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.
클럽 경기 전체 일정·핸디캡·대진표·실시간 순위와 각 선수 카드·보드·스킨·정산을 휴대폰에서
Flights, handicaps, brackets and live standings for a club's whole competition — with every player's card, board, skins and settle-up on their own phone.
스포츠·피트니스TypeScript · JavaScriptGitHub @GHajaymore온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
From tee to trophy.
Production build of the golf tournament management console described in
design_handoff_golf_tournament_console/.
A console for running a multi-stage golf event end to end: registration →
flights → round-robin/stroke rounds → qualification → brackets → live standings.
Built with Next.js (App Router) + TypeScript, Prisma + SQLite, a pure
(dependency-free, unit-tested) tournament engine, and the design system
(src/app/design-system.css) ported verbatim from the handoff.
Sign-in is real email + password (src/app/actions/auth.ts), not a demo
picker. From a fresh seed:README 전문 보기 ↗From tee to trophy.
Production build of the golf tournament management console described in
design_handoff_golf_tournament_console/.
A console for running a multi-stage golf event end to end: registration →
flights → round-robin/stroke rounds → qualification → brackets → live standings.
Built with Next.js (App Router) + TypeScript, Prisma + SQLite, a pure
(dependency-free, unit-tested) tournament engine, and the design system
(src/app/design-system.css) ported verbatim from the handoff.
npm install
npm run db:push # create the SQLite schema
npm run db:seed # load the Demo Cup pilot (32 players, 8 groups)
npm run dev # http://localhost:3000
Sign-in is real email + password (src/app/actions/auth.ts), not a demo
picker. From a fresh seed:
RESEND_API_KEY in .env to actually send it; without a key the link is
logged to the server console instead so local dev still works end to end.Organizers can preview the player view with the "Viewing as" switch in the
sidebar, and switch between every tournament their email has access to from
/choose.
| Script | Purpose |
|---|---|
npm run dev | Start the dev server |
npm run build / npm start | Production build / serve |
npm test | Run the tournament-engine unit tests (Vitest) |
npm run typecheck | tsc --noEmit across the app |
npm run db:push | Push the Prisma schema to the database |
npm run db:seed | Seed the Demo Cup pilot data |
npm run db:reset | Reset + reseed |
npm run db:studio | Open Prisma Studio |
src/
lib/domain/ Pure tournament engine — no framework/DB deps, fully unit-tested
match.ts match-play resolution from holes[] (3&2 / AS / N UP)
standings.ts aggregation, configurable tiebreaker chain, ranking, cutoff
grouping.ts snake-draft group formation
schedule.ts round-robin schedule (circle method)
bracket.ts 8-seed bracket seeding [1,8,4,5,3,6,2,7] + advancement
carry.ts stage carry-forward
lib/db.ts Prisma client singleton
lib/auth.ts Signed-cookie sessions, scrypt password hashing, role model
lib/courses.ts Built-in course presets + resolveCourse/hasCourseData (custom courses)
lib/email.ts Resend wrapper (password reset emails; logs the link if unconfigured)
lib/services/ Server read model (loadEventState) + regroup service
app/ Next.js App Router — one route per screen
(app)/… authenticated console (sidebar shell)
actions/ server actions (mutations)
reset-password/ public route for the emailed reset link
components/ Client components for the interactive screens
prisma/
schema.prisma Data model (Event, Account, User, Player, Group, Stage, Match,
Scorecard, MatchScorecard, PasswordResetToken, …)
seed.ts Demo Cup seed
Standings are always derived, never stored: every screen recomputes from the
match holes[] data through src/lib/domain, exactly as the handoff specifies.
The same engine powers the seed script, so demo data matches production behavior.
Landing/sign-in/signup/forgot-password · Tournament picker (/choose) ·
Dashboard · Event setup · Registration & field · Rounds & format · Flights &
divisions · Access & staff · Tee sheet & pairings · Scorecards · Score entry
(hole-by-hole tap, gross scorecard with automatic net-of-handicap match-play
scoring, match-result entry, and voice dictation for all three) · Qualification ·
Bracket manager · Announcements · Prizes & payouts · Live leaderboard ·
Reports/export.
Enforced server-side in src/lib/auth.ts / page-helpers.ts (PLAYER_SCREENS,
ADMIN_ONLY_SCREENS), not just hidden in the nav. One User (one email, one
password) can hold an Account — and therefore a role — on any number of
events; /choose lists every event a signed-in email has access to.
datasource.provider in prisma/schema.prisma to
postgresql and set DATABASE_URL. No app code changes — all access goes
through the repository/service layer.getSession() contract).RESEND_API_KEY (and ideally a verified
sending domain via RESEND_FROM_EMAIL) in production — see src/lib/email.ts.Event, not per-round or per-match. A month-long round robin played
across multiple clubs would need that moved onto Stage (or Match) —
not yet scoped.ios/,
android/ — see their READMEs. .github/workflows/ios-testflight.yml and
android-release.yml build and ship to TestFlight/Play Console from
GitHub-hosted runners (no local Mac needed); both need App Store
Connect/Play Console setup and several secrets first — see the comments at
the top of each workflow file. Neither has run against real credentials
yet, so expect to iterate once real CI logs are available.electron/
(npm run electron:build); a signed download link for it is still open.See design_handoff_golf_tournament_console/README.md
for the full domain spec this build implements.
An AjAi Labs creation.