BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A personal workout tracker for a fixed weekly plan: open it at the gym, log your sets, and let it
tell you what you lifted last time. Everything is stored locally in your browser — no account, no
backend, no data leaving your device.README 전문 보기 ↗A personal workout tracker for a fixed weekly plan: open it at the gym, log your sets, and let it tell you what you lifted last time. Everything is stored locally in your browser — no account, no backend, no data leaving your device.
Live: https://rep-track-ten.vercel.app
Next.js 16 (App Router, React 19, static prerender) · Tailwind CSS v4 · shadcn/ui (base-nova on Base UI) · Recharts · TypeScript · vitest · oxlint + oxfmt · pnpm. Originally scaffolded with v0.app.
Every route is statically prerendered and all training state lives in localStorage (treated as
a trust boundary — stored payloads are runtime-validated on load). The only server-side work is
fetching exercise metadata from the WWWorkout catalogue, revalidated hourly (ISR); set
WWWORKOUT_URL to point at another catalogue instance (default https://wwworkout.vercel.app).
pnpm install
pnpm dev # http://localhost:3000
| Command | What it does |
|---|---|
pnpm build / pnpm start | production build / serve it |
pnpm test | vitest unit tests (pure logic in lib/) |
pnpm typecheck | tsc --noEmit |
pnpm lint / pnpm lint:fix | oxlint |
pnpm format / pnpm format:check | oxfmt |
pnpm perf:bundle | per-route bundle drift vs the recorded baseline (after pnpm build) |
pnpm perf:latency | TTFB percentile smoke against $PERF_BASE_URL |
pnpm catalog:sync | refresh the offline catalogue snapshot from WWWorkout |
CI runs formatting, linting, type-checking and tests on every push and pull request, alongside three scanning layers: a production dependency audit, CodeQL static analysis (SAST), and a gitleaks secrets scan. Performance checks live in perf/, deliberately outside the CI test path.
The workout plans are data, not UI. Each plan is one module —
lib/plan-barbell-strength.ts,
lib/plan-dumbbell-hybrid.ts — holding a WorkoutDay[]; edit one to
change days, exercises, or targets (or build your own in the Planner, no code needed). To add a plan, write a third module, register it in
lib/plans.ts, and add its selector pair to the reveal rule at the bottom of
app/globals.css.
Two identifiers are load-bearing:
(dayId, calendar date), so renaming a
day id detaches every session already logged under it. Ids must also be unique across plans.pnpm catalog:sync to refresh the bundled snapshot
(lib/catalog-snapshot.json) used when the catalogue is unreachable.Data-integrity tests in lib/workouts.test.ts and lib/plans.test.ts guard all of it; custom plans
built in the Planner are validated by lib/custom-plans.ts (tests in lib/custom-plans.test.ts).
All training data stays in your browser's localStorage. There is no sync and no tracking of
your training data; the only way it leaves the device is the backup file you export yourself.
The only network request the app's server makes is fetching the public exercise catalogue from
WWWorkout (refreshed hourly) — it sends nothing about you or your training. Device preferences —
active plan, theme, units, rest length — live in localStorage too and are deliberately not part
of the backup file, which holds sessions and custom plans only. Browsers may evict local storage under pressure —
export a backup now and then (the app reminds you).