왜 만들었나
일반 운동 앱은 운동별 기록만 보여줘서, 이번 주에 근육별로 운동량이 충분했는지와 실제 수행 능력이 좋아졌는지를 판단하기 어려웠다.
주요 기능
- 근육별 주간 환산 세트·총중량 집계(주동근 1, 보조근 0.5 가중치)
- 같은 운동·같은 기구끼리 최고 세트 비교와 더블 프로그레션 증량 판단
- 추정 1RM(Epley)·수행지수·노력 체크 등 수행 분석
- 인체 지도 시각화, Fleek CSV 가져오기·내보내기
- 오프라인 대기열 동기화 PWA, 한국어·영어·러시아어
숫자로 보면
기본 운동 233개 · 근육 16개 분류
운동 예시 이미지 446장
엔진·분석 단위 테스트 43개
어떻게 동작하나
세트 기록
세트 종류·무게·반복·RIR을 입력하고 드롭 세트는 직전 무게의 80%를 원판 단위로 반올림해 붙인다.
src/sets.ts로컬 저장·동기화
변경을 행 단위 대기열에 넣어 Supabase로 보내고, 실패하면 남겨 두었다가 재전송한다.
app/store.ts주간 집계
사용자 시간대의 월요일 기준 주로 묶어 근육별 환산 세트·총중량·훈련 일수를 계산한다.
src/engine.ts운동 사전 매핑
운동마다 주동근·보조근 기여도와 기구 종류를 정의해 집계에 쓴다.
src/library.ts수행 분석
추정 최대 무게, 42일 기준선 대비 수행지수, 증량 예상과 체성분 추세를 계산한다.
src/analysis.ts화면 표시
인체 지도와 근육량 예상 카드로 주간 결과를 보여준다.
app/bodymap.tsx
구조
Supabase가 인증과 행 단위 보안(본인 기록만)이 걸린 records 테이블을 제공하고, 집계는 저장 없이 클라이언트에서 매번 재계산한다.
Next.js 앱React 19 · PWA
로컬 상태localStorage · 동기화 대기열
집계 엔진engine.ts · analysis.ts
운동 사전233개 운동 · 근육 기여도
SupabaseAuth · Postgres · RLS
- 로컬 상태 → Supabase: 행 단위 동기화
- 집계 엔진 → Next.js 앱: 주간 리포트
비공개 저장소라 소스 코드 링크와 코드 발췌는 싣지 않았습니다.
어려웠던 점
한 세트를 근육마다 더하면 데드리프트 1세트가 하체에 2~3세트로 부풀려져서, 부위 단위로는 가장 큰 가중치로 한 번만 세는 규칙을 따로 두었다. 1RM 추정이 고반복에서 부정확한 점을 고려해 반복 상한을 두고, 미기록 RIR은 보수적으로 처리했다.



