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.