BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2 或任何藍牙控制器,搭配 MyWhoosh、Rouvy、Zwift 等。iOS、Android、Windows、macOS 均可免費試用。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 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).