Pokémon TCG tournament data visualization and meta analysis
Live Site • Features • How It Works • Development • Credits
Ciphermaniac aggregates and analyzes Pokémon TCG tournament data to provide useful insights. Look up any card and see where it's played. Browse archetypes and filter by specific cards, and track what's rising and falling in the meta.
- Per-card data - Pick any card, see which decks run it, average copy count, and usage over time
- Archetype breakdowns - Core lists, tech choices, and variant comparisons
- Flexible filtering - Multiple includes, multiple excludes, specific copy counts
- Meta trends - Track archetype popularity and card usage shifts over time
- Price data - Current market prices from TCGPlayer
- Fast loads - Reports are statically compiled, so pages load in under a second
Tournament data is collected and processed automatically through GitHub Actions:
| Pipeline | Description | Schedule |
|---|---|---|
| Online Meta | Aggregates the last 14 days of online tournaments from PlayLimitless | Daily |
| Daily Pricing | Fetches market prices from TCGCSV | Daily |
| Meta Trends | Computes archetype popularity and card usage trends | Daily |
| Tournament Reports | Scrapes Day 2 decklists from major events on LimitlessTCG | On-demand |
Data is stored in Cloudflare R2; more details at r2.ciphermaniac.com.
Getting Started
- Node.js >= 20.0.0
- npm
git clone https://github.com/rosematcha/ciphermaniac.git
cd ciphermaniac
npm installnpm run devAvailable Commands
npm run lint # Check code quality with ESLint
npm run lint:fix # Fix linting issues
npm run typecheck # Run TypeScript type checking
npm run validate # Run all validation checks (lint + typecheck)
npm run dev # Start development server
npm run build:prod # Build production bundle (strips debug code)
npm run test # Run all testsProduction Build
The production build strips development code before deployment:
npm run prepare:prod # Creates optimized build & updates HTML filesWhat gets stripped:
perf.start()andperf.end()callslogger.debug()statements- Dead code via tree-shaking
Production builds run automatically during Cloudflare Pages deployment.
To restore development configuration:
npm run restore:devPerformance Monitoring
Performance monitoring is enabled on localhost and stripped from production builds.
import { measureFunction } from './utils/performance.js';
const measuredSort = measureFunction(sortData, 'sortData');
measuredSort(data); // Logs: "Performance: sortData took 15.42ms"import { perf } from './utils/performance.js';
perf.start('myOperation');
// ... do work ...
perf.end('myOperation');GitHub Actions
- Online Meta Report (
online-meta.yml) — Aggregates online tournaments. Daily. - Daily Price Check (
daily-pricing.yml) — Fetches market prices. Daily. - Download Tournament (
download-tournament.yml) — Scrapes major tournament decklists. On-demand. - Meta Trends (
trends.yml) — Computes archetype and card trends. Daily.
-
LimitlessTCG, PlayLimitless, and Robin — Tournament data. The Limitless team's work is foundational to the Pokémon TCG community.
-
TrainerHill and Brad — Deck archetype analysis and early development support.
-
TCGCSV and CptSpaceToaster —For exposing TCGPlayer market price in a compatible and malleable form after TCGPlayer's API crackdown.
MIT — see LICENSE for details.
Not affiliated with The Pokémon Company, Nintendo, Game Freak, Creatures Inc., or RK9.