Spire Codex v1.3.1 Release Notes
Replay scene view and browser, every stats page under /stats, Seed Finder and Deck Builder, chart builder, Top Players, site-wide search, supporter perks and themes, and a lot of memory work
Features
- +Replay scene view: every replay page now has a Timeline and a Scene tab. Scene plays the run back on the same battle scene the live view uses, step by step: hand, draw and discard piles, energy, block, enemy HP, intents and powers, then shops, rest sites, rewards and event choices with the picked option highlighted. Arrow keys step, Space plays, and the speed goes up to 4x. It shows only what the mod recorded, so cards the game created mid-fight are listed as created rather than guessed into a pile. (PR #1223)
- +Replay browser at /replays, with public /api/replays and /api/replays/summary endpoints and an admin replay surface. The turn timeline is easier to read, in-combat card selections and enchantment picks show as cards, event options show in the viewer's language, act names are right, and runs whose journal shows a save reload are hidden from the boards. Replay versions 5, 6 and 7 from the mod are accepted. (PRs #1055, #1056, #1069, #1077, #1078, #1081, #1082, #1086, #1108, #1112, #1129)
- +Every stats page lives under /stats now, with 301s from the old URLs, one shared metrics grid for cards, relics, potions, shops, events and campfires, a single Stats mega menu, and a stats strip on entity pages. Relic metrics come from the lake with seat counting, a wax split, relic Elo, floor-adjusted Lift, and shop, event, campfire and potion-use tables. Unknown brackets get a 400 instead of empty data. The scoring page explains every column. (PRs #1141, #1142, #1148, #1158)
- +Filter any stats grid with a small query language (for example character, rarity and win-rate expressions), and search your own runs on your profile with the same expressions the run browser uses. (PRs #1177, #1182)
- +Chart builder: build a chart from any metrics table, save it to your profile and share it at /charts/{id}. (PR #1145)
- +Seed Finder and Deck Builder are finished and in the Tools menu. Seed Finder has a nightly seed index, a full filter board, an inspect-a-seed page, full matches only, per-run lobbies for unstamped runs, and seed predictions built in the lake. (PRs #1090, #1092, #1094, #1118, #1120, #1122)
- +Top Players page backed by a nightly player Elo board, with /api/leaderboards/elo for API users. (PRs #1087, #1088)
- +Site search runs on one tantivy index with typo tolerance across entities, pages and CDN images. The index is rebuilt in atomic generations with a single coordinated rebuild. The Pages search list is back. (PRs #1089, #1110, #1111)
- +Supporters: Overwolf Rare and Ancient subscribers, Patreon patrons and monthly Ko-fi supporters get an ad-free site and an opt-in listing on the Thank You page. Overwolf Common members can opt in to the listing. Supporter themes add a custom colour picker, an owner palette takeover and a coloured badge; Common, Rare and Ancient badges show next to player names. The Thank You page is dynamic, imports the Ko-fi supporters export as-is, and has Patreon, Ko-fi and Overwolf subscribe cards. (PRs #1095, #1097, #1099, #1105, #1106, #1115, #1132, #1186, #1188, #1189, #1190, #1201)
- +Overwolf account linking: a /link/overwolf page the overlay opens, the connection and tier shown in Settings next to the other accounts, a reason shown and logged when a link is rejected, and verification of Overwolf session tokens with and without a kid header, confirmed through the subscriptions API when they are secret-signed. (PRs #1192, #1193, #1194, #1195, #1196, #1197)
- +Character themes for the Ironclad, Silent, Defect, Necrobinder and Regent, picked from the theme menu next to Light and Dark. (PR #1117)
- +Profiles: per-player stats, a tab for every stats table and for charts, Your stats on the signed-in profile, runs played and runs uploaded charts, and every run row shows the last boss, key relics and key cards. Profile and supporter settings moved to Settings. Stats tables collapse to compact rows on phones. (PRs #1164, #1165, #1179, #1184, #1187, #1200)
- +The run page reads in the game's own words: the game's localization tables are served per table from /api/localizations and the run page ships only the roughly 26 KB subset it needs. Untranslated epoch titles fall back to English. (PRs #1072, #1073, #1139, #1157)
- +Run exports: the full run export is built once a day after publish and served as a file, runs can be downloaded for a single game version, and run rows and export lines carry a pseudonymous player token. (PRs #1074, #1075, #1161, #1170)
- +Ascensions tier list, enemy quotes on monster pages with two-decimal percentages, each Ancient's relic pools on its event page, archetypes rebuilt in the lake ingest, and The Future of Potions listed per potion rarity. (PRs #1135, #1137, #1178, #1185, #1221)
- +Card library: sort by cost, filter to any star cost, upgrade-added keywords count in the keyword filter, random attack patterns read as sentences, the run page deck is ordered the way it was built, and a shared fallback covers missing card images. (PRs #1065, #1066, #1084, #1085, #1215, #1217)
- +Entity pages render their links, a data summary and ItemPage schema on the server. Titles put the game name first, name the character, rarity and type, name the source for powers that share a name, and link keyword and entity mentions inside descriptions. The card tier list title carries the game name and month and lists each character's top cards. (PRs #1126, #1149, #1208, #1209, #1211)
- +About page gained Behind the Codex and Supporting Spire Codex sections. A data study comparing Slay the Spire 2 card win rates with tier lists is published as a showcase. Home news images are served as small webp thumbnails. (PRs #1140, #1191, #1219)
- +Run and replay browsers show exact totals, using a time-budgeted count with a lower-bound flag instead of the old 10,000 cap. Abandons are counted in every community bracket and apart from deaths in encounter stats, runs abandoned by floor 5 stay out of the stats, deaths to retired bosses stay on the community stats page, and the player-count slices and every leaderboard view come from the lake boards. (PRs #1052, #1058, #1059, #1063, #1143, #1166, #1168)
Fixes
- ~Memory: the Next.js page cache stays in memory with a fixed heap it cannot overflow, backend workers cap malloc arenas and recycle after 50k requests, the Mongo cache is held at 2 GB inside the 5 GB limit, big lake generations no longer run the backend out of memory, entity cube folds are shared across backend workers, and the live overlay has its own Redis client with a longer timeout. (PRs #1159, #1169, #1171, #1172, #1174, #1175, #1213, #1214)
- ~Lake ingest: the build no longer spills 100+ GB on the per-floor tables, the entity cube and upgrade Elo stay inside memory, the community payload no longer fills the ingest disk, run charts are built in DuckDB instead of pulling every run into Python, and each staging page is parsed once with flat per-page card, rest, upgrade and event tables for the store stages. (PRs #1162, #1163, #1167, #1176, #1180, #1181)
- ~Deploys are purge-free with healthcheck-gated container swaps, there is a one-command rollback, the hourly cron and the rebuilder are retired, the deploy script installs itself on release, and the warm crawl and log-grep readiness check are gone. The frontend image build no longer writes outside the build context, and update.py exits cleanly on a failed step. (PRs #1093, #1096, #1098, #1100, #1101, #1102, #1103, #1113, #1121)
- ~Logs ship to Loki from Alloy 1.20 with a host label, including container, journal, /var/log and nginx error logs; successful presence polls and uvicorn access lines are dropped; both boxes are monitored with cAdvisor container metrics over remote write. (PRs #1150, #1151, #1152, #1154)
- ~Security: a CI heredoc injection, the news HTML sanitizer, claim auth, login CSRF and the Steam token in the URL were fixed in one batch; runs are attributed only from a verified bearer token with a bare steam_id kept as a hint; claim paths honour the hint and unverified flag; run uploads are capped per IP at nginx; the overlay's Steam sign-in poll can read the session again. (PRs #1104, #1119, #1133, #1134, #1138, #1202)
- ~Search Console: real 404s instead of 200s from the loading shell, no more linking English pages through /eng, Google is no longer sent to modded entity pages or into redirect loops, localized run pages canonicalize to the English run, the sitemap escapes ampersands, never serves the build-time stub, and leaves the noindex localized guide and mechanics copies out. (PRs #1127, #1128, #1204, #1205, #1206, #1207, #1210)
- ~Shared run pages no longer 500 on an empty run file (atomic writes plus an uncached blob fallback), the cached shared-run payload is dropped when a run's owner changes, cached run pages are evicted when a run is hidden or unhidden, and a run can be hidden or unhidden from its page without the edge login. (PRs #1064, #1114, #1136, #1153)
- ~Impossibly fast wins are hidden, and the home page win rates, daily board rows and Elo table names are right. (PR #1131)
- ~Front end: the locale prefix survives imperative navigation, filter changes no longer jump the footer or round-trip the server, Lighthouse accessibility and console failures are fixed, the browser gets only the UI strings and tooltip entries a page needs, Google Tag Manager is gone (the GA tag stays), the phone header shows only the logo mark, and the profile and theme picker work on phones with American spelling. (PRs #1079, #1125, #1198, #1212, #1216, #1218, #1220)
- ~Spire Codex news previews are clean of Markdown, a news image fetch that times out returns a 502 instead of a 500, the empty searches-per-day chart on /admin/searches is fixed, the /images page is localized, player flair is cached for 30 seconds instead of 5 minutes, and prettier runs on the frontend. (PRs #1067, #1083, #1109, #1160, #1199, #1224)
- ~Run uploads with a number past 64-bit get a 400 instead of crashing the backend, batch uploads work again with the body cap above the route maximum, and the upload response says whether the token was accepted. Runs list honours steam_id so the in-game mod shows the player's own runs. (PRs #1124, #1203, #1222)
API Changes
- >New GET /api/replays and GET /api/replays/summary for browsing replays. Replay uploads accept replay_version 5, 6 and 7. (PRs #1069, #1077, #1112, #1129)
- >New GET /api/localizations/{table} serving the game's own localization tables per table and language, after the API refactor that split pure game localisation out. (PRs #1072, #1073)
- >New GET /api/leaderboards/elo for the nightly player Elo board. (PR #1087)
- >Stats: relic metrics gained seat counting, a wax split, relic Elo and floor-adjusted lift; new /api/runs/metrics/shops, /events and /campfires tables; unknown brackets answer 400; per-entity run stats carry lift, lift_n, win_rate_ci and hold_rate; release-candidate build ids are accepted as version brackets; stats grids accept a query language filter. (PRs #1141, #1147, #1148, #1177)
- >Exports: GET /api/exports/runs serves the daily full run export as a file with a manifest, runs can be downloaded for a single game version, and run rows and export lines carry a pseudonymous player token. (PRs #1074, #1075, #1161)
- >Auth: new POST /api/auth/refresh renews a token for long-running clients; new POST /api/auth/overwolf/link and DELETE /api/auth/overwolf; run attribution comes only from a verified bearer token, a bare steam_id is a hint, and the upload response reports whether the token was accepted. (PRs #1116, #1134, #1138, #1193, #1203)
- >Charts: new /api/charts endpoints to create, list, update and delete saved charts, served at /charts/{id}. (PR #1145)
- >The archetypes endpoint and its response are documented in Swagger. (PR #1183)
- >Run and replay list endpoints return exact totals with a lower-bound flag instead of capping at 10,000. Run uploads containing integers outside the 64-bit range are rejected with a 400. Uploads are rate limited per IP at nginx. (PRs #1104, #1143, #1222)
