BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2,或任何藍牙控制器搭配 MyWhoosh、Rouvy、Zwift 等。可於 iOS、Android、Windows 與 macOS 免費試用。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Free team app for amateur sports clubs: responses, squads, chat, helper duties, carpools. Own installation on Cloudflare, invitation only, passkeys.
翻譯準備中
正在載入完整 README。
檢視完整 README ↗Find Kabine useful? Consider giving the repo a ⭐ to support development.
Deutsch: README auf Deutsch
A self-hosted team app for amateur sports clubs that runs entirely on Cloudflare, with no server to run and nothing to pay on the free plan.
Trainings and games with yes/no responses, squads, team chat, push notifications, helper duties and carpools, for players, parents and coaches. Each club deploys its own copy into its own Cloudflare account with one click.
Try the demo, no sign-up: as a player · as a parent · as a coach · as an admin
It started as the app of a handball club, where several hundred players, parents and coaches use it every day. The demo and all pictures show an invented club; more in docs/screenshots.
git clone https://github.com/witscher/kabine && cd kabine
npm ci # Node.js 22 or newer
npm run secrets:generate -- --dev # local secrets in .dev.vars
npm run db:reset:local # local database with the invented demo club
npm run dev # http://localhost:5173
The first admin is set up at /einrichtung#<ADMIN_BOOTSTRAP_TOKEN> (see .dev.vars). npm run check runs the typecheck and all tests, npm run e2e the Playwright suite.
To run it for a club, use the Deploy button above: it creates the copy and all resources, and the free plan is enough for a typical club. Step by step: docs/install.md; running it (backups, season change, updates): docs/operation.md.
flowchart LR
app["PWA (Preact)<br/>installable, offline view"] -- "HTTPS / WebSocket" --> worker["Worker (Hono)<br/>API, passkeys, static assets"]
worker --> d1[("D1<br/>club data")]
worker --> kv[("KV<br/>logo, switches")]
worker --> chat["Durable Objects<br/>team chat, live helper plans"]
worker --> queue["Queue"] --> push["Web Push (VAPID)"]
cron["Cron, hourly"] --> worker
.po files anyone can correct.Built with TypeScript, Hono, Preact and Lingui. Architecture: docs/dev/architecture.md; design and decisions: docs/dev/design.md, docs/dev/decisions.md.
Optional modules: helper duties, youth referees, carpools, game schedules from handball4all (German handball), SMS codes and reminders.
One installation per club, in the club's own Cloudflare account: there is no central server, and the authors of Kabine have no access to any club's data. It is invitation-only, not in the app stores, and stores only what a team needs week by week. The full data inventory, deletion periods and a privacy policy template are in docs/privacy.md; questions about costs, GDPR and why Cloudflare are answered on kabine.dev.
The repository is built for contributions made with a coding agent (Claude Code, Codex, Cursor, …): every contribution is a folder or a file of its own, a generator creates the skeleton, and contract tests show at once what is missing. Good places to start:
| Add | Command |
|---|---|
| A sport (age groups, playing times, typical helper duties) | npm run new -- sport basketball --name "Basketball" |
| Game schedules from an association's system (nuLiga, SAMS, …) | npm run new -- connector nuliga --vendor "nuLiga" --domain nuliga.example --sport handball |
| A function clubs can switch on | npm run new -- module polls --label "Polls" --label-de "Umfragen" |
| A language or a better translation | docs/dev/translation.md |
The entry point for people and agents is AGENTS.md. A person sends the pull request, has tried it locally and answers questions. Ideas and requests: issues; security problems: SECURITY.md.
AGPL-3.0-only, see LICENSE. You may run, change and share Kabine. If you run a changed version for others, you must offer them its source code.
If Kabine is useful to you or your club, a ⭐ helps others find it.