Long Run Club
Our marathon training leaderboard.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Interactive soccer play builder and animator
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗An interactive web tool to create, animate, and share tactical soccer patterns of play — an animated whiteboard for coaches. Drag players on an SVG pitch, draw passes and runs, add step-by-step narration, preview the animation at 60fps, then save and share a link.
requestAnimationFrame loop.npm install
cp .env.local.example .env.local # fill in your Supabase project values
npm run dev # http://localhost:3000
| Variable | Description |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Your Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Your Supabase anon (public) key |
The app works without a database — the editor runs and a banner reads "Database not configured — plays won't be saved." Saving is disabled until you configure Supabase:
supabase/migrations/001_initial.sql, then supabase/migrations/002_mvp_open_access.sql (MVP has no auth, so 002 opens read/write to the anon key; tighten it when sign-in lands)..env.local (locally) and the Vercel project's Environment Variables (then redeploy — NEXT_PUBLIC_* values are inlined at build time):
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYAPI: GET/POST /api/plays, GET/PUT/DELETE /api/plays/:id (503 when the database isn't configured).
npm run dev # dev server
npm run build # production build
npm run typecheck # tsc --noEmit
npm run test # vitest run
npm run test:watch # vitest watch mode
npm run lint # eslint
src/
app/ # App Router pages
page.tsx # home
library/ # browse public plays
play/[id]/ # public play viewer
editor/ # play editor (auth required), editor/[id] edits existing
api/plays/ # REST API: list/create + get/update/delete
components/
editor/ # PitchEditor, StepSequencer, NarrativePanel, toolbars…
viewer/ # AnimatedPitch (animation engine), PlayControls, StepNarrative
library/ # PlayCard, PlayGrid, PlayFilters
layout/ # Header, AuthButton
ui/ # shadcn/ui components
lib/
engine/ # physics (trapezoid easing, tweens), simulator, pitch coords
store/ # Zustand stores (editorStore, playStore)
supabase/ # browser/server clients + session middleware
types/ # Play data model + editor types
api/ # typed client helpers for /api/plays
middleware.ts # Supabase auth middleware (gates /editor)
supabase/
migrations/ # SQL migrations
Pitch coordinates are in meters: x = 0..68, y = 0..105 (y=0 is our goal line). The reference half-pitch view maps x=16..68, y=22..105 onto a 580×890 SVG viewBox at 10px/m via the X() / Y() helpers in src/lib/engine/pitch.ts.