← Back to editor

What's New

What's New

Newest first. Nearly all of it comes from people building characters and telling us what broke or what was missing.

1.2.0

2026-09-09

A lot of this update came from things you were trying to make and couldn't quite get the editor to do. There's also another layout to try, because finding the right setting shouldn't be the hard part.

New

  • Fixed older epochs with no unlock requirement missing from the Timeline. They now appear ready to reveal, and their cards stay available as before. Re-export your mod for the fix.
  • Effect conditions can check for a custom enchantment on the card, or a minimum number of its stacks.
  • Summon Pet can give a timed pet extra turns when the summoning card is upgraded. Set the pet's normal duration under Leaves after, then set the extra turns on the summon effect.
  • Damage formulas can read a custom status now. Use selfCustomStatusStacks or targetCustomStatusStacks and pick the status below the formula. For example, energySpent * (4 + min(10, floor(selfCustomStatusStacks / 10) * 2)) adds 2 damage per Energy for every 10 stacks, up to a bonus of 10 per Energy.
  • Fixed Transform All Cards Named catching the card while it was still being played. That copy now finishes playing before it transforms, so Exhaust and Return to your hand can finish properly. Re-export your mod for the fix.
  • Affliction and enchantment effects now check their attached card for “this card” conditions, including inside Otherwise branches.
  • Added "Whenever you lose HP from a card" to mechanic triggers. Use it with Apply Status → Strength to reward card-caused HP loss. It fires once per HP-loss event, and ignores fully blocked hits and damage without a card source.
  • Remove Block can now take a percentage of your current Block. Set it to 50 to lose half; odd amounts round the loss up.
  • Added Increase Mechanic Maximum. Pick a mechanic with a stack limit and raise that limit for the current fight or the rest of the run. Works in effect blocks, including on-kill triggers, and as a permanent event reward. Run bonuses survive saving and loading; raising the limit doesn't add stacks by itself.
  • Fixed pets coming back invisible after dying and being summoned again. Their idle animation now restarts instead of staying on the last death frame. Pets with a death sheet but no idle sheet return to their normal image. Re-export your mod to get the fix.
  • Airborne and push/pull animations now move just the character's art. The HP bar and status icons stay put. Re-export your mod to get the change.
  • Scaled effects can use the damage of a hit just before it lands. Choose the incoming or outgoing before-hit trigger, then use pendingDamage in an expression, such as floor(pendingDamage / 2). This includes damage modifiers, before Block.
  • Added Swap Draw and Discard Piles. It keeps the cards and their order, including upgrades and enchantments.
  • Shuffle Draw and Discard Piles has a “Do not trigger shuffle effects” option. Normal pile-entry effects still fire, and later automatic shuffles still work as usual.
  • Cards and tokens have a “Capped?” checkbox for Strength and Vigor. Set the maximum bonus per hit: 5 damage three times with a cap of 3 stays at 8 three times, even with 25 Strength. The cap is shared by Strength and Vigor; Weak, Vulnerable and enchantments still work normally. Re-export your mod after setting it.
  • Added max-HP comparisons to conditions. You can check whether a target has more max HP than you, or equal/less, without injuries changing the answer.
  • Statuses can lift their holder off the ground while active. There's also a push/pull animation block. Both are visual tools; pair them with damage, Block, or a passive for the actual effect.
  • Fixed an export error when a card checked the previous card's tag more than once.
  • Fixed card-driven pet attacks not triggering Phantasmal Gardener's Block. They now count as attacks properly, including when a token orders the pet to attack. Re-export your mod to get the fix.
  • “Anyone” cards now give Block and statuses to the creature you picked. They were applying them to you even when you targeted someone else.
  • Raised the pet limit from 20 to 151. That's room for 151 different pets in a project; you don't need to summon them all at once.
  • Events can remove a specific card from the deck without opening a selection screen. Pick the card and how many copies to remove. If the player doesn't have it, that step does nothing.
  • The ally-card-play trigger now has card, type, keyword, and tag filters. Create Token blocks also let you give tokens to teammates, everyone, or the player whose card triggered the effect.
  • Added Change Enemy Intent. It can pick a random different move or look for an attack, defense, buff, or debuff. The enemy continues its sequence from that move. Locked transitions and special moves are excluded; if nothing else matches, its intent stays as it was.
  • Fixed character sprites and idle animations not showing up if you hadn't uploaded a portrait. A sprite sheet or normal sprite works on its own now.
  • Grey token cards keep the colourless energy symbol now. Tokens with their own colour still use your character's symbol.
  • Hiding a pet's HP bar no longer makes it impossible to target. Its status icons stay with the pet too.
  • Summon Pet has a Pet HP upgrade field, and Remove All Pets does what it says: your pets leave combat without being killed.
  • Added “This card was made free by an effect” to effect conditions and playability rules. You can use it to skip a token payment on a free card without also skipping it on every card that normally costs zero.
  • “Before taking a hit” can be limited to hits that would be lethal after your current Block. Give Block there and it arrives before the hit lands. Later effects that prevent HP loss or redirect damage aren't included in that check.
  • Fixed uploaded per-type frames being tinted by the character colour. Picking black could turn the whole uploaded frame black. A Power-only frame still only applies to Powers; use the default slot to cover every card type.
  • “This card is upgraded” works in enchantment pile triggers now too. Card and token pile triggers keep checking their own upgrade state.
  • Pile triggers can fire when this card enters hand, draw, discard, or exhaust. This includes turn-end moves, so you don't have to pretend every trip to discard is a discard effect.
  • Login emails now ask you to press Continue before signing in. Opening or previewing the email link won't use it up. Already-used and expired links also get their own messages.
  • Fixed an export error on cards with more than one pet attack, including a second attack gated on another pet being alive.
  • Description overrides now hide the automatic Wears Out sentence too. You can still use {expiry} in your own text for the live countdown.
  • “The targeted pet is…” lets a card do different things for each pet. Use it on separate Discover blocks to give each pet its own three cards to choose from.
  • Cards and tokens can target “Any pet” now. Pick one of your living pets to give it Block, healing, or statuses. “Any ally” still means a multiplayer teammate.
  • Mechanics can reward you for every X status stacks gained. Pick the status, set the number, and add your reward. Leftovers carry over, losing stacks doesn't erase progress, and a big gain can give more than one reward.
  • Pet attacks and {petdamage} now account for Vulnerable, the pet's own Strength/Weak, and card enchantments. They don't borrow the player's Strength.
  • Weak's card tooltip uses “Weakened creatures…” again, so applying it to an enemy doesn't read like a debuff on you.
  • Energy symbols in card text and card costs now use your uploaded orb artwork. They were still using an orb drawn from the character color.
  • You can leave energy layers empty, or use just a stationary backdrop. Moving your background out of a spinning layer no longer makes the whole counter disappear.
  • Fixed random-target pet attacks on token cards getting stuck in the middle of the screen. Pet Attacks also has its own Random enemy option now, so you can use it directly in a mechanic trigger.
  • Fixed enemy-held scaled statuses ignoring the other enemies when set to Other allies. This was breaking chains like Detonate spreading damage from Burning.
  • Fixed the energy backdrop being left out of compiled downloads even though it was present in the source export.
  • Leaving a stance no longer adds a visible “No stance” icon. Exit effects, like Calm's energy, still happen.
  • Card costs can follow your statuses. Reduce a card's cost for each custom status stack you apply, or tie it to the stacks you currently have. The current-stack option goes back up when you lose stacks.
  • Apply statuses to pets. There's a new effect for giving your living pets a custom or game status. Pets also get their starting mechanics back when you summon them after they die.
  • Fixed token choices showing the base version when they were going to give you an upgraded token. The choices now show what you'll actually get.
  • Fixed {petdamage} staying at its base value when the card was upgraded.
  • The HP-bank passive now has its missing status picker, with an explanation of what gets stored and when.
  • “When this card is discarded” no longer checks for a pile the card has already left. Multiple discard groups can run on the same card. The editor also explains the difference between discarding through an effect and clearing your hand at turn end.
  • Discover tokens by tag. In Discover a Card by Tag, set Discover from to Your tokens. Put the same tag on your twelve tokens and set Candidates shown to 3 to offer three random, different choices.
  • Upgradable curses. Turn on Allow upgrades in a custom curse's Upgrade section. It can then be upgraded by card effects, rest sites and other upgrade sources. Existing curses keep their old behavior.
  • Damage-result statuses can go somewhere else. Deal Damage and Apply Status from the Result has an Apply status to setting: the enemy hit, yourself, your teammates, all allied players, all enemies, or all other enemies.
  • Cards and tokens can now start with Replay. Add Give This Card Replay to their effects, then turn on Change Replay when upgraded if you want the upgraded card to play more (or fewer) times. Replay 2 means three plays total.
  • Upgrade specific cards or tags with Upgrade Cards in a Pile. Pick your card, a token, a base-game card, or a custom tag under Which cards. Turn on Upgrade every matching card to upgrade each eligible copy once without a picker. Deck upgrades stick around after combat; other piles affect that fight's cards.
  • One download for main and beta. Pick Automatic in Game Branch when exporting. The mod chooses the right build when the game starts. Features that only exist on one branch still need a single-branch export, and switching branches mid-run is still up to the game's save format.
  • A smaller sidebar. The << button in the Newer layout shrinks navigation down to icons. Click >> to bring the names back. It remembers your choice.
  • Compact card lists. Pick Compact · drag order in the sort dropdown to fit more cards on screen, in the order you arranged them. Switch back to Drag order to move them around.
  • More control over events. Choose which acts an event can appear in, and whether another custom event has to be visited first.
  • Fixed duplicate token groups when switching lists, including folders named Tokens.
  • Fixed a source ZIP issue that some unzip tools were less forgiving about. Automatic source downloads include both gameplay projects and the loader.

Mods without a character. Change Mod Type to Content Pack in Mod Info. Make a few cards, a relic, an event, or a whole collection. Cards join the existing characters' reward pools; relics, potions and events can turn up in their runs too. Their usual rarity and unlock rules still apply. You can leave the other lists empty.

Folders for tokens. Tokens have their own categories and sorting now. Use the Tokens view beside All Cards to work on them without your whole card pool in the way.

More archetypes in Balance. Add the archetypes your deck actually uses and assign their cards. At least 15% of the pool counts as primary, 10% to under 15% as secondary. Smaller synergies stay out of the archetype totals. There's an optional warning for two or fewer primary archetypes, or five or more.

A backdrop for the energy counter. One stationary layer behind everything else, including both spinning layers. Existing layers keep their positions.

Epoch unlock requirements. Set an Epoch to unlock after wins, completed runs or floors climbed. Its requirement appears in the Timeline hover text. Cards assigned to it become available when you reveal the earned Epoch. Existing Epochs keep their previous behavior until you choose a requirement.

A newer layout. The layout selector now has Old, New and Newer. The newest one uses full names in the navigation, keeps Balance and Export within reach, and adds a section picker to long editors. Pick a section and it'll open it for you, even if it was collapsed. Same project, same settings; switch back whenever you like.

Fixes

  • Description overrides now hide the extra running-total sentence when Override replaces auto-text is on. You can also use {calculateddamage} in a scaled card's own text without turning on the running-total checkbox.
  • The guide now separates solo card counts from full pools including multiplayer cards, with main and beta versions listed. Solo pools have 35 uncommons and 25 rares; beta's full pools have 38 and 27.
  • Separate copies of a mechanic now read their own counter when checking their own stacks. One copy reaching its threshold shouldn't make another copy fire early.
  • Fixed an export error with nested Otherwise effects on cards in a pile. This was rejecting setups the editor allowed, including Oathsworn's Chastise.
  • Creating cards without the fly-in preview now updates the discard and draw pile counters too. You can still turn the preview on if you want the animation.
  • Added a warning when a random status amount runs into the mechanic's stack limit. A Single mechanic without stack accumulation caps at one, even if the effect rolls more.
  • Enter Stance now uses the custom stance you selected. Add Card to Hand and Discard can use your cards and tokens too, without turning them into Wounds. Missing selections point you back to the effect instead of quietly substituting another card or stance.
  • An unfinished tag clears when you switch cards or tokens. Press Enter to add it to the card you're editing.
  • The “Gain Status per HP-Damaging Hit” export error names the card or mechanic to check and explains which trigger it needs.
  • Negative random amounts work for custom status stacks. A range of -10 to -1 rolls within that range instead of sticking to one value.
  • Token-count upgrade controls show up again on cards that use them.
  • A full card description override also hides the extra automatic scaling text in the editor preview.
  • Uploaded Epoch portraits use your art in the small Timeline view instead of the NOPE image.
  • An image upload that finishes after you switch projects can't write into the project you switched to. Saving a cloud copy also keeps its art separate. New projects no longer pick up old, unscoped cached images.
  • Switching layouts while editing a card no longer leaves its panel blank.
  • Percentage passives show what their numbers mean. With the default stack calculation, 101% means 1% more per stack, and the editor shows the result at six stacks. The calculation picker sits beside the value now.

There is clearer help around stacking and death prevention too. Stacking adds to one status instance; use the stack multiplier when its effect should scale with the amount. A fatal hit has different timing from an ordinary after-damage trigger, which matters for healing and revival mechanics.

Still being investigated

The Susan crash, the Ember freeze, and the reports of revival or upgrades changing behavior mid-run aren't confirmed fixed. The small reproductions passed, but we haven't reproduced those exact failures.

1.1.0

2026-09-09

Everything since 1.0. A lot of this came from people trying to make a card or relic do something the game already does, and finding the one option that was missing.

We worked through the vanilla cards, statuses, relics, potions, orbs, enchantments and afflictions to fill those gaps. There is quite a bit here.

New

Your own afflictions. Give a card a debuff you designed: extra effects, keywords, a different cost, or something that happens while it waits in a pile. The seven vanilla afflictions are still there beside them.

Passive effects can leave some cards out. "Only for cards with this tag" now has an inverse. Exclude a tag, a card type or a particular card from a mechanic without having to tag everything else in the deck.

An attack can ignore Block. A checkbox on cards and tokens. It still counts as an attack, with the usual damage modifiers and things that happen on a hit.

More ways to choose, copy and change your deck. Copy a card with its upgrades and enchantments, enchant cards permanently, or offer a choice from your own pool, Colorless cards, or both. Upgrade or transform the first, last or every Basic Strike and Defend. A reward can also give you a card even if you skip the choice — the Hefty Tablet arrangement.

A relic can show you its card before you take it. The Dusty Tome shape. The card is picked when the relic is offered, appears in its hover tips, and stays picked through a save. You can choose the pool, rarity and whether it comes upgraded.

Relics have more say in rewards. Change which card pools are offered, upgrade or enchant cards as they arrive, and choose whether a relic can appear at Neow. Card upgrades can happen before or after other changes to a card, including when the card is already upgraded.

Cards and tokens can carry campfire quests. Having the card in your deck adds an option at the rest site. Give it effects, a limit on uses, and a choice of whether it disappears once it is finished. Cards used just as choices can resolve their effects without being played or spending energy.

More precise triggers. A hit and a hit that actually takes HP are separate things. So are the first event and every event, a card being created and drawn, an orb being channelled and evoked, and the different points at which a turn starts or ends. Relics can also react to Osty's attacks and an enemy losing their last Block.

A counter can belong to a turn, a fight or the whole run. Limit how often an effect fires, keep a running total, or make a reward happen every few turns. Relic counters that need to survive saving do.

More numbers to build an effect around. Energy and Stars spent, cards and attacks played, actual damage dealt, cards left in a pile, empty Orb slots and status stacks. Selected copies of a card can grow their own values, including Wither-style self-damage, and keep those values when copied or saved.

Cards that play tokens can follow their targeting. If a status changes what the token can aim at, its launcher can use that target too. There is also an option to pass the enemy you selected through to the tokens it plays.

More control over automatic plays. Choose existing cards to play again, play a sequence, and distinguish a paid play from a free play or a duplicate.

Art and editor

GIF and MP4 character-select backgrounds. Upload either and it is turned into a looping animation for the game.

Sprite sheets go up to 60 frames and 30 columns. The column picker was still stopping at 16. You can play the animation and scrub through it in the editor.

Campfire art has its own size and position controls. You should not have to shrink your character inside a huge transparent image just to get their feet on the ground.

Status bars can show status icons. The side bars can use the same icons as the usual status row.

An upgraded number can go down. Negative upgrade changes work in the editor and in live card descriptions, including on tokens. A resource cost that drops on upgrade can now say so without a dummy status just for the text.

Relic repeat counts can go past 10. "Every N orbs channelled ever" and the other repeat counters no longer stop there.

Fixed

Random custom-status amounts actually roll. "1 to 6" was always applying 1. It now rolls the inclusive range, keeps upgraded minimums, and multiplies the rolled amount when you ask it to scale with stacks.

An enchantment aimed at whoever you hit reaches them. It was applying the status to you instead, even on an ordinary single-target attack.

Kaiser Crab can hit your back. Custom characters were being treated as facing both directions, making the fight easier than it should have been.

Custom curses go in the compendium's Curses section. They were appearing under the character's cards.

"Hide tooltip on cards" works on tokens too.

A dead creature's status bar goes away. The coloured bar could outlive the player, or briefly hang around after an enemy died.

Status damage predictions account for Block and damage prevention. This includes Buffer and Hardened Shell across multiple ticks. Ordinary status damage also respects Block when it is supposed to.

A companion arrives if you get its relic during a fight. It also no longer conflicts with the relic's other combat-start effects or spawns twice.

Categories drag from further down the list. This affected Mechanics as well as cards, especially on the new layout. Empty categories can receive items too.

A search stops following you into tabs with no search box. Searching for "Bomb" in Cards no longer leaves Afflictions silently filtered for Bomb. Find also points to the keyword tab's current home.

Older projects have fewer reasons to refuse an export. Fixed missing sound data, leftover relic counter settings and effect groups that the editor had allowed but export rejected. Errors name the fields that need attention, and reports include the app version. Import and animation recovery also handle more of the older saved formats.

Both main 0.107.1 and beta 0.111.0 builds were checked. In-game testing was on beta; networked co-op was not tested for this release. If a combination still does something it shouldn't, please send a report with the character attached.

1.0.0

2026-09-04

Everything since the last notes — 3 and 4 September — and the release itself.

Three weeks of reports from people building real characters, plus two audits that went looking for the gaps nobody had reported yet. What follows is the whole of it.

New

Temporary statuses are a real thing now. "Gain 3 Strength this turn" used to mean applying +3 and then applying −3 on a turn-end trigger — two effects pretending to be one, showing in the status row as a permanent buff. Tick Temporary on any Apply Status effect and the game handles it: the temporary icons, the "wears off" wording and the taking-back, the same way the base game's own temporary Dexterity works. It can wear off at the end of your turn or the enemy's, and last extra turns if you want.

Afflictions. The seven card debuffs the game puts on your cards — Bound, Entangled, Galvanized, Hexed, Ringing, Smog and Tainted — can be applied to the cards in a pile, and cleared. These are the real ones, so they render with the game's own art and read in the player's language.

Ancient relics. The rarity was simply not on offer, and a third of the game's relics are Ancient. Same acquisition caveat as an Ancient card, and the checks say so.

Upgrade or transform cards from the whole deck, not just from your hand. The Astrolabe and Yummy Cookie shape. Removal has been there for a while; these two were missing beside it.

A card in a pile can watch what a status can watch. Nine more while-in-pile triggers: your Block hitting zero, your HP changing, energy spent on a card, your hand emptying, an orb channelled, an orb evoked, a potion drunk, Stars gained, and the fight ending. Enchantments got the same nine. A card can carry six while-in-pile triggers, up from two.

Enchantments act while their card waits in a pile, rather than only when it is played.

A card can get cheaper when it is drawn, the way Kingly Kick does.

Predict a custom status on the enemy's health bar, the way Poison is predicted — a shaded slice of the bar showing what your status is about to take, in a colour you pick, at whatever damage per stack you set.

Map a capped status to a bar in the combat HUD. The Alchemist's antitoxin shape, for a status with a ceiling.

Give energy, cards or Block to ONE ally — the one you aimed at. Every option before this fanned out to everybody, so "Believe in You" could not be written.

Scaled damage can hit more than once. "Deal X damage Y times" where X scales. Hits (Scaled) is the mirror, scaling the count and keeping the damage flat.

A card frame per card type, so attacks, skills and powers can read differently, with the measurements published so a frame can be drawn to fit.

Highlighting in card text, the way the base game does it. Terms like Draw Pile, Poison, Block and your own statuses are marked in gold automatically. The game does this by hand in its own card text and mod cards read flat beside it; now they do not. There is a switch in Mod Info if you would rather they did.

A status can read as its ICON in card text instead of its name, for the one or two a character mentions constantly. Upload an icon, tick the box on the status.

You can write colour and the energy symbol yourself. [gold]like this[/gold] in any description, and {energyPrefix:energyIcons(1)} for the energy symbol — which picks up your character's own icon. Both are noted under the description box now, since neither was findable.

"The player(s)" as a target for applying and removing statuses. On a status you put on an ENEMY, "self" is that enemy and "all allies" is the other monsters, so there was no way to name the human at all.

Five conditions on an effect, up from three.

A "spent N energy" condition, and a count of cards played this combat to scale from.

A token can be told which animation to play, the same dropdown a card has.

Scale an effect by the empty slots in your hand. It worked everywhere and was missing from the one list the dropdown reads.

"Download C# Source" gives you a project that builds, rather than a single file — everything, laid out so dotnet build works on it.

A new layout you can switch on and off. "New layout" in the top bar. Search moves to the top of the left rail with its shortcut, and the thirteen sections group into Build, Extras, World and Ship. Nothing is added or removed, and the old layout is one click away — the two can be compared on the same character.

Things sit with the things they belong to, on the new layout. Star cost, X star cost and the cost-reduction trigger moved up beside the card's energy cost. Sound, hit and cast effects, poses, animations and your own VFX moved in with the card's art. Borrowed card pools, your own keywords and the starting deck moved from the Hero screen to Cards; the Osty skin moved to Pets; mod info moved to Export.

A keyword can send its cards to your draw pile instead of the discard when played. Tick "To draw pile" on one of your own keywords and every card carrying the word follows it. Cards that Exhaust still exhaust.

Allies can be made to discard, at random — your target, your other allies, or everyone including you.

Discover a Card can offer up to ten rather than three, on the same grid the tag version uses. "Can skip" now works on that grid in both.

Cards can be banned while a status is up. The inverse of "you can only play cards matching the filter" — this one names what you *cannot* play, and a status can carry both.

A character can call stars something else. Embers, Souls, Charges — shown in the counter's tooltip and the "I don't have enough" message, only while your character is playing.

A character's own Strike and Defend carry the game's tags, so cards that care about them see yours too.

Fixed

Scaled damage on an "all enemies" attack measures each enemy. It computed one number and dealt it to everybody — from the enemy you aimed at, or from nothing at all on a card that aims at nobody, in which case it did not scale. Off a card it measured whichever enemy happened to be first.

Permanent damage growth survives saving and quitting. The growth was written to the save and never read back into the card.

Custom stance sprites hold through a token. A token played no character animation at all, where the same card as a regular card played the one your stance supplies.

"Predict on the enemy health bar" is visible. It was drawn behind the health fill, which covered every pixel of it.

The character-select background shows the whole image when you ask it to. It was being fitted, correctly, to a rectangle about 1.4× the size of the screen — so the window cropped it whatever the setting said.

"Enemy" means the other side again. On a status you put on an enemy, aiming an effect at "enemy" had started meaning the enemy's own side, so a debuff that was supposed to reward the player stopped reaching them. The fix that caused it — "all enemies" meaning the enemies, from a status sitting on an enemy — still stands; the two were being answered the same way and are different questions.

"All enemies" means the enemies, from a status on an enemy. A status the mod puts on an enemy whose trigger damages all enemies was damaging the party.

A permanently-scaling card no longer desyncs in multiplayer. The saved growth and the live number moved by different amounts the moment a step was not a whole number, so a client that had reloaded and one that had not held different damage on a card whose saved state matched exactly.

"At the end of your turn, while in hand" fires. The hand is emptied before that hook runs, so the card was never in hand by the time it was asked. It appeared to work only on cards with Retain, which are not flushed.

A search menu is no longer cut off by the panel it opens in. The condition list, and every other long list in the app.

Statuses on an orb can name your tokens and relics. Nine effects that work everywhere else did nothing on an orb.

A card that picks from a selection compiles. Every one of them failed to build.

A scaled damage potion hits what you aimed it at, and an aimed potion no longer fails to build.

Mod Info is visible on the new layout.

Damage triggers say they fire once per enemy hit, because they do — an attack that hits five enemies runs an "after you deal damage" mechanic five times. The checks warn when that is unlikely to be what was meant.

The balance checker stopped calling a temporary buff permanent scaling. A buff a card hands back is worth what it does this turn, which is what Block is.

The shop's Rare card check says which count it means. It counts Rares BY TYPE, so a pool of six could read as "you have 0" — twice — while the export panel said six. Both numbers were right and neither said what it was counting.

An ally is a living player, never a pet.

The checks name the effect that is unfinished, not just the mechanic it is on.

The checks warn when a timeline row or stance art will not do what it looks like it will.

Custom card frames are drawn the way you made them. The game was running your uploaded frame through the shader that recolours the vanilla red frame, which shifted the hues and washed out the lower panel. Re-export and it will look like your file.

"Add Card to Deck (permanent)" works outside combat — on a relic you pick up in a shop or a treasure room, which is where it was mostly wanted.

"Create upgraded only when THIS card is upgraded" works with "Choose from selection." It worked with a named token and silently did nothing with a chosen one. Enchanting a chosen token was broken the same way.

The vanilla hit effect can be turned off. There is a "None" option on Hit Effect now, for when it drowns out a custom hit VFX of your own.

Your character's own sounds stopped being reported as unused. Sounds set on the Hero tab — select, hit, dead, victory — were listed as dead weight while playing perfectly well in game.

Every while-in-pile trigger says when it fires in the card's text. Nine of them read as an empty phrase.

Auto-playing a token from a selection opens the selection.

The token selection screen says what it is for. It read "Choose a card to Enchant" when picking a token to play or a card to discover.

A relic's second "when status lost" trigger can name its own status.

Paying gold in an event builds again.

The moved panels kept the spacing they were inheriting.

0.10.0

2026-09-02

Everything since the last notes — 31 August through 2 September.

New

The hub. A public page for characters people have built, with each listing showing its cards and mechanics. You can publish straight from the export panel.

Version history for cloud saves. Every save keeps its earlier versions, and you can open one and go back to it. The storage a character uses is shown as you go.

Pro. Subscriptions, a compile queue that puts Pro exports first, and a lifetime Discord role. Signing in now says, at the point it matters, that it is what keeps your work.

Freeze, as an enchantment. An enchanted card can be unplayable while the count lasts, lose one each turn, and cost 0 once it runs out. There is a new effect to add or reduce an enchantment's count, on this card, the card a trigger is about, a random enchanted card in your hand, or the whole hand.

Card frames you supply yourself. One for the character, and one per enchantment, so an enchanted card can read differently at a glance. Use this if the colour picker cannot get you the frame you want — pure white in particular cannot be reached by tinting.

Your key statuses can hold still. A mechanic can be pinned to the front of the status row, and can stay on screen at 0 instead of vanishing, so the four you watch every turn stop shuffling around as you spend and regain them.

New triggers.

  • A relic can go off when *you* would die, Lizard's Tail style — it stops the death, once per run.
  • A relic can react to its Block being hit, which mechanics have had as Temporary Thorns.
  • A relic or a mechanic can react to one of your attacks getting damage through Block, once per attack rather than once per hit.
  • A mechanic can react to gaining stars.

Enchant a card the player picks. All three enchant effects can offer the hand and let the player choose, through the game's own enchant screen — from a card, from a relic, and from an event, which offers the deck instead because a map room has no hand.

A card can act from the draw pile and from exhaust. The while-in-hand triggers now have siblings for both, so "return this from exhaust" and "this does something while it waits to be drawn" are buildable.

Frozen cards finish the shape. A frozen card keeps Retain while it is frozen, and thaws a count at the start of your turn only while it is in your hand.

Branch on where the card was sitting. "Deal 4 damage. If this card is rightmost in your hand, deal 14 instead." Leftmost and rightmost are conditions on any effect, not only a playability gate.

Give a keyword to only some cards. The keyword passive takes the same filters the damage passives have, so Retain can go to cards carrying one tag.

Star cost reduction can filter by card type, the way the energy one always could.

Scale by what the played card cost. "Whenever you play a card, gain that much of a status."

Scale by your own HP. Current and max, wherever a scaling source is offered — including Lose HP Equal To, which was reading max HP by accident.

A character can call stars something else. Embers, Souls, Charges. It shows in the counter's tooltip and in the "I don't have enough" line, and only while your character is the one playing, so Regent keeps the word Stars.

{star} in card text puts the star icon in a sentence — your own icon, if your character ships one.

A relic can target whoever it hit, or whoever hit it.

Card colour can go brighter than the frame it came from. The recolour shader can only darken, so pure white came out grey; saturation and value can now be pushed past 1.

Pets got a lot. They can hit several times, scale their damage with their own HP, and their damage can be upgraded. A damage-boosting mechanic can be set to cover them.

Orbs. Channel a random orb from your own set, evoke a specific one, evoke from either end of the queue, and gate effects on what is in the queue. Loop, Tesla Coil and Thunder are all buildable.

Discard and draw the same number. However many cards actually went, that is how many you get back — the Calculated Gamble shape, on the whole hand or on a chosen few.

Forge scales. By stacks, and by any scaling source.

More ways to scale. Count cards of a type sitting in a pile, count how many allies are in the fight, and let percentage passives scale with stacks.

Enchantment bonuses can scale with a status rather than only with the enchantment's own count.

Cards can preview another card as a hover tip, and a card can hide its token preview when the tip would be noise.

Recovered cards can go to the draw pile instead of the hand, so getting a card back does not mean playing it this turn.

A card can grow itself for the rest of the run, the way Genetic Algorithm and Scythe do. It used to grow only for the current fight and reset afterwards.

A card can pay out only the first time it is played each turn, the way Fetch does, and a card can be sent back to your hand from anywhere — the discard pile, the draw pile or exhaust — the way Make it So does.

X star cost, and star cost reduced on upgrade. Tokens can carry custom keywords and a star cost, which they could not before.

Apply a random number of stacks, rolled once.

A "Do Nothing" effect, for a branch that should deliberately do nothing.

Move a card from your hand to the draw pile.

Tag filters can all say NOT, and statuses can be cleaned off allies.

Your own art on the vanilla Osty, and custom relics draw their character's outline in the compendium.

Spritesheets can run at 60fps.

Card roles in the balance tool, and the balance tab now reads the whole card rather than part of it.

Fixed

Events no longer soft-lock the run. An event with no picture left you in a room with no text, no options and no way out.

Your potions show up. Custom potions were built and then never added to the pool, so none of them could appear.

Art stopped disappearing. Event pictures were being written into browser storage at full size, which filled it and quietly stopped saving anything else — so work done after that point was gone on the next reload. Blank art is treated as missing rather than as a broken image, every unreadable image is listed rather than only the first, and the one that fails to export is named.

Paying gold in an event builds again. It failed the compile on a missing import, so any event that took gold could not be exported at all.

Channelling a random custom orb builds again.

Auto-play a token from a selection now opens the selection. The card simply played and no menu appeared.

A card that glows on a condition can watch a base-game status, not only one of yours.

A relic's second "when status lost" trigger can name its own status. Every trigger after the first watched whatever the first one did — the same bug in four places, including card-drawn filters and the mechanic that watches another status.

A tag discover can offer more than three cards.

An ally card can heal the caster when that is what it says.

"Apply to enemy" applies to the enemy, not to the holder of the status doing the applying.

A mod built for the other game branch says so at load, by name, instead of crashing mid-fight with a missing-method error naming a card.

A token's VFX stays on its own card. They were saved under one name and read under another, so they went missing or landed on the wrong card.

Transforming into one of your own cards keeps the upgrade.

The "any player" warning was backwards. It flagged cards that work fine and stayed quiet on the one that does not. Cards that target Self now warn when they carry a condition about a target they do not have.

Damage that scales with the target's HP works on cards that aim at nobody, and a card that hits all enemies measures each enemy on its own HP.

Card text. {all?} is resolved instead of being shipped to the game, costs are written with the energy icon the way vanilla does, custom keywords appear in the preview, and several description bugs are gone. The editor also says when a running total cannot be shown, instead of the box doing nothing.

Two events with the same name no longer become one. The build used to succeed and quietly ship only one of them.

Your chronicle reaches the Timeline on the game's beta branch. The newer game version keeps a second list of epoch ids, and yours was not in it, so the epoch was rejected as unknown. With two chronicle mods installed only the first one worked.

Hovering a card that shows a live scaled number no longer errors outside combat — in a shop, on a reward screen, or in the deck view.

The else half of a condition shows its own number. Both halves shared one, so the "otherwise" branch printed a figure that belonged to the other branch.

"Target's custom status is at least N% of max HP" can be configured. It could be picked and then never filled in, which left the card erroring about a status that had never been set.

Custom Thorns stopped hitting its own owner and retaliating against poison.

The star counter told modded characters they were the Regent.

The energy counter's backdrop no longer covers its own spin. Building the layers from your colour produced a counter whose spinning parts were completely hidden. The five slots are also listed in the order they actually stack, which is not 1 to 5.

A suppressed orb leaves the screen, not just the queue.

The shop and campfire honour the character's size setting.

Cards a mod creates were credited to nobody.

Unplayable cards no longer show a cost the game never draws, and a Curse missing the Unplayable keyword is flagged.

A mechanic watching another status ran the right blocks when more than one was merged, and a card-created trigger can no longer feed itself.

"The one this card targets" stripped your own buffs instead of the enemy's.

Lagavulin's debuff is noticed. It applies a negative buff, which no trigger was watching for.

An orb with an apply-to-all extra effect builds again, and "Do Nothing" saves.

Scaled attacks honour their target option outside a card, and a RandomEnemy card picks its target once for every line, not just its attacks.

The recovery file is named .project.txt, so the game stops erroring on it.

The character-select sound plays.

Every pet gets a health bar, and pets stand beside you rather than on top of you.

Changed

Condition pickers are searchable, and so are the trigger and passive pickers — mechanic triggers, "also fires on", relic triggers and extra triggers.

Archetype is a picker rather than free text.

Event pictures are 2048x960, matching the frame the game draws them in.

Effects that repeat can say how many times on an X-cost card. The Times field on Damage Multiple Times is replaced by the X you paid — that is how Whirlwind and Skewer work — and the field now says so.

0.9.1

2026-08-30

Bug reports from 2026-08-30.

Fixed

Your character opens again after a long tooltip. A mechanic's tooltip text is capped at 300 characters, and the box you typed it in did not know that — so a longer one exported fine and then refused to import, taking the whole character with it. Over-long text is now shortened on import the way over-long lists already were, and the box stops you at the limit.

"Failed to fetch" while opening a cloud save. A dropped connection put the browser's own error on screen with nothing you could act on. It now says the server could not be reached.

Relic copies stay stacked after you save and quit. The count was being forgotten on load, so a relic you had picked up four times came back as one.

Taking a relic that enchants your Strikes no longer errors. A card with no art pointed at an empty image path, so the game logged a load failure every time it drew that card — including from inside a relic's pickup effect, which is where the crash was reported.

Discover tells you when it cannot work. The game never generates Basic or Ancient cards in combat, and Discover reads your card pool, which holds no token cards. A tag on the wrong cards left you with a card that did nothing and said nothing. The editor now says which case it is.

A relic's pickup effect can no longer be traded away and taken again.

Pets stand beside you, and have a health bar again. A custom pet was being placed exactly on top of your character, and its health bar and status icons never appeared. Both came from the game treating pets as its own Osty and custom ones as something else.

A relic with no icon shows the game's "missing art" marker instead of nothing at all, and the editor now says so before you export.

New

Damage (Scaled) can count different debuffs, like Rend — how many the enemy has, or how many you have. Three stacks of one debuff still counts once.

"Add Card to Deck" can add one of your own cards, which its permanent version could already do.

A card can return to your hand after you play it, the way Particle Wall does. It stacks with Exhaust rather than fighting it.

A damage-boosting mechanic can cover your pets' damage too. Off by default, matching the base game, where Strength does nothing for a pet.

Changed

Mechanics that live on a Power card are listed again, marked with the card they belong to. Picking one opens that card.

Event pictures are 2048x960. The frame the game draws them in is 2560x1200 and never crops, so the old 1024x480 target was being stretched two and a half times.

0.9.0

2026-08-28

Three days of Discord bug reports and requests.

New things you can build

Your own map events. Write a room with up to four choices, give it a picture, and it turns up alongside the game's own events in every act, in runs with your character. Choices can hand out gold, HP, Max HP, one of your cards, one of your relics, or take cards out of the deck. Events can be translated like everything else.

Quest cards. A card that steers the next unmarked room on the map to one of your events, the way Lantern Key does. Unplayable, never in a reward, meant to be given.

Your own keywords, with their own tooltip, printed on the cards that carry them.

Save a group of effects and drop it in anywhere. Build a combination once, name it, and reuse it on any card. You can export a group and share it too.

Borrow a vanilla card pool. Lean your character on the Defect's cards, or any other, and their unlock rules come with them.

Hidden mechanics. A status can stay off the HP bar, for the bookkeeping counters a kit keeps behind the scenes.

Live numbers in blue, on cards, mechanics and enchantments. Every figure the game works out as you read renders blue, so a player can tell at a glance which ones change.

A card that doesn't count as a card play. Echo Form and Throwing Axe can't replay it, and Aeonglass won't count it toward the Wither it hands you. Everything else still sees it played.

Scaling on a trigger you choose. A card that grows can grow when it's retained, when each turn starts or ends, when you draw it, or when you discard it, in your hand or from the discard pile.

Mechanic triggers can ask which card caused them. "Whenever you deal damage, from a card tagged X" now works on damage, Block gained, an attack landing and a status being applied.

Two numbers of the same kind on one card are both live now. "Gain 5 Block. Gain 3 Block" used to print the second one as a fixed number, so Dexterity, an enchantment or an upgrade would change what the card granted while the printed 3 stayed put. Each one gets its own value now, and the card says what it does.

Take another turn. A mechanic can grant extra turns, one per stack.

Duplicate relics stack into one icon with a count, instead of another row in the relic bar. The relic still does the same amount.

Around forty new effects and conditions, including: Target Loses HP, Lose Max HP, a Claw-style growing attack, upgrade the card a trigger is about, remove a card's enchantment, look at the top of your draw pile and take a card to hand, play a visual effect on yourself, play any of your character's poses, a temporary Max HP template, a card that becomes another card after N events, "you have exactly N of a status", "this status was applied to me this turn", "one of your pets is dead", healing-received as a percentage, a mechanic that stops orbs evoking, a discover choice gated on holding a status, and Add Card naming any card in the game.

Potions can be tagged, and a potion-drunk trigger can filter on the tag, so a relic that rewards drinking *your* potions ignores the rest.

Enchantments can add their own line to the card they sit on.

Orbs get the full effect builder, so an orb can do anything a card can.

Tokens get the advanced settings they always supported and never offered.

More character art control: a custom character-select sound, a background that shows the whole image, the three poses the game triggers rather than you (hit, dead, victory), alternate attack and cast poses per card, a card's animation replayed on every hit of a multi-hit attack, and a height nudge for art that sits high in its frame.

Pets: control which one soaks a hit first, have one arrive already carrying a status, and summon far more of them.

The guide now teaches design, not just buttons. A "Designing a Character" section with the real pool shape and card numbers, measured from the 410 obtainable cards in the five shipped characters, and a "Complex Effects" section with five animated walkthroughs: layered conditions, sharing one condition across several effects, keeping numbers live, what an upgrade can reach, and building a card as a flag other cards read.

Gold checks. "If you have less than 50 gold" and "if you have 50 or more gold", on any effect, so a card can pay off when you are broke or when you are flush.

A percentage chance on any effect. "70% of the time: Deal 10 damage." Every effect can now roll for it, on cards, relics, potions, orbs, mechanics and enchantments alike, and you can give it a second effect for the miss. Hit chances like Fire Emblem or XCOM, coin-flip cards, a relic that fires now and then. It uses the run's own seeded randomness, so a saved run replays the same way.

No cap on relics. There was one at fifteen.

A kit overview that counts what your character can actually do (draw, damage, Block, scaling) separately from whether the numbers are balanced.

Editor: duplicate any entity and keep its art, every delete confirmed and undoable, lists sortable by type or rarity inside your own categories, mechanics that belong to nothing surfaced instead of hidden, and a code-only build for when you only need the DLL.

Fixed

  • A repeated number on a card upgrades too. "Deal 6 damage. Deal 4 damage" only ever raised the first number on upgrade, which is why the campfire highlighted only the first one. Each repeat now gets its own upgrade field ("Damage 2"), and the same goes for applying a status twice.
  • Spritesheets up to about 2.9 MB now upload at full quality, with no re-compression. The editor shows what one frame will actually export at, warns when the layout doesn't match the image, and can fill in the column count for you. Re-upload any sheet you added before this to get the quality back.
  • Custom events no longer soft-lock the game.
  • Potion targeting works. Any Enemy hits the one you clicked, All Enemies hits all of them, Random Enemy is random, and an ally-aimed potion applies to the ally, including any token it creates.
  • Live numbers work in translated text, Strike and Defend included.
  • Every value a card declares can be used as a `{token}` in your own card text, and the preview matches what exports.
  • Art stays deleted when you remove it, and survives a reload. Large character art no longer fills the browser's storage until a save fails.
  • Strength and Dexterity no longer inflate relic, potion and status values.
  • A pet's all-enemies attack hits the enemies.
  • Unplayable cards don't show a cost.
  • A cost-reduction trigger no longer prints "undefined" on the card.
  • An upgraded scaling multiplier shows on the card.
  • No limit on how many sounds a character can have. There was one at eight. Size is still what matters, and the export warns when your clips add up.
  • A blocked export names what is blocking it, next to the button.
  • Orbs can be translated.
  • A random-target card turns you to face what it hit, so a character built on all-enemies and random-target cards can still steer in the Kaiser Crab fight.
  • Relics built for the beta branch compile. Every fixture builds clean on both branches.
  • And more!

0.8.0

2026-07-31

Six weeks of community requests and bug reports from Discord. Almost everything here came from someone building a character and hitting a wall.

New things you can build

Your own creatures and companions. Summonable pets with their own art, HP and attacks — give them a damage bonus, heal or hurt them, send them away, or make a card do something extra while yours is out. Plus Summon and Osty-attack effects for the vanilla creature.

Custom Chronicles. Your character can have its own Timeline stories and epochs, with their own art, alongside the vanilla ones.

Cards that ask for X. X Energy cost already worked; X Stars is new, and effects can now scale off either — "deal 3 damage per Star spent", or a formula mixing the spend with anything else.

A lot more ways for a card to react while it sits in your hand or discard. When it is drawn, when it is retained, when you play a card of a given cost, tag, name or type, when a certain number of cards have been played this turn, and when you gain or lose one of your own statuses.

Custom archetype tags. Tag your cards, then count them, trigger off them, scale from them, or make a relic care about them. Relics can be tagged too.

Roughly a hundred new effects and conditions, including: give Block to allies (fixed or scaled), Energy scaled off anything, recover cards from the discard or exhaust pile, return the top card of a pile to your hand, remove cards from the deck permanently, add cards to the deck permanently, transform every card with a given name, play a card automatically, exhaust from the top of the draw pile, apply a status equal to almost any measurement, heal or lose HP on a scale, a Vigor-style one-shot damage bonus, a per-turn damage cap, an Artifact-like ward you can narrow to specific statuses, curses, and a customizable "play a visual effect" effect.

Multi-level upgrades, the Searing Blow pattern — a card that can be upgraded more than once, with its own text per level.

Custom orbs that apply your statuses or draw cards, with real icons and an adjustable position.

Custom stances that change the character's idle, attack and cast art, adapt their damage per move, cut enemy buffs, or change healing.

Better relics: several triggers on one relic, a stack-counter badge on the icon, trigger on a specific turn, on a card joining your deck, on the kind of enemy killed, and the ability to hand the player a card permanently.

Editor quality of life: card categories with drag-and-drop, a searchable sound and effect picker, a one-click share image, a project migration layer so older saves keep working, and a spec table listing every image size.

Fixed

  • Upgrade text. The whole card no longer turns green when an upgrade only changed the cost, added a keyword, or differed by a stray space or period. Upgraded numbers now show up on effects that were hiding them, custom-status amounts included, and multi-level text no longer crashes the description.
  • "You cannot die" no longer bricks the run. It put the game in a coma-like state where nothing could proceed.
  • Lethal damage works on cards, not just statuses — a card can now tell whether the damage it dealt actually killed, was blocked, or broke Block.
  • "Tokens come out upgraded" now covers every effect that makes a token. It only worked for three of the seven.
  • Two effects on one card no longer share a number. "Gain 2 Block. If X: gain 3 Block" granted 2 twice and printed 2 twice.
  • Multi-hit damage takes Strength, Vulnerable and Weak, uses the per-hit damage you typed in, and its upgrade actually applies.
  • Scaled damage is no longer quietly cut by Weak (a computed value is not a swing), and can opt back in to Strength when you want it.
  • Statuses with non-English names work as {tokens} in card text.
  • A status no longer fires on the card that granted it.
  • Several export blockers: mods that failed to build, projects this tool exported that it could not re-import, "too many files" from non-buildable assets, image uploads timing out, and the editor breaking after an animation upload.
  • Art: background removal no longer eats white artwork, the export compressor no longer destroys spritesheets, combat animations render at a consistent size, custom relics show the right outline, and token cards use your character's colour instead of the curse frame.
  • Targeting: Any Player no longer hangs solo runs, ally-targeted cards give every ally their token, target conditions on an all-enemies attack are judged per enemy, and "apply status equal to X" no longer applies a room-wide total to one enemy.
  • And more!

0.7.0

2026-06-13

P2 polish wave — closing out the audit's remaining editor/codegen/image items.

Added

  • Upgrade system completed: upgradeEffects.additionalEffects now fire under if (base.IsUpgraded) (were silently dropped); companion powers on Power cards thread the card's upgrade state so recurring effects scale; an upgradedDescription override emits {IfUpgraded:show(upgraded|base)}; a plain description override that would freeze the displayed numbers now warns.
  • Editor UX: deletions are undoable via toast (no more confirm()), alert() replaced with non-blocking toasts everywhere, Duplicate for relics and token cards, sidebar mechanic rows focus the clicked power, number inputs clamp to their schema range on blur, and a mobile "☰ Browse" drawer (the sidebar — the only way to pick a card/relic — was hidden on mobile).
  • Sidebar validation dots: items with a blocking pre-flight error show a red dot (preflight issues now carry an entityId).
  • Ancient acquisition warning: Ancient cards (excluded from shop/reward rolls) are flagged inline and in pre-flight, pointing to the starting-deck path that actually makes them obtainable.

Fixed

  • Transparency: JPEG is rejected on transparency-required slots (it has no alpha → black/white boxes in game); a corner-sampled solid-colour background remover handles flat backgrounds, not just checkerboards.
  • Relic outline: the small top-bar relic icon's outline layer is populated (it was null — ResourceLoader can't read raw mod PNGs).
  • PCK engine-version header bumped to the game's Godot 4.5.1.

0.6.0

2026-06-12

The feature wave following the 0.5.0 audit — toward full game-mechanic parity.

Added

  • All 183 player-usable vanilla powers exposed (was 16) — registry generated from the decompiled source (scripts/generate-power-registry.mjssrc/lib/generated/gamePowers.ts); searchable power picker with Buff/Debuff tags and descriptions. Flying = Flutter/Soar, tagged for conditions.
  • If/then/else conditionals — any conditioned effect can carry up to 3 "Otherwise" effects; conditions can check ANY registry power (targetHasPower — e.g. "is the target Flying", selfHasPower, targetPowerStacksAtLeast). Card text renders "If …: … Otherwise: …".
  • Passive always-on modifiers on custom statuses AND relics — 12 kinds compiled to the game's Modify*/Should* overrides (the Strength/Dexterity/Frail/Barricade pattern): damage dealt/taken, block gained, extra draw, max energy, healing, damage cap, block-not-cleared, shop prices, rest-site healing. Powers can scale flat amounts with stacks; passive-only statuses are valid.
  • Random-card mechanics — "Random token card" option for token effects; addRandomCardFromPool (pile/amount/type filter/0-cost), discoverCard (the game's own Discovery flow), transformRandomCardInHand. All seeded through RunState.Rng (multiplayer/replay safe).
  • New primitives — loseGold, gainPotionSlot, gainStars, stunEnemy.
  • Guided tour + /guide manual — 8-step spotlight walkthrough (auto-launches on first run, replayable from the titlebar) and a full reference page: effects, upgrades, image specs, shop rules, install steps.
  • Rest-site campfire character, treasure-hand textures, map-marker patch — custom characters now appear at campfires (generated NRestSiteCharacter subclass + scene), the relic-grab hand renders, and the map marker uses a consumer-side Harmony patch instead of an impossible CompressedTexture2D cast.
  • Nightly real-compile — golden fixtures build on the deployed Fly service every night; failures file a code-factory issue. PCK writer round-trip tests.

0.5.0

2026-06-12

Driven by an 8-dimension multi-agent audit against the decompiled game source (full findings with file:line evidence in C:\Work\Projects\slay\audit-findings\).

Fixed — compile errors reported by users

  • Non-Latin names (Chinese/Japanese/emoji)sanitizeIdentifier now produces deterministic hash-based identifiers instead of collapsing every non-Latin name to _ (the Cards/_4.cs + colliding-class family); compile-service sanitizeModName kept in lockstep
  • Name registry — all generated class names assigned once, collision-proof, shared by codegen, localization keys, and asset paths; replaces the post-hoc file renamer that broke cross-references for duplicate names
  • `StarterRelic` CS0246 — projects with zero relics now synthesize a default starter relic (with localization) instead of referencing a class that was never generated
  • `CustomPower` CS0246 — effects referencing deleted/unlinked custom powers or token cards are skipped with a comment instead of emitting phantom classes; targetHasCustomStatus conditions on missing statuses compile to false
  • `removeCustomPower` on AllEnemies CS1503PowerCmd.Remove<T> takes a single Creature; all-enemies variants now loop (the user-reported IReadOnlyList<Creature> error)
  • Stance/Mantra/Scry emitted Watcher-mod-only classes — generated self-contained _StanceSupport.cs (Wrath/Calm/Divinity/Mantra, ported from the Watcher mod) and _ScryCmd.cs; scry previously *drew* cards instead of scrying
  • 15+ verified API mismatchesSetRetainGiveSingleTurnRetain, phantom CardSelectPreferencesCardSelectorPrefs, .Health.CurrentHp, relic base.Owner.Playerbase.Owner, missing CardSelection/Models.Cards usings, Watcher-only "Smite" clamped to Shiv, slugify divergence on consecutive capitals (blank titles), fractional CardsVar/EnergyVar, FromCard(null) NRE chains in relic/power damage (a damage relic used to hit the *player*)
  • AllEnemies/RandomEnemy cards — debuffs no longer silently target the player; bare damage uses TargetingAllOpponents/TargetingRandomOpponents instead of null cardPlay.Target
  • MSB6006 "csc.dll exited with code 1" — root-caused to compiler OOM/disk crashes whose stack trace the error filter discarded; raw output tail now included, UseSharedCompilation=false, session images stay on disk instead of being held as base64 strings through the entire build, __pck_img__ payloads no longer written to the build dir

Fixed — in-game crashes and broken behavior

  • Shop soft-lock — the merchant throws (run unrecoverable) unless the pool has ≥2 Rare Attacks, ≥2 Rare Skills, ≥1 Rare Power; codegen now auto-fills filler cards and the export panel explains the gap
  • Upgrade system overhaul — keyword upgrades (removeExhaust/addRetain) now use AddKeyword/RemoveKeyword in OnUpgrade (the game caches Keywords, so the old ternary never re-evaluated); "+Energy on Upgrade" was dead code; power-stack upgrades routed to the correct PowerVar instead of the card's first var; gainBlock upgrades crashed the game (undeclared BlockVar); heal/draw/energy play lines now read their DynamicVars so card text and behavior stay in sync; token cards support upgrades
  • `new Random()` in power-context random targeting → seeded RunState.Rng.CombatTargets (multiplayer/replay safety)
  • doubleDamage uses the game's own DoubleDamagePower instead of a non-stacking clone
  • `afterApplied` custom-power trigger never fired for enemy-applied powers; onPickup relics with run-level effects (heal/gold/max HP) never fired outside combat

Fixed — images ("art doesn't work", "character is tiny", black backgrounds)

  • JPEG-under-.png — export compression re-encoded large images to JPEG at .png PCK paths; Godot picks decoders by extension, so art silently failed to load and alpha went black. Now always PNG (downscale, never switch codecs)
  • Combat sprite scale — hardcoded 0.28 rendered a 512px upload ~143px tall; now auto-scales to the ~310px creature bounds
  • Token card art wiped on reload — ArtRestorer now restores token cards (and the fast-hydration path no longer skips poses/sheets/energy layers)
  • Relic/power icons bumped to the game's real 256×256; upload-session filename collisions (relic + power sharing a name) fixed with content-addressed names

Added

  • Pre-flight checks panel in Export — dangling references, empty/CJK names, shop-safety gaps, missing starting relic — caught *before* compile, with compile blocked on errors
  • Friendly compile errors — raw dotnet build output translated to "Your card 'X' caused CS0246 …" with plain-language hints; technical output collapsed behind a toggle
  • CI workflow (.github/workflows/ci.yml) — typecheck + 417 tests on every push/PR (previously nothing ran tests)
  • Golden kitchen-sink suite — fixture built programmatically from EFFECT_BLOCKS/triggers/conditions (coverage can't rot); validates every generated file structurally, asserts unique paths and that every cross-file reference resolves
  • Upgrade editor everywhere — per-stat upgrade inputs for all var-backed effect types, on cards *and* token cards; honest "not yet upgradable" note for custom statuses
  • Roadmap for the power registry (all ~150 player-usable game powers), passive modifier blocks, if/then/else conditionals, random-card effects, rest-site/hand/map-marker art, and the guided tutorial in TODOS.md

0.4.0

2026-03-19

Added

  • Art appears in-game — session-based image upload pipeline sends card/character art directly to the Fly.io compile service, bypassing Vercel's 4.5MB body limit; card portraits now appear in-game at the correct PCK paths
  • Custom Mechanics Editor (Powers tab) — full visual editor for creating custom buffs, debuffs, and status effects with multi-trigger composition (13 trigger types), effect builders, balance badges, and delete-with-confirmation
  • 13 trigger types for powersafterTurnEnd, afterCardPlayed, afterDamageReceived, afterDamageGiven, afterPlayerTurnStart, afterSideTurnStart, afterBlockGained, afterCurrentHpChanged, afterApplied, afterRemoved, beforeAttack, afterCardExhausted, afterCardDrawn
  • Mechanic templates — 8 pre-built power patterns (Momentum, Rage, Thorns, Echo, Siphon, Fortify, Overcharge, Elemental Attunement) to start from instead of blank canvas
  • Power balance indicator — heuristic strength rating (Feeble/Balanced/Potent/Broken) comparing trigger count, effect weights, and stack type against vanilla power baselines
  • C# validation step — lightweight structural validation (balanced braces, duplicate override detection) before compile; surfaces errors in the UI
  • Character description field — textarea on CharacterConfig (max 200 chars); shown on the character select screen
  • Character portrait generation — portrait embeds at res://images/packed/portraits/ and overrides CharacterSelectIconPath
  • Card frame preview — STS2-style card mockup with cost orb, rarity gem, art/gradient placeholder, and rarity bar in CardEditor detail panel
  • `applyCustomPower` / `removeCustomPower` effects — cards and powers can reference project-defined custom powers by ID
  • Disk full error handling — 507 on disk full, with a clear message instead of a raw failure

Changed

  • Power schemaPowerDefinition now uses triggerBlocks array (1-6 blocks); old projects auto-migrate on load
  • `generateEffectLine` — now accepts typed EffectContext config objects; CARD_CONTEXT, RELIC_CONTEXT, POWER_CONTEXT defined
  • Tab order — Powers tab added between Relics and Balance; Sidebar shows Powers count badge

Fixed

  • Path traversal guard — compile service rejects file paths that escape the build directory
  • Duplicate trigger deduplication — same-trigger blocks merged before C# codegen to prevent duplicate method override compile errors

0.3.3

2026-03-19

Added

  • Art persistence (IndexedDB) — card/relic art is saved to browser IndexedDB and restored on every page load; art no longer disappears on refresh

Fixed

  • 413 on compile — removed base64 art data URLs from the compile request payload (stripped __pck_img__ entries); compile no longer exceeds Vercel's 4.5 MB request body limit
  • Art disappearing after Load into Editor — localStorage quota was exceeded by ~30 MB of base64 images; art URLs are now excluded from Zustand's persist middleware and stored in IndexedDB instead
  • Strike/Defend cards dropped their effects — cards named "Strike" or "Defend" were compiled from simple templates that discarded everything the card actually did; they now use the full effect codegen with a class rename

0.3.2

2026-03-19

Fixed

  • Import JSON error messages — distinguishes JSON parse errors from schema validation errors; shows the specific failing field path from Zod
  • Double-click compile guard — added compilingRef ref to prevent race condition window where rapid double-clicks could trigger two compile requests
  • Unicode/emoji in card names — verified sanitizeIdentifier handles emoji, pure-emoji, and unicode-only inputs without crashing; added 14 regression tests

Added

  • 14 new tests: sanitizeIdentifier unicode edge cases, toPascalCase, and 0-card/0-relic isValid guard (152 → 166 tests)

0.3.1

2026-03-19

Added

  • BaseLib auto-bundling — compiled zip now includes BaseLib/ folder alongside the mod folder for single drag-and-drop install; BaseLib files are silently skipped if not present in the compile environment
  • How to Install — collapsible installation guide appears in Export tab after a successful compile, with Windows + Mac paths and step-by-step instructions

0.3.0

2026-03-19

Added

  • Images embedded in the mod PCKcompile-service/compile.ts handles the __pck_img__: prefix for base64 → binary embedding
  • Custom powersPowerModel subclasses with turn-trigger effects - src/lib/codegen/powerTemplate.ts — C# PowerModel codegen (7 effect types: damageEnemy, damageSelf, gainStrength, gainDexterity, gainBlock, applyPoison, drawCard)
  • VFX variety — card effects now use effect-appropriate VFX paths instead of hardcoded slash - selectVfx() maps 15 effect types to distinct VFX paths (slash, heavy_blunt, giant_horizontal_slash, slime, starry, lightning, blunt, block, debuff, heal)
  • Character color theming — 6 color properties now use the character's chosen color: NameColor, EnergyLabelOutlineColor, DialogueColor, MapDrawingColor, RemoteTargetingLineColor, RemoteTargetingLineOutline

Changed

  • src/lib/effectBlocks.ts — damage effect codegenTemplates use {vfx} placeholder (substituted at codegen time)
  • src/lib/codegen/helpers.tsgenerateEffectLine() substitutes {vfx} with selectVfx() result
  • src/lib/codegen/cardTemplate.ts — exports cardPortraitPckPath(); PortraitPath uses actual PCK path when artUrl is set
  • src/lib/codegen/generateProject.ts — emits __pck_img__: entries for cards with artUrl; includes power files
  • src/lib/schema.ts — added PowerDefinition/PowerEffect schemas; powers array on CharacterProject; artStyle on modMeta
  • src/lib/codegen/localizationTemplate.ts — generates powers.json localization when powers exist

0.2.0

2026-03-19

Added

  • Synergy annotationssynergizesWith field on cards, shown on hover in card list
  • Ancient card rarity — added to schema, codegen, and UI

Changed

  • src/lib/schema.ts — added synergizesWith, buildPath fields to CardDefinition; added archetype to CharacterProject; raised card max to 120, relic max to 15
  • src/lib/codegen/constants.ts — added Ancient to CARD_RARITY_MAP
  • src/components/CardPreview.tsx — added Ancient rarity style

Fixed

  • Ancient rarity cards now render correctly in CardPreview (previously would throw a TS index error)

0.1.0

2026-03-18

Added

  • Initial MVP: a starting character (12-14 cards, 1 Starter relic)
  • Phase 0 foundation: vitest test suite (87 tests), shared codegen constants/helpers, DynamicVar extraction
  • 7 previously-unimplemented effect codegen types: removeDebuffs, discard, scry, addCardToHand, addCardToDiscard, addCardToDeck, upgradeRandomCard
  • C# codegen for all 6 templates: card, relic, character, localization, modInit, project
  • PCK file generation for Godot mod packaging
  • Compile service integration