BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2 或任何藍牙控制器,搭配 MyWhoosh、Rouvy、Zwift 等。iOS、Android、Windows、macOS 均可免費試用。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A small live-scoring site for a knockout bowls competition:
• 4 qualifying nights, 16 players each, single-game-to-21 knockout, top 4 per night advance
• Finals day: the 16 qualifiers, knockout to one winner
• You enter the draw and update scores live from your phone (Android is fine, it's just a website)
• Anyone with the link sees live scores, updating automatically
• Next.js (React) — the website itself
• Supabase — Postgres database, login for you as admin, and realtime updates for viewers
• Jest — unit tests for the bracket logic查看完整 README ↗A small live-scoring site for a knockout bowls competition:
supabase/schema.sql, and run it. This creates the nights, players, and matches tables, sets up permissions, and turns on realtime.supabase/seed.sql, and run it. This creates the competition's 5 nights (Monday–Thursday qualifying plus Finals Day) with fixed names and display order, so they immediately show up as nav links on the public site. Safe to skip or re-run — it won't duplicate a night whose name already exists./admin.cp .env.local.example .env.local
Open .env.local and fill in the two values from Supabase:
NEXT_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-public-key
npm install
npm run dev
Visit http://localhost:3000 for the public site, http://localhost:3000/admin to log in and manage nights.
npm test
This runs the bracket-logic unit tests in __tests__/bracket.test.js.
The easiest option is Vercel (made by the same people as Next.js, free for this kind of project):
.env.local.bowls-live.vercel.app you can share with players, and use on your phone for admin./admin and log in. The 5 nights from supabase/seed.sql are already there — no need to create them./admin/night/[finals-day-id]) without adding them yourself. This works as qualifiers come in from different nights on different days; each just slots into their number. Drag their name to a different number any time to move them — no need to reset anything, and it updates their match instantly, even after Finals Day's bracket has started.A couple of things worth knowing:
app/
page.tsx Public homepage — list of nights
night/[id]/page.tsx Public live bracket view for one night
admin/
login/page.tsx Admin sign-in
page.tsx Admin dashboard — create/list nights
night/[id]/page.tsx Admin editor — players, draw, live scoring
lib/
bracket.ts Pure bracket logic (round names, winners) — unit tested
adminActions.ts Supabase writes: create night, generate bracket, score, etc.
supabaseClient.ts Supabase browser client
types.ts Shared row types
supabase/
schema.sql Database schema — run this once in Supabase's SQL editor
seed.sql Creates the 5 competition nights with fixed names/order — run once after schema.sql
components/
NightNav.tsx Shared top nav of all 5 nights, used on the public homepage and night pages
__tests__/
bracket.test.js Jest tests for lib/bracket.ts