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.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Soccer team management: rosters, a drag-and-drop tactical board, match and substitution planning. Becoming Rostr Coach.
翻訳待ち
Loading the full README.
Read the full README ↗Try it: matchday-advt.onrender.com · Create a free workspace
Head coaches can create their own private workspace for free. Matchday is becoming Rostr Coach. The first visit after a quiet period can take up to a minute while the server wakes up.
Built by Rostr EdTech: custom software designed around your process. Source published for transparency; see LICENSE.
Status lives in TODO.md, not here. This file only covers setup/usage — see
TODO.mdfor what's built so far and what's next, andCONTEXT.mdfor the architecture and why it's built this way.
A soccer team-management platform with two sides:
/portal) to see their team(s) and any feedback a coach has
chosen to share.Each head coach who signs up gets their own independent, private workspace — their own teams, athletes, and lineups, invisible to every other coach's workspace by default. A head coach can explicitly grant a colleague assistant coach access to one or more of their specific teams for real collaboration; that grant never widens beyond the teams it names.
Forked from class_copilot — see CONTEXT.md for the full domain mapping and why
that base (not the CRM root both class_copilot and college-counseling forked from) was reused here.
Kept fully independent: its own repo, own database, no shared runtime with class_copilot or the
student-check-in app (Rostr).
| Role | Sees | Can do |
|---|---|---|
| Head Coach | Their own workspace only — teams/athletes they created, plus any team an explicit assistant-coach grant gives them | Manage their own teams & athletes, assign assistant coaches, generate athlete invite links, the tactical board, the match planner, manage their own assistant-coach accounts |
| Assistant Coach | Only the teams they're assigned to (or every team taught by the one head coach who created their account, if granted all-access — never platform-wide) | Manage rosters, build lineups, and plan matches for their assigned teams only |
| Athlete | Only their own data, via /portal | See their own team(s) and any feedback a coach chose to share |
An athlete gets portal access via a one-time invite link a coach generates (they choose their own email/password when they open it) — a coach never sets or sees an athlete's password.
The app is local-first: it runs entirely on a local SQLite database with seeded demo data.
cd matchday
npm install
# Create your local env (SQLite + a generated AUTH_SECRET):
cp .env.example .env
node -e "console.log('AUTH_SECRET=\"'+require('crypto').randomBytes(32).toString('hex')+'\"')"
# → paste that AUTH_SECRET into .env (DATABASE_URL is already file:./dev.db)
npm run db:push # create the SQLite schema
npm run db:seed # head coach + 2 assistant coaches + 2 teams + 18 demo athletes
npm run dev # http://localhost:3000
npm run build compiles the whole app; npm run db:reset wipes + reseeds (destructive — only ever
run this against your local dev database).
ChangeMe123! for all)| Role | |
|---|---|
| Head Coach | [email protected] |
| Assistant Coach | [email protected] (Varsity) / [email protected] (JV) |
| Athlete | [email protected] / [email protected] / [email protected] / [email protected] |
Several demo athletes are seeded without a portal login, to demonstrate the "athlete exists before
being invited" state. Or go to /signup to create a brand-new, separate coach workspace of your own
instead of using the seeded one.
Bulk athlete-invite emails (the "Send invite links to all" button on a team's roster page) need a
Gmail address + App Password added from /admin/settings — without one, invite links still work
fine, a coach just shares them manually.
/admin/teams/[id]) — add athletes to a team, set positions/jersey numbers/injury
status./teams/board) — pick a formation, drag athletes from the bench onto a slot,
drag one slot onto another to swap, drag a slot back to the bench to unassign. Save multiple
named lineups per team./teams/matches) — schedule a match (opponent, date, number/length of periods)./teams/matches/[id]/plan) — for each period, start from a saved lineup (or
carry over who was on at the end of the previous period), then log substitutions (player off,
player on, minute). A running total-minutes-per-athlete panel flags anyone who hasn't played yet./teams/attendance) — start a practice and every active roster athlete defaults
to Present; tap a name to cycle Present → Late → Absent. "Mark all present" resets the whole
list in one tap.Next.js 15 (App Router) · React 18 · TypeScript · Tailwind + a hand-built shadcn-style UI kit · Prisma (SQLite local / Postgres-ready) · custom JWT auth (jose + bcrypt) · Zod · lucide-react.
This is the beginning of the README. Read the rest at the original. Read the full README ↗