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