Changelog

What's shipped, what's changed, what's fixed. Newest first.

v0.30.3

  • FixedThe AI Coach's TvP late-game advice now reflects the current game — it no longer recommends the Raven's Point Defense Drone (removed in Legacy of the Void) or quotes outdated Tempest anti-air range, and it grounds counter-unit suggestions in the actual abilities each unit still has (Interference Matrix, Anti-Armor Missile, Yamato, EMP).

v0.30.2

  • AddedFeedback on the AI Coach now records the submitter's email when signed in (or when they enter one), so the team can follow up directly on flagged issues.

v0.30.1

AI Coach gets its own footer column
  • ChangedThe footer now has a dedicated AI Coach column in gold, with the main "How it works" walkthrough at the top followed by direct links to the replay data, units, abilities, tactics, and build orders references — so every layer the engine reasons about is one click away from any page on the site.
  • ChangedFooter accent color is now consistent — the "Contact us" link and the AI Coach column share the same amber tone instead of one being lemon-yellow and the other gold.

v0.30.0

Tactic detectors are now linkable, versioned, and explained
  • AddedEvery entry in the AI coach tactics catalog now has its own permalink — click the # next to a tactic name to copy a stable URL that drops anyone straight onto that card, with a brief amber highlight so the right entry is unmistakable when the page lands.
  • AddedEach tactic now carries a version stamp (v1, v2, …) shown next to its name. The version bumps when we improve the detection rule, so older replays can show what version of the detector flagged the play and you can tell at a glance whether a re-analysis would catch something new.
  • AddedEvery tactic in the catalog now has a "How it's detected" section that spells out the exact thresholds the engine uses — the timing windows, distances, unit counts, and confidence rules — instead of describing the algorithm in vague terms.
  • AddedHovering a tactic band on the timeline scrubber in the fullscreen replay viewer now opens a card you can click to open that detector's documentation. A bridge fills the gap between the band and the card so the cursor doesn't lose the hover mid-trip.
  • AddedHovering a tactic band that contains other shorter detections now stacks each of those nested tactics as its own full popover card above the highlighted one, sorted chronologically. Every card links to its own detector page, so dense, overlapping detections are all reachable from a single hover instead of hiding behind the band you're pointing at.
  • ChangedWhile hovering a tactic on the fullscreen replay timeline, that detection's start tick is now thickened and glows in the player's color, and the other player's tactic histogram fades out — so the focused window reads cleanly without the other player's bands competing for attention.
  • AddedThe unit reference table now has a Size column showing each unit's collision radius (Marine 0.375, Tank 0.75, Thor 1.0) and each structure's footprint as N×N tiles — useful when planning building placement, kiting math, or wall-offs.

v0.29.2

Brighter, more legible muted text across the site
  • ChangedSecondary and tertiary text — labels, captions, footnotes, footer links, breadcrumbs — is now noticeably brighter against the dark background. The dimmest tier in particular was failing the contrast threshold for small text; everything from the smallest stat readouts up through body copy now hits a comfortable readability bar.
  • ChangedFaint amber eyebrow labels on the AI coach reference pages ("Why a player does it", "What it costs", "Coach reads it as:") are no longer washed out — the gold tone is preserved but the contrast is back where you can read them at a glance.
  • ChangedTypography across the site is now driven by a single semantic ramp (caption / body-sm / body / body-lg / h1–h4 / hero) instead of an ad-hoc mix of sizes. Visually identical to before — the win is consistency going forward, so spacing and rhythm stop drifting between pages.

v0.29.1

Featured replay sized like the rest of the homepage + avatars on /players
  • FixedReplay of the week on the homepage no longer stretches across the full row — it now sits in the same narrow column as the upload dropzone and recent replays so the page reads as one consistent vertical stack on desktop. Minimap is back on top, player + meta below.
  • FixedPlayer rows on the /players page now show the user's avatar (or initials puck for email-signup users) when the toonhandle has been claimed by a signed-up account, matching every other surface that lists players.

v0.29.0

Pro players page + weekly featured replay + brighter coach version
  • AddedPro players moved into their own page at /pros — 15 cards in a roomier 5-column grid with bigger portraits. The homepage now leads with the replay of the week and links here via a "Browse 15 pro players →" affordance, freeing the above-the-fold space for the upload dropzone.
  • ChangedReplay of the week on the homepage now spans the full width with the minimap on the left and player/meta info on the right, so the headline replay reads as the primary feature.
  • AddedReplay of the week is now picked by an automated weekly heuristic — Sunday night PT a job scores every replay from the past two weeks against view count, AI Coach coverage, composition coverage, battle count, watchable duration, pro player presence, and high-MMR signal, and pins the winner. The slot has a real 7-day shelf life now instead of re-shuffling on every page view.
  • ChangedThe "AI Coach v0.28" indicator next to the three trigger buttons (Analyze Replay, Analyze Compositions, Generate Summary) is now a visible amber chip alongside each button instead of a muted line below it. Clicking still opens the changelog.
  • AddedEmail-signup users with no provider photo now get a circular initials puck rendered next to their toonhandle wherever the avatar appears, so signed-up players show up consistently regardless of how they signed in.

v0.28.3

Avatars next to claimed toonhandles across the site
  • AddedSigned-up users who have claimed a SC2 toonhandle now get their profile photo rendered next to that handle wherever it appears on the site — replay cards, the player profile header, the player picker in the full-screen replay viewer, and the per-player labels in the side stats panel. Unclaimed handles look the same as before.

v0.28.2

Coach version on every trigger + Coach badge on the Players list
  • AddedThe three AI Coach trigger buttons — Analyze Replay, Analyze Compositions, and Generate Summary — now show the current AI Coach version directly underneath, linked to the changelog. Lets you read what's in the release before spending a mineral on it.
  • AddedPlayers list (/players) now shows a Coach badge next to any player who has had an AI Coach summary generated for their last games. Same amber chip style as the Coach affordance on the replay card; clicking the row deep-links into the player's Coach tab.

v0.28.1

Coach feedback now records which version you were reading
  • ChangedThumbs-up / thumbs-down and freetext feedback on AI Coach output now record the exact AI Coach release the reader was looking at — both in the database and in the team-mailbox notification — so a complaint about a hallucinated unit interaction can be triaged against the actual prompt that produced it instead of guessing.

v0.28.0

Composition Analysis goes multilingual + smarter about flying units
  • AddedComposition Analysis on the Battle tab can now be generated in English, Korean, Chinese, or French. Pick a language next to "Analyze Compositions"; once an analysis is cached, the language is locked until you regenerate.
  • AddedSwitching a cached Composition Analysis to a different language is free — same regenerate button, no mineral charge. Same applies when the cache is on an older AI Coach release.
  • ChangedAI Coach is now on version 0.28. The composition coach now reasons explicitly about which units are flying — Mutalisks, Phoenixes, Banshees, lifted Command Centers, and so on — and won't claim a ground-only attacker like Hellions or Marauders is countering them.
  • ChangedVersion chip next to AI Coach output now shows when the analysis was run, who ran it (you vs. another viewer), and which language it was written in — hover the v0.28 chip to see the full run metadata.
  • ChangedThe Composition Analysis version chip and "Regenerate (free)" affordance moved up to the Battle tab header so it's visible at a glance, instead of buried inside the first battle card.

v0.27.0

AI Coach v0.27 — refresh any cached analysis for free
  • AddedAI Coach is now on version 0.27. The free-regenerate button appears on every cached analysis from v0.26 — click "v0.26 → v0.27 Regenerate (free)" next to the AI Coach badge to pull in the accumulated improvements: inline timestamped citations, archetype confidence labels (STRONG / MODERATE / WEAK MATCH), the proxy townhall detector, and canceled-build awareness so the coach stops counting an extractor-tricked Extractor as two extractors before the pool.

v0.26.2

Heads-up about the upcoming AI coach fee
  • AddedA short note above the AI coach (and a dismissable banner on the homepage) explains why we're introducing a small per-coaching fee — the AI bill has grown as more of you have tried the coach, and the fee keeps the service running. Available in English, Korean, Chinese, and French with an inline language switch.
  • AddedPlayer profile pages now have an AI Coach tab. The coach reads across the player's last 5 coached games and writes a short progress note — what they keep doing well, the patterns they're failing to address, and how they're tracking over time. The summary is shareable via a direct link.
  • AddedAI Coach summaries on profiles cost 1 mineral to generate and are free for anyone to view once cached. Each summary lists the 5 games it read across so you can click straight back into the underlying replays.
  • AddedThumbs-up / thumbs-down and freetext feedback on every profile coach summary, just like the per-replay coach. Tell us what's landing and what isn't.
  • ContentAdded preview images for the Netsphere Terminal and Greenspill maps so replays on those maps show real minimaps in the list and full-screen viewer instead of the placeholder tile.
  • FixedThe in-game name autocomplete in the user menu now works the second time you edit your linked profile too — previously it stayed empty if you hadn't opened the form earlier in that page load.
  • ChangedIn the full-screen replay viewer, the ISO / Fit / Details controls now sit next to Players / Teams in the map overlay, so all viewport controls live in one place — and they're available on mobile for the first time.
  • AddedProfile AI Coach summaries are now translated into Korean, Chinese, and French — every label, button, and message follows the page locale.
  • ChangedProfile AI Coach summaries now show two clearly-labelled lists when newer games are available — the games this summary read across, and the latest games (newer ones flagged). Regenerate is disabled when the latest 5 games match what the summary already covered, so you don't accidentally spend a mineral on a no-op.
  • FixedProfile AI Coach summaries now always show the 5 referenced games once a summary exists, with each game tagged [1]–[5] so you can match it back to the prose.
  • FixedThumbs and freetext feedback on the profile AI Coach summary now save instead of returning a 500 error.
  • AddedWhen the profile AI Coach summary cites a specific game (e.g. [3]), the bracketed reference is now a link straight into that replay's coach tab.
  • AddedAn upload prompt + dropzone on the profile AI Coach tab lets you add more replays to a player without leaving the page.
  • ChangedProfile AI Coach layout cleanup — the referenced games sit inside the same panel as the summary, while the feedback widget and upload prompt drop the amber tint and sit on the page's default palette.
  • ChangedProfile AI Coach summaries now reliably include inline [N] citations linking to the cited replay's coach tab. Older summaries that predate the citation system can be regenerated even when you have no new games, so you can pick up the linked-references rewrite for 1 mineral.
  • AddedReplay deep-links now scrub. Visit /replay/<id>?t=315 (or click any timestamp link) and the viewer auto-seeks to that second of the game.
  • AddedTimes mentioned in a replay's AI Coach output are now clickable — click 5:15 in the prose and the Pixi viewer scrubs there. Works in Strategy, Strengths, Mistakes, Improvement Priorities, and Overall Assessment.
  • AddedProfile AI Coach citations can now carry an in-game time, e.g. [3@5:15], which links straight to game 3's coach tab and scrubs to 5:15.
  • FixedProfile AI Coach Regenerate is now also available when the cached summary lacks the timestamped citations the prompt now produces — so users with a stable top-5 can pick up the new linking-into-moments rewrite for 1 mineral.
  • AddedAI Coach output is now versioned with the site's release semver. Each replay analysis and profile summary shows a small version chip (e.g. v0.26) next to the AI Coach label, linking back to the changelog. When a newer release lands, Regenerate becomes available so anyone can pick up the improvements for 1 mineral.
  • ChangedCitation chips in the profile AI Coach summary are smaller and quieter now, so they anchor claims without competing with the prose around them.
  • AddedThe Composition Analysis section in a replay's Battle tab now shows the AI Coach version chip too, matching the per-replay coach and profile coach badges.
  • FixedAI Coach version chip now also shows on cached analyses that predate stamping — falls back to the live release with a tooltip noting it's a fallback, so the link to the changelog is always available.
  • AddedThe replay tactics scrubber now detects proxy townhalls — Hatcheries, Command Centers, and Nexuses built closer to an opponent's main than to the player's own. The AI coach can frame these as forward-base cheese instead of describing them as a normal expansion, regardless of race.
  • ChangedAI coach now sees an explicit confidence label (STRONG / MODERATE / WEAK MATCH) on each archetype resemblance, alongside the percentage score. Weak matches no longer get named as the player's chosen build — the coach describes what the build actually shows instead, so a 12 Pool tag at 18% confidence stops appearing on builds that aren't 12 Pool.
  • FixedAI coach now sees canceled buildings (extractor trick, mis-clicks, structures killed during construction) annotated as canceled in the build order. The coach no longer counts a canceled-and-rebuilt Extractor as two extractors before the Spawning Pool, and similar miscounts on any aborted construction.
  • AddedReplays uploaded by signed-in users are now attributed on the replay card with a small "uploaded by <profile>" link to the uploader's profile page. Anonymous uploads stay anonymous.
  • ChangedCoach-feedback emails to the team now include the signed-in submitter's email and linked profile (when set), so we can follow up with concrete users instead of guessing from session ids. Anonymous (signed-out) feedback is marked as such.
  • AddedFree version-upgrade regenerate. When a cached AI Coach output (per-replay analysis, composition analysis, or profile summary) is from an older release, a small "v0.26 → v0.27 Regenerate (free)" chip now appears next to the version label. The upgrade is on the house — minerals are only spent for true new content (new games for a profile summary, first-run analysis for a replay).
  • FixedAI Coach version chip no longer shows "v0.26 → v0.26 Regenerate (free)" on cached analyses that predate version stamping. The chip now reads "v?" when the cached version is unknown, and patch-only differences (0.26.1 vs 0.26.2) no longer trigger the upgrade affordance — only major / minor releases that actually change coach behavior do.
  • ChangedFree-regenerate button no longer appears on cached analyses with an unknown version (legacy rows). It waits for a real version delta (e.g. v0.26 → v0.27) before offering the upgrade — no more confusing "v? → v0.26" prompts.

v0.26.1

AI coach now sees the top 3 matching pro builds, not just the closest one
  • AddedThe AI coach now reads each player's build against the top 3 closest pro/community openings instead of forcing a single best match. Hybrid and transitional builds (Reactor Hellion FE → 2-1-1, 4-Gate Pressure into Macro, etc.) come through as multiple parallel matches with similar scores rather than being squashed into one inaccurate label. The catalog of relevant pro builds is included with descriptions, signature pro players, and key buildings, so the coach reasons about your build with shared vocabulary.

v0.26.0

AI coach reasons about tactics from a grounded catalog
  • AddedThe AI coach now reads from a grounded catalog of 24 named SC2 tactical plays (Reaper harass, Mutalisk harass, Cannon Rush, Drop Play, Power Droning, etc.) — each with a description, strategic intent, tradeoffs, and coaching guidance. Combined with the per-player chronological sequence of detected plays, the coach can now reason about strengths and weaknesses in shared vocabulary instead of inventing tactic semantics on every replay. A coverage test pins detector slugs to catalog entries so future plays can't ship without documentation.

v0.25.2

Bonus damage table audit — fixes Thor, adds Spine/Spore Crawlers
  • FixedAudited the bonus damage data the AI battle analyzer reads. Caught and fixed three Thor errors (default anti-air missiles bonus vs Light, High Impact mode bonus value vs Massive) and added the two Zerg static defenders (Spine Crawler bonus vs Armored, Spore Crawler bonus vs Biological) that were missing entirely. Coverage test added so future gaps surface immediately rather than silently shipping wrong numbers.

v0.25.1

Battle analyzer reads real bonus damage values from a data table
  • FixedThe battle composition analyzer used to recall bonus damage numbers from memory ('Immortal +30 vs Armored', 'Marauder +10 vs Armored') and could drift from current balance. Each unit's per-attack bonus damage now comes from a Liquipedia-anchored data table that the prompt pulls inline, so the analyzer cites exact game values rather than approximations.

v0.25.0

AI coach prompts trimmed and grounded in real game data
  • ChangedThe AI coach prompt was overfitting on specific scenarios — calling out a literal '4-Gate Adept' build pattern by name — and padding the battle analyzer with an SC2 armor/attack-types encyclopedia the model already knows. Generalized both: the coach now applies a single 'verb choice must match observed behavior' principle, defers to the actual data when build shape and unit movement disagree, and reads armor/attack tags from the per-unit data the battle prompt now passes in directly. Re-run analysis to see the trimmer, more focused output.

v0.24.3

AI coach no longer suggests upgrades or buildings you already have
  • FixedThe AI coach used to suggest building more Forges when your upgrades were already done, or warping Archons when you had no Templar Archive — it had to mentally combine the global upgrade list with each timeline snapshot and sometimes got it wrong. Each timeline snapshot now explicitly shows which upgrades are complete and which tech buildings exist at that exact moment, so advice stays grounded in what's actually on the map. Re-run analysis on existing replays to get the corrected feedback.

v0.24.2

AI coach no longer claims pressure when no units moved out
  • FixedThe AI coach used to call a build 'pressure' just because it had the SHAPE of an aggressive opener (4 Gateways, 2-rax bunker rush, mass Adepts) — even when those units never left the home base. So a player who built defensive Shield Batteries against an attack that never came was told they 'absorbed pressure'. The coach now reads an aggression timeline showing how close each player's combat units actually got to the opponent's base over time, and only labels something 'pressure' when units were actually moving out. Re-run analysis on existing replays to get the corrected feedback.

v0.24.1

AI coach treats build archetypes as references, not rules
  • FixedThe AI coach used to flag missed archetype benchmarks as mistakes — telling a Terran their first medivac was 'late' just because the standard 2-1-1 archetype hits 3:38, even when the game state never warranted that timing. Real games legitimately deviate based on opponent scout, map, and player style. The coach now only calls out deviations as mistakes when the miss is large, the player was clearly going for that build, AND the lateness actually hurt them in the game. Re-run analysis on existing replays to get the corrected feedback.

v0.24.0

AI coach upgraded to Opus 4.7 with extended reasoning
  • ChangedThe AI coach now runs on Anthropic's Claude Opus 4.7 with extended reasoning, replacing Sonnet 4.5. Side-by-side testing showed Opus produces sharper root-cause analysis, more precise timestamps and unit counts, better build-order naming, and a more diverse moment selection that includes praising what you did well — not just listing mistakes. Re-run analysis on existing replays to get the upgraded coaching.

v0.23.2

More accurate fog of war on the replay viewer
  • FixedThe fog of war on the full-screen replay viewer was using a fallback 9-tile sight for Terran buildings while they were lifted (CCs flying across the map, factories drifting to a new spot) and for a handful of other morph variants. Lifted Command Centers and Orbital Commands now reveal the same 11 tiles as their grounded counterparts, and the AI coach reads from the exact same sight-range table the viewer draws — so 'who saw what when' is consistent between the visualization and the coach's feedback.

v0.23.1

AI coach now sees scans, all opponent buildings, and per-unit sight
  • FixedThe AI coach used to only know the first time a player walked a unit into the opponent's base radius — it ignored Comsat scans entirely, never noticed scouting via production/tech buildings, and used a flat 18-tile proximity instead of each unit's real sight range. So a Terran who scanned the opponent ten times still got told they were 'completely blind' through the midgame. The coach now reads every Comsat scan, tracks vision of all production and tech buildings (not just resource halls), and uses per-unit sight ranges from the actual game data (Reaper=9, Observer=11, Phoenix=10, etc.). Reactivate analysis on a replay to get the new feedback.

v0.23.0

AI coach now counts bases correctly when bases get upgraded
  • FixedThe AI coach used to mis-count bases when a Terran lifted a Command Center into an Orbital Command (or made a Planetary Fortress), and similarly when a Zerg morphed Hatchery → Lair → Hive. It would see only the original constructions and miss that the upgraded buildings still count as bases — leading to feedback like 'you took your third base 3 minutes late' when in fact it was placed on time but morphed into an Orbital. The coach now reads a per-base lifecycle timeline that tracks every morph as the same physical base, so expansion-timing feedback matches what's actually on the map.

v0.22.1

Shorter homepage hero on mobile
  • ChangedThe featured replay card and pro player grid take less vertical space on mobile, so visitors can scroll to the user-submitted replays section faster without losing the hero content.

v0.22.0

Every featured pro now has at least a dozen replays
  • ContentEvery pro on the homepage now has a meaningful catalogue of replays to browse — Astrea, Dark, MaxPax, Bunny, Rogue and the rest moved from a handful (or zero) up to 12+ each, with most rosters now at 25+. Pro replays in the database roughly tripled in this round.

v0.21.9

Pro tiles show replay counts
  • AddedEach pro tile on the homepage now shows how many of their replays we have, so you can see at a glance which players have the deepest catalogue before clicking in.

v0.21.8

Profile replay cards now match the homepage
  • ChangedReplay cards on profile pages now show the player name with the same casing as the page heading and URL — no more mismatch between 'HeRoMaRinE' in the title and 'HeroMarine' inside individual cards. The profile owner's name is also bolded regardless of casing.
  • AddedProfile replay cards now show the AI coach and AI cast badges, matching the homepage.

v0.21.7

Profile pages now match names case-insensitively
  • FixedProfile pages used to 404 when the URL casing didn't exactly match what's inside the replay files. Liquipedia spells one player 'HeRoMaRinE' but his in-game name is 'HeroMarine', and the same player can appear as 'Serral' or 'serral' depending on who uploaded — the previous exact-match lookup missed everything when the URL casing was off by even one letter. /profiles/<region>/<name> now matches case-insensitively, so any spelling resolves to the same player.

v0.21.6

HeroMarine profile now loads
  • FixedClicking the HeroMarine card on the homepage led to a profile page that returned no replays despite us having 31 of his games. The card linked using the Liquipedia spelling 'HeRoMaRinE' but the name inside replay files (and our DB) is 'HeroMarine' — exact-match lookup missed everything. Roster now uses the canonical in-game spelling.

v0.21.5

Pro profiles now show games from every region
  • FixedClicking herO from the homepage went to a profile page that showed no games — the profile route filtered by SERVER region (where games were played) but the homepage card linked using the pro's nationality region (KR), and herO actually plays mostly on the CN server. Two fixes: profile pages now show every replay where the player's name appears regardless of which server it was played on, AND homepage pro cards link to the region where the pro has the most games in our DB.

v0.21.4

Pro card images now load on mobile
  • FixedOn mobile the pro player cards on the homepage rendered as super-thin slivers with no photo visible — the cards relied on a desktop-only grid stretch to get their height, so on mobile they collapsed. Each card now has an explicit square aspect ratio on mobile (auto on desktop), which gives the photos a real frame to fill.

v0.21.3

Top 15 active 2026 pros on the homepage
  • ChangedThe pro player grid is now the curated top 15 S-tier 2026 active pros, in skill-rank order: Serral, Clem, MaxPax, herO, Maru, Reynor, Cure, Solar, ByuN, HeRoMaRinE, Astrea, Dark, ShoWTimE, Rogue, Bunny. Photo-dominant cards in a 5×3 grid that fills the same vertical space as the replay-of-the-week, so the portraits read large. Pros without a Liquipedia portrait fall back to a race-themed coloured tile with their initials.

v0.21.2

Pro player headshots on the homepage
  • AddedPro player cards on the homepage now show actual headshots instead of initials. 24 portraits installed: Serral, Reynor, Maru, Clem, herO, ByuN, Cure, Solar, Dark, Rogue, Trap, Stats, Zest, GuMiho, ShoWTimE, Lambo, SpeCial, Ryung, TY, PartinG, HeRoMaRinE, Neeb, Scarlett, Astrea.

v0.21.1

Homepage layout — Featured prominent above the fold
  • ChangedReworked the homepage so Featured (replay of the week + pros grid) is the first thing you see after the hero, with the upload dropzone tightened up beneath it. The replay-of-the-week card now shows the map's minimap, in cyan instead of amber so it's not confused with AI Coach branding. The pro player grid uses three columns on desktop with full names and 9 cards visible.

v0.21.0

Featured pros + replay of the week on the homepage
  • AddedHomepage now features a 'Replay of the week' card and a grid of pro player profile cards (Serral, Reynor, Maru, Clem, herO, ByuN and 15+ others) below the upload dropzone. Click a pro to see all their replays in our index; click the featured replay to study the analyzed game. The pros list and featured replay refresh automatically — pros with at least one replay in our DB show up, and the featured replay is the most-viewed game from recent weeks.

v0.20.4

Thumbs-up/down feedback on per-battle AI coach insights
  • AddedEach battle's AI coach insights box (in the Battles tab of the replay viewer) now has a 👍 / 👎 control next to the AI Coach header. Same flow as the existing per-strength / per-mistake feedback — votes persist on the replay, ping the team, and the highlighted state survives a page reload.

v0.20.3

Lifted Command Centers no longer vanish from the replay viewer
  • FixedWhen a Terran lifted their Command Center or Orbital Command and the Bldg toggle was off, the building vanished for the entire flight and reappeared on landing. The flying variants of town halls now stay visible regardless of the building toggle, matching the behaviour of grounded CCs/OCs.

v0.20.2

MULEs render as real unit sprites (with proper MULE icon)
  • AddedReplay viewer now shows MULEs as real unit sprites at the mineral line — same visual treatment as SCVs, with the actual in-game MULE portrait. They appear when calldown'd and disappear when their lifetime ends (or when killed by harass — early MULE deaths now render correctly).

v0.20.1

MULE drops + per-player exit time + scan/MULE in player colors
  • AddedReplay viewer's FX overlay now shows MULE calldowns: a small filled dot in the casting player's colour appears at the drop location and stays for the MULE's full 64-second lifetime. Pairs nicely with scans (also now player-coloured) so Terran-mirror matchups make sense at a glance.
  • ChangedComsat scan rings now render in the casting player's colour instead of a generic yellow — easier to tell at a glance which team scanned where in 2v2+/team games.
  • AddedReplays now record when each player left the game, so a future surrender-vs-elimination indicator can tell apart 'they tapped out at 12:30 with their main alive' from 'their last base died first'. Surfacing this in the UI is a follow-up.

v0.20.0

Replay viewer now shows scans, storms, force fields, and EMPs
  • AddedNew 'FX' toggle in the full-screen replay viewer renders ability casts as overlays on the map: yellow expanding rings for Terran scans (8.93s), purple AOE pulses for Protoss Psi Storms (4s), cyan rings for Sentry Force Fields (11s), and white shockwaves for Ghost EMPs (1.5s). Each effect renders for its actual in-game duration — scrub backwards and the cast replays from the right age.
  • ChangedReplay parser now extracts these four ability events from every uploaded replay. Older replays parsed before this release won't have the data until they're re-uploaded or re-parsed; freshly-uploaded replays show FX immediately.

v0.19.2

Coach feedback unbroken on production + Contact us moved to footer
  • FixedAI coach 👍 / 👎 votes and freetext comments were silently failing in production with a 400 error — votes were getting black-holed for everyone since v0.19.0 shipped. Fixed: submissions now go through end-to-end and the team email actually fires reliably (was previously losing some sends to a serverless cleanup race).
  • ChangedMoved the yellow 'Feedback' button out of the top navbar into a 'Contact us' link in the site column of the footer. Frees up navbar space on mobile and groups the contact link with the rest of the site links.

v0.19.1

More visible coach feedback + Strategy/Overall votes + freetext box
  • ChangedMade the 👍 / 👎 feedback buttons in the AI coach more visible — they now sit in subtle bordered chips with brighter default opacity, so it's obvious you can click them. Added the same vote control to the Overall Assessment and Strategy sections (previously only Strengths / Mistakes / Key Moments / Priorities had them).
  • AddedFree-text feedback box at the bottom of the AI coach panel: tell us what landed, what didn't, what you wish it said. Up to 3500 characters, sends straight to the team.

v0.19.0

👍 / 👎 feedback on every AI coach item
  • AddedTiny thumbs-up / thumbs-down buttons now sit next to every Strength, Mistake, Key Moment, and Improvement Priority in the AI coach panel — for both the in-replay-viewer compact panel and the full-screen Coach tab. One click records the vote against the replay and pings the team so we hear about coaching that landed (or didn't) without you having to file feedback separately. Your votes persist across page loads via localStorage, so the highlighted button stays after a refresh.

v0.18.7

Cannon rushes now reported as one event per location
  • FixedMulti-cannon rushes used to surface as one tactic per cannon — a 6-cannon rush at one enemy base showed up as 6 overlapping events spamming the AI coach. Forward Forges and Photon Cannons that land near each other (within 15 units) and within 30 seconds of one another are now grouped into a single tactic spanning the full attack window, with the unit count in the label (e.g. '6 Cannons at enemy base from 1:51 to 2:10').

v0.18.6

Removed noisy 'building canceled' tactic from coach context
  • FixedStopped tagging every short-lived structure as a 'building ended early' event. The only meaningful version of this play — Zerg's double-extractor trick — already has its own dedicated detector with the right context. Buildings killed mid-construction during harass are already explained by the harass detectors. The leftover catch-all was firing ~1.7 times per replay on routine misclicks and resource pivots, adding noise the coach didn't need.

v0.18.5

Tightened harass detection — fewer false positives on mid-game engagements
  • FixedMineral-line attack detection no longer fires on standing-army units (Vikings, Marines, Stalkers, Hydralisks, etc.) that walk through or attack a base in the mid-late game — those are normal army engagements, not harass plays. The catch-all from yesterday's release was over-tagging legitimate fights as harass.
  • AddedThree new specific harass detectors filling canonical gaps: Hellion run-by harass (T), Adept Shade harass (P), and Lurker burrow harass (Z). Each fires only when the harass unit actually reaches the mineral line AND kills workers, matching the existing 8 unit-specific harass detectors (Reaper / Banshee / Liberator / Widow Mine / Oracle / DT / Mutalisk / Zergling).

v0.18.4

AI coach also tags the attacker on mineral-line raids
  • AddedMineral-line attacks now show up as their own event in the AI coach's input, separate from the defender's worker pull. The attacker's coach can say 'you killed N workers raiding their mineral line at X:XX' instead of just describing it as the defender's perspective. Works for any race (any worker-killing unit — Marines, Vikings, Adepts, Lurkers, Roaches, etc.) and pairs automatically with the defending player's tag so neither perspective is lost. Worker-loss confirmation prevents fly-by misclassification — only fires when the opponent actually killed a worker.

v0.18.3

Smarter AI coach: scouting, build match, benchmarks, power spikes, race-agnostic worker pulls
  • AddedThe AI coach now sees four new pieces of context for every replay: when each player first got vision of an opponent's base (so the coach can stop blaming you for not reacting to something you couldn't have known about), which pro build your opening most closely matches, which timing benchmarks for that build you hit on time vs missed, and when either team had a sustained ≥30% army-value advantage. Battle reports also now include each side's army composition at the start of the fight plus a derived trade-winner, so the coach can evaluate a 25-supply army vs 18-supply trade instead of just per-team totals.
  • FixedWorker pulls now correctly distinguish 'fled an attack' from 'real combat pull' across all races. Previous version only caught pulls that overlapped one of our specific harass detectors (Reaper / Banshee / Liberator / Widow Mine / Oracle / DT / Mutalisk / Zergling). It now also catches any race's anti-worker units near a townhall when the puller actually lost workers — Vikings landing on a CC, Marines pressuring the mineral line, Adepts shading in, Lurkers burrowed in the line, and so on. Stops the coach saying 'Never pull workers in TvT' (or any matchup) when the player was just defending an attack the previous detector set didn't recognize.

v0.18.2

Friendlier 'database unavailable' message
  • AddedWhen the database is temporarily unavailable, the home page and replays list now show a clear amber banner with a Try Again button — instead of an empty list that looks like the site itself is broken. Localized in English, 한국어, 中文, and Français.

v0.18.1

Landing page: version badge + tighter desktop dropzone
  • AddedMajor.minor version (e.g. 'V0.18') now renders directly under the hero title on the home page in the same gradient/uppercase/heading style as the title itself, and links to /changelog. Patch numbers are stripped so the badge only changes when meaningful releases ship — gives users a visible signal that the site is actively maintained without churning every UI tweak. Source is the top entry of src/lib/changelog.ts so it stays in sync automatically
  • ChangedReduced the desktop replay dropzone height by switching its padding from sm:p-12 (48 px all around) to sm:py-6 sm:px-12 (24 px vertical, 48 px horizontal). Mobile padding (p-6) unchanged. Net: dropzone shrinks from ~240 px → ~180 px tall on desktop, which keeps the 'Drop a replay file here' CTA above the fold alongside the new version badge

v0.18.0

AI coach: 5 new strategy-shape detectors
  • AddedFive new tactic detectors so the AI coach can frame feedback in terms of the player's overall game posture instead of misreading common openings as mistakes. fast_expand fires when the second resource hall completes at or before the per-race supply benchmark (Terran ≤ 17, Protoss ≤ 19, Zerg ≤ 16) — concretizes 'expanded too late' / 'good macro economy' feedback with hard timing. all_in fires on a composite signal: worker production stops for 60+ s, mineral bank near zero, army held at ≥ 75 % of peak, AND opponent loses 5+ units in the window — coach now evaluates the all-in's success/failure instead of treating it as 'didn't macro.' power_droning fires on Zerg openings where ≥ 85 % of the first 4 minutes' production was Drones with at most 4 army units — fixes false-positive 'you didn't build any units' feedback for correct economic-first openers. worker_rush detects opening-2-minute mining collapses where workers committed to attack and opponent workers actually died — rare but unmistakable cheese. turtle fires on long games (≥ 18 min) where the player held 6+ static defenses with army value below 4000 through the first 15 min — frames feedback as 'evaluate the late-game tech transition,' not 'should have attacked sooner.' Live-corpus dry-run on 200 replays hit zero crashes; fire rates land at FE 66 % / all-in 31 % / power-droning 25 % / turtle 30 % / worker-rush 1.5 %, conservative enough to add real signal without flooding the coach prompt. tactics_version bumps 5 → 6; cached rows self-heal on next read. Six new unit tests covering each detector's positive and negative path. 12 tactic types in total now (15 incl. worker_pull's three sub-classes), all mapped to canonical Liquipedia strategy names

v0.17.5

AI coach: distinguish defensive worker pulls from combat pulls
  • FixedThe tactics detector now classifies worker_pull events with cross-detector context instead of emitting a single generic tag. After all detectors run, a post-pass refines each worker_pull into worker_pull_defensive (an enemy harass tactic — Reaper, Banshee, Liberator, Widow Mine, Oracle, DT, Mutalisk, or zergling runby — overlaps the pull window AND targets the puller), worker_pull_relocation (a resource hall the puller owns finished within ~60 s before the pull), or stays as worker_pull when neither applies (the original combat-pull semantic). Labels and evidence strings reflect the classification, so the AI coach sees the actual context. Fixes the case where a TvT replay was being told 'never pull workers in TvT' for what were actually workers fleeing a Liberator siege and transferring to a third base. Harass detectors now also emit targetPlayerId so the post-pass can disambiguate teammates in 2v2+. tactics_version bumps 4 → 5; cached rows self-heal on next read. New unit-test file (6 tests) covers each branch — combat baseline, relocation hit, opponent's base ignored, far-away base ignored, defensive harass match, 2v2 wrong-target safety

v0.17.4

Pixi viewer: full unit-icon coverage for Co-op + custom mods
  • FixedAudited the live corpus (1,432 replays, 1,066 distinct unit names) and went from 61 missing icons → 0. Replays on Co-op missions and custom mods now render all units in the Pixi fullscreen viewer instead of falling back to placeholder squares for unfamiliar names. Coverage breakdown: aliased Stetmann commander variants (ZerglingStetmann, LarvaStetmann, HatcheryStetmann, SuperGaryStetmann, …) to their base zerg equivalents; HotS Co-op Swarmling/Splitterling variants → Zergling/Baneling; Stukov infested-Terran units (StukovInfestedDiamondBack, StukovInfestedSiegeTankUprooted, StukovInfestedBanshee, SILiberator, InfestedTerran, …) → base Terran units; Tychus outlaws (TychusWarhound, TychusHERC, TychusOdin, TychusWarhoundAutoTurret) → Marauder/Marine/Thor/Raven; Mengsk VikingMengskFighter → Viking; Zagara BileLauncherZagara → Roach; Brutalisk mutator eggs → Drone/Ultralisk; TaurenSpaceMarine joke unit → Marine. Also expanded the hidden-from-Pixi list with: decorative props (DestructibleStreetlight/BullhornLights/Searchlight/TrafficSignal, Hut, GarysDen, UtilityBot, DumpTruck), effect/cloud/cocoon units that emit position events but aren't gameplay units (SNARE_PLACEHOLDER, SICocoonInfested* family, SILiberatorCloud, NovaAcidPuddle, TychusOdinPrecursor, Liberator_BlackOpsSpawnerUnit), Stetmann-themed casters, and the long tail of low-frequency arcade-mod props (AdunGenerator, CruiserBike, TerranBuggy, SoACaster, plus the Iron Gang Chinese arcade mod). Net result: every unit in every parsed replay now resolves to either a real icon or an explicit hide

v0.17.3

Map: WOL Protoss Edition 3 (Zero Hour) custom-mod minimap
  • ContentAdded the minimap for 'Wings of Liberty Protoss Edition 3: Zero Hour' — a fan-made Protoss reskin of the WoL campaign mission, listed on SC2 Arcade as a multi-mission campaign mod. Image extracted directly from the replay's map archive (no Liquipedia / wiki page exists for arcade mods). Also added a colon-safe alias mapping the original name (which contains a ':') to a filesystem-safe canonical so the on-disk filename works on every platform and is URL-clean: 'Wings of Liberty Protoss Edition 3: Zero Hour' → 'Wings of Liberty Protoss Edition 3 Zero Hour'. Replays on this mod now render their actual minimap instead of the placeholder

v0.17.2

Map coverage sweep: aliases, GSL prefix, Disco Bloodbath
  • ContentAudited every distinct replays.map value in the database against the resolver — 195 distinct names, 23 unresolved. Knocked it down to 15 (98.7% of the replay corpus now hits a real image instead of the fallback) by adding cross-locale aliases for Chinese ladder map names whose English images already exist on disk: 永恒帝国 → Eternal Empire LE, 特里同 → Triton LE, 雷鸟 → Thunderbird LE, 伊菲莫隆 → Ephemeron LE, 大气2000 → 2000 Atmospheres LE, 亡者之夜 → Dead of Night, 浴血迪斯科 → Disco Bloodbath LE. Also downloaded Disco Bloodbath LE itself (full + thumb webp) from Liquipedia. The remaining 15 are all 1–3 replay long-tail maps (one-off SC1 customs and obscure CN ladder names with no obvious English equivalent) — adding aliases for those without high confidence is more risk than reward, so they stay on the placeholder until a stronger signal shows up
  • FixedResolver now strips the 'GSL_' tournament prefix before alias lookup (matching the existing AVEX strip rule). 'GSL_Antiga Shipyard' resolves to the existing Antiga_Shipyard.webp instead of the fallback, and any future GSL_-prefixed names auto-resolve

v0.17.1

Map coverage: Berlingrad LE, Invader 1.0, + locale aliases
  • ContentAdded two missing map images and two cross-locale aliases that the resolver was previously falling through to the placeholder for. Berlingrad LE (LotV ladder, sourced from Liquipedia) — full-res for the replay viewer plus thumb for the cards. Invader 1.0 (SC1/Brood War custom by Earthattack, used in ASL S16) — also full + thumb. Aliased '营救矿工' (Chinese co-op map name) → existing Miner_Evacuation.webp, and 'Champs de mort CE' / 'Champs de mort' (French ladder name) → existing Fields_of_Death_CE.webp. The Invader 1.0 file lives alongside the existing Invader_LE.webp — different maps, same root name; the resolver's space→underscore step keeps the version suffix on disk so they don't collide. Replays on these maps will now render their actual minimap instead of the fallback

v0.17.0

French locale (Français) — fourth supported language
  • AddedFrench (fr) is now the site's fourth supported locale alongside English, 한국어, and 中文. Every page renders under /fr/* — home, all 19 guides, replays index, replay viewer, build orders, players, profiles, changelog. The whole UI string set (~30 JSON namespaces, including the 19 SEO-targeted guide articles) was machine-translated via Claude Opus 4.7 with a translator-grade system prompt that preserves keys, ICU placeholders, HTML/markdown markup, and the in-game / brand vocabulary the French SC2 community already uses in English (Marine, Stalker, build order, APM, stim, etc.). Triggered by a recent French traffic surge landing on the English site — visitors can now read native, and Google can index the localized URLs. Driven by adding 'fr' to next-intl's locale list, so the site language switcher (v0.16.0), sitemap, and hreflang alternates pick it up automatically. Also expanded the AI Coach + AI Cast language pickers to French — coaching output and cast narration both work in fr, with the SC2 jargon kept in the form French casters/coaches actually use
  • FixedCentralized hreflang generation. Every guide and metadata page now declares alternates for ALL configured locales via a buildHreflangAlternates helper that loops over routing.locales, instead of each page hardcoding its own languages dict. Audit found ~10 guides that had been declaring only en + ko in their alternates — Chinese versions of those guides were live and indexable but weren't linked as alternates from the en/ko versions, weakening cross-locale SEO. All 4 locales (en/ko/zh/fr) + x-default now appear consistently across every page, so adding a fifth locale in the future is a one-line change in routing.ts

v0.16.0

Site language switcher in the nav
  • AddedGlobe-icon dropdown between Players and Feedback in the top nav lets visitors switch the entire site between English, 한국어, 中文, and Français in one click. The trigger shows the current locale code (EN / KO / ZH / FR) and a chevron; the menu lists each option with its native-script label. Switching preserves the current path and any query string — e.g. clicking 한국어 from /en/replay/abc?t=120 lands on /ko/replay/abc?t=120, so users on a guide or a deep replay link don't lose their place. Driven by next-intl's locale-aware Link so navigation stays client-side. The switcher also propagated SiteNav onto guide pages, which previously had no top nav at all — guides now match the rest of the site's chrome
  • ChangedOn mobile the Feedback button collapses to its icon-only form (full label keeps showing on sm+ screens), so the new globe icon doesn't crowd Donate at narrow widths

v0.15.3

Guides link removed from top nav
  • ChangedThe Guides link is gone from the top navigation. Guide pages remain reachable via direct URL, search, internal links from other pages, and the footer — only the navbar entry was dropped to streamline the primary nav and free a slot for surfaces users hit more often (Replays, Build Orders, Players)

v0.15.2

AI cast feature hidden
  • ChangedThe AI cast button, language picker, generation banner, and 'Cast' badge on replay cards are hidden site-wide. The replay viewer falls back to the silent visualization play button on every replay (SC2, Brood War, AI Arena, Co-op all behave the same now), and the ?autoplay=cast deep-link is short-circuited so old external links can't silently kick off a new generation. Server-side cached MP3s and the /api/commentary pipeline are untouched — flipping the supportsCast flag back brings the UI in unchanged

v0.15.1

Mobile replay viewer: footer always above the fold, single play button frees timeline width
  • FixedMobile browsers compute h-screen (100vh) including the URL bar even when it's painted over the bottom of the viewport — so the play button + timeline could clip below the visible fold on phones until you scrolled or collapsed the URL bar. The replay viewer now uses h-dvh (dynamic viewport height) which tracks the actually-visible area, so the controls always sit inside the visible footer regardless of browser chrome state. Trimmed the safe-area floor from 2.5rem down to plain env(safe-area-inset-bottom) + 0.5rem too — the old floor was bigger than the iPhone home indicator (~34px) needs and was eating ~24px of timeline real estate on every phone
  • ChangedMobile timeline shows only the play button that's the active control. When the AI cast is currently the playback mode, only the cast button (Pause / Resume Cast) renders; otherwise only the silent visualization play button. Frees ~40px of timeline scrubber width — meaningful on a 375px-wide phone. Desktop is unchanged (both buttons + language picker stay visible). Cast generation remains a desktop affordance — tapping cast on a phone is rare and the timeline trade is more valuable

v0.15.0

Army-tab unit toggles, namespace-aware lookups, mid-game morph icons, and flying-building flight paths
  • FixedWhen a player resigned, every one of their surviving units would suddenly vanish from the Pixi replay canvas about 15 seconds later — even though the units were still alive and the replay was still playing. The renderer used to hide any unit whose last sampled position was more than 15s behind the playhead (so we wouldn't freeze a scout in mid-walk forever), but sc2reader stops emitting UnitPositionsEvents once a player leaves, so during the post-resignation cleanup phase EVERY surviving unit on that player's side hit the threshold simultaneously. The renderer now uses the parser's death events as the sole source of truth for visibility — units stay drawn at their last known position until they actually die. The earlier guard was guessing; the parser's diedAt is reliable, so trust it
  • AddedInside the side-by-side replay viewer, the unit-composition pills on the Overview and Army side-panel tabs are now clickable. Clicking a pill hides that unit type from the Pixi map (and stops it contributing to fog of war); clicking again restores it. In team view a single click toggles every player on that team. Useful for inspecting stacked units that share spawn coordinates — e.g. a Colossus stuck at the Robotics Facility can be obscured by a later-spawned Immortal at the same point — and for isolating a player's army during a busy fight. Hidden state resets on reload
  • FixedThe Overview-tab side-panel composition pills mixed in random-looking structures alongside army units — the BUILDING_NAMES set the filter relied on was missing the actual unit-name variants sc2reader emits, so e.g. Templar Archives showed up as 'TemplarArchive' (singular) and Lurker Dens as 'LurkerDenMP', sneaking past the building filter. Synced the set with the parser's list and added the lifted-Terran flying variants. The Overview pills now show only units; the Army tab still groups Army + Buildings as before
  • FixedComposition pill counts could stay frozen at peak even after every one of those units had died — the parser was reading the human-readable name off the death event ('LurkerBurrowed', 'BattleHellion', 'LurkerEgg') instead of the internal type tracked through morphs, so the −1 landed on a name that no birth event ever produced and the canonical-name count never decremented. The death-event resolver now reads the latest internal type from the per-unit registry that already follows morph state and applies the alias table once at the source — every downstream caller (timeline activeUnits, units-lost feeds, units-killed feeds) gets the same canonical name regardless of burrow / egg / cocoon state. Existing replay rows refresh on the next backfill
  • FixedAudited every LotV multiplayer transformation/morph/mode-change and filled in the parser's alias coverage. Burrow forms for every burrowable Zerg unit (Drone/Zergling/Baneling/Roach/Ravager/Hydralisk/Infestor/Queen/Ultralisk) now collapse to the canonical name; siege/AG/HiP forms (SiegeTank, Liberator, Thor) do too; cocoons for the Overseer/OverlordTransport morph paths join the existing Baneling/Ravager/BroodLord/Lurker cocoon coverage; mode flips (WidowMine burrow, SupplyDepot lower, PylonOvercharge, Observer surveillance, Overseer oversight, Spine/Spore Crawler uproot) all alias to their persistent base. Side-panel composition pills no longer flicker between rooted/uprooted or burrowed/unburrowed counts, and morph-form deaths attribute to the correct canonical name. Rule of thumb: if it has a morph state, the parser now collapses it. The new units.test.ts grep-parses parse.py's alias table at test time so future drift breaks the suite immediately
  • FixedFilled UNIT_STATS gaps so every canonical LotV ladder name has a hp/range/cost record for the side-panel tooltip — generic addons (TechLab, Reactor) the parser emits before they attach, lifted-Terran flying buildings (CommandCenterFlying / OrbitalCommandFlying / BarracksFlying / FactoryFlying / StarportFlying) with non-attacking variants of their grounded stats, rich-vespene gas geyser variants (RefineryRich / AssimilatorRich / ExtractorRich), and the morph-state legacy aliases for replay rows that haven't been re-parsed yet. The audit found 9 canonical names with no UNIT_STATS entry — every hover on those rendered an empty tooltip
  • AddedMode-aware unit-icon and unit-stats resolvers (getIconForGame / getStatsForGame). The icon resolver now accepts a 'sc1' | 'ladder' | 'coop' mode and prefers the namespace that matches the replay's mode — guards against the 6 ladder/co-op name collisions (SiegeTank, Mothership, MothershipCore, NydusCanal, SwarmHostMP, TemplarArchive) silently shadowing each other if a future commander tweak diverges any of them. Default mode stays 'ladder' so existing call sites keep working unchanged
  • ChangedWired the GameMode discriminator from the replay page down through every renderer that resolves icons or stats. ReplayStatsPanel pills, the Pixi sprite scaler, the Canvas2D heatmap icon cache, the hover tooltip, and every Overview/Economy/Army/Battle tab now pass mode='ladder' or mode='coop' (derived once via deriveGameMode(replay.game, replay.category)) to the resolvers. Co-op replays now read commander-specific stats out of COOP_UNITS first; ladder replays read out of UNIT_STATS first; SC1 short-circuits to its own table. The unit-scale function reads off the right side of the resolver too
  • FixedLowered Supply Depots and other morph-state buildings rendered roughly 6× their correct tile area on un-re-parsed replays — the Pixi renderer fell through to its missing-stats fallback (scale 2.5×) because UNIT_STATS only covered the canonical name. Mirrored every entry in api/parse.py UNIT_NAME_ALIASES into UNIT_STATS so morph keys (SupplyDepotLowered, BanelingBurrowed, RoachBurrowed, OverseerCocoon, …) inherit the canonical's footprint and radius — and added a parity test asserting each morph form scales identically to its canonical, so future drift fails the suite
  • AddedSourced Liquipedia portraits for the most-visible morph-state forms that had been falling back to the canonical icon: Supply Depot (Lowered), Siege Tank (Sieged), Liberator (AG mode), Widow Mine (Burrowed), Warp Prism (Phasing). Lowered depots now render with their distinct flat sprite on the Pixi canvas (typeChanges-driven, kicks in mid-game when the depot toggles); the unit-mode forms get the right portrait in the side-panel composition pills + tooltip, and will pick up canvas swaps when unit-side mode tracking is added
  • AddedLifted Terran buildings now follow their flight path on the replay canvas instead of being pinned to the construction site. The parser routes UnitPositionsEvent samples to base_tracks too (alongside unit_tracks), and the renderer uses a new resolveBasePosition() helper that walks typeChanges to identify the active Flying segment, keeps interpolation confined to samples inside that segment (so a CC that flies twice never gets a fake straight line connecting the two flights), and falls back to the construction site whenever sc2reader didn't sample the building during a given lift. sc2reader emits position samples sparsely for buildings — most lifts (especially Factory/Starport defensive lifts) won't produce any samples and stay static, but the cases where it matters (CC/OC moving to a new expansion, Barracks proxy plays) now animate correctly

v0.14.17

Cast deep-links land paused so the first play click reliably starts audio
  • Fixed?autoplay=cast deep-links could land on a silent replay because browser autoplay policies require a recent user gesture and the click on the source card doesn't survive SPA navigation. The previous fix tried to detect blocked autoplay and retry on the next gesture, but each browser failed differently — sometimes play() rejected, sometimes it resolved while staying paused, sometimes it paused a tick later — so detection was unreliable and users frequently had to toggle pause→resume to unstick the audio. Now the deep-link lands with cast enabled at 1× but paused, so the user's first click on Play is itself the gesture that unlocks audio and it works on the first try. Same change for clicking 'Play w/ Cast' on a replay that needs generation: after the 1–2 min generation finishes, cast is enabled but paused, since the original click gesture has long expired

v0.14.16

BW inactivity-based death detection no longer requires a 30s observed span
  • FixedThe inactivity fallback in tag-death inference required observedSpan ≥ 30s (a tag had to be seen for at least 30s before it could die via inactivity). That filter was rejecting briefly-selected units that were then killed quickly — e.g. a Shuttle that got clicked once to unload, then was shot down; or a High Templar that cast one storm and immediately died. Because the 2-pass lifetime tracker already incorporates every Select + every hotkey-recalled action, tag.lastSeen truly is the final mention anywhere in the stream. If lastSeen is followed by 30s of silence before game end, the unit is dead regardless of how long it was observed. Workers + Overlords stay exempt (they routinely idle unseen for minutes)
  • ChangedDownstream effect on user replay: tagged-unit death rates now look realistic (Zealot 46%, Hydralisk 42%, HT 33%, Lurker 43%), and the sibling-propagation step inherits those rates for untagged units. Total deaths in na1st-vs-lock: 8→16 Protoss (18%), 44→52 Zerg (36%)

v0.14.15

BW deaths propagate from tagged units to untagged siblings
  • FixedBW death attribution was only running on units with a Select-based tag match — about 31% of produced units in a typical macro replay. The other 69% (units that lived and died inside a hotkey group, never individually re-selected) had diedAt=null by default, so the scoreboard showed ~12% mortality in games where real mortality was 30–50%. Now, for each (player, unit type) pair we take the death rate among tagged units and distribute the same proportion of deaths across untagged siblings in bornAt order, borrowing death timestamps from the tagged death timeline. Aggregate lost-unit counts now roughly match reality and deaths still cluster around the real battle flashpoints

v0.14.14

BW movement now follows per-unit selection history
  • ChangedBrood War unit trajectories were being assigned by a proximity heuristic — each right-click was attributed to whichever tracked unit happened to be nearest. That produced the 'wandering back-and-forth in base' look, especially for macro armies: the heuristic would hand a Hydralisk the scouting Overlord's move, or spread a single attack-order across 40 zerglings as 40 different drifting paths. Layer 3 now takes a birthKey → tag map from the tag-matching stage and, when a birth has a confirmed tag, follows only the move commands where that tag was actually in the player's currentSelection (fed by the hotkey-group-aware replay stream from v0.14.13). Untagged births still use the proximity fallback so they at least appear on the map

v0.14.13

BW tag matching reads hotkey groups (better death inference)
  • FixedThe BW tag-lifetime tracker only considered explicit Select commands when extending a unit's lastSeen. Macro players hotkey their army once (ctrl-1), then press 1 + a-move for the rest of the game — those recalls never fire a Select, so the last lifetime stuck at assign frame and the 30-second inactivity fallback prematurely killed the unit for death-inference purposes. Now the tracker snapshots the current selection on Hotkey Assign / Add and restores it on Hotkey Select, so right-clicks issued after a hotkey recall propagate to every tag in the recalled group

v0.14.12

Tactic detection now SC2-only (skips BW + AI Arena)
  • FixedTactic detection (timeline scrubber tags like 'widow mine drop', 'zergling run-by', 'oracle harass') was firing on Brood War and AI Arena replays. The detectors reference SC2-only unit names and SC2-only timings, so on BW they mostly matched false positives (a Dragoon poke flagged as an Oracle harass, a Lurker burrow flagged as a Widow Mine, etc.). Short-circuited at the source — game === 'sc1' or 'aiarena' returns no tactics, matching the earlier Co-op carve-out

v0.14.11

BW parser: Zerg unit production + macro-army visibility
  • FixedZerg units were missing from the replay viewer entirely — screp reports Zerg production as 'Unit Morph' commands, but our layer-0 extractor only handled 'Train'. Every Drone, Zergling, Hydralisk, Mutalisk, Overlord, and so on was silently discarded. Now Unit Morph is parsed with the same shape as Train, and Zergling/Scourge emit two births per egg
  • FixedProtoss/Terran macro armies were also under-counted: all rapid Train commands routed to the most-recently-built producer, and MAX_QUEUE=5 dropped the rest. Now trains distribute across all available producers by shortest queue, so a 10-Gateway Zealot pump actually shows 10-Gateway worth of Zealots on the map
  • FixedThe strict tag-matching ground-truth layer was also filtering out any produced unit the player never individually Selected. For macro players who mass-hotkey and a-move their armies without clicking, this meant ~75% of produced units vanished. Unit tracks now derive from all raw births; tag matching still runs but only for death inference where it has data
  • ChangedBW schema version bumped to 2 — replays uploaded before v0.14.11 need re-parse to pick up the new unit tracks

v0.14.10

BW sprites now render proportional to real footprints
  • ChangedSprite scale in the replay viewer now consults SC1_UNIT_STATS (our BW unit/building reference) for footprint and collision radius, just like the SC2 path uses UNIT_STATS. Hatchery/Command Center at 4-tile footprint render at the largest size; Spawning Pool/Forge at 3-tile render mid; Photon Cannon and Zerg colonies at 2-tile render smallest — matching the actual in-game proportions. Also swapped the vision-radius lookup to the same helper, so fog-of-war circles use BW sight ranges (Lurker 8 tiles, Overlord 9, etc.) instead of the SC2-only default fallback. Replaces the constant 2.5× fallback shipped in v0.14.8

v0.14.9

Real BW building art (was letter placeholders)
  • FixedBW replays were rendering two-letter placeholders like 'Ha', 'SP', 'HD', 'La', 'Eg', 'IT' on colored squares for Hatchery, Spawning Pool, Hydralisk Den, Larva, Egg, Infested Terran, and others. The icon resolver was returning the correct file path and Pixi was binding the texture fine — but the underlying .webp files were long-committed stub art (76×76 letters on a purple/brown square). Pulled 30 real BW sprites (17 Zerg buildings + 10 Protoss buildings + Larva + Egg + Infested Terran) from Liquipedia at 128×128. Terran buildings and all combat units already had real art

v0.14.8

BW building sprites now visible (not just loaded)
  • FixedFollow-up to v0.14.7: the Brood War building sprites were loading and binding correctly in the fullscreen Pixi viewer, but scale defaulted to 1× because UNIT_STATS is SC2-only (no BW footprints). On a full-map isometric view the buildings ended up ~10 px squares and read as missing. Defaulting missing-stats buildings to 1.8× (≈3×3 tile) so they're actually visible; units stay at 1×

v0.14.7

Brood War building sprites now render
  • FixedBW replays were missing sprites for Hatchery, Spawning Pool, Extractor, Photon Cannon, Citadel of Adun, Templar Archives, Robotics Facility, Observatory, Hydralisk Den, Creep Colony, Evolution Chamber, and other BW-era buildings. The on-screen map's icon cache was calling the SC2-only resolver, which doesn't know about BW's spaced names like 'Spawning Pool' (SC2 uses 'SpawningPool'). Now plumbed the game type through the tab → heatmap → renderer chain so BW replays resolve through SC1_UNIT_ICONS

v0.14.6

Cast research now actually reads Liquipedia
  • FixedAI cast was telling listeners 'Liquipedia is down'. Two things wrong: Cloudflare Turnstile was 403'ing the Chrome-mimic UA (their API terms ask for a descriptive UA with contact info) and the MediaWiki API was 406'ing because we weren't sending Accept-Encoding: gzip. Tool now uses a polite UA + gzip, auto-rewrites liquipedia.net/starcraft2/<Page> URLs to the api.php parse endpoint, and returns clean plaintext. Also told the narrator explicitly never to mention tool outages or website names on-air

v0.14.5

Cast gating + autoplay audio hardening
  • FixedLotV / HotS / WoL SC2 replays with a null `game` column (older rows) no longer have the cast button hidden. The gate flipped from 'game === sc2' to 'game !== sc1 && game !== aiarena', so any row whose game isn't explicitly one of the BW-parser variants falls through as SC2
  • AddedWhen cast autoplay is blocked (Safari, strict Chrome profiles), a 'Tap anywhere to enable cast audio' banner now appears over the map. Previous silent-video behavior misled users into thinking the cast was broken — it was just waiting for a gesture. Also catches the Safari case where play() starts briefly, then the browser pauses the element because user-activation expired

v0.14.4

Cast autoplay audio-unlock + SC2-only gating
  • Fixed?autoplay=cast no longer plays the replay silently. Browsers were blocking the audio element's play() on the new page because the user gesture from the list-card click didn't carry across SPA navigation. The first rejected play() now wires a one-shot click/touch/keydown listener that retries on the next user interaction — audio unlocks the instant you touch the page
  • ChangedPlay w/ Cast is only shown on SC2 replays — SC1, Brood War, and AI Arena replays don't get the cast button or language picker, since the narrator prompt is trained on SC2 units + matchups

v0.14.3

Co-op cleanup: no tactic scrubbers, stray cast deleted
  • FixedTactic markers no longer appear on co-op replays. The detectors are calibrated for ladder 1v1 and were misfiring on Amon waves (fake gas steals on pre-placed geysers, bogus zergling runby tags, etc). detectTactics short-circuits to [] for Co-op category, and existing co-op rows re-parse their tactics on next view to clear the old noise

v0.14.2

Co-op icon fixes, cast gated to ladder, research-phase agent
  • FixedCo-op unit icons: Infested Abomination now shows Aberration art (was Ultralisk), Dusk Wing shows a Banshee (was Tempest), Scourge shows the proper Scourge icon (was Mutalisk), Diamondback shows a Vulture (was Hellion), Hybrid Behemoth shows Archon (was Tempest)
  • ChangedPlay w/ Cast is hidden on co-op replays — the narrator is ladder-trained and gave misleading calls on commander kits, so we gate it until a co-op-specific prompt ships
  • ChangedAI cast now runs a short research pass before it writes. Claude calls three tools — our archetype archive, our unit-stat table, and a whitelisted fetch (Liquipedia, TL.net, Aligulac) with browser-shaped headers — to assemble a fact sheet, and the writer can only cite facts that appeared in that sheet. Kills Hardened Shields Immortal / ghost GSL season hallucinations at the source; also removed the hardcoded map / matchup / news blobs from the prompt so facts stay evergreen

v0.14.1

AI Coach: English, Korean, or Chinese analysis
  • AddedAI Coach now has the same EN / 한국어 / 中文 picker as Play w/ Cast, welded onto the right side of the Analyze button. Claude writes the analysis in the chosen language with coach-style phrasing; JSON keys and severity/category enums stay in English so filtering still works. First run locks the language for the replay

v0.14.0

Play w/ Cast: English, Korean, or Chinese commentary
  • AddedSmall language picker on the right of the Play w/ Cast button — pick EN / KO / ZH before generation. ElevenLabs turbo-v2.5 handles all three natively; Claude writes the script in the chosen language with caster-style phrasing for each. First generation locks the language for the replay so every future viewer hears the same cast

v0.13.2

More dropped units rescued + parser audit + DB write fix
  • FixedParser was silently dropping a long tail of units from unit tracks: Hellbats, Warp Prisms, Lurkers, Banelings, Ravagers, Brood Lords, Swarm Hosts. All now alias to their canonical names at ingestion, so they show up on the replay viewer + match build orders + tactic detectors
  • FixedRe-uploading a replay after a parser bump now actually rewrites parsed_data in the DB instead of returning the stale cache (the file_hash dedup short-circuit was skipping the upsert entirely). Combined with a schemaVersion bump, viewing any older replay re-parses it lazily
  • Addedscripts/audit-unit-tracks.ts compares every replay's build orders against its unit tracks, flags name mismatches and silent drops, and exits non-zero past 5 affected replays so future regressions get caught

v0.13.1

Vikings now render in the full-screen replay viewer
  • FixedTerran Vikings were being silently dropped from unit tracks — both the VikingFighter (air) and VikingAssault (ground) morph forms were in the parser's excluded set, so every Viking's position data got skipped even when the player clearly built them. Now normalized to 'Viking' at ingestion with the morph transition treated as a no-op, so air ↔ ground landings don't flicker army counts. Re-upload an affected replay to pick up the fix

v0.13.0

Cast pipelines Claude stream + per-beat TTS
  • PerfPlay w/ Cast generation now streams Claude's output and fires TTS for each beat the moment its narration lands, instead of waiting for the full script. writeScript (30-90s) and synth (15-30s) stages now overlap — wall-time on long replays drops by roughly one full stage

v0.12.6

Cast mp3 size fix for long games
  • FixedLong-replay Play w/ Cast no longer fails at upload with 'object exceeded max size'. Whole audio pipeline now runs at 32 kbps mono (ElevenLabs fetch, ffmpeg trim, final mix) — a 22-min 3v3 goes from ~21 MB to ~5 MB, well inside the storage bucket cap and far cheaper to fetch + decode on the client

v0.12.5

Ship blocked v0.12.2-4 cast perf work to production
  • FixedThe last three Play w/ Cast perf passes never actually shipped — every deploy since 2026-04-21 was silently failing because vercel.json asked for a maxDuration above the Pro plan's 800 s cap. Reverted to 800 s so the concurrency bump, beat cap, backfill removal, parallel duration probes, streaming heartbeats, and stage timings all reach prod

v0.12.4

Cast generation streams keep-alive, stage timings logged
  • FixedPlay w/ Cast generation for long 3v3 / 4v4 replays no longer cut out at the 5-minute network-idle mark — the endpoint now streams heartbeat bytes while it works so proxies keep the connection warm for the full run

v0.12.3

Cast generation further sped up for long games
  • PerfDropped the post-synthesis TTS backfill pass (saved 20-50 extra ElevenLabs calls per long cast) and parallelized the 150× ffmpeg duration probes that were running serially — big generation-time reduction for 3v3 / 4v4 games

v0.12.2

Cast perf for long games + post-upload tactic scrubbers
  • PerfPlay w/ Cast now fans out TTS at concurrency 12 (up from 6) and caps total beats at 150 for very long 3v3 / 4v4 games, so generation no longer blows past the 5-minute mark on extended matches
  • FixedTactic scrubbers now appear immediately after upload instead of only after a page refresh — detectTactics runs client-side before the replay lands in the store

v0.12.1

Cast background-tab fix + replay list coach/cast indicators
  • FixedPlay w/ Cast no longer rewinds / repeats after you tab away — the audio is now the source of truth during cast playback, so the replay cursor catches up to the audio when the tab returns instead of the audio seeking back to a stale cursor
  • AddedReplay list cards show a sparkle badge when AI coach has already been run and a gold cast button when audio commentary is cached — click either to jump straight into the replay with that tab open or cast auto-playing

v0.12.0

Strategy tab + AI cast opening speculation
  • AddedStrategy tab in the full-screen replay viewer auto-matches each player to the closest pro archetype with a time-weighted similarity score and highlights which beats hit vs missed
  • AddedPlay w/ Cast speculates between plausible pro archetypes when each player places their first tech-defining structure (Factory, Robo, Roach Warren, etc.) — hedged in real time as builds are revealed rather than guessed from nothing at kickoff

v0.11.0

AI cast: priority-ranked packer + no-dead-air guarantee
  • ChangedPlay w/ Cast now scores every candidate moment (battles, tactics, key builds, matchup/map/news/reflect filler) and packs the most important calls first, so the biggest plays always land on time
  • FixedSilence gaps >3s are now auto-filled post-synthesis with a shoutcaster filler clip sized to the gap — the cast stays continuous from kickoff to GG regardless of which beats Claude writes shorter

v0.10.0

Timeline tactics, heatmap calibration, sprite polish
  • AddedTactic markers on the full-screen replay scrubber, color-coded per player with hover popover
  • AddedColor-coded leading tick per tactic to show where each hover region starts
  • ChangedDetected tactics (cannon rush, proxy, gas steal, worker pull, supply float, recall, drop, etc.) now inform the AI coach
  • PerfHeatmap calibrated so intense white is reserved for large battles, not mineral lines or supply depots
  • ChangedThinner per-unit borders in the replay viewer
  • ChangedSC2 unit sprites upscaled 3.4× for crisper zoom
  • PerfLighter page weight across the site
  • FixedNew uploads now populate lobby type (Ladder/Public/Private), battle count, and player region on the replay card
  • FixedMap resolution for German (Shuttle zu Schutt → Void Launch) and Korean (핵심 부품 → Part and Parcel) co-op mission names, plus AVEX/BGH tournament-prefixed maps and the HotS AfterWar2016 arcade variant
  • FixedUnit-icon coverage: every distinct unit/building name seen in uploaded replays now resolves — commander prefix/suffix stripping (MengskSiegeTank, TychusSCV, …), SC1-to-SC2 analog fallbacks (Medic → Medivac, ScienceVessel → Raven, …), and an expanded hidden list for mission decorations, cocoons, weapon-effect dummies, and custom-campaign NPCs
  • AddedAI Commentary button in the full-screen replay viewer — generates a game-time-synced shoutcaster narration (Claude scripts it, ElevenLabs voices it), caches the MP3 on Supabase, and follows the scrubber as you play

v0.9.0

AI tactics pre-pass, build-orders page, co-op coverage
  • AddedTactic detection for cannon rush, proxy production, gas steal, worker pull, supply float, building cancel, recall escape, drop play, and double extractor — shown in the coach
  • AddedClickable Key Moments timestamps seek the replay playhead
  • AddedStandalone /build-orders page with archetype browser, per-step unit icons, 10 new pro builds
  • AddedCo-op guide, co-op commander unit rosters, 11 co-op mission minimaps
  • AddedLadder / Public / Private category filter and label on replays
  • AddedDonate modal triggered by engagement
  • AddedReplay card shows battle count next to duration, and 1v1/2v2/… game type
  • FixedProfile page nav now renders in both loaded and not-found states

v0.8.0

Replays hub, profiles, navigation consolidation
  • AddedNew /replays and /players directory pages
  • AddedUnified top nav across every page
  • AddedCleaner shareable URLs for replay pages
  • ContentSeason 1 2026 /guides/maps page
  • ContentProtoss Oracle + strategy FAQs; Zerg and Terran map-pool FAQs
  • ContentEconomy benchmarks and matchup timing windows for all three races
  • ContentUnit counter quick-reference table in the army-composition guide
  • ContentBuild-orders greedy-openers section with 3 new FAQs
  • FixedSupply cap at 200, corrupt replays rejected cleanly, edge-case map names resolve correctly

v0.7.0

Donate, April patch content, share flow
  • AddedDonate modal with suggested amounts
  • AddedShare Replay button on replay results
  • ContentSC2 Patch 5.0.16 guide
  • Contentsc2-in-2026 guide with EWC 2026 and BlizzCon coverage
  • ChangedHero banner replaced with a looping 3v3 replay video

v0.6.0

Map fixes, AI coach polish
  • FixedMap-corruption and unit-morph handling in the replay viewer
  • AddedAI coach cues layer on the replay viewer
  • ContentMore ladder and community maps covered
  • FixedPagination and map-name resolution edge cases

v0.5.0

Brood War support, fog of war, AI Arena
  • AddedStarCraft: Brood War replay support
  • AddedFog of war toggle with per-unit vision radius
  • AddedAI Arena replay category; FFA game type
  • AddedExpansion filter (WoL / HotS / LotV / SC1 / BW / AI Arena)
  • AddedReplay view counts
  • AddedBuildings toggle in the replay viewer

v0.4.0

Battle replay viewer, isometric, full-screen
  • AddedFull-screen replay viewer with WebGL battle rendering
  • AddedIsometric view, heatmap toggle, death tickers
  • AddedPlay-and-coach overlap: watch the replay while the coach explains
  • AddedEmbedded game replay on every analysis tab
  • PerfSmoother unit motion at all playback speeds

v0.3.0

Korean localization, global sort
  • AddedKorean translations across the whole site
  • AddedGlobal sort across the replay list
  • ContentMore guides in every locale

v0.2.0

AI coach, strategy tab, guides
  • AddedAI coach with automatic strategy detection
  • AddedStrategy tab with benchmarks, ideal worker/army ratio, and build-order comparison
  • AddedGuides section and footer navigation
  • ChangedTighter battle definitions; mobile + typography pass

v0.1.0

Initial launch
  • AddedUpload a replay and get it analyzed
  • AddedBattle detection with per-battle army values and unit losses
  • AddedReplay detail page with Overview / Economy / Army tabs
  • AddedSide-by-side player comparison