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.
Kostenlose Mannschafts-App für Vereine: Zu- und Absagen, Kader, Chat, Helferdienste, Fahrgemeinschaften. Open Source, eigene Installation, ohne Passwörter.
Translation pending
Sports & fitnessTypeScript · JavaScriptGitHub @witscherOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Free team app for amateur sports clubs: responses, squads, chat, helper duties, carpools. Own installation on Cloudflare, invitation only, passkeys.
Translation pending
Loading the full README.
Read the full 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.