Open source tool for organizing TCG tournaments with professional standards. Designed for local communities without access to official Play! Pokémon software.
The official Tournament Operations Manager (TOM) from The Pokémon Company is only available to officially recognized stores. Organized communities without that recognition lack access to the tool, yet they still want to play with the same rules and structure as official tournaments.
Aura Tournament OM App replicates the full competitive logic: Swiss system, OMW%/OOMW% tiebreakers, age divisions, Top Cut, and Age-Modified Swiss. It also adds features the official TOM lacks: online registration, on-site check-in, and an accumulated community ranking.
Not SaaS. It is a tool for a specific community. Any community can clone the repository and deploy their own instance.
Not official. It does not integrate with Play! Tools or Pokémon Company championship points.
| Game | Divisions | Status |
|---|---|---|
| Pokémon TCG | Junior / Senior / Masters (by age) | ✅ MVP |
| Mitos y Leyendas | General (no divisions) | ✅ MVP |
| Magic: The Gathering | Configurable | 🔜 Post-MVP |
| One Piece TCG | Configurable | 🔜 Post-MVP |
| Gundam TCG | Configurable | 🔜 Post-MVP |
Adding a new game is as simple as inserting rows in the games and division_configs tables — no code changes required.
| Role | Description | Access |
|---|---|---|
| admin | Creates tournaments, manages judges, confirms payments, does check-in | Login required |
| judge | Operates the tournament, reports results | Login required |
| player | Registers online, views history and ranking | Google Login |
| public | Views pairings and standings for the active tournament | No login |
1. Admin creates tournament → selects game, configures rounds, opens registration
2. Players register online (Google OAuth, 2 clicks)
3. Admin confirms payments manually
4. Tournament day: admin performs on-site check-in for attendees
5. Only checked-in players enter Round 1
6. Judges report results round by round
7. Players view pairings in real-time from their phones (QR code)
8. System generates Swiss rounds with official standards
9. Automatic Top Cut based on attendance
10. Results saved to community ranking
| Layer | Technology |
|---|---|
| Framework | Next.js 15 (App Router) + TypeScript |
| Styling | TailwindCSS v4 + shadcn/ui |
| Client State | Zustand |
| Server State | TanStack Query |
| Database | Supabase (PostgreSQL) |
| Auth | Supabase Auth (Google OAuth + email) |
| Real-time | Supabase Realtime (WebSockets) |
| Tests | Vitest (unit) + Playwright (E2E) |
| Deploy | Vercel |
auratom/
├── src/
│ ├── app/
│ │ ├── (dashboard)/ # Admin and judges (auth required)
│ │ ├── (public)/ # Public player view (no login)
│ │ └── api/ # API Routes
│ ├── core/ # Pure algorithms (framework-agnostic)
│ │ ├── swiss/ # Swiss pairing
│ │ ├── tiebreakers/ # OMW%, OOMW%, H2H
│ │ ├── topcut/ # Elimination bracket
│ │ └── age-division/ # Division calculation
│ ├── db/ # Supabase queries
│ ├── schemas/ # Zod schemas and types
│ ├── components/ # React components
│ ├── stores/ # Zustand stores
│ └── lib/ # Helpers (auth, utils)
├── specs/ # Feature specs
├── tests/
│ ├── unit/ # Vitest
│ └── e2e/ # Playwright
├── docs/ # Technical documentation
├── supabase/
│ └── migrations/ # Versioned SQL migrations
└── CLAUDE.md # AI agent instructions
| Document | Description |
|---|---|
CLAUDE.md |
Instructions for the AI agent |
docs/ALGORITMOS.md |
Full mathematical specification of Swiss |
docs/DATABASE_SCHEMA.md |
Supabase schema with all tables |
docs/ARQUITECTURA.md |
Architecture decisions (ADRs) |
docs/METODOLOGIA.md |
Spec-Driven flow + Harness Engineering |
docs/ROADMAP.md |
Development phases and checklist |
specs/ |
Individual specs per feature |
Phase 0 — Initial project setup.
Herramienta open source para organizar torneos TCG con estándares profesionales. Diseñada para comunidades locales sin acceso al software oficial de Play! Pokémon.
El TOM oficial de The Pokémon Company solo está disponible para tiendas reconocidas oficialmente. Comunidades organizadas sin ese reconocimiento no tienen acceso a la herramienta, pero sí quieren jugar con las mismas reglas y estructura de los torneos oficiales.
Aura Tournament OM App replica la lógica competitiva completa: sistema suizo, desempates OMW%/OOMW%, divisiones de edad, Top Cut y Age-Modified Swiss. Además agrega lo que el TOM oficial no tiene: inscripciones online, check-in presencial, y ranking comunitario acumulado.
No es SaaS. Es una herramienta para una comunidad específica. Cualquier comunidad puede clonar el repositorio y desplegar su propia instancia.
No es oficial. No se integra con Play! Tools ni championship points de Pokémon Company.
| Juego | Divisiones | Estado |
|---|---|---|
| Pokémon TCG | Junior / Senior / Masters (por edad) | ✅ MVP |
| Mitos y Leyendas | General (sin divisiones) | ✅ MVP |
| Magic: The Gathering | Configurable | 🔜 Post-MVP |
| One Piece TCG | Configurable | 🔜 Post-MVP |
| Gundam TCG | Configurable | 🔜 Post-MVP |
Agregar un nuevo juego es insertar filas en la tabla games y division_configs — sin cambios de código.
| Rol | Descripción | Acceso |
|---|---|---|
| admin | Crea torneos, gestiona jueces, confirma pagos, hace check-in | Login requerido |
| judge | Opera el torneo, reporta resultados | Login requerido |
| player | Se inscribe online, ve su historial y ranking | Login con Google |
| público | Ve pairings y standings del torneo activo | Sin login |
1. Admin crea torneo → elige juego, configura rondas, abre inscripciones
2. Jugadores se inscriben online (Google OAuth, 2 clicks)
3. Admin confirma pagos manualmente
4. Día del torneo: admin hace check-in presencial de asistentes
5. Solo los checked-in entran a la Ronda 1
6. Jueces reportan resultados ronda a ronda
7. Jugadores ven pairings en tiempo real desde sus celulares (QR code)
8. Sistema genera rondas Swiss con estándares oficiales
9. Top Cut automático según asistencia
10. Resultados guardados en ranking comunitario
| Capa | Tecnología |
|---|---|
| Framework | Next.js 15 (App Router) + TypeScript |
| Estilos | TailwindCSS v4 + shadcn/ui |
| Estado cliente | Zustand |
| Estado servidor | TanStack Query |
| Base de datos | Supabase (PostgreSQL) |
| Auth | Supabase Auth (Google OAuth + email) |
| Tiempo real | Supabase Realtime (WebSockets) |
| Tests | Vitest (unit) + Playwright (E2E) |
| Deploy | Vercel |
auratom/
├── src/
│ ├── app/
│ │ ├── (dashboard)/ # Admin y jueces (auth requerido)
│ │ ├── (public)/ # Vista pública jugadores (sin login)
│ │ └── api/ # API Routes
│ ├── core/ # Algoritmos puros (sin framework)
│ │ ├── swiss/ # Emparejamiento suizo
│ │ ├── tiebreakers/ # OMW%, OOMW%, H2H
│ │ ├── topcut/ # Bracket de eliminación
│ │ └── age-division/ # Cálculo de divisiones
│ ├── db/ # Queries a Supabase
│ ├── schemas/ # Zod schemas y tipos
│ ├── components/ # Componentes React
│ ├── stores/ # Zustand stores
│ └── lib/ # Helpers (auth, utils)
├── specs/ # Specs de features
├── tests/
│ ├── unit/ # Vitest
│ └── e2e/ # Playwright
├── docs/ # Documentación técnica
├── supabase/
│ └── migrations/ # SQL migrations versionadas
└── CLAUDE.md # Instrucciones para agente IA
| Documento | Descripción |
|---|---|
CLAUDE.md |
Instrucciones para el agente IA |
docs/ALGORITMOS.md |
Especificación matemática completa del Swiss |
docs/DATABASE_SCHEMA.md |
Esquema de Supabase con todas las tablas |
docs/ARQUITECTURA.md |
Decisiones de arquitectura (ADRs) |
docs/METODOLOGIA.md |
Flujo Spec-Driven + Harness Engineering |
docs/ROADMAP.md |
Fases de desarrollo y checklist |
specs/ |
Specs individuales por feature |
Fase 0 — Configuración inicial del proyecto.