Eunice · StewardAI
· 16분 읽기
- #AI
- #개발자도구
- #헬스
openGym: Claude Code로 만든 1인 자가 호스팅 헬스 앱
스위스에서 아직 수습 중인 소프트웨어 개발자가 7월에 올린 자가 호스팅 헬스 트래커 openGym이 GitHub 데일리 트렌딩에 올랐습니다. 스타 4,201개, Claude Code로 거의 전부 개발, AGPL-3.0 무료 오픈소스이며, 포크 653개로 커뮤니티 백로그도 활발합니다.
스위스에서 아직 수습 중인 소프트웨어 개발자가 7월에 헬스 트래커 앱 하나를 GitHub에 올렸습니다. 오늘 이 저장소는 GitHub 데일리 트렌딩 페이지에 올라 있는데, 총 스타 4,201개 중 1,433개를 최근 24시간 동안만 얻었습니다 (이 글을 쓰는 시점 기준 — 트렌딩 페이지 수치는 실시간으로 바뀝니다) — 그리고 이 저장소는 자체 README에 따르면 대부분 Claude Code 세션으로 개발되었습니다.
이 프로젝트는 openGym으로, 무료로 쓸 수 있는 자가 호스팅 운동·체중 트래커입니다 — 혼자 만들어서 공개적으로 출시한, 교과서적인 인디 해커 헬스 앱입니다. 자세히 들여다볼 가치가 있는 이유는 스타 수 자체가 아니라, 메인테이너가 저장소에 그대로 들어 있는 평범한 파일들을 통해 AI 코딩 에이전트가 실제 출시 프로세스에 정확히 어떻게 들어맞는지 — 무엇을 초안 작성까지 맡기고, 사람이 그래도 어디를 확인하며, 프로젝트에 여전히 남아 있는 거친 부분은 어디인지 — 공개해뒀다는 점입니다.
openGym이 실제로 하는 일
자체 GitHub 설명에 따른 셀링 포인트는, 회사 서버가 아니라 여러분 자신의 서버에서 돌리는 운동 플래너 겸 로거입니다: 루틴을 계획하고, 슈퍼셋과 웜업까지 포함해 세션을 기록하고, 어떤 근육이 훈련되었는지 또는 아직 피로가 남아 있는지 확인하고, FitNotes·Strong·Hevy에서 기존 기록을 가져올 수 있습니다.
README는 형용사가 아니라 구체적인 숫자로 이를 뒷받침합니다: 애니메이션 데모가 달린 운동 1,324개 라이브러리 위에 올라가는 루틴 빌더, 추정 1RM 추적, 패스키 로그인(Face ID, Touch ID, 지문), 그리고 오른쪽에서 왼쪽으로 쓰는 아랍어를 포함한 17개 언어 지원입니다. 배포 형태는 Docker 컨테이너 2개와 여러분 자신의 데이터 폴더로 이루어지며, docs/SELF_HOSTING.md에 문서화되어 있고, Cloudflare Tunnel·Caddy·Traefik·Kubernetes를 위한 리버스 프록시 설정 레시피도 함께 제공됩니다.
선택 기능으로 AI 코치도 있어서, 한 주치 루틴 초안을 짜주고 기록된 히스토리를 바탕으로 변경을 제안합니다 — 다만 README에 따르면 "the app itself doesn't need an LLM. Nothing in a default install calls an AI service"(앱 자체는 LLM이 필요 없습니다. 기본 설치에는 AI 서비스를 호출하는 부분이 전혀 없습니다)라고 하며, 이 코치는 여러분이 직접 Anthropic, OpenAI, Gemini, 또는 로컬 Ollama 엔드포인트용 API 키를 넣어야만 작동합니다.
v1.0.0에서 석 달도 안 돼 GitHub 트렌딩 페이지까지
CHANGELOG는 v1.0.0을 "first public release"(첫 공개 릴리스)로 기록하며 날짜는 2026년 7월 20일입니다. 그 뒤로는 꾸준한 주간 출시 주기가 이어집니다: 이틀 뒤 나온 v1.1.2에서 커스텀 운동과 12개 언어가 추가되었고, 이어 v1.1.3에서 자가 호스팅 사용자를 위한 관리자 대시보드가 더해졌습니다. AI 코치는 9월 3일 v1.3.0으로 출시되었고, 가장 최근 태그된 릴리스인 9월 28일자 v1.3.9는 히스토리 수정 기능과 함께, 자체 릴리스 노트에 따르면 "thirty-nine community pull requests"(커뮤니티 풀 리퀘스트 39개)만큼의 수정 사항을 추가했습니다.
그 첫 태그로부터 11주가 지난 지금, 저장소 페이지와 풀 리퀘스트 목록에 따르면 main 브랜치는 포크 653개, 커밋 1,197개를 기록하고 있고, 열린 이슈 68개, 열린 풀 리퀘스트 65개에 이미 닫히거나 머지된 PR 102개가 더해져 있습니다 — 잠들어 있는 저장소 위에 쌓인 스타 수가 아니라, 실제로 살아 움직이는 백로그입니다.
뒤에는 투자받은 팀이 아니라 한 사람이 있습니다
이 뒤에는 회사가 없습니다. Duarte Santos의 GitHub 프로필은 그를 스위스 Sunrise UPC에서 수습 중인 소프트웨어 개발자로 소개하고 있고, 팔로워는 65명이며, 실제로 트랙션이 있는 고정 프로젝트는 openGym 하나뿐입니다 — 나머지 고정 저장소들은 작은 유틸리티와 포트폴리오 사이트입니다. 이는 스폰서가 붙은 해커톤에서 스타 253,000개까지 성장한 ECC, 또는 이미 팔로워 20.6k를 보유하고 뒤에 에이전시까지 있던 개발자가 만든 ai-memory와는 의미 있게 다른 출발점입니다.
커밋 히스토리를 보면 main 브랜치의 모든 커밋이 그의 단일 계정으로 작성되어 있습니다 — README가 밝힌 "a person decides and ships. What goes in, what gets reviewed and merged, and every release are the maintainer's call"(한 사람이 결정하고 출시합니다. 무엇이 들어가고, 무엇이 리뷰되어 머지되고, 모든 릴리스가 메인테이너의 판단입니다)라는 내용과 일치합니다. PR 목록에 melduarmir, danifuuu, sgoendoer 같은 기여자 계정명이 보이는 닫힌 풀 리퀘스트 102개는 외부 도움이 실제로 존재한다는 걸 보여줍니다 — 다만 무엇이든 출시되기 전에 리뷰어 한 명을 거쳐야 한다는 게이트가 걸려 있을 뿐입니다.
이게 그냥 흔한 앱이 아니라 '인디 해커 헬스 앱'인 이유
openGym은 자신의 규칙을 글로 써둠으로써 가장 모호한 버전의 "AI로 만들었다"는 주장을 피해 갑니다. 저장소 루트에는 CLAUDE.md 파일이 있는데 — 메인테이너가 세션을 시작할 때 Claude Code에게 건네는 컨텍스트입니다 — 마케팅 문구보다는 엔지니어링 제약 문서처럼 읽힙니다: "Dependency-light is a hard constraint, not a preference. Frontend: React + Router + Zustand and nothing else"(의존성을 가볍게 유지하는 건 선호가 아니라 엄격한 제약입니다. 프런트엔드: React + Router + Zustand, 그 외엔 아무것도 쓰지 않습니다), 그리고 "다음에 뭘 들어야 할지 결정하거나, 기록된 세션을 다시 읽어들이는" 모든 것은 바로 옆에 테스트가 붙은 순수 헬퍼 함수로 작성되어야 합니다.
같은 파일은 의도적으로 생략한 부분도 솔직하게 밝힙니다: "There is no linter/formatter configured (no ESLint/Prettier config in the repo) and no TypeScript — match the existing style by hand"(린터·포매터가 설정되어 있지 않습니다(저장소에 ESLint/Prettier 설정 없음), TypeScript도 없습니다 — 손으로 기존 스타일에 맞춰 작성하세요). AI 에이전트가 일부 작업을 맡은 프로젝트에서 이렇게 인정하는 건 흔치 않은 일입니다 — 스타일을 자동으로 강제하는 데 특히 능한 게 바로 그런 도구이기 때문입니다.
CONTRIBUTING.md는 같은 논리를 외부 기여자에게도 확장합니다: "You're welcome to use whatever tools you like for a pull request"(풀 리퀘스트에 어떤 도구를 쓰든 상관없습니다). PR이 Claude Code, Cursor, 혹은 그냥 텍스트 에디터에서 나왔는지는 신경 쓰지 않습니다 — "the bar is the same either way: you understand the change, it's tested, and you can answer questions about it in review"(어느 쪽이든 기준은 같습니다: 변경 사항을 이해하고 있어야 하고, 테스트되어 있어야 하고, 리뷰에서 질문에 답할 수 있어야 합니다).
반대편의 에이전트를 위해서도 만들어졌습니다
저장소 트리 안에는 mcp/ 디렉터리가 묻혀 있습니다 — 자체 README에 문서화된 Model Context Protocol 서버로, Claude Desktop 같은 툴이 자가 호스팅된 openGym 인스턴스의 데이터를 직접 읽을 수 있게 해줍니다: 루틴, 운동 기록, 추정 1RM, 근육 균형. 현재 단계에서는 명시적으로 읽기 전용이고, 웹 앱의 Stats 화면이 쓰는 것과 동일한 트레이닝 로직 코드를 재사용해 둘이 서로 다른 값을 낼 수 없게 만들었으며, Docker Compose가 이미 관리하는 것과 같은 ./data 폴더에 대한 파일시스템 접근 외에는 네트워크 접근이나 시크릿도 필요 없습니다. 작은 디테일이지만, 이 빌더가 AI 에이전트를 자신이 글을 쓰는 데 쓴 도구로만 보지 않고, 자기 제품을 소비하는 주체로도 생각하고 있다는 신호입니다.
하이라이트 릴에 들어맞지 않는 부분
몇 가지가 이 이야기를 깔끔하게만 두지 않습니다. 프로젝트 자체 NOTICE.md는 운동 이미지와 애니메이션의 업스트림 소유권이 두 제3자 소스 사이에서 분쟁 중이라고 밝히고 있고, 이게 해결되기 전까지는 파일에 이렇게 명시되어 있습니다: "until then, treat the media as third-party content licensed to neither openGym nor to you"(그때까지는 이 미디어를 openGym에도 여러분에게도 라이선스되지 않은 제3자 콘텐츠로 취급하세요). 대부분의 프로젝트라면 조용히 못 본 척 넘겼을 법한 진짜 법적 회색지대를, 솔직하게 짚어둔 부분입니다.
수익화도 어디에도 보이지 않습니다. README는 이를 직접 밝히고 있습니다: openGym은 "free and stays free: AGPL, no paid tier, nothing held back for sponsors"(무료이고 계속 무료로 남습니다: AGPL, 유료 티어 없음, 스폰서를 위해 숨겨둔 기능도 없음)입니다. 이는 호스팅 Pro 티어를 가진 이 시리즈의 다른 프로젝트들과는 실질적으로 다른 지점으로 — 일반적인 SaaS 로드맵보다는, 공개적으로 만들어지는 무료 스크린 리더 NVDA가 수익화를 다루는 방식에 더 가깝습니다 — 여기서 보고할 매출 수치가 없는 건, 메인테이너가 의도적으로 매출 자체를 배제했기 때문입니다.
그리고 리뷰어 한 명을 상대로 열린 풀 리퀘스트 65개는 각주가 아니라 병목입니다 — 빠르게 성장하는 커뮤니티 백로그를 단일 메인테이너가 걸러내고 있는 구조이고, 트렌딩 페이지 트래픽이 이어지는 한 따라가기는 점점 더 어려워질 수밖에 없습니다.
이것이 일반화되는 지점
여기서 다른 곳에도 적용할 수 있는 습관은 "Claude Code를 써라"가 아닙니다 — 증거 없이 그렇게 주장하는 저장소는 이미 수없이 많습니다. 핵심은 openGym의 AI 보조 프로세스가 눈으로 확인 가능하다는 점입니다: 정확한 제약을 명시한 CLAUDE.md("의존성을 가볍게 유지하는 건 엄격한 제약"이라는 문구, 린터 없음, 모든 트레이닝 로직 헬퍼 옆에 테스트), 모든 기여자에게 같은 도구 무관(tool-agnostic) 기준을 확장하는 CONTRIBUTING.md, 그리고 모든 주장에 실제 날짜가 붙은 changelog. 이 중 어느 것도 첫날부터 뛰어난 엔지니어여야 한다는 조건을 요구하지 않습니다 — Duarte Santos는 스스로를 여전히 수습 중이라고 소개합니다. 필요한 건 첫 PR이 들어오기도 전에, 에이전트가 스스로 결정하도록 맡겨도 되는 것과 안 되는 것을 정확히 적어두는 것입니다 — 그래야 6주가 지나고 열린 풀 리퀘스트가 65개로 늘어난 뒤에도, 가리킬 규칙이 여전히 그 자리에 남아 있습니다.
출처
아래 링크는 발행 전 직접 확인했습니다.
- 1.GitHub — DuarteSantos8/openGym (저장소: 스타, 포크, 커밋, 이슈, PR, 라이선스, 설명) · 확인일
- 2.GitHub — openGym README(raw): 기능, Claude Code 관련 문구, AGPL·무료 티어 문구, AI 코치 · 확인일
- 3.GitHub — DuarteSantos8 프로필(소개, 위치, 팔로워, 고정 저장소) · 확인일
- 4.GitHub — openGym 커밋 히스토리(main 브랜치): 작성자 패턴 · 확인일
- 5.GitHub — openGym 릴리스(버전 히스토리, v1.3.x 날짜와 노트) · 확인일
- 6.GitHub — openGym LICENSE(raw): AGPL-3.0 전문 · 확인일
- 7.GitHub 트렌딩 — 일간(openGym 순위, 총 스타, 오늘 획득한 스타) · 확인일
- 8.GitHub — openGym 풀 리퀘스트(열림/닫힘 개수, 기여자 계정명) · 확인일
- 9.GitHub — openGym 저장소 트리(main 브랜치): CLAUDE.md, mcp/, docs/ 등 최상위 파일 · 확인일
- 10.GitHub — openGym CLAUDE.md(raw): Claude Code 세션을 위한 개발 컨벤션 · 확인일
- 11.GitHub — openGym CONTRIBUTING.md(raw): PR에서의 AI 툴 사용 정책 · 확인일
- 12.GitHub — openGym NOTICE.md(raw): 운동 미디어 제3자 라이선스 관련 유의사항 · 확인일
- 13.GitHub — openGym docs/SELF_HOSTING.md(raw): 배포 방법과 패스키/HTTPS 요구사항 · 확인일
- 14.GitHub — openGym mcp/README.md(raw): AI 에이전트를 위한 읽기 전용 MCP 서버 · 확인일
- 15.GitHub — openGym CHANGELOG.md(raw): v1.0.0 출시일과 전체 버전 히스토리 · 확인일