Warlords
Every card is an army
One human. A fleet of AI agents. 35 days.
Paul Booth · for the ByteDance crew · July 2026
Introductions

Hi, I'm Paul Booth.

Most recently Sr. Engineering Manager at Reddit, leading 50+ engineers and managers across Consumer Growth and Advertising.
Olin College of Engineering. Lifelong tinkerer who lives by “Do, Make, Learn.”
Matt's friend. He said you like games and fast prototypes, so I brought both.
Relevant credential for tonight: in five weeks on this game I typed zero lines of game code by hand.
Uncle Jim in squirrel form
The unofficial mascot, Uncle Jim. He's a squirrel. We'll get to him.
The premise

What does game development look like when you stop writing the code?

I played QA engineer, game director, and engineering manager.
AI agents played everyone else.
Act I · The Game

A roguelike deckbuilder where combat is an autobattler

Slay the Spire's map. A card hand. Then the cards become armies that fight on their own.
1 · Draft packs
2 · Climb the map
3 · Deploy your hand
4 · Ten seconds of war
What five weeks bought

The game, by the numbers

35
days, first commit to tonight
1,421
commits on main
563
cards across 21 draftable packs
274
relics
41
named enemy warlords, no filler
129
hand-written events, each with painted art
74×2
original songs, every one with an instrumental twin
78
Steam achievements, icons included
11
languages, 7,063 strings each
4-player
online co-op, Steam or direct IP
119,020
lines of GDScript, and only 4 hand-authored scenes
0
lines of game code written by hand
Act I · The Game

Deep, keyword-driven combat

unique cards
Every unique card. Painted faces, pop-out art, forged frames by type.
BurningPoison + ContagionHivemind UndyingSlime MergeHatch Ember ChainSacrificeChanneling Pack TacticsFormationIntangible
375 summons · 130 spells · 58 powers. Plus traps, hazards, turrets, barricades. 68 unit keywords, 15 statuses, 75 stacking battle powers.
Every keyword carries its number. “Shield 2”, never “some shield”. House rule, enforced by an audit script.

41 named enemy warlords

Each with its own army, arena, taunts, signature spells, and its own theme song. Many are living, multi-piece animated rigs.
Bosses

Wound a boss and it rewrites the fight

The banner reads THE DEAD RISE, and the dead rise.
Boss phases. At half health the arena recoils, a cinematic names what changed, and the rules change with it.
Twin commanders. Some lords come in pairs; both must fall.
Second forms. Six bosses have hand-built “woken” rigs that take over mid-fight.
Signature spells. 41 enemy spells with painted card faces, aimed at your commander.
Battlefields

No two fields are the same

ArcticVolcanoNecropolisSporewood Gallows CourtCrystal Cavern…30 themes
Procedural arenas, seeded per map node: 2–5 lanes that bend, 18 terrain kinds. Bog, ice and high ground, destructible obstacles, and 14 battle-wide conditions like Emberfall and The Long Night.
Bosses get bespoke arenas tuned to their gimmick.
The same clash across five biomes.
Between battles

The events are unhinged, and you actually play them

Wheel of Fate
Knucklebones duel
One-Armed Bandit
Bone Casino
Shell Swindler
Double or Nothing
129 choose-your-own-adventure events, and a dozen of them are real minigames, played live for keeps:
Jump rope3-D physics diceRhythm SimonJigsawAuction Press-your-luckSlotsPachinko Shell game
The dice are rigid-body physics. The wheel is honest. The mimic lures you with treasure. Every event has bespoke painted art, all 129 of them.
The toolbox

Spells, relics, potions

Meteor Storm, with a live area preview before you commit.
274 relics across five pools: starter, normal, pack synergy, boss, and boon. Passive or triggered, shown as inline icons in the run bar, each linking the card it names.
33 potions. Spells strike units or the enemy commander directly. A rule the whole enemy AI had to learn too.
Commander healing is deliberately scarce. Every point matters.
Your commander

A paper doll assembled from your draft

Every pack you draft contributes one body part. Head, torso, arms, legs, and accessory, so every run's commander looks like what you're playing.
All vector art, re-rasterized at true size for cinematics. 36 part sets, each with a gilded mastery variant.
Five playable warlords: The King, The Mummy, The Spaceman, The Gunslinger, and The Eternal, each with a signature relic and starting deck.
The doll re-dresses itself as you pick.
Meta-progression

Reasons to come back

Pack XP → unlock cards. Win with a pack, level it, open its next cards.
Pack Paths. At levels 4/5/6 each pack branches, so pick a doctrine and its cards transform.
Ascendant looks. Master a pack fully and its gilded cosmetic set is yours, with 21 matching achievements.
Compendium that fills in as you discover. Daily March. One seeded run a day, on a Steam leaderboard. 10 ascension tiers when it gets too easy.
Win with one warlord to wake the next.
Every pack's commander in three looks: Battleworn, Gilded, Ascendant.
Multiplayer

Full 4-player online co-op

Shared clashes, allied squads, slot-colored pings and aim arrows.
Host-authoritative netcode. One real simulation, clients render 12 Hz snapshots. Solo play is byte-identical to the local path.
Steam lobbies or direct IP with UPnP auto-port-forward, so co-op works even without Steam.
Map voting, claim-a-seat resume, mid-battle rejoin, live presence. Watch an ally's fight and suggest the card they should play. 76 message types in the protocol.
The War Council
Emote wheel · 461 lines
Even the demo has co-op.
ACT II

The Factory

How one person ships like a studio: turn the studio into software.
The org chart

One human, many agents

Me
direction · taste · QA · priorities
Worker agents ×10
GitHub tickets, isolated git worktrees, parallel
Verifiers
281 test & screenshot drivers, 14 zero-tolerance audits
The Simulator
an AI that plays the whole game, hundreds of runs
Ship robots
Steam, itch, partner-site automation, Cloudflare
The management problem is the same one a real team has: write clear tickets, keep workers out of each other's way, demand evidence, merge fast.
The pipeline

GitHub issues in, merged PRs out

/ticket
work filed as issues, sized S / M / L
/dispatch
claims ready tickets, spawns up to 10 workers
worktree
each agent codes in an isolated checkout
verify
PR must carry VERIFIED evidence
merge
auto-merge, then smoke-test main
105
issues filed
173
PRs merged
10
agents in parallel at peak
S/M/L
size labels pick the model, and small tickets batch 5-up on a cheaper one
Trust, but verify

Agents must prove their work

119 test drivers that play real battles headlessly and assert outcomes.
130 screenshot drivers. The agent launches the game, frames the feature, and attaches the picture to its PR.
14 audits with zero tolerance. Every card has painted art, no text overflows a card face, no missing translation, no unlinked relic. The number must be 0.
A watchdog autoload kills stray game processes agents leave behind, and parks their windows off-screen, muted, so they never interrupt me playing.
A screenshot-driver capture: proof the card-lift hover works, straight into the PR.
Balance at scale

An AI that plays the whole game

The headless simulator drafts packs, routes the map, fights every battle with relics and boss phases live. Hundreds of full runs in parallel.
A/B testing with paired seeds and McNemar's test, so balance changes ship with a p-value.
Card lab: measure one card causally, same deck, with and without it.
Calibrated against live playtester telemetry; tuning only moves when sim and reality agree.
sim gate · pre-ship
PASS win-rate 61% (target 55–70) act1 boss clears: 78% act3: 44% worst pack: Trapworks 41% → ticket filed archived → results/sim_history/
Release engineering

One command → everywhere

version
stamp project + all presets
export
headless Godot: Win · macOS · Linux · Web · Android · iOS
sign
macOS sign + notarize, from Windows
upload
steamcmd → Steam · butler → itch
live
playtest branch auto-set-live
Three Steam apps ride this: the game, the demo, and the soundtrack. The web build re-imports every texture lossy first, a full mirrored project, so the itch build stays small while desktop stays lossless.
The parts with no API

When Valve has no API, drive the browser

The Steamworks partner site is forms and checkboxes, so ~25 Playwright scripts share one logged-in browser profile and fill it like a very patient intern.
78 achievements + 4 stats: created, saved, re-opened, icons attached, and the site won't take an icon before the first save. The script knows.
Store copy pushed in 10 languages; achievement titles localized from the game's own catalogs; a 693 MB soundtrack ZIP uploaded through the site's XHR flow.
Nothing auto-publishes. The Publish button stays human.
Unlocked
Locked
Every icon ships as a pair, sliced from 4×4 generated grids; the locked variant is one line of grayscale.
Closing the loop

Playtesters → Cloudflare → tickets

in-game panel
feedback + auto-screenshot + the last battle's data
Worker + D1
one Cloudflare Worker ingests feedback and telemetry
/triage-feedback
an agent fixes the safe ones same-day, backlogs the rest
tickets
the backlog feeds the worker fleet
My phone pings when someone starts playing, wins a run, or walks away. A cron sweep infers session ends from the telemetry gap. Discord first, Telegram fallback.
The screenshot is grabbed before the pause menu draws, and the last battle payload rides along, so “that fight was unfair” arrives with the fight.
ACT III

Art & Music

Nine hundred paintings and ten hours of original songs, from a team of one.
nano-banana · Gemini image gen

The art pipeline audits itself

audit
dump every card missing a painted face
prompt
name, flavor, pack palette, never mechanics text
generate
Gemini image API, 3 workers, retries
ingest
center-crop, Lanczos to 1200×896
wire
one dict entry in content.gd
audit = 0
“missing a painted face, must be ZERO”
The count

An art department's output

830
painted card images (faces, full-art, pop-outs)
129
event illustrations
1,563
hand-tuned SVGs (units, icons, rigs)
208
enemy-rig body parts across 29 bespoke animated lords
245
paper-doll pieces, gilded twins included
156
achievement icons, unlocked + grayscale locked
This is the first image the pipeline ever produced. The humble Recruit, at 2:11 AM on day one. The 796th looked considerably better.
Suno + Claude + Gemini

Every villain gets a genre

EnemyTheir sound
The Elder Treantreggae rap
Grix the Goblin Kingstyle prompt, in full: “goblin”
Brass ColossusGerman industrial metal
The Slime Lord“classic white rapper from Detroit. a little whiny.”
Silvertongue's Racketbig-band swing showtune
The Pale Riderspaghetti-western doom
Amanita, the Sporecrownpsychedelic mushroom doom
Slime Swarm (pack)bubblegum chiptune pop
Final Rites (pack)New Orleans funeral dirge
Trapworks (pack)modern trap. obviously.
Lyrics and style prompts co-written by Claude, Gemini, and Suno's own agent. Each lord's song references its real units and gimmicks.
The first voiced test song was so good it changed the plan on the spot: this game's soundtrack would have lyrics.
house rule, verbatim from the spec
"Default lean = divorced-dad-rock when a lord had no strong genre pull."
Turn your sound on

Ten hours of original music. Listen.

Tremor of Earth
reggae rap
The Elder Treant
The Goblin King
goblin
Grix
Circus in the Back of My
manic horrorcore rap
Plays anywhere
Stamp Grind Melt Shine
industrial metal, auf Deutsch
Brass Colossus
The Slime Lord's Theme
Detroit rap, a little whiny
The Slime Lord
Vocals ⇄ Instrumental
The in-game toggle, live in this deck. Same take, stem-split, swapped at the exact playhead:
Tremor of Earth · with vocals
The only ear we had

All hail Hari, our entire music department

one of Hari's pick-the-take rounds
Music Director · honorary · unpaid
HARI
47 songs · 5 rounds · 0 dollars
Every take went out as an A/B page: play both, pick one, leave a note. Each round came back smaller as he settled them. 16 songs left, then 11, then 5.
His round-three verdict, quoted in full: “too much metal.” Half the soundtrack changed genre the next morning.
He also said the Twins sounded like one person arguing with himself, so they were recast as a brother and a sister. That note is the reason we spent a week teaching Suno to keep two singers apart.
Everything else in this talk was judged by a script. The soundtrack was judged by a guy with good headphones.
ACT IV

Thirty-Five Days

June 26 → today, in commits and screenshots.
Velocity

1,421 commits in 35 days

Milestones

What landed when

Day 1 · a playable battle loop, jukebox, first card art at 2 AM
Day 4 · the headless balance simulator, before most of the game exists
Day 7 · online co-op, lobby to netcode to Steam, in one day
Day 8 · the paper-doll commander; enemy rigs get personalities
Day 10 · every pack painted; 114 new relics; feedback worker live
Day 11 · real Steam AppID, achievements engine, mobile export
Day 15 · minigame carnival; iOS preset; Daily March + leaderboard
Day 19 · boss phases; emote wheel; cosmetics
Day 23 · a theme song for every pack and lord, start to finish
Day 26 · store overhaul: trailer, 10 shots, OST app, jukebox site
Day 31 · five playable warlords; trading cards; spells hit commanders
Day 33 · eleven languages in one day; store localized to ten
Evolution · drag the handle

The same fight, staged twice

Day 11
Today
Same warlord, same plains, same five cards in hand, same 80 HP and 99 gold. I wrote a capture script that re-stages the old screenshot in today's build. Everything that moved, moved on its own.
Evolution

The art learned too

Day 2: the model kept painting card frames inside the card. Same-day fix: full-bleed scenes only.
“Looks like a Magic card” → repainted as a clean scene. Style rules became prompt law.
Valve rejected the OST cover for having no game logo. Regenerated, resubmitted, approved.
ACT V

The Job

The skills that transfer aren't coding skills. They're manager skills: clear briefs, crisp acceptance criteria, knowing when to trust, when to verify, and what to kill.
I review outcomes. Screenshots, sim numbers, the feel of the build. Almost never the code itself.
Real prompts, verbatim

Most direction is one sentence

jul 18 · taste
for the brass colossus ability, Thunderclouds have to be a lot cooler than just circles - make it look like clouds
jul 20 · bug report
shield bearers when upgraded says Protection 30, but it should be shield
jul 28 · localization
Tooltips on the relics in the top bar was not translated.
jul 21 · shipping
pull down the latest, then push up a new build to steam, itch, android, demo, everywhere
jul 30 · the entire standup
what is needed from me?
Real prompts, verbatim

…and some direction is a design brief

jul 22 · pack rework brief (excerpt)
rename trapworks to "traps and tricks". rework that pack to add more tricky things - giving units free placement, applying blind, teleporting groups of units from one place to another or switching their positions, more things with surprises, something with charm to trick someone. give Decoy Dummy the tank ability. make the starter card bear traps [...] get creative, and see how this pack could be made more fun, interesting, have unique builds and cool payoffs, etc. also see if there is a way to regenerate the pack art and description to try to get the pack picked more often
jul 26 · new feature (excerpt)
make a new screen before you pick packs where you have a cool character selection screen [...] every time you win a game with the previous character, you unlock the next one. each character gets a special starting relic and a custom starting deck [...] there should also be a mummy, a spaceman...
jul 28 · qa with a spec inside
enemies sometimes spawn units that immediately have red attack and hp [...] it should be green if it is higher than the original max HP (like growth does), regular if same, red if less. if I give a unit +5 max HP and they take 1 damage, it should still be green.
Real prompts, verbatim

Managing a fleet sounds like managing

jul 18 · lowering the review bar
I don't want to review everything, just merge in unless I specify
jul 29 · capacity planning
can you make more than 3 spin up to handle the ticket backlog? make it ten since my tokens just refreshed
jul 28 · delegation, full autonomy
you do the steam partner site changes for the game and demo, localize the store page, do the achievement strings. make all the changes necessary on that site. [...] do all steps, don't ask me for any input, and make sure to complete the whole thing
jul 22 · performance management
what did i say about stopping when you have tasks or phases left?
ACT VI

Scars

The parts that hurt. You'll want these if you try this.
July 29

The night one agent erased everyone's work

A dozen agents had worked through the night. One of them hit a snag, decided the history looked wrong, and reverted the lot. Every other agent's merged work, gone.
The recovery was archaeology: one stray commit had preserved only the test drivers. Orphaned tests describing features that no longer existed, so the tests became the spec, and thirteen tickets rebuilt the night.
New law: every worker commits and pushes relentlessly, and works isolated. Nobody touches shared history.
the recovered spec, in effect
ttest_undying_fx.gd → what WAS undying fx? ttest_relic_rework.gd → which relics changed? ttest_summon_storm.gd → storm did… something? 13 tickets filed: #118–#130 "orphaned drivers ARE the spec"
Same lesson every distributed team learns, except my team runs at 3 AM and never gets tired enough to stop.
The rest of the scar tissue

What was actually hard

The Twins' duet
Suno kept blending two singers into one voice. The fix reads like a legal contract: “THE MAN … THE WOMAN … the singer NEVER changes mid-section.” Take after take.
Balance at scale
563 cards × 41 lords × 21 packs. Humans can't test that. The answer was the simulator, personas, and paired-seed statistics.
Boomerang bugs
Some bugs return. Attack-speed resets, tooltip clipping, untranslated strings. The cure is a regression driver per fix, 119 of them now.
Token ceilings
The fleet is budget-bound. Size labels route small work to cheap models; big pushes wait for the window. “make it ten since my tokens just refreshed.”
Valve's clock
Every review round costs days: demo flagged for undisclosed online play, OST cover bounced for a missing logo. Automation can't speed up a queue.
The last 10%
Polish still takes the longest. AI compresses the first 90%; the final feel (juice, readability, fairness) is still handcraft, one build at a time.
Five weeks with a fleet

What it's actually like

Speed
  • One prompt returned a fanned hand of cards, each rotated into place, neighbours sliding aside as the hovered one lifts and grows.
  • Time to a working thing has never been shorter.
  • Bloat is one prompt away, and so is any small delight. Saying no is the hard part now.
It snags, and it forgets
  • I say finish the whole list, and no flavor text on cards, over and over.
  • Verbose by default, in code and in prose. Most of my editing is cutting.
  • Em dashes are only the surface. The whole cadence announces itself.
What it does to learning
  • Tutorials are dead weight. Ask, and it teaches while it builds.
  • Assembly-level tuning, nodeType 9, git bisect. What I skip learning is mostly what I no longer need to know, and that still reads as a loss.
  • It feels more like playing a game than writing code.
Five weeks with a fleet

What I'd carry to the next one

Always automate
  • It handed me a tidy file of achievements and said a human has to upload them. No. Write the Playwright script and drive the browser yourself.
  • The rig is what transfers between projects. Syntax in your head is not.
Spend the scarce model well
  • Fable is the sharpest and the most rationed. It wrote the multiplayer plan. Opus built it.
  • Claude, Gemini and Suno each win at something different. The results came from stacking them with local tools.
The hard part never moved
  • Almost nothing fails because it could not be built. It fails because someone stopped.
  • Motivation, communication and vision setting matter more now, not less.
  • Start from the goal. Learn, earn, or make your friends laugh. Name the problem, not the thing you want to build.
If you try this

What I'd tell your team

1 · Verification is the product. The game is agent output; the audits, sims, and screenshot drivers are what make it shippable. Build the proving ground first.
2 · Demand evidence, not diffs. A PR with a screenshot and a green audit merges itself. Reviewing code line-by-line doesn't scale to ten workers; reviewing outcomes does.
3 · Isolation is cheap, lost work isn't. Worktrees, relentless pushes, no shared mutable history. Ask me how I know.
4 · Keep taste human. Direction, feel, fairness, humor. The prompts that matter are opinions. “Thunderclouds have to be a lot cooler than just circles.”
5 · Size the ceremony to the change. One-line fixes go inline; only real features earn the full ticket pipeline. Overhead must pay for itself.
The part everyone is doing arithmetic about

The whole bill was about five hundred dollars

WhatCost
Claude Max$200 / month
nano-banana image generation$100, one month
Suno$10 / month
Steam Direct, once per game$100
Claude usage credits, bought once~$90
Everything else$0
No engine license, no middleware, no contractors, no art budget, no music budget, no publisher.
The usage credits were the one bad buy. The Max plan already covers the fleet, and paying per token on top of it bought me nothing.
Five weeks of a content studio, for roughly what a single day of contract art would cost.
Roadmap

Where it goes from here

Marketing, and wishlists above all · the biggest job left, and the one I have done least of
Pad-native overhaul · controller play without a cursor
Demo approval → Steam launch · through Valve's queue, then the Release button
Trading cards unlock post-release; OST goes live alongside
Mobile · the exports already build; the UX pass is the work
More of everything · the factory doesn't stop: content is a ticket away
Every costume Uncle Jim owns, celebrating early. Wishlist it and make him right.
Recap

One person. Thirty-five days.
A real game on Steam, and a factory that built it.

I spent almost none of these five weeks writing code.
I spent them filing tickets, checking evidence, and making calls on taste.
Not a prototype

It's a live store page, right now

the live Steam store page
Captured from store.steampowered.com. The real page, live today. Every asset on it came out of the same pipeline.
Capsules, trailer, 10 screenshots, animated GIFs, the long-form copy, the tag set, the AI-content disclosure, and the release date.
Localized into 10 languages. Three approved Steam apps hang off it: the game, a free demo, and the soundtrack, plus 78 achievements and a 15-card trading-card set with badges and backgrounds.
Scroll far enough and Steam puts it beside Slay the Spire. That's the shelf it's trying to earn.

Ask me anything

← → navigate · F fullscreen
Warlords
Turn your phone sideways
Then tap once to go fullscreen. Tap or swipe to move through it.