개요
openGym은 데이터가 완전히 자신의 서버에 저장되는 셀프 호스팅 피트니스 및 체중 추적 앱입니다. 1300개 이상의 운동 동작이 포함된 트레이닝 플랜, 휴식 타이머와 PR 감지 기능이 있는 가이드형 운동, 근육 회복 히트맵을 제공하며 FitNotes, Strong, Hevy에서 데이터 가져오기를 지원합니다. PWA로 설치되며 패스키 로그인, 오프라인 사용 및 다중 기기 동기화를 지원합니다.
README 미리보기
\n\n\n\n**A self-hosted gym and body-weight tracker you actually own.**\n\nPlan your week, run guided workouts, log every set and your body weight —\non your phone, synced across your devices, behind your own passkey login.\n\n[](https://discord.gg/e62jY6fwVb)\n[](https://discord.gg/e62jY6fwVb)\n[](https://github.com/DuarteSantos8/openGym/stargazers)\n\n[](https://github.com/DuarteSantos8/openGym/releases)\n[](https://github.com/DuarteSantos8/openGym/actions/workflows/test.yml)\n[](https://gitlab.com/DuarteSantos8/opengym/-/pipelines)\n[](https://gitlab.com/DuarteSantos8/opengym/-/pipelines?ref=main)\n[](LICENSE)\n\n[Website](https://opengym.duarte-santos.ch) ·\n[Live demo](https://opengym.duarte-santos.ch/demo/) ·\n[Android APK](https://github.com/DuarteSantos8/openGym/releases/latest) ·\n[Self-hosting guide](docs/SELF_HOSTING.md) ·\n[Roadmap](ROADMAP.md) ·\n[Changelog](CHANGELOG.md)\n\n\n\n\n\nHome · today's workout and weight\nGuided workout · demos and sets\nStats · heatmap, charts and PRs\n\n\n\n## Why openGym\n\nMost workout apps keep your data on their servers, push you towards a subscription, or vanish\nwhen the company does. openGym runs on your own box, keeps your data in a folder you control, and\nis yours to fork. It still behaves like a modern app: installable on the home screen, passkey\nsign-in, works offline, syncs between your phone and your laptop.\n\nNo account on someone else's server, no subscription, no ads, no telemetry. One\n`docker compose up` and it's running.\n\nThe [in-browser demo](https://opengym.duarte-santos.ch/demo/) is the real app with example data,\nif you want to try it before installing anything.\n\n## Features\n\n**Planning**\n\n- A routine per weekday over a library of **1,324 exercises** with animated demos, searchable and\n browsable by muscle on a body map. Filter by the equipment you own.\n- Four starter plans (Push/Pull/Legs, Upper/Lower, Full Body, 5×5) that load as ordinary,\n editable routines.\n- Move a session to a
FAQ (4)
문제 해결openGym Android 앱이 사설 CA 인증서를 사용하는 자체 호스팅 서버에 연결할 수 없는 이유는 무엇인가요?
근본 원인: Android API 24부터 networkSecurityConfig가 없는 앱은 시스템 CA만 신뢰하며 사용자가 설치한 CA는 무시됩니다. WebView가 이 정책을 상속하므로 private-CA 서버에 대한 TLS 핸드셰이크가 조용히 실패하고 요청(예: POST /api/pair/redeem)이 서버에 전혀 도달하지 않습니다. Chrome은 사용자 CA를 신뢰하기 때문에 작동합니다. 수정 방법(APK를 다시 빌드해야 함): frontend/android/app/src/main/res/xml/network_security_config.xml 파일을 <network-security-config><base-config cleartextTrafficPermitted="false"><trust-anchors><certificates src="system" /><certificates src="user" /></trust-anchors></base-config></network-security-config> 내용으로 생성한 다음, AndroidManifest.xml의 <application> 태그에 android:networkSecurityConfig="@xml/network_security_config"를 추가합니다. 리빌드 없이 우회하는 방법: 네이티브 앱 대신 휴대폰의 Chrome에서 PWA를 설치하세요. Chrome이 사용자 CA를 신뢰하므로 패스키 로그인과 동기화가 작동합니다. 참고: WebView origin이 https://localhost이고 allowMixedContent가 false이므로 LAN IP를 통한 일반 HTTP도 실패합니다.
문제 해결AI Coach가 /v1 접두사 없이 OpenAI 호환 엔드포인트(예: Open WebUI의 /openai 마운트)에 연결할 때 404를 반환하는 이유는 무엇인가요?
openGym v1.4.0에서 Coach는 항상 base URL에 /v1을 추가하므로 {base}/v1/chat/completions를 호출하게 되며, 이는 버전 세그먼트가 없는 경로에 마운트된 서버(llama.cpp/llama-swap 앞단의 Open WebUI /openai 프록시, 리버스 프록시된 Ollama 등)에서는 404 오류를 발생시킵니다. 해결 방법: openGym v1.4.1로 업그레이드하세요. 해당 버전에서는 {base}/v1이 404를 반환하면 Coach가 자동으로 {base}를 직접 재시도하고 작동하는 형식을 기억하므로, 제공업체 문서에 나온 그대로 엔드포인트를 붙여넣으면(예: http://127.0.0.1:8099/openai) List models와 Test the Coach 모두 정상적으로 작동합니다.
문제 해결Strong 또는 Hevy에서 가져올 때 같은 날의 두 운동이 하나로 병합되는 이유는 무엇인가요?
이것은 openGym v1.4.0의 버그입니다: CSV 가져오기와 Hevy API 가져오기가 운동을 달력 날짜 기준으로만 그룹화하므로(frontend/src/lib/import-csv.js의 byDate와 frontend/src/lib/import-hevy.js의 parseHevyWorkouts 참조), 오전 세션과 저녁 세션이 하나의 운동으로 합쳐집니다. 해결 방법: openGym v1.4.1 이상으로 업그레이드하세요. v1.4.1부터는 Strong, Hevy CSV, Hevy API에서 가져온 데이터가 날짜와 운동 시작 시간을 함께 기준으로 그룹화되므로, 같은 날의 두 세션이 두 개의 별도 운동으로 유지됩니다. FitNotes 가져오기는 영향을 받지 않는데, FitNotes 내보내기에는 날짜만 포함되어 있고(시작 시간 없음) 따라서 여전히 일 단위로 그룹화되기 때문입니다.
문제 해결openGym에서 운동 중에 운동을 추가할 때 "Type"(운동 유형) 항목이 표시되지 않는 이유는 무엇인가요?
이것은 openGym v1.4.1에서 수정된 UI 버그입니다. 이전 버전에서는 운동 중 "Add exercise" 화면에 "Muscle"과 "Equipment" 행만 표시되고, Exercise browser에 있는 "Type" 행이 누락되었습니다. openGym을 v1.4.1 이상으로 업데이트하면 운동을 추가할 때 Type 행이 올바르게 표시됩니다.