JasonFlatford
Skip to content

Content SaaS

Mythic Decks

A new Arena Brawl deck every day, ready to play. A fully automated pipeline — GitHub Actions plus Anthropic agents — generates, validates, and publishes a fresh decklist daily, grounded in Moxfield references and Scryfall card data so nothing hallucinated ever reaches the site.

  • Next.js 16 + Tailwind v4 + shadcn/ui
  • Anthropic Agent Pipeline
  • Neon Postgres + Drizzle ORM
  • Zero-Touch Daily Publishing

Overview

Mythic Decks is a focused content site that does one thing exceptionally well: give Magic: The Gathering Arena Brawl players a ready-to-import deck every morning. No accounts, no sign-ups, no AI branding — just a fresh, well-built decklist waiting on the homepage.

  • Daily publishing, zero manual work: a cron-driven pipeline selects a commander, gathers community references, builds a deck, validates it, and publishes — every day
  • Grounded generation: Moxfield decklists plus occurrence rankings from the oracle CLI keep the agent anchored to real community play, not guesses
  • Full validation: every card is checked against Scryfall for existence, Brawl legality, color identity, and singleton rules before anything is published
  • One-click Arena import: the deck is pre-formatted so players copy, paste into Arena, and queue up in seconds

Problem

Brawl is one of MTG Arena's most popular formats, but finding a good decklist for it is a fragmented, low-quality experience.

Scattered content

  • Decks live in Reddit threads, old blog posts, random Moxfield searches
  • No single daily source for fresh Brawl content
  • Aggregator sites treat Brawl as an afterthought

Quality vs. scale

  • Hand-curated decks don't scale to a daily cadence
  • Naive AI generation hallucinates cards or breaks format rules
  • Readers need trust that every card is real and legal

Friction at the finish line

  • Even when a deck is found, copying it to Arena is fiddly
  • Players want to queue up, not transcribe cards
  • Mobile clipboard flow must just work

Solution

A minimal site with a single hero surface — today's deck — backed by an autonomous publishing pipeline that treats Scryfall and the Anthropic API as the two sources of truth.

Core design decisions

  1. One deck per day, always fresh: a UTC daily cadence with round-robin color rotation so players never see three Simic decks in a row
  2. Agent grounded in real play: ~10 Moxfield reference decks plus occurrence rankings feed the agent so it synthesizes a consensus build, not a speculative one
  3. Validation is non-negotiable: every card must pass Scryfall existence, format legality, color identity, and singleton checks before publication
  4. Content over chrome: no accounts, no AI branding, no bloat — the page is a decklist, a deck guide, and a copy button

Generation pipeline

A seven-step GitHub Actions workflow runs daily at 06:00 UTC. Each stage has a clear input, output, and failure mode — the pipeline either publishes a validated deck or leaves yesterday's in place and logs the failure.

StageWhat happens
1 — Commander selectionPull the next commander from the queue with color rotation and no recent repeats; verify the commander is still Brawl-legal
2 — Reference gatheringFetch ~10 Moxfield decklists for the commander; fall back to pre-ingested data or occurrence rankings if Moxfield is blocked
3 — Theme selectionIdentify viable archetypes (Tokens, Voltron, Aristocrats, Spellslinger, Landfall…) and pick the strongest for this commander
4 — Decklist generationAnthropic agent receives the commander, theme, references, and occurrence data; builds a 100-card singleton list
5 — ValidationEvery card verified against Scryfall for existence, legality, color identity, singleton; up to three correction rounds if checks fail
6 — Deck guideAgent writes the pitch, play summary, key synergies, and opening-hand guidance; guide card references are cross-checked against the decklist
7 — PublicationWrite decklist, guide, Moxfield refs, and metadata to Postgres; trigger Next.js revalidation so the homepage flips

Commander rotation

  • Launch seed: ~15 hand-picked commanders with strong reference availability for day-one quality
  • Ongoing rotation: randomized round-robin through color combinations, then a random commander within each slot
  • No repeats until the pool is exhausted; deprioritize commanders with zero references

Failure handling

  • Up to three correction rounds if validation fails — the agent is re-prompted with the specific failures
  • After three failures, skip the commander and log for manual review
  • If the run fails entirely, yesterday's deck stays featured — never a blank homepage

Validation & quality

The agent is not trusted to produce correct decklists on its own. Every card passes a deterministic validation layer before anything reaches the database, and the generated guide is cross-checked against the final decklist.

CheckFailure action
Card existenceScryfall lookup — reject unknown names, request replacement
Brawl legalityReject banned/unreleased cards, request replacement
Color identityReject cards outside commander's identity
Singleton ruleReject duplicate non-basic cards
Deck size (100)Re-run generation if short or over
Minimum land count (34)Re-prompt to add lands
Minimum interaction (5)Re-prompt to add removal/counterspells
Guide card referencesEvery card named in the guide must be in the decklist and exist on Scryfall

Architecture

A clean split between the publishing pipeline and the reader-facing site. The pipeline runs in GitHub Actions and writes to Neon Postgres; the Next.js app reads from Postgres via Drizzle and renders server components on Vercel.

Stack choices

  • Next.js 16 App Router: SSR for SEO, server components for direct database reads, ISR for efficient rebuilds
  • Drizzle + Neon Postgres: type-safe schema and queries, serverless Postgres with a generous free tier
  • Tailwind v4 + shadcn/ui: dark-first UI with OKLch tokens, consistent with sister projects
  • Vercel hosting: zero-config Next.js, edge network, preview deploys for every PR

Data model highlights

  • Commanders, decklists, decklist cards split so cards are queryable across every published deck ("show me every deck running Arcane Signet")
  • Postgres tsvector with weighted title/theme/guide fields powers full-text search
  • Commander queue table tracks scheduled dates and failure reasons for operational visibility

Product surface

The site is deliberately small — a hero surface, a searchable archive, and a handful of polish affordances that turn a decklist into a frictionless "copy and queue up" moment.

Today's deck

  • Commander art hero with color pips and mana value
  • Deck guide: pitch, play summary, synergies, opening hand
  • Decklist grouped by card type with mana curve
  • One-click Arena import + copy-link share

Archive & search

  • Full-text search across commanders, cards, guides
  • Filters by color identity and date
  • Paginated art-crop grid with lazy images
  • Commander permalinks for every featured deck

Polish

  • Card hover previews on every card name
  • RSS/Atom feed for new decklists
  • Open Graph art so shared links render rich previews
  • Internal design system page for token QA

Outcomes

1
Fresh deck published every day
7
Pipeline stages from queue to publication
100
Cards per singleton decklist, fully validated
0
Hallucinated cards reach the site
0
Manual curation required post-launch

Delivered capabilities

  • Autonomous daily publishing on GitHub Actions cron
  • Anthropic agent grounded in Moxfield refs and occurrence data
  • Deterministic validation against Scryfall for every card
  • Guide cross-validation against the decklist and Scryfall
  • One-click Arena import with set/collector-number formatting
  • Full-text search and color-identity filtering on the archive
  • RSS feed and Open Graph previews for organic distribution
  • Design-system page for dark-theme token QA

Shipping AI-powered content products?

Mythic Decks shows what it takes to publish trustworthy AI-generated content every day — agents plus deterministic validation, minimal surface area, and an opinionated stack. If you're building something similar, let's talk.

Return to top

Press Esc to close • ⌘K / Ctrl K to open