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
- Public REST API + OpenAPI
- Bluesky + Mastodon federated 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
- 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
Platform & public API
Mythic Decks has grown beyond a single daily site into a small platform: a public REST API powers other tools, federated cross-posting distributes each day's deck across the open social web, and a Resend-backed email newsletter keeps subscribers in the loop.
Public Toolkit API
- REST/JSON over HTTPS at
api.mythicdecks.net— cards, commanders, decks, sealed pool, served from the same Postgres that powers the site - OpenAPI 3 spec rendered with Scalar at
/docsfor an interactive reference - Upstash Redis rate limiting protects the public surface from runaway callers
- First consumer: the sister
mtg-deckbuilderCLI; designed for Wave 2 public launch and Wave 3+ MCP distribution
Distribution
- Bluesky via the AT Protocol — each new deck cross-posted with commander art and a deep link
- Mastodon via
masto— federated reach for the same payload - Email newsletter through Resend with subscribe/unsubscribe flows and DKIM-aligned delivery
- RSS + Open Graph rich previews keep organic distribution working on every channel
Data autonomy
- Scryfall bulk fetcher keeps the oracle copy current; oracle JSON powers offline validation with zero per-call cost
- EDHrec ingestion feeds card popularity rankings into theme selection and the "hidden gems" tagger
- 17lands pool fetcher feeds the sealed deckbuilder with limited-format rating data
- LLM tagger & dossier synthesizer run incrementally over new cards and commanders so the taxonomy stays fresh
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 & cards
- Full-text search across commanders, cards, guides
- Card browser with hover previews and Scryfall deep links
- Filters by color identity, date, and tags
- Commander permalinks for every featured deck
Sealed builder
- Build optimal sealed pools from set inputs
- Backed by 17lands ratings and limited-format heuristics
- Lives at
/sealed-builderalongside the Brawl content
Public API + docs
- REST endpoints: cards, commanders, decks, sealed pool
- Scalar-rendered OpenAPI reference at
/docs - Rate-limited via Upstash Redis
Newsletter
- Subscribe / unsubscribe flows with Resend delivery
- One email per featured deck, opt-out honored everywhere
- Companion to the daily Bluesky + Mastodon posts
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, EDHrec popularity, and occurrence data
- Deterministic validation against Scryfall for every card
- Guide cross-validation against the decklist and Scryfall
- Sealed/limited deckbuilder backed by 17lands ratings
- LLM card tagger and commander dossier synthesizer running incrementally
- Public REST API with Scalar-rendered OpenAPI reference
- Upstash Redis rate limiting on the public surface
- Federated cross-posting to Bluesky and Mastodon
- Resend-backed email newsletter with subscribe/unsubscribe flows
- One-click Arena import, full-text search, RSS, rich Open Graph
- 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.