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
- 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
- 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
- Validation is non-negotiable: every card must pass Scryfall existence, format legality, color identity, and singleton checks before publication
- 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.
| Stage | What happens |
|---|---|
| 1 — Commander selection | Pull the next commander from the queue with color rotation and no recent repeats; verify the commander is still Brawl-legal |
| 2 — Reference gathering | Fetch ~10 Moxfield decklists for the commander; fall back to pre-ingested data or occurrence rankings if Moxfield is blocked |
| 3 — Theme selection | Identify viable archetypes (Tokens, Voltron, Aristocrats, Spellslinger, Landfall…) and pick the strongest for this commander |
| 4 — Decklist generation | Anthropic agent receives the commander, theme, references, and occurrence data; builds a 100-card singleton list |
| 5 — Validation | Every card verified against Scryfall for existence, legality, color identity, singleton; up to three correction rounds if checks fail |
| 6 — Deck guide | Agent writes the pitch, play summary, key synergies, and opening-hand guidance; guide card references are cross-checked against the decklist |
| 7 — Publication | Write 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.
| Check | Failure action |
|---|---|
| Card existence | Scryfall lookup — reject unknown names, request replacement |
| Brawl legality | Reject banned/unreleased cards, request replacement |
| Color identity | Reject cards outside commander's identity |
| Singleton rule | Reject 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 references | Every 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
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.