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분 만에 확인하기Tournament app
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
The competition engine of the NMAO suite — a monthly, video-based martial arts tournament. Competitors submit an event video each round; an automated engine sorts them into fair divisions and skill-based pods, routes videos to judges, scores them, updates ratings and standings, and ships collectible medals. A season runs 9 qualifying rounds → semi-finals → grand finale.README 전문 보기 ↗The competition engine of the NMAO suite — a monthly, video-based martial arts tournament. Competitors submit an event video each round; an automated engine sorts them into fair divisions and skill-based pods, routes videos to judges, scores them, updates ratings and standings, and ships collectible medals. A season runs 9 qualifying rounds → semi-finals → grand finale.
Backend is Supabase (Postgres + Auth + Edge Functions + Storage). The engine is a pure, DB-free, unit-tested core wrapped by idempotent edge functions keyed by (round_id, step) — the same core powers live runs and the operator preview.
README.md This file
docs/
NMAO-suite-handoff.md Master orientation for the whole 3-product suite
engine-spec.md Full tournament engine spec (state machine, pipeline, overrides)
scoring-and-rating.md Plain-language, auditable spec of scoring + the locked rating rule
project-log.md Living log: locked decisions, parked ideas, open items
supabase/
migrations/ Ordered, reconciled set — apply in filename order
20260804000000_base_reference_people.sql 1/3 reference + people/org (schools, competitors,
guardians/COPPA consents, judges[+school_id], staff)
20260805120000_tournament_engine.sql 2/3 engine (seasons, division_schemes, rounds, divisions,
pods, entries, judge_assignments, results, step-runs, audit)
20260806000000_ratings_finance_recognition.sql 3/3 skill_ratings (seed 50), rating_history, medals +
medal_shipments, payments, payouts, content_reports, season_results
20260807000000_rls_policies.sql 4/4 per-role Row-Level Security: competitor/guardian/judge/
staff scoping + public reference/structure; engine via service role
functions/
_shared/
divisioning.ts Step 3 core: classify → collapse → formPods → runDivisioning
assignments.ts Step 4: per-video judge assignment (1/3, own-school exclusion)
rating.ts Step 4: resolve (score→placement) + LOCKED same-rank rating
distribute.ts Step 4: medal ship list (one shipment per school)
roundState.ts Step 4: round state machine + §4 guardrails
engine.ts Step 4: idempotent orchestration over an EngineStore seam
supabaseStore.ts Supabase (Deno) EngineStore adapter — not run by npm test
*.test.ts 93 assertions total across the cores
round-controller/
index.ts Edge entrypoint: run a step (or the tail) for a round
mission-control/
index.html Operator dry-run console (seeded data, real engine) — open in a browser
Migrations reconciled (2026-08-06): the earlier forked
001schema was split into the three ordered files above (base → engine → ratings/finance). The engine schema is the source of truth for competition structure; ratings/finance/recognition were repointed onto the engine'srounds/entries/divisions;judges.school_idand amedal_shipmentstable were added. Verified to apply clean in order against Postgres (PG16) with all foreign keys resolving.
(round_id, step). The Supabase adapter + round-controller edge function wire the pure cores to the DB.mission-control/index.html).npm test runs 93 assertions, all passing (divisioning 24, rating 21, assignments 11, distribute + state machine 19, engine orchestration 18).
Open before a live DB run: confirm the identity→role model the RLS policies assume (auth users linked via auth_user_id; guardians act for their competitors; the school app has no school↔auth mapping yet, so school data is staff-only for now), stand up a Supabase project + env for the round-controller edge function, and design the video storage/moderation pipeline. Schema reconciliation, judges.school_id, medal_shipments, and per-role RLS policies are done (RLS row-isolation validated against Postgres with test users for each role).
See docs/engine-spec.md for the pipeline and docs/scoring-and-rating.md for exactly how every score and rating is produced.
Requires Node 18+ (uses tsx to run the TypeScript tests directly).
npm test
Expected: each suite prints N passed, 0 failed.
Open mission-control/index.html in any browser — no build step. Seed competitors/schools/judges, edit the Division Scheme, simulate, then advance a round through the full state machine (classify → … → distribute) and watch pods, judge assignments, results, rating deltas, and the per-school medal ship list. Its embedded engine mirrors the locked cores.
Pod floor 6 · rank tiers beginner/intermediate/advanced · age brackets 7-9, 10-12, 13-15, 16-17, 18+ · pods cap 20, split at 22 · collapse merges nearest rank then age, never across events · judging 1 judge (beginner/intermediate) or 3 (advanced) · 3-judge score = straight average · tiebreak = highest single-judge score then earliest submission · incomplete pod = reopen to judge pool, never force-resolve.
Rating (locked): every competitor seeds at 50 on a 0–100 scale; rating moves on placement, measured only against same-rank podmates; K = 8 for a competitor's first 3 rounds then 4; clamped 0–100; used only to form pods within a rank bracket — it never crosses ranks (that's a real dojo promotion via declared_rank). Full formula + worked examples in docs/scoring-and-rating.md.