尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗League night, sorted. A Pokémon TCG app for local game stores: hosts run Swiss events, players scan a QR code to join, get their opponent and table on their phone, report results and watch the round clock. Every player keeps a profile with match history, stats and a deck library.
Hosting
Playing
| Concern | Choice |
|---|---|
| App framework | TanStack Start (Router, Query + persist-client, Virtual, Pacer, Devtools) on Vite 8 + Nitro |
| Backend logic | Effect 4 services, typed errors, ManagedRuntime bridge to server functions |
| Data | Drizzle ORM on Turso / libSQL (file:local.db locally) |
| Auth | better-auth: email + password, username, magic link (via Resend) |
| Share images | satori + sharp (/api/og/*) |
| Validation | Zod 4 for user input (forms + server functions), Effect Schema for domain models |
| Offline | Serwist service worker |
| UI | Tailwind 4, shadcn-style components on Base UI, TanStack Charts, lucide |
| Language | TypeScript 7 |
| Tests | Vitest 5 + @effect/vitest (server), jsdom + Testing Library + MSW (client), Playwright (e2e), Storybook 10 |
| Review | fallow, react-doctor, impeccable |
| Agent workflow | Matt Pocock's engineering skills + impeccable in .claude/skills |
pnpm install
cp .env.example .env # set BETTER_AUTH_SECRET at minimum
pnpm tsx scripts/migrate.ts # create local.db (and backfill avatars and achievements)
pnpm db:seed # optional: demo store, 9 players, an event per pairing system
pnpm dev # http://localhost:3000
Seeded accounts: oak (host), ash, misty, brock, … — password pallet-town-1.
Without RESEND_API_KEY emails are logged to the console; without CARD_CATALOG_URL decks are saved without card art (run pnpm tsx scripts/backfill-card-images.ts once it is set) and the partner Pokémon search says the catalog is unreachable. scripts/migrate.ts also backfills player identity (default avatars and achievements from history) for users who don't have it yet. Uploaded profile photos are gone: run pnpm tsx scripts/delete-uploaded-photos.ts once with the old UPLOADTHING_TOKEN to delete the stored files. For production point DATABASE_URL / DATABASE_AUTH_TOKEN at Turso and set APP_URL so QR codes and share images use your domain. On Vercel, pnpm vercel-build applies pending migrations before building, on production deploys only (previews skip them).
| Command | What it does |
|---|---|
pnpm dev | Dev server with TanStack Devtools (Router, Query, Pacer) |
pnpm build / pnpm start | Production build to .output (+ service worker) / run it |
pnpm typecheck | TypeScript 7 |
pnpm test | Vitest: server (node) and client (jsdom + MSW) projects |
pnpm test:e2e | Playwright, desktop + Pixel 7 (own dev server on :3100) |
pnpm storybook | Component workbench |
pnpm db:generate / db:migrate / db:studio | Drizzle Kit |
pnpm review | fallow + react-doctor + impeccable detect |
In sandboxed containers Playwright may need
PLAYWRIGHT_CHROMIUM_PATH=/path/to/chromium.
src/
domain/ pure rules: standings, swiss, match-clock, deck-list, ids (+ tests)
server/ Effect services (events, decks, profiles), db, auth, email, og, functions/
shared/ Zod schemas used by forms and server functions
routes/ file routes; api/ for auth, og images
components/ ui/ primitives (Base UI) and feature components (+ stories, tests)
sw.ts Serwist service worker
e2e/ Playwright specs
docs/adr/ architecture decisions
See CLAUDE.md for conventions, PRODUCT.md / DESIGN.md for product and visual direction, and GLOSSARY.md for domain language.