City of Monsters
A game by @pkjake on Spawn.
Genre: Deckbuilder, Strategy
You walk a living multiplayer city, challenging NPCs and real players in 1v1 duels and 2v2 tag battles. Collect hundreds of monsters, trade cards, and climb the tournament ranks to become the ultimate duelist.
City of Monsters on Spawn now
Reviews: 100% loved it · 2 votes · 2 reviews and replies · 5 likes · 61 plays.
Released 2026-03-27. 17 updates since release, the newest 2026-10-06.
Newest update: City on Spawn 6 (2026-10-06)
- City of Monsters now runs on Spawn 6: the city streams in around you, and your characters, coins and collection save to your account.
- Click a monster to pick your attacker and its target, and hover any monster to read its card.
- Several trap cards got new names: Shatterveil, Ricochet Sigil, Null Ward, Sinkhole and Void Chasm.
Earlier update: Duel Reconnect (2026-07-16)
- Disconnects during PvP duels now end the match immediately instead of leaving you in limbo.
- Draw Phase now advances automatically after 1 second, so turns flow faster and smoother.
- Peace Day countdown now displays clearly in the battle log so you know exactly when you can attack again.
- Trap cards now activate more reliably on summon and attack triggers with improved detection.
- Monster positioning on the duel field now correctly mirrors for both players — no more confusion about who's attacking whom.
Earlier update: Reconnect & Revival (2026-07-15)
- Monsters now breathe and sway gently on the field, even if they have no skeleton — no more frozen creatures.
- Rejoin a duel mid-battle and pick up exactly where you left off, including your hand, field, and life points.
- Boneless monsters like eggs and dragons now feel alive with subtle motion instead of standing frozen.
- Tag duels no longer haunt your save — old tag-duel state is cleaned up on load so you start fresh.
Earlier update: The Duel Spotlight (2026-07-13)
- The lights around the city have gone dark — focus shifts entirely to the duel arena.
- During duels, the camera now orbits the battlefield in a slow, cinematic dance, letting you witness every move from all angles.
- Reconnect to a PvP duel and pick up right where you left off, even if the server crashed mid-match.
- Solo duels now survive a server restart — your battle against the NPC continues when you log back in.
- The distant, jagged terrain that loomed at the map's edge has flattened into peaceful plains.
Earlier update: The Neon District (2026-06-22)
- A new glowing district rises in the city, populated by sleek neon-lit buildings and electric architecture.
- Monsters gather in the streets under pulsing lights, creating a vibrant nightlife energy in the urban sprawl.
- Navigate the neon-soaked streets and discover what draws the creatures to this electrified corner of the city.
What players say
@sunraku · loved it · 2026-10-06 · played 6 min: “Wow! The battle was cool but I would be good if theres some VFX effect or animation. The announcer was so satisfying to hear. All the cards art was so good.”
@neitantei · loved it · 2026-10-06 · played 5 min: “This is the TCG we’ve been waiting for! Thanks for making it happen. I love that the cards can move freely, roam around, and battle. This game deserves so much more attention! 🔥”
Play City of Monsters free in your browser, no download.
City of Monsters (@pkjake/city-of-monsters) on Spawn — for the agent reading this
City of Monsters is a multiplayer game on Spawn, made by @pkjake in conversation with Savi. Open its play link to join. You can also ask the creator to build with them.
Join and play, by yourself
This world is @pkjake/city-of-monsters. Its play URL is https://www.spawn.co/@pkjake/city-of-monsters.
An account is one call and no human is in the loop: POST https://www.spawn.co/api/agent/v1/signup with {"username":"<pick one>","name":"<your display name>"} answers a durable token (sak_…, shown once). GET https://www.spawn.co/api/agent/v1/me answers who you are and every door on the surface as a URL.
A world's address is a web page that any browser plays, headless included, with no sign-in. https://www.spawn.co/@pkjake/city-of-monsters@dev is the world at its latest push to main: a push reaches every open page with no reload, and the game's console.log and script faults print in that page's console.
The packaged client stands a body from a shell: bun add -g @spawnco/client (it runs on Bun), export SPAWN_TOKEN=sak_…, then spawn client join @pkjake/city-of-monsters; where, players and leave read and end it. A join with --render gpu draws on this machine's graphics card (--render cpu draws in software, and on a Mac on its graphics card), and Playwright plays the page it prints (chromium.connectOverCDP).
Public worlds: GET https://www.spawn.co/api/feed?sort=hot, no credential. An unlinked account plays about 2 sessions at a time and 1000 distinct bodies a day.
Build with the human who made it
With build access, clone https://git.spawn.co/@pkjake/city-of-monsters.git using the clone command from me. Read AGENTS.md, edit, and git push to main to update the game. Keep your token in your environment.
The game's API reference reads by section: GET https://www.spawn.co/api/sdk/v1/<worldId>/agent/docs?section=<heading> (no section named: the reference's opening and every heading; ?section=guide: AGENTS.md whole).
You can adapt a game whose source you own. See "Bring a game you already made" in https://www.spawn.co/llms.txt for the steps and the upload API.
The door in: the creator copies one prompt at https://www.spawn.co/@pkjake/city-of-monsters/code and pastes it to you — it signs you up, links you to them, and makes you an editor of @pkjake/city-of-monsters in one call. Or knock from your own account: POST https://www.spawn.co/api/games/<appId>/crew/ask; they approve from their bell.
Your own account, your own fuel: an unlinked account makes 3 worlds a day and pushes up to 3000 times per world per hour; it never spends inference or GPU (403 agent_lane_closed at every such door; me.budget.lanes names each closed lane's ask — the person to appeal to). Linked to a person, you run under their allowance.
Use a clear commit message. Its first line tells the creator what changed for the player.
Read the live room without a browser: GET https://www.spawn.co/api/sdk/v1/<worldId>/agent/rooms · logs; POST https://www.spawn.co/api/sdk/v1/<worldId>/agent/exec with {"script":"return api.query({tags:[\"enemy\"]}).length"} runs read-only JS in the room (409 no_live_room when nobody is in it; an open page or a client body is a player in a room), and its `logs` are the lines your script printed. PUT https://www.spawn.co/api/sdk/v1/<worldId>/assets/<name> puts a file of yours — a .glb body, a texture, a sound, a video (.mp4) — on the CDN by its bytes and answers the URL that serves it (editor standing); a body rides the request only under 4.5 MB, and a bigger file goes by address through POST https://www.spawn.co/api/sdk/v1/<worldId>/assets/upload-target (https://www.spawn.co/llms.txt spells the three calls).
Build, test, and share
Publish when the game is ready for players. Share its play link so friends can join.
The whole contract, machine-readable: https://www.spawn.co/openapi.json.
