BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2 或任何藍牙控制器,搭配 MyWhoosh、Rouvy、Zwift 等。iOS、Android、Windows、macOS 均可免費試用。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Webapp (PWA) cho CLB chạy bộ CLR: đăng nhập bằng Strava, thống kê, challenge, thưởng phạt, event, quỹ. Kế hoạch và tiến độ nằm trong plans/.
Yêu cầu: Node 24 (nvm use), Docker (cho Supabase local).
npm ci
cp .env.example .env.local
npx supabase start # in ra URL và key local, điền vào .env.local
npx supabase db reset # chạy migration + seed
npm run dev # http://localhost:3000
Trang kiểm tra (chỉ có khi chạy dev): /dev/theme (bảng màu), /dev/db (đọc bảng settings).
Kiểm tra trước khi commit: npm run typecheck && npm run lint && npm test.
Sinh lại kiểu DB sau khi đổi schema: npm run db:types (ghi src/lib/types/database.generated.ts, không sửa tay). Code import Database từ @/lib/types/database, file này thu hẹp các cột text có check constraint thành union; thêm giá trị vào constraint thì sửa union ở đó.
Tự động: khi merge vào main có file mới trong supabase/migrations/, workflow Migrate production chạy supabase db push lên project production. Cần 3 secret trong GitHub (Settings → Secrets and variables → Actions): SUPABASE_ACCESS_TOKEN (tạo ở supabase.com/dashboard/account/tokens), SUPABASE_DB_PASSWORD (mật khẩu database của project production), SUPABASE_PROJECT_REF (project ref của clr). Có thể chạy lại tay ở tab Actions.
Preview (clr-preview) vẫn chạy tay:
npx supabase login
npx supabase link --project-ref <project-ref-preview>
npx supabase db push
Migration chỉ thêm file mới (supabase/migrations/000N_*.sql), không sửa file đã chạy.
Vercel: preview cho mỗi PR, production từ main. Biến môi trường khai báo theo .env.example (URL công khai là APP_URL, không có tiền tố NEXT_PUBLIC_), tách Preview và Production (Preview dùng project Supabase riêng).
STRAVA_WEBHOOK_VERIFY_TOKEN và CRON_SECRET trên Vercel (Production và Preview), thêm secret APP_URL và CRON_SECRET vào GitHub Actions để workflow Strava cron gọi /api/cron/*.npm run strava:subscribe -- create (đọc .env.local; Strava gọi GET /api/strava/webhook để xác thực). list xem subscription, delete <id> xoá. Mỗi app Strava chỉ có một subscription.img.clr.vn), tạo API token quyền Object Read & Write cho đúng bucket.R2_ACCOUNT_ID, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_BUCKET, R2_PUBLIC_BASE_URL trên Vercel (Production và Preview).[
{
"AllowedOrigins": ["https://<domain-app>", "http://localhost:3000"],
"AllowedMethods": ["PUT", "GET"],
"AllowedHeaders": ["Content-Type"],
"MaxAgeSeconds": 3600
}
]
Ảnh event nằm dưới events/{eventId}/; ảnh giấy chứng nhận (task 5.2) sẽ dùng prefix riêng.