BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2,或任何藍牙控制器搭配 MyWhoosh、Rouvy、Zwift 等。可於 iOS、Android、Windows 與 macOS 免費試用。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
MeQ is a Thai-language web application for basketball courts at Naresuan University. It records team membership, court queues, check-in status, game results, player statistics, court calendars, and maintenance reports.
The deployment is being tested. Access through LINE may be limited by the LINE Login channel's tester and publication settings.
The application is undergoing multi-user testing.
• LINE Login is implemented.
• LINE notifications: queue calls for team members, new maintenance reports for admins, and status updates for reporters.檢視完整 README ↗MeQ is a Thai-language web application for basketball courts at Naresuan University. It records team membership, court queues, check-in status, game results, player statistics, court calendars, and maintenance reports.
Live demo: https://meq-starter-v01.vercel.app/
The deployment is being tested. Access through LINE may be limited by the LINE Login channel's tester and publication settings.
The application is undergoing multi-user testing.
Each court has its own queue. The 3x3 A and 3x3 B courts share the daily 3x3 target-score setting. A team or player cannot be active in more than one queue.
The match rules allow a winner to stay for at most two consecutive wins, rest for one game on the same court, and then return. A losing team has three minutes to requeue.
| Area | Technology |
|---|---|
| Web application | Next.js 16 App Router, React 19, TypeScript |
| Authentication | Supabase Auth with a custom LINE OAuth provider |
| Database | Supabase PostgreSQL |
| Authorization | Row Level Security, column grants, and role checks |
| Server operations | Next.js Server Actions and PostgreSQL RPC functions |
| File storage | Supabase Storage for maintenance evidence |
| Scheduled work | PostgreSQL scheduled jobs for database-owned deadlines |
| Deployment | Vercel |
| Tests and CI | Node test runner, pgTAP, GitHub Actions |
flowchart LR
U[Player, captain, or admin] -->|HTTPS| W[Next.js application on Vercel]
W -->|OAuth session| A[Supabase Auth]
A -->|Custom OAuth provider| L[LINE Login]
W -->|RLS-protected reads| D[(Supabase PostgreSQL)]
W -->|Validated RPC calls| D
W -->|Private evidence files| S[Supabase Storage]
D -->|Expiry processing| C[PostgreSQL scheduled jobs]
C --> D
The browser receives a Supabase session cookie and uses the publishable key. Service-role credentials are not exposed to browser code.
PostgreSQL is the source of truth for team membership, queue position, check-in deadlines, games, score submissions, and player history. Queue transitions and game finalization are handled by database functions so the client cannot choose its own queue position, role, timer, or result.
Important database rules include:
RLS controls table access for signed-in users. Operations that change team, queue, game, or score state use RPC functions that check auth.uid() and the caller's role inside a transaction. Admin access is represented by the role stored in profiles and is checked again by admin operations.
Maintenance images are stored in a private Storage bucket. The database stores the object path rather than image data.
LINE Login is implemented through Supabase Auth using the custom:line provider. When Supabase creates an auth user, a database trigger copies available LINE display-name and avatar metadata into the MeQ profile.
LINE notifications are sent through a database outbox. Setup steps are in docs/architecture/line-notifications.md.
Asia/Bangkok and start at 05:00.Install dependencies before running the checks:
npm ci
npm run typecheck
npm run lint
npm run build
npm run test:unit
Database tests require Docker and the local Supabase stack:
npx supabase start
npx supabase db reset --local --no-seed
npm run test:db
GitHub Actions runs type checking, linting, a production build, unit tests, and pgTAP database tests for pushes and pull requests to main.
The current automated tests cover rule helpers, admin validation, production-surface checks, team and location rules, database privileges, team membership, queue management, and a full 3x3 database flow.
Requirements:
Create a local environment file from .env.example and set these runtime values:
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=
NEXT_PUBLIC_APP_URL=http://localhost:3000
The LINE provider and its callback URL must also be configured in the connected Supabase project and LINE Developers console.
Start the application:
npm ci
npm run dev
Open http://localhost:3000.
app/ Next.js routes, pages, and server actions
components/ UI components
lib/ Business rules and Supabase repositories
supabase/migrations/ Database schema, RLS policies, and RPC functions
supabase/tests/ pgTAP database tests
tests/ TypeScript rule and production-surface tests
docs/requirements/ Product and queue rules
docs/architecture/ Backend boundaries and implementation notes
docs/diagrams/ Queue, team, game, auth, and database diagrams
Start with these documents when reviewing the repository:
docs/requirements/queue-rules.md for queue and match requirementsdocs/architecture/supabase-foundation.md for the implemented backend boundarydocs/diagrams/README.md for the diagram index