The Modder's Manual
Everything the editor does, explained in plain language. New here? Read Quick Start, then come back to the rest when you need it. You can also replay the interactive walkthrough any time with the ? Tour button in the editor's top bar.
Quick Start
This tool builds a playable custom character for Slay the Spire 2 — their card pool, relics, custom statuses, and art — and compiles it into a mod you drop into the game. No coding required. Your work auto-saves to your browser as you go.
The flow, in 8 steps
- Character tab — name, HP, gold, energy per turn, and the character color (it tints every card frame in game).
- Cards — build your pool. Click a card in the sidebar to edit it; add effect blocks to define what it does.
- Upgrades — for each card, decide what its + version does at rest sites.
- Token cards — cards created mid-combat (like Shivs). Create these before referencing them from effects.
- Mechanics — your own buffs/debuffs (custom statuses). Same rule: create first, reference after.
- Relics — passive items with a trigger and effects. You need at least one.
- Balance — optional sanity check of your numbers.
- Export — fix any pre-flight issues, then Compile & Download and install (see Export & Install).
Minimum requirements
A mod must have at least 10 cards and 1 relic before the export buttons unlock. A new project starts with just Strike, Defend, and a starter relic — add at least 8 more cards of your own to reach the minimum.
Cards
Types, rarities, targeting
- Attack — deals damage; red frame. Most damage effects live here.
- Skill — everything that isn't an attack or a power — Block, draw, debuffs; blue frame.
- Power — a permanent effect for the rest of the combat; green frame. Power cards can use start-of-turn / end-of-turn timing on their effects.
Rarity controls how often a card shows up in rewards: Basic (starter deck only, never in rewards), Common, Uncommon, Rare, and Ancient — see the rarity rules before using Ancient.
Target decides who the card hits: Self, AnyEnemy (player picks one), AllEnemies, RandomEnemy, AnyAlly, or AllAllies (ally targets matter in co-op).
Effect blocks
A card is a stack of effect blocks, executed top to bottom when the card is played. Each block becomes real game code on export. The picker groups them by category:
- Damage — single hits, multi-hits, hit-all, random target, scaling damage.
- Defense — gain Block, heal, lose HP (for high-risk designs).
- Power — apply buffs/debuffs — vanilla ones like Strength, Weak, Poison, or your own custom statuses.
- Card — draw, discard, exhaust, upgrade cards mid-combat, and add token cards to hand / discard / draw pile.
- Utility — energy, gold, max HP, stances, Mantra, and other odds and ends.
- Orb — channel and evoke orbs (give your character orb slots in the Character tab first).
Conditions
Every effect block has a condition dropdown, defaulting to “Always (no condition)”. Pick a condition and the effect only fires when it's true — e.g. target has Poison, player HP below N, last card played was an Attack, in Wrath stance, enemy intends to attack. Some conditions take a number or a custom status to check for.
A conditional effect can also carry an Otherwise branch — effects that run only when the condition is false. That's the clean way to build “deal 7 damage; deal 14 instead if the enemy is Poisoned” cards. Otherwise-effects can have a condition of their own (one extra level), so “if A do X, otherwise if B do Y, otherwise Z” works too.
X-cost and other advanced options
- X-Cost — the card costs all your remaining energy and its effects scale with the amount spent (like Whirlwind).
- Playability condition — the card can only be played while a requirement holds — hand is all Attacks (Clash), exhaust pile is large enough, or no cards discarded this turn.
- Self-scaling — the card permanently grows (+N damage or Block) every time you play it — the Rampage pattern.
Keywords
- Exhaust — the card is removed for the rest of combat after being played once.
- Ethereal — if it's still in your hand at end of turn, it exhausts.
- Innate — always in your opening hand.
- Retain — not discarded at end of turn.
- Sly — when discarded, the card plays itself automatically.
- Eternal — the card can never be removed from your deck.
Card text
You never have to write card text: the description is auto-generated from your effect blocks (shown in italics under the effects list and on the card preview). If the auto text reads awkwardly — long conditional chains are the usual culprit — type your own in Description Override. Numbers in an override are up to you to keep in sync with the actual effect values. If an overridden card also upgrades, fill in the upgraded description too — a plain override freezes the shown numbers, so the + version needs its own text.
Upgrades
At rest sites the player can upgrade a card once, turning it into its + version. The Upgrade section on each card decides what that means:
- Cost Reduction — the + version costs this much less energy (a 1-cost card with reduction 1 becomes free).
- +Damage / +Block / +Heal / +Draw / +Energy on Upgrade — one input appears per stat the card actually uses; the + version adds that amount. Two damage effects on one card share a single damage value, so one input upgrades both.
- +Stacks on Upgrade — for cards applying vanilla statuses (Strength, Weak, Poison...), the + version applies this many more stacks.
- Remove Exhaust on Upgrade — the + version no longer exhausts (shown only on Exhaust cards).
- Add Retain on Upgrade — the + version gains Retain.
Token Cards & Custom Statuses
Token cards
A token card is a card that other cards create during combat — think Shivs. Tokens never appear in card rewards or shops; they only exist when an effect puts them in your hand, discard, or draw pile. Create them under Token Cards in the sidebar; they get the same editor as normal cards (effects, keywords, art, upgrades).
Custom statuses (Mechanics tab)
A custom status is your own buff or debuff — a named icon with stacks that does something on a trigger (after a card is played, when damage is taken, at turn end...). Define them in the Mechanics tab, then apply them from cards or relics with the “apply custom status” effect.
Besides triggers, a status can have Passive Effects — always-on stat changes while it's active, the way Strength or Barricade work: extra attack damage, cheaper cards, more draw, keeping your hand or Block at end of turn, immunity rules, and dozens more. Most scale with the status's stack count.
Reskinning a base mechanic. Want Poison, but called Ether with your own icon? In the Mechanics tab open Templates and pick Poison-style or Regen-style — they rebuild the exact vanilla behavior (lose or heal HP equal to stacks each turn, fading by 1). Then just rename it and upload an icon. The behavior stays; only the skin changes.
Stances
Stances are the Watcher's Wrath/Calm/Divinity system — you are in at most one at a time, and it changes how much damage you deal and take. The Stances panel at the top of the Mechanics tab lets you build your own: set Damage Dealt % and Damage Taken % (200 = double like Wrath, 50 = half), energy gained on enter or exit, and whether it auto-exits at the start of your turn (the Divinity pattern). Give it a name and icon, then enter it with the Enter Custom Stance effect on a card, relic, or status — and branch card logic on it with the In custom stance condition. The Exit Stance effect leaves whatever stance you're in.
Stack-scaled effects and streaks
Inside a status's triggers, several effects can scale with the status's own stack count. “× Stacks” checkboxes on Apply Status and Lose HP multiply the amount by the current stacks, and there are dedicated stack-scaled Damage and Block effects. The “Change Own Stacks” effect lets a status modify itself — a negative value is the classic poison decrement (the status disappears at zero).
For example, a poison-style debuff is: trigger at end of turn, effect Lose HP with × Stacks checked, then Change Own Stacks: -1. Whoever carries it loses HP equal to its stacks each turn, then it ticks down by one.
The after a card is played trigger also supports “In a Row” — fire only on every Nth consecutive matching play (playing a non-matching card resets the count). Combined with the card-type filter: “whenever you play two Attacks in a row”. Relics get the same pair of controls on their onCardPlay trigger, and their streak count resets at the start of each combat.
Stat manipulation, gold costs, and potions
Apply Status reaches every base-game status — search the dropdown for Vigor, Strength, Ritual, and the rest. Check “Reduce instead” to apply negative stacks: that's how you make an enemy lose Strength, exactly like the game's own debuff cards. Temporary this-turn-only versions exist as their own statuses (Coordinate for Strength, Anticipate for Dexterity, Dark Shackles for enemy Strength).
Cards that spend gold as a cost: add the Lose Gold effect next to the attack's damage. And “Obtain Random Potion” is the Alchemize effect — it rolls a random potion using the game's own generator (nothing happens if your potion slots are full).
Relics
A relic is a passive item: pick one trigger, attach effect blocks, and the effects fire every time the trigger happens. Relics can also carry Passive Effects — always-on stat changes with no trigger at all (extra draw every turn, cheaper cards, more gold from fights, and so on). Rarity (Starter, Common, Uncommon, Rare, Shop, Event) controls how the relic is found in a run. Your character begins every run with the Starter relic; if your configured starting relic is ever deleted, the first relic in your list is used instead.
Triggers
| Trigger | Fires |
|---|---|
onPickup | once, the moment the player obtains the relic. |
combatStart | at the start of every combat (the classic starter-relic trigger). |
combatEnd | when a combat is won. |
turnStart | at the start of each of your turns. |
turnEnd | at the end of each of your turns. |
onCardPlay | every time you play a card (powerful — keep the effect small). |
onDamageDealt | whenever you deal damage to an enemy. |
onDamageTaken | whenever you take damage. |
onBlock | whenever you gain Block. |
onHeal | whenever you heal. |
onRest | when you rest at a campfire. |
Images
You can upload your own art anywhere the editor offers it. Uploads are automatically resized to the target dimensions, so close-enough source images are fine — but the aspect ratio should match or things get cropped.
| Asset | Size | Transparency | Where it shows up |
|---|---|---|---|
| Card art | 500 × 375 PNG/JPG | no | the picture in the top half of each card. |
| Relic icon | 256 × 256 PNG | supported | relic bar at the top of the screen, reward and shop screens. |
| Status (mechanic) icon | 256 × 256 PNG | supported | the buff/debuff icon row under a creature. |
| Character portrait | 256 × 256 PNG/JPG | no | character select screen and run UI — the default art for every character slot. |
| HUD icon (optional) | 88 × 88 PNG | supported | the small combat icon at the top-left; falls back to the portrait if not set. |
| Select screen art (optional) | 132 × 195 PNG/JPG | no | the tall character-select button image; falls back to the portrait if not set. |
| Energy counter layers (5) | 256 × 256 PNG | required | custom energy orb in combat, built from 5 stacked layers (2 and 3 rotate); all 5 or none. |
| Combat sprite | 512 × 512 PNG | required | your character standing in combat. |
| Pose images (5) | 512 × 512 PNG | required | idle / attack / cast / hit / dead poses, for the basic animation mode. |
| Spritesheets | any size, 1–60 frames | required | full animation mode; one sheet per pose plus a frame count, played at 1–30 FPS. |
Shop & Rarity Rules
The Rare-card minimum
The in-game merchant stocks five cards from your pool, typed Attack / Attack / Skill / Skill / Power, and each slot can roll Rare. If a slot rolls Rare and your pool has no matching Rare card of that type, entering the shop crashes the run. A crash-proof pool therefore needs at least:
| Card type | Rare cards needed |
|---|---|
| Attack | 2 |
| Skill | 2 |
| Power | 1 |
The pre-flight check warns you when you're short, and the compiler auto-fills the gap with generic filler cards (Honed Edge, Reckless Cleave, Bulwark, Second Wind, Inner Fire) so your mod never bricks a run — but filler is boring. Replace it with your own Rare cards.
Ancient cards
Export & Install
Three different downloads
- Export .json — your project file — a save you can back up, share, or re-import later. Not a mod. Your browser also auto-saves, but a .json export survives cleared browser data.
- Download C# Source — the generated code as one combined .cs file, for the curious or for compiling by hand. Most people don't need it.
- Compile & Download .zip — the real thing: sends your project to the compile service and returns a ready-to-install mod.
Pre-flight checks
Above the export buttons, the Export tab lists everything that would break or degrade your mod before any compiling happens: empty or non-English names, effects pointing at deleted statuses or token cards, a missing starting relic, and the Rare-card shop minimums. Red errors block compiling until fixed; gold warnings are handled automatically but worth reading.
Installing the mod
- Extract the downloaded
.zip— it contains two folders: your mod andBaseLib. - Copy both folders into your STS2 mods directory:Windows: Steam\steamapps\common\Slay the Spire 2\mods\Mac: ~/Library/Application Support/Steam/steamapps/common/Slay the Spire 2/mods/
- Launch STS2, open Mods in the main menu, enable both
BaseLiband your mod, then restart the game. - Your character appears on the character select screen.
BaseLib is required. It's the modding library your mod is built on; without it enabled, your mod won't load. If BaseLib is already installed from another mod, you can skip copying that folder.
If the compile fails
The Export tab translates compiler errors into plain language and names the card or relic responsible. The usual suspects:
| Error | What it means |
|---|---|
CS0101 | two items produce the same internal name — rename one of them. |
CS0246 | an effect references a custom status or token card that was deleted — re-link or remove the effect. |
CS1002 / CS1513 | a name or description contains characters that broke the generated code — usually quotes or unusual symbols. |
CS1503 / CS1061 | a bug in the mod creator itself; it is reported automatically — try removing the most recently added effect. |