BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2,或任何藍牙控制器搭配 MyWhoosh、Rouvy、Zwift 等。可於 iOS、Android、Windows 與 macOS 免費試用。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Solo bodyweight agility trainer — random exercises, EN/IT, Web Audio, speech, mobile-first static web app.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Single-page mobile-first web app that cycles through random bodyweight agility exercises (English or Italian), with Web Audio transition beeps, optional speech synthesis, category filters, configurable pace and session length, and settings persisted in localStorage.
Design tokens follow a ui-ux-pro-max design-system pass (fitness / vibrant palette: Barlow + Barlow Condensed, primary #DC2626, soft rose background).
You do not need Node or npm installed on your machine.
Explanations appear only during a workout, under the heading “How to do it” (English) or “Come fare” (Italian), below the big exercise name. If you still see the old layout, do a hard refresh so the browser loads the latest index.html, styles.css, and js/app.js.
Open a terminal on your machine.
Go to the project directory (adjust the path if yours differs):
cd /Users/carlo/Documents/lavoro/kiwifarm/octopus_lab/scratch/games/agility_trainer
Build the nginx runtime image (tag name is arbitrary but must match podman run):
podman build -t agility-trainer .
Run the container with the project folder mounted as the web root. Without this volume, nginx serves an empty site and you will not see the app or explanations.
Linux (SELinux):
podman run --rm -p 8080:80 \
-v "$(pwd):/usr/share/nginx/html:ro,Z" \
agility-trainer
macOS (omit :Z if you get permission or mount errors):
podman run --rm -p 8080:80 \
-v "$(pwd):/usr/share/nginx/html:ro" \
agility-trainer
Leave this terminal open while you test. The server runs in the foreground until you stop it with Ctrl+C.
Optional checks
If port 8080 is busy, pick another host port, e.g. -p 9090:80 and open http://localhost:9090.
To confirm the mount from inside the container (second terminal):
podman ps
podman exec -it <CONTAINER_ID_OR_NAME> ls -la /usr/share/nginx/html
You should see index.html, styles.css, and a js/ directory.
Use HTTP, not file:// — open:
http://localhost:8080
(Use the same port you mapped in podman run.)
Hard refresh once so cached old assets are dropped:
Configure and start
Where the explanation is
js/exercises.js): a card titled “How to do it” / “Come fare” and the step text. Scroll the page if needed; on narrow phones, Pause / Stop stay fixed at the bottom.If there is still no explanation
js/app.js returns 200 (not an old CDN or offline cache).--rm flag removes the container when it exits.The runtime image is vanilla nginx with no app files baked in. Mount this directory read-only as the document root:
podman build -t agility-trainer .
podman run --rm -p 8080:80 \
-v "$(pwd):/usr/share/nginx/html:ro,Z" \
agility-trainer
Open http://localhost:8080 — or use the hosted build at https://efficacious-fold.surge.sh/.
On macOS, omit :Z if SELinux labels cause trouble:
podman run --rm -p 8080:80 -v "$(pwd):/usr/share/nginx/html:ro" agility-trainer
Installs dev dependencies and writes reports into ./coverage/ on your host:
podman run --rm \
-v "$(pwd):/app:Z" \
-w /app \
docker.io/node:22-alpine \
sh -lc 'npm ci --ignore-scripts && npm test && npm run test:coverage'
On macOS you can omit :Z if you hit permission issues:
podman run --rm -v "$(pwd):/app" -w /app docker.io/node:22-alpine \
sh -lc 'npm ci --ignore-scripts && npm test && npm run test:coverage'
Coverage output is gitignored (coverage/).
The test stage bind-mounts the build context and copies sources into a tmpfs sandbox (no COPY in the Dockerfile, no node_modules on your host). Coverage output stays inside the build container unless you use the mounted-workspace command below instead.
podman build --target test -f Containerfile .
Requires a builder that supports Dockerfile 1.6 RUN --mount= (Podman 4.2+ / recent Docker BuildKit).
Same as production run: keep the volume mount, edit files locally, refresh the browser — no image rebuild needed for static changes.
gh)Source repo: carlok/agility-trainer. Public demo: https://efficacious-fold.surge.sh/.
Set the GitHub Website field (shown in the repo “About” sidebar) to the Surge URL:
gh repo edit carlok/agility-trainer --homepage https://efficacious-fold.surge.sh/
The description line can stay aligned with the app, for example: Solo bodyweight agility trainer — random exercises, EN/IT, Web Audio, speech, mobile-first static web app. (gh repo edit --description "..." if you change it.)
If you fork or rename the repo, update REPO_URL and LIVE_URL in js/app.js and this README.
cd /path/to/agility_trainer
git init
git add .
git commit -m "Initial commit: Agility Trainer MVP"
Install and log in once: GitHub CLI (gh auth login).
Create YOUR_USERNAME/agility-trainer with a public description and push the current folder:
gh repo create agility-trainer \
--public \
--description "Solo bodyweight agility trainer — random exercises, EN/IT, Web Audio, speech, mobile-first static web app." \
--source=. \
--remote=origin \
--push
carlok, ensure gh is authenticated as that user (or use gh repo create carlok/agility-trainer ... if your token may create repos there).--description alone.Home returns to session setup (stops an active workout), GitHub opens the repo, About / Credits open lightweight dialogs; strings follow English / Italian like the rest of the app.
| Path | Role |
|---|---|
index.html | Page shell, skip link, hamburger nav + About/Credits dialogs |
styles.css | Design tokens, responsive layout, prefers-reduced-motion |
js/exercises.js | Exercise pool + categories (EN/IT) |
js/engine.js | Filtering, random pick with anti-repeat, clamps |
js/settings.js | Defaults + localStorage (de)serialization |
js/audio.js | Web Audio beep |
js/speech.js | speechSynthesis wrapper |
js/app.js | DOM, timers, session flow |
tests/ | Vitest unit tests |
package.json / package-lock.json | Dev dependency manifest (used inside Node container only) |
Containerfile | Multi-stage: test (Node + bind-mounted context) + runtime (nginx only; app via volume) |
.containerignore | Keeps image/test contexts lean |
prompts/original.md | Product spec |
For general movement guidance only. Stop if you feel pain, dizziness, or shortness of breath.