GitHub

DuarteSantos8/openGym — Self-hosted gym & body-weight tracker — plan routines, log workouts (supersets, warm-ups, cardio), see which muscles are trained, fatigued or detrained, import from FitNotes/Strong/Hevy, passkey login. Your data, your server.

openGym — 운동 기록과 루틴을 직접 호스팅하는 헬스 트래커

openGym은 루틴 계획, 운동 기록, 체중과 근육별 훈련 상태를 관리하는 오픈소스 트래커입니다. Docker로 자체 서버에 설치하고 패스키 로그인, 오프라인 사용, 기기 간 동기화를 지원하며 FitNotes·Strong·Hevy 기록을 가져옵니다.

에디터 노트

헬스 앱 구독 피로감에 대한 정면 대응입니다. README의 첫 줄부터 남의 서버에 계정 만들지 마, 구독도 광고도 텔레메트리도 없다고 선언합니다. docker compose up 한 번이면 돌아갑니다. 아키텍처가 재밌습니다. API는 순수 node:http에 의존성 딱 두 개(패스키, 푸시 알림), 데이터는 ./data 디렉터리의 JSON 파일들입니다. 백업은 이 디렉터리 복사로 끝납니다. 운동 진행 규칙은 순수 함수로 테스트까지 붙어 있습니다. FitNotes·Strong·Hevy 가져오기 지원이 교묘합니다. 기존 앱 사용자를 끌어오는 탈출구이자 유인책입니다. 다만 운동 이미지·애니메이션은 AGPL에 포함되지 않아 권리 확인이 필요하다고 스스로 밝힙니다.

AI 요약

openGym은 운동 계획과 기록을 자신의 서버에 보관하는 셀프 호스팅 앱입니다. 주간 루틴을 구성하고 가이드 운동으로 세트와 체중을 기록합니다. Superset, 웜업·드롭 세트, 휴식-정지, 유산소 운동도 다룹니다. 운동 목록에는 1,324개 동작이 있으며 근육 지도와 보유 장비를 기준으로 검색할 수 있습니다. Push/Pull/Legs, Upper/Lower, Full Body, 5×5 시작 루틴도 제공합니다.

운동 기록과 진행 관리

운동을 시작하면 직전 기록의 중량을 미리 채우고 세트 사이에 휴식 타이머를 실행합니다. 기록 중 개인 최고 기록(PR)을 감지하며, 노력도는 RIR 또는 RPE로 입력합니다. 바벨과 EZ바, 트랩바, 스미스 머신은 사용자가 가진 원판을 기준으로 중량을 계산합니다. 맨몸 운동은 자체 중량으로 기록하고 필요하면 딥벨트 하중을 더합니다.

진행 규칙은 루틴이나 운동별로 설정합니다. 선형 증가, Greyskull LP, 반복 횟수 범위에 따른 이중 진행, 시간 증가를 지원합니다. 목표 중량의 근거를 표시하고 반복 횟수를 채우지 못하면 중량을 올리지 않습니다. 정체가 발생하면 디로드를 적용합니다. 운동별 추정 1RM, Poliquin·Thibaudeau·ATG 기준 구조적 균형 비율, 연간 활동 히트맵도 제공하며, 근육 지도에서 훈련량과 회복 상태, 장기간 훈련하지 않은 부위를 살펴봅니다. 저장한 운동은 나중에 수정할 수 있고, 수정된 기록을 바탕으로 기록을 다시 계산합니다.

배포와 데이터 동기화

Docker Compose로 설치하며, 기본 배포는 docker compose up -d로 시작합니다. 웹 화면은 React 19와 Vite로 빌드하고 Nginx가 정적 파일을 제공하며 API 요청을 프록시합니다. API는 Node.js 기본 http 모듈을 사용하고 패스키에는 @simplewebauthn/server, 푸시 알림에는 web-push를 씁니다. 데이터는 호스트의 ./data 디렉터리에 JSON 파일로 저장합니다. 이 디렉터리를 백업하면 프로필, 운동 계획, 기록과 설정도 함께 백업됩니다.

로그인은 Face ID, Touch ID, 지문 인식 등을 활용하는 패스키 방식입니다. 서버에는 공개 패스키 정보가 저장되며 개인 키는 휴대전화 보안 하드웨어나 비밀번호 관리자에 남습니다. 앱은 오프라인에서도 동작하고 기기 간 동기화를 지원합니다. 각 프로필 문서에는 서버 리비전이 붙습니다. 기기가 마지막으로 확인한 리비전과 변경 사항을 보내고, 그 사이 다른 기기가 문서를 바꿨다면 서버는 최신 문서를 반환합니다. 기기는 변경을 병합한 뒤 다시 시도합니다. 서버에 도달하지 않은 변경은 연결이 끊기거나 로그아웃해도 버리지 않으며, 앱은 오프라인 작업 상태를 알립니다.

FitNotes와 Strong은 CSV로 가져올 수 있고, Hevy는 CSV 또는 API 키를 사용합니다. Apple Health 체중 내보내기도 지원합니다. 전체 데이터는 JSON으로 내보내며, 계획은 파일로 공유하거나 PDF로 출력할 수 있습니다. 스마트폰과 노트북에서 패스키를 사용하려면 도메인과 HTTPS 설정이 필요합니다. Android는 서명된 APK로 배포하고, iPhone은 PWA로 홈 화면에 추가하거나 Xcode로 직접 빌드합니다.

선택 기능과 라이선스

AI 코치는 기본 설치에서 꺼져 있습니다. 활성화하면 사용자가 지정한 Anthropic, OpenAI, Gemini, Ollama 등 제공자 키를 사용해 주간 루틴 초안을 만들고 기록에 따른 변경을 제안합니다. 변경 사항은 사용자가 승인해야 합니다. MCP 서버도 선택 기능이며 로컬에서 훈련 기록을 읽는 용도로 제공됩니다. 기본 앱은 AI 서비스에 요청을 보내지 않습니다.

코드는 AGPL v3.0으로 공개하며 유료 등급이나 스폰서 전용 기능을 두지 않습니다. 수정한 버전을 네트워크 서비스로 운영한다면 해당 버전의 소스도 같은 라이선스로 제공해야 합니다. 단, 운동 이미지와 애니메이션은 AGPL에 포함되지 않습니다. 저장소는 이 자료의 권리 관계가 분명하지 않다고 밝히며, 재사용 전에 권리자에게 허가를 받도록 안내합니다.

원문: GitHub / 번역·요약: Trawling