BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
트레이너와 회원을 위한 운동 기록, 식단, PT 일정 관리 서비스
Translation pending
Sports & fitnessGitHub @sudongChilloenOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗PT 센터 · 트레이너 · 회원을 위한 운동 기록 + PT 알림장 + 수업 관리 웹앱. 트레이너가 회원을 관리하고 수업을 기록하면, 그 내용이 회원의 운동 기록으로 이어진다.
개발 경과와 설계 판단은 docs/PROGRESS.md 에 있다.
Next.js 16 (App Router) · React 19 · Prisma 7 + Postgres(Supabase) · Tailwind 4 + shadcn ·
zod 4 · 직접 구현한 JWT 인증(jose + bcryptjs)
이 프로젝트의 Next.js 는 익숙한 버전과 다르다 (
middleware→proxy.ts등). 코드를 쓰기 전에node_modules/next/dist/docs/를 먼저 볼 것. 자세한 내용은AGENTS.md.
npm install
cp .env.example .env # 없으면 아래 환경변수를 직접 채운다
npx prisma migrate deploy
npx prisma db seed # 기구 · 운동 시드 (선택)
npm run dev
http://localhost:3000 에서 확인한다. 패키지 매니저는 npm 이다 (pnpm 락파일을 두지 말 것).
| 변수 | 용도 | 비고 |
|---|---|---|
DATABASE_URL | 앱 런타임 연결 | Supabase pgbouncer 6543 (transaction 모드) |
DIRECT_URL | 마이그레이션 | Supabase 5432 (session 모드) |
SESSION_SECRET | 세션 JWT 서명 | openssl rand -base64 32 |
SUPABASE_URL | 사진 저장소 (선택) | 없으면 사진 영역만 "저장소가 설정되지 않았어요" |
SUPABASE_SERVICE_ROLE_KEY | 사진 서명 주소 발급 (선택) | 서버 전용. 브라우저로 나가면 안 된다 |
SUPABASE_PHOTO_BUCKET | 사진 버킷 이름 (선택) | 기본값 fitnote-photos |
FCM_PROJECT_ID · FCM_CLIENT_EMAIL · FCM_PRIVATE_KEY | 푸시 알림 (선택) | 세 값이 모두 있어야 켜진다. 서버 전용 |
APP_URL | 푸시를 눌렀을 때 열 주소 (선택) | https://도메인 처럼 끝에 / 없이 |
DATABASE_URL 과 SESSION_SECRET 이 없으면 빌드가 실패한다 (모듈 로드 시점에 검사).
사진 버킷은 새 환경에서 한 번만 만든다: npx tsx --conditions=react-server scripts/setup-storage.mts
| 명령 | 내용 |
|---|---|
npm run dev | 개발 서버 |
npm run build / start | 빌드 / 실행 |
npm run typecheck | tsc --noEmit |
npm run lint | eslint |
npm test | 단위 테스트 |
npm run test:integration | 통합 테스트 — 임시 Postgres 를 띄운다. 운영 DB 는 안 건드림 |
CI(.github/workflows/ci.yml)가 PR 마다 위 순서대로 돌린다.
app/
(auth)/ 로그인 · 가입 (트레이너가 만든 계정 이어받기 포함)
(user)/ 회원 화면: 홈, 운동 기록, 운동 라이브러리, 식단, 체성분·목표, 알림장, 내 PT
trainer/ 트레이너 화면: 회원, 일정, 수업 진행, 알림장 작성, 계약
api/ 운동·워크아웃 REST API
lib/ jwt · session · dal(권한 확인) · rate-limit · zod 스키마
server/ 도메인별 서비스 (페이지와 액션이 직접 호출)
pt/ workouts/ trainers/ journals/ diet/ body/ ...
lib/ prisma, storage, date(KST) 등 공용
prisma/ schema · migrations · seed
generated/prisma 생성된 Prisma 클라이언트 (커밋한다)
tests/ 단위 · 통합 테스트
proxy.ts 쿠키만 보는 낙관적 라우트 보호
proxy.ts 는 JWT 서명만 보고, 실제 방어선은 app/lib/dal.ts 의 DB 조회다.
서버 액션과 서비스는 requireUser / requireTrainerProfile 로 다시 확인한다.generated/prisma 는 커밋한다. 스키마를 바꾸면 npx prisma generate 후 결과를 함께
커밋해야 Vercel 빌드가 통과한다. 필드 순서가 통째로 바뀌어 diff 가 커도 정상이다.lib/date.ts). 서버는 UTC 로 돈다.pt.service.ts, workout.service.ts 는 하위 파일을
다시 내보내는 얇은 파일이라 import 경로가 바뀌지 않는다.환경변수를 등록하고, 코드를 올리기 전에 새 마이그레이션을 먼저 적용한다
(npx prisma migrate deploy, DIRECT_URL 필요). 자세한 내용은 docs/PROGRESS.md 3장과 7-4.