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.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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