세트마다 다음 무게·휴식을 정해주는 AI 헬스 트레이너. 실시간 처방은 순수 로컬 엔진으로 오프라인 100%, AI는 그 위에 코칭을 얹습니다.

GYMKC 홈 · 데모 데이터 화면
// the brief
헬스 앱은 넘치지만 대부분 '기록'만 합니다. 정작 세트 중에 "다음은 몇 kg으로?"를 정해주는 앱은 드물죠. 게다가 AI 앱은 인터넷이 끊기면 무용지물인데, 헬스장은 지하·구석이라 신호가 약합니다.
운동하는 그 순간에 작동하지 않는 코치는 의미가 없습니다. 그래서 목표를 하나로 잡았어요. 인터넷이 없어도, 서버가 죽어도, 다음 세트를 정확히 정해주는 트레이너.
// approach
휴식 시간·다음 세트 무게·횟수 같은 실시간 처방을 LLM이 아니라 순수 TypeScript 로컬 엔진으로 만들었습니다. 인터넷도 서버도 없이 폰 안에서 100% 돕니다. AI(Claude·Gemini)는 그 위에 코칭·분석·대화를 얹는 보조 역할이고요.
엔진이 처방의 정본, AI는 코칭 보조. 이 원칙을 처음부터 끝까지 지켰습니다. 운동 중 결정에는 LLM이 한 번도 끼어들지 않습니다.
// key decisions
다음 세트 무게·휴식·프로그레션을 순수 TS 엔진이 계산합니다. 인터넷이 끊겨도, 서버가 죽어도 운동은 안 멈춰요. 처방 로직은 130개 넘는 유닛 테스트로 고정해, 앱이 바뀌어도 결정이 흔들리지 않게 했습니다.
챗·세션 분석·주간 리포트는 AI가 맡습니다. 비용은 구독 정액으로 고정하고 한도 초과분만 저렴한 모델로 폴백해서, 사용자가 늘어도 원가가 터지지 않게 설계했어요. 무료 사용자의 한계비용은 사실상 0.
웹 PWA를 안드로이드 네이티브로 감싸 삼성헬스에 운동 기록을 쓰고, 백그라운드 휴식 알림을 보냅니다. 웹만으론 못 하는 걸 네이티브 브리지로 이었습니다.
실시간 조절도 세밀합니다. 휴식이 길어지면 다음 세트를 자동으로 줄이고, 컨디션이 나쁜 날은 볼륨을 낮춥니다. 드롭세트·디로드 같은 특수 세트는 강도 지표에서 정확히 걸러내 다음 처방이 오염되지 않게 했고요. 전부 엔진이, 오프라인에서.
// offline-first
운동 기록·타이머·세트 처방이 전부 폰 안(로컬 DB + 엔진)에서 돕니다. 서버(Cloudflare D1)는 여러 기기 동기화 대상일 뿐이에요. 그래서 동시 접속이 1만 명이어도 '운동하는 순간'의 서버 부하는 0입니다. 부하가 걸리는 건 동기화와 AI 잡뿐이고, 그건 큐로 분리했습니다.
// result
Google Play 비공개 테스트로 운영 중이고 구독 모델입니다. 갤럭시 S25 실기기로 반복 검증하며, 헤드리스 E2E와 130개 넘는 유닛 테스트로 잠복 버그까지 잡아냈어요. 슈퍼세트·플레이트 계산기·회복 히트맵 같은 기능이 계속 붙고 있습니다.
// 이런 걸 만들어 드립니다.