다음 세트의 무게를,
인터넷 없이도.
세트마다 다음 무게와 휴식을 정해 주는 AI 헬스 트레이너입니다. 무게와 휴식 계산은 인터넷 없이 기기 안 엔진이 하고, AI는 그 위에서 설명과 분석을 돕습니다.

gymkc.org · 앱 소개와 운동 백과, 설치 없이 쓰는 웹판

AI 트레이너 · 제안엔 근거를 붙이고, 적용은 사용자가 정합니다
// the brief
기록을 다음 세트의 처방으로.
헬스 앱은 넘치지만 대부분 '기록'만 합니다. 정작 세트 중에 "다음은 몇 kg으로?"를 정해 주는 앱은 드뭅니다. 게다가 AI 앱은 인터넷이 끊기면 쓸 수 없는데, 헬스장은 지하·구석이라 신호가 약합니다.
운동하는 그 순간에 작동하지 않는 코치는 쓸모가 없습니다. 그래서 목표를 하나로 잡았습니다. 인터넷이 끊겨도 다음 세트의 무게와 휴식을 바로 정해 주는 트레이너.
// approach
운동 중 결정은 기기 안 엔진이.
휴식 시간·다음 세트 무게·횟수 같은 실시간 처방은 언어 모델 대신 TypeScript로 만든 기기 안 엔진이 계산합니다. 인터넷이나 서버 없이 폰 안에서 돌고, AI는 그 위에서 코칭·분석·대화를 맡습니다.
처방은 엔진이, 설명과 코칭은 AI가 맡습니다. 운동 중 결정에는 언어 모델이 끼어들지 않습니다.

분석 화면 · 엔진이 계산한 비율과 목표 일치도를, 판단 근거와 함께 보여줍니다
// key decisions
믿을 수 있는 코치를 만든 세 가지.
실시간 처방은 기기 안 엔진이
다음 세트 무게·휴식·진행 단계를 기기 안 엔진이 계산합니다. 인터넷이 끊기거나 서버에 문제가 생겨도 운동은 멈추지 않습니다. 처방 로직은 1,100개가 넘는 자동 테스트로 고정해, 앱이 바뀌어도 처방이 흔들리지 않게 했습니다.
AI는 코칭 보조 (비용까지 설계)
챗·세션 분석·주간 리포트는 AI가 맡습니다. 사용자가 늘어도 원가가 급격히 늘지 않게 비용 구조를 처음부터 설계했습니다. Pro 플랜은 한도에 닿아도 분석과 챗이 간단 모드로 계속 이어지고, 실시간 처방은 애초에 AI를 쓰지 않으니 그 축은 사용량과 무관합니다.
한 엔진으로 웹·Android·iOS·워치 둘까지
폰·태블릿·웹 화면과 처방 엔진은 같은 코드이고, 워치 둘은 그 엔진의 처방을 따르는 네이티브 앱입니다. 오프라인 우선 웹을 Capacitor 껍데기로 감싸고, 플랫폼마다 필요한 것만 직접 만든 네이티브 플러그인으로 붙였습니다. 건강 데이터 쓰기·삭제, GPS 트랙, 패스키, 위젯, 워치 연동은 생태계 플러그인이 없거나 부족해 자체 구현했습니다. 안드로이드는 Health Connect에 쓰고(삼성헬스가 이를 읽어 표시합니다), iOS는 HealthKit에 씁니다. 워치는 갤럭시 워치와 Apple Watch가 기능이 같고, Apple Watch는 사각 화면에 맞춰 다시 설계했습니다.
실시간 조절도 세밀합니다. 힘든 세트 뒤에 계획보다 훨씬 짧게 쉬었다면 다음 세트를 1회 줄이자고 제안하고, 컨디션이 나쁜 날은 수행이 떨어지는 신호를 더 일찍 잡아 볼륨을 낮춥니다. 드롭세트·디로드 같은 특수 세트는 강도 지표에서 걸러내 다음 처방에 섞이지 않게 했습니다. 모두 엔진이 기기 안에서 계산합니다.
// offline-first
인터넷 없이 도는 구조.
운동 기록·타이머·세트 처방이 전부 폰 안(로컬 DB + 엔진)에서 돕니다. 서버(Cloudflare D1)는 여러 기기를 맞추는 데만 씁니다. 그래서 사용자가 늘어도 운동 중 처방에는 서버 부하가 생기지 않습니다. 서버 일은 동기화와 AI 작업뿐이고, 이것도 대기열로 따로 돌립니다.
// exercise library
따라 할 수 있어야 처방입니다.
다음 세트를 정해 줘도 그 운동이 뭔지 모르면 따라 할 수 없습니다. 그래서 종목 라이브러리를 7,630종까지 넓히고, 3D 자세 시연과 근육 도해를 붙였습니다.
앱에는 2,795종을 기본으로 담고 나머지는 필요할 때 바로 받아 오며, 그래도 없는 운동은 직접 만들어 쓸 수 있습니다.
검색은 한글 오타를 잡습니다. 자모 축으로 편집거리를 재는 방식이고, 허용 오타 수는 감으로 정하지 않고 측정해서 정했습니다.
이 라이브러리는 로그인 없이 볼 수 있게 /exercise로 열어, 검색엔진이 종목 하나하나를 읽어 갑니다.
// trust
처방의 이유를 함께 보여 줍니다.
처방하는 앱은 왜 그 무게인지 설명할 수 있어야 합니다. 설명하지 못하면 사용자는 다음 세트에서 앱을 닫습니다. 그래서 설계의 한 축을 처방을 믿게 만드는 일에 썼습니다.
휴식 처방 옆에 이유를 답니다. 이유 문장은 엔진이 그 휴식을 정한 원인을 그대로 옮깁니다. 엔진이 계산한 값 옆에 그 값이 나온 이유가 붙으니, 오프라인 로컬 엔진이라는 결정이 사용자 눈에도 보입니다.
운동 이름은 정식 명칭을 기본으로 보여 주고, 길게 누르면 초보자가 알아들을 우리말로 바뀝니다.
처방 풀에 넣을 종목은 근거로 가르고, 그 기준이 흔들리면 배포가 막힙니다. 루틴의 칸을 채울 때도 트레이닝 전문 자료에서 그 종목을 다룬 횟수 같은 근거를 봅니다.
어젯밤 수면을 준비도 신호로 읽습니다. 남의 몸 데이터를 다루는 앱이라 권한도 코드로 지킵니다. 요청하는 권한과 실제 코드가 어긋나지 않도록 자동 검사가 매 배포 전에 대조하고, 쓰지 않는 건강 권한은 요청하지 않습니다.
좌우 차이는 관측해서 알려 줍니다. 굳어진 차이에는 무게를 깎는 대신, 설정에서 켠 상급자에게 약한 쪽부터 하는 순서를 제안합니다. 초보자에게는 좌우를 따로 재는 확인 세트를 내지 않습니다.
임신·산후 모드가 따로 있습니다. 해당될 수 있는 사용자에게만 묻고, 켜면 처방을 보수적으로 낮추고 종목별로 제외합니다.
아픈 곳은 위치와 그 운동이 거는 힘을 함께 보고 제외·교체·주의로 나눕니다. 주의로 남긴 운동은 세트 뒤에 아팠는지 묻고, 조금 아팠으면 무게를 올리지 않고 많이 아팠으면 한 칸 가볍게 내립니다. 진료가 먼저인 증상이 있다고 답하면 남겨 둔 운동까지 모두 뺍니다.
// result
두 스토어에 출시해 운영 중입니다.
Google Play 와 App Store 에 둘 다 출시했습니다(iOS 는 2026-09-12 공개). 워치 앱은 각 스토어 제출본에 함께 들어 있습니다. 웹에서도 정기결제를 붙였고 체험은 양쪽 모두 14일입니다. 온보딩에서는 장비와 아픈 곳을 그림으로 고릅니다.
처방 로직과 플랫폼별 동작은 자동 검사 9,300여 개로 확인하고, 웹 7개 화면 크기와 Android·iOS·Wear OS·watchOS 각각에서 검사를 통과한 판만 배포합니다. 갤럭시 S25와 아이폰·아이패드 실기기로도 반복 확인합니다.
// 이런 걸 만들어 드립니다.