NBA Feed
팀 뉴스와 경기 정보를 제공, 점수는 직접 확인할 때까지 숨겨져 있습니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A website to manage and publicly display one or more recreational hockey leagues:
standings, schedules, player/team stats, team pages, league rules, plus
authenticated tools for staff to set rosters, keep score, build balanced
schedules, and edit rules.
Built with Next.js 16 (App Router), Tailwind v4 + shadcn/ui, and
Supabase (Postgres + Auth + RLS + Storage).
• League manager — full control (people, seasons, teams, rosters, schedule, rules, scoring).
• Captain — sets their own team's game-day roster.
• Scorekeeper — a global role that records goals/penalties and finalizes games.README 전문 보기 ↗A website to manage and publicly display one or more recreational hockey leagues: standings, schedules, player/team stats, team pages, league rules, plus authenticated tools for staff to set rosters, keep score, build balanced schedules, and edit rules.
Built with Next.js 16 (App Router), Tailwind v4 + shadcn/ui, and Supabase (Postgres + Auth + RLS + Storage).
Sign-in is staff-only — there is no public sign-up. A magic link is the
primary way in and the only one that works with no JavaScript; a password is the
fallback, set by the account holder at /set-password (emailed link) or by a
commissioner in the League Office. The public site is read-only and needs no
account.
Prerequisites: Node 22 (pinned in .nvmrc and declared as engines in
package.json; CI reads the same file), Docker (for the local Supabase stack).
npm install
npx supabase start # starts the local Postgres/Auth/Storage stack
npm run db:reset # applies migrations + seed.sql
npm run seed:users # creates the seeded staff accounts (admin API)
npm run gen-types # regenerate src/lib/db/types.ts (after schema changes)
npm run dev # http://localhost:3000
Easiest in dev: the Dev quick sign-in panel on /login has one-click
buttons for each role (local-only — hidden when NODE_ENV=production).
Otherwise sign in with a magic link; the email lands in Mailpit
(http://localhost:54324).
| Role | |
|---|---|
[email protected] | League manager |
[email protected] | Scorekeeper |
[email protected] | Captain (Oceanview Sharks) |
(Local-only: the seed also sets the password hockey123, used by the dev
quick sign-in and scripted testing.)
The seed creates two public leagues — Oceanview (obhl) and Harbor Rec
(harbor) — so the header league switcher is live, and two people
(e.g. the Sharks captain) skate in both leagues to exercise shared player
identity.
| Script | Purpose |
|---|---|
npm run dev / build / start | Next.js dev / production build / serve |
npm test | Vitest unit tests |
npm run db:reset | Drop + re-apply all migrations and seed.sql |
npm run seed:users | Create/sync the staff accounts via the admin API |
npm run gen-types | Generate DB types from the local schema |
src/lib/queries/*, writes through src/lib/actions/* (server actions).supabase/migrations/0007_views.sql); the
ordered standings table (incl. head-to-head) is computed in
src/lib/standings/tiebreakers.ts.src/lib/schedule/ (circle-method
round-robin + greedy night/slot assignment), unit-tested without a database.
Mid-season edits — move a night, pin a team, repair around it — run the same
engine and write through the apply_game_writes RPC (0045), one transaction
per batch. The pre-flight around it (gameWrites.ts) is pure functions, so it
stays unit-testable the same way.0008_rls_public.sql, role/write
policies in 0009_rls_roles.sql, and a custom access-token hook
(0010_auth_hook.sql) injects the role into the JWT for UI gating.Deploying and operating: see RUNBOOK.md → Deploy and operations.