Skip to content

rosematcha/ciphermaniac

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

522 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Ciphermaniac Logo

Ciphermaniac

Pokémon TCG tournament data visualization and meta analysis

Live SiteFeaturesHow It WorksDevelopmentCredits

Website License Node Version TypeScript Strict ESLint


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.


Features

  • 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

How It Works

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.


Development

Getting Started

Prerequisites

  • Node.js >= 20.0.0
  • npm

Installation

git clone https://github.com/rosematcha/ciphermaniac.git
cd ciphermaniac
npm install

Development Server

npm run dev
Available 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 tests
Production Build

The production build strips development code before deployment:

npm run prepare:prod  # Creates optimized build & updates HTML files

What gets stripped:

  • perf.start() and perf.end() calls
  • logger.debug() statements
  • Dead code via tree-shaking

Production builds run automatically during Cloudflare Pages deployment.

To restore development configuration:

npm run restore:dev
Performance 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.

Credits

  • 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.


License

MIT — see LICENSE for details.


Not affiliated with The Pokémon Company, Nintendo, Game Freak, Creatures Inc., or RK9.

About

Static analysis of Pokémon card usage.

Topics

Resources

Stars

Watchers

Forks

Sponsor this project

Contributors