Open the Co-op tab today and you’ll land on the new lobby surface instead of the live roster. Same Steam OpenID sign-in, same friend-gated invite at the end — the middle is what changed. The big bet: a co-op tool earns its real estate by doing things the Slay the Spire 2 Discord can’t do, not by being a prettier version of the same thing. Eight of those landed today, in two back-to-back releases (v0.10.0 and v0.11.0). The biggest of them — verified co-op reputation — is the first SpireVault feature that’s strictly impossible without the save data we already have, and it’s the start of the lock-in.
What you’ll see when you open it
Hero card with two large buttons in the same row above the fold: Quick Play (auto-match into the best open room) and Host a Room (3-step modal — goal & timing, party shape, review). Below it, four stat tiles: online now, hosting rooms, looking for group, and a new starting soon tile that lights up green when somebody’s countdown is ≤30 minutes out. Below the stats, your Campfire Log ribbon — rank, parties, hearts, friends, and an XP bar showing how close you are to the next rank. Tap it for the full personal-history sheet (friends roster, run timeline, send-a-heart). Below the log, the Live Parties list, sorted soonest-first.
The eight Discord-impossible features
1. Live-updating Discord LFG posts
When you host a room with a planned start time, the “Copy Discord LFG Post” button now embeds Discord’s native <t:UNIX:R> timestamp tags. Paste the post into your channel and Discord renders it as “Starts in 28 minutes” — and re-renders it five minutes later as “Starts in 23 minutes” without anyone editing or re-posting the message. Each viewer also sees their own local time via <t:UNIX:t>. You’d have to type the message manually with a Discord bot to do this otherwise. The toast that appears after copying tells you straight up: “Discord LFG post copied — it’ll live-update in your channel.”
2. A synced GO moment
Hosts can set a planned start (now / 15m / 30m / 1h / when full) when they post a room. Everyone in the lobby sees the same countdown badge tick down in real time. At T-60s, anyone who opted in gets a chime and a browser notification; at T-0, a green pulse + “Launch Steam now” CTA appears inline on the row, and the host sees a one-tap “⚡ Start now” pill if they want to fast-forward. Voice optional, voice required, no-mic-needed — doesn’t matter; the countdown is the coordination.
3. A play-again memory that survives the run
Discord doesn’t remember who you played with last week. The Campfire Log does. Every party you join gets logged locally; every teammate becomes a friend with a count and a last-played stamp. Open My Co-op and you can send any of them a heart (one per teammate per 24 hours, so it stays meaningful). The XP curve is real — party joined: +10 XP, completed: +15, heart-run goal: +25, heart sent: +5 — and the bar inside the Rank tile fills smoothly as you accumulate. Two-tab open? A heart sent in tab A updates tab B inside ~250ms via BroadcastChannel.
4. Verified Co-op Reputation the lock-in feature
Every host on the live-parties list now has a small tier dot next to their name. Five tiers, server-derived from actual save data: your uploaded run history plus a co-op event log the server keeps for every party you’ve hosted, joined, completed, or bailed on. Newcomer → Regular → Trusted → Veteran → Ascended. Up to four optional badges show alongside — Heart kill, A20 clear, Host reliable, Active recent.
The public endpoint (/coop/reputation/:steamID) returns a redacted shape — tier, badges, and a bucketed completion count — so the formula isn’t directly farmable. Your own /coop/reputation/me shows the raw counters. Newcomers render no dot — a fresh account shouldn’t wear a colored badge that reads as a downgrade.
This is the answer to “can I tell whether this person finishes runs or bails at floor 5?” Discord cannot answer that. The data lives in SpireVault. Now it shows up where it matters.
5. Daily Co-op Challenge
Every UTC day, SpireVault picks a deterministic seed plus a suggested character and ascension. Every player in the world sees the same daily. A gold-bordered tile under the hero stats shows today’s seed; tap it and the seed is on your clipboard with a toast telling you to type it into STS2’s seed field on character select. Hosts who tag their lobby note [daily=YYYY-MM-DD] show up in the day’s joined count. We don’t enforce the seed (no game-side mod) and we don’t make it a leaderboard — the challenge is a coordination signal: “if you want to play the same board as someone else right now, this is it.”
6. Synced Ready-up + Auto-advance
Extends the synced GO above: a single Ready pill on your own party row, an X / Y ready count visible to every member, and an auto-advance to in_game the moment all live members are ready and the planned start has passed. Frontend-only, no leader election — each client makes its own decision against observable state, so two clients arrive at the same conclusion from opposite corners of the world. When you’re the last one not-ready, the rest of the lobby sees “Waiting on your name” instead of guessing. Opt-out per browser: localStorage["pf.readyup.autoAdvance.v1"] = "off".
7. Post-run Shared Report
Once anyone in the party reaches in_game, a Share this run button shows up next to Ready on your own party row. Click, give it an optional one-line caption, and the server captures a 30-day snapshot of the party (display names, characters, roles, status — no Steam IDs) into a public-readable KV blob. The URL app.spirevault.app/share/coop/<shareId> goes to your clipboard, pre-formatted for Discord / X / Reddit. The pretty HTML render of that URL with OG cards ships in v0.11.1 alongside this post.
8. Steam Rich Presence — web endpoint live, helper next
Half-shipped on purpose. The POST /coop/rich-presence/ingest endpoint is live, audited, rate-limited, and ready for the native helper that watches Steam’s own RunningAppID on your machine and flips your SpireVault status to “Looking” the moment STS2 boots. The macOS helper is a SwiftPM LaunchAgent that’s already buildable in VaultApp/Helpers/SteamRichPresence/; signed pkg / MSI / tarball ship in v0.12.0. The endpoint is up now so the helper can talk to a real production target on day one.
This is the feature that changes SpireVault from “tab you remember to open” to “daemon running when you boot the game.”
Smaller things, all of them mattering
- Quiet match — a single toggle next to the hero CTAs that biases matchmaking toward voice-optional rooms. For the player who just wants to play and not talk. Renamed from “Quiet mode” because Sound and Notifications already mean different things and overloaded copy was confusing.
- One Alerts gear instead of two floating toggles. Sound chime + Browser notification now live in a single popover anchored to a ⚙️ gear next to Quiet match. Green dot lights up when either is active so the closed state still tells you what you’ve enabled.
- Live Parties auto-sort by urgency. Rooms starting in ≤15 min sort first; then 15–60 min; then everything else. Inside a tier, it’s your fit score and recency. So if you want to play right now, the imminent rooms are the first thing you see.
- Pagination. List caps at 25 rows with a “Show 25 more” footer. The 1-second runtime tick uses an
IntersectionObserverso we only update countdown badges on rows you can actually see — even at 200 visible rooms the page stays cool. - Reconnecting banner. If
/coop/statefails twice in a row, you see a yellow “Reconnecting…” banner. After five fails it goes red with “Can’t reach the server. Your stats may be stale.” A “Retry now” button forces a refresh. No more silently-stale UI. - Steam launch fallback. Click “Launch Steam” at GO time without Steam installed and ~800ms later a “Don’t have Steam? Open the store →” link appears under the CTA. Same pattern Discord and Slack use for their deep links.
- Reduced motion respected. If your OS has
prefers-reduced-motion: reduceset, the tab-title flash, the GO pulse, and the “starting soon” tile’s pulse all turn off. Information is still there in color and text.
Server-side kill switch — in case something’s on fire
This is shipping default-on, which means I need a way to roll it back without a deploy. Three layers, in priority:
?beta=offon any SpireVault URL persists an opt-out for that browser.?beta=killsets a per-browser kill flag.?beta=onclears both. Query string is stripped on load so links stay clean.- The Cloudflare Worker reads
COOP_LOBBY_BETA_KILL=1from env and emitsflags.coopLobbyBetaKill: truein/coop/state. Every connected client downgrades to Classic on the next poll (≤15s focused, ≤60s hidden). No deploy. - Code-level:
ENABLE_COOP_LOBBY_BETA = falseinWeb/script.jsand a redeploy. Hides the toggle entirely.
Prefer the old layout? In the lobby surface, Switch to Classic Co-op sticks for your browser. You can flip back any time.
What I’m not claiming
This isn’t the must-use STS2 co-op tool yet. The build is polished, the integration with Discord is genuinely useful, but a lobby finder is only as alive as the lobby list. If you open it and see “No live parties yet” that’s the failure mode I can’t fix from a UI — it needs hosters. So if you read this and you’re going to play co-op tonight, host the room here first and then drop the live-updating Discord post into your channel. That’s the bootstrap.
The next move is the half of feature 8 that’s still on the bench: the signed native helper that runs in your tray when STS2 boots and flips your status to “Looking” without you opening a tab. v0.11.0 shipped the server endpoint and the macOS Swift skeleton; v0.12.0 ships the signed packages for macOS / Windows / Linux. That’s the version of SpireVault where “should I open the tab” stops being a question because it’s already running.
Try it
- Sign in at app.spirevault.app with Steam.
- Click Host a Room. Pick “In 15 min.” Click Copy Discord LFG Post when it appears. Paste into your STS2 Discord channel and watch the timestamp render live.
- Tap the ⚙️ Alerts gear, turn on Sound and Notifications. Walk away. Get pinged at T-60s.
- If anything feels off, file an issue at github.com/c3rooks/SpireVault/issues with a screenshot.
— Corey
