Multi-Team Support


Same Factorio seed, up to 20 private worlds — each team races their own copy. Independent research, separate planets, zero resource conflicts. Buddy-join with friends, ally via mutual friendship, spectate rivals with live per-player follow cams. First-to-research announcements and per-team clocks drive fair speedruns. Common terrain mods (dangOreus, VoidBlock, Alien Biomes) work out of the box.

Scenarios
2 days ago
2.0
313
Planets Character Environment

Changelog

Version: 0.4.44
Date: 2026-05-29
  Features:
    - Team Awards: new first/fastest awards for raw resources -- iron ore, copper ore,
      uranium ore, and crude oil. Crude oil reads from the fluid production statistics and
      shows with its fluid icon, and wood now appears alongside the ores too.
    - mts-v1: register_milestone / report_milestone let a downstream mod define its own
      first/fastest milestones, announced through the same records, broadcast, and Discord
      bridge path as the built-in ones and shown in the Team Awards window.
    - mts-v1: get_team_label returns the coloured team tag with its current leader, and
      set_spawn_label_enabled lets a mod suppress MTS's own spawn label on a surface it
      labels itself.
  Changes:
    - Team Awards shows consumer-reported milestones by their registered name, and renders
      fluids (e.g. crude oil) with their fluid icon.
    - Milestone discovery self-heals on load, so awards added to the config start tracking
      after a simple reload instead of needing a new game or a mod-configuration change.
Version: 0.4.43
Date: 2026-05-28
  Features:
    - mts-v1: new register_welcome_tab interface lets a mod add its own tab to the
      welcome screen, populated via the on_welcome_tab_built event. Registered tabs
      lead the screen -- before the built-in About / Discord tabs -- so a host
      scenario can introduce itself first. Mirrors the existing register_team_tab API.
  Info:
    - Relicensed from MIT to GPL-3.0-or-later.
Version: 0.4.42
Date: 2026-05-27
  Features:
    - Follow Cam: every camera now has a View / Body toggle. "View" (the default) tracks
      where the player is actually looking — their remote-view camera — which is what you
      want for remote-play teammates; "Body" tracks their physical character position.
    - Follow Cam: a camera shows a "Spectating <team>" flag when the followed player is
      actively spectating another team, since their live view is then on that team's
      surface rather than their own base. The flag updates live.
  Changes:
    - Follow Cam: a camera's team label now always shows the player's real team, even
      while they are temporarily in spectator mode (it previously read "spectator").
    - Follow Cam: the map is only charted around a followed player in "Body" mode. "View"
      mode never reveals fog, so a follower cannot expose the map by riding a panning
      remote-view camera.
Version: 0.4.41
Date: 2026-05-27
  Changes:
    - Renamed the admin flag "Disable Blueprint Imports" to "Allow Blueprint Imports"
      (enabled = imports allowed), removing the confusing double negative. Existing saves
      keep their effective setting via an automatic migration.
    - /mts-trim now trims unused chunks on all of a team's surfaces (every planet), not
      just Nauvis. Space platforms are skipped, since their foundation is tiles rather
      than entities. Use "/mts-trim team-N" to limit it to one team across its planets.
Version: 0.4.40
Date: 2026-05-27
  Features:
    - Modding API (mts-v1): a consumer mod can take over starter-item delivery via
      register_starter_item_delivery. While registered, MTS routes admin-configured
      starter items to that mod (through the new on_starter_items_added event and
      get_starter_items query) instead of inserting them into player inventories; the
      override self-clears if the mod is removed.
    - Modding API (mts-v1): added the on_team_renamed event, raised by /mts-rename.
  Changes:
    - With a delivery override active, the spawning player's character is emptied while the
      admin starter-item list still pre-populates from the map's default loadout, so a
      character-free mod can route those items elsewhere.
Version: 0.4.39
Date: 2026-05-26
  Features:
    - Modding API (mts-v1): registered team tabs now persist in the save instead of a
      session-scoped table, so the registry is identical on every peer. A mod can
      register its tab once (in on_init / on_configuration_changed) and it survives
      reloads and mid-game joins — no per-session re-registration on a one-shot tick,
      which was not multiplayer-safe.
    - Modding API (mts-v1): mods can now anchor their own widgets into the native space
      platform hub GUI. register_platform_hub_widget{ name, caption, order, position }
      adds a relative-GUI frame, and the on_platform_hub_gui_built event hands the mod
      that frame (plus the hub entity) to fill each time a player opens a hub. Same
      persisted, multiplayer-safe registry as the team tabs.
Version: 0.4.38
Date: 2026-05-25
  Features:
    - Modding API (mts-v1): mods can now add their own tabs to the Team Settings panel.
      The panel is a tabbed pane (built-in "Team" tab plus one tab per registered mod);
      register_team_tab{ name, caption, order } adds a tab, and the on_team_tab_built
      event hands the mod the content element to fill each time a player's panel is built.
    - Modding API (mts-v1): added disband_team(force_name) so mods can implement their
      own loss conditions and tear a team back down.
Version: 0.4.37
Date: 2026-05-24
  Features:
    - Follow Cam: a Maximize button on the title bar fills the screen with the followed
      players' cameras. They split the screen evenly — two players get half each — so
      spectators (and players) get a much larger live view. Restore the panel with the
      same button, close it, or press Esc to return it to its previous size and position.
    - The maximized Follow Cam re-fits automatically when you resize the game window or
      change the UI scale, so it always fills the screen.
  Changes:
    - Follow Cam panels now use thin dividers between cameras instead of the heavy framed
      borders.
Version: 0.4.36
Date: 2026-05-24
  Features:
    - Track each team's "online time" — wall-clock time the team had at least one member
      connected (it freezes while the whole team is offline, so logging off for the night
      doesn't penalise a team). Shown in the research overview, and selectable as the
      ranking basis in Team Awards. Server-elapsed time stays the official basis for records.
  Changes:
    - Team Awards: the clock basis (Server vs Online time) is now a slider switch instead of
      a button, so it no longer blends in with the category tab buttons.
Version: 0.4.35
Date: 2026-05-24
  Features:
    - Optional integration with the Open Discord Bridge mod. When present, MTS announces
      team-aware join/leave/switch events, team research completions, and other game events
      to the bridge as human-readable sentences, with per-team label emoji.
Version: 0.4.34
Date: 2026-05-20
  Changes:
    - The logistic import_from rewrite notification is now a floating pop text
      instead of a chat message. When MTS silently reroutes a space-platform
      logistic request to the team's own planet variant, the old and new planet
      names appear briefly above the player and fade away, leaving chat uncluttered.
Version: 0.4.33
Date: 2026-05-20
  Bugfixes:
    - Team variant surfaces now generate terrain based on the host's chosen map seed instead of
      a fixed hash of the planet name. Previously all games produced the same terrain regardless
      of the seed selected at map creation; now each game's seed is respected and all teams still
      share identical terrain for each planet.
Version: 0.4.32
Date: 2026-05-20
  Bugfixes:
    - Gridlocked: recycled teams no longer inherit the previous occupant's chunk-point
      balance. When MTS reuses a force slot, it now calls Gridlocked's reset_force API
      to restore the starting point count and refresh every member's HUD label, so each
      new team begins from a clean slate regardless of what the previous team researched.
Version: 0.4.31
Date: 2026-05-20
  Bugfixes:
    - Gridlocked no longer crashes on team surfaces. Gridlocked tracks its
      per-chunk "gl-unclaimed-chunk" markers by entity unit_number, and MTS's
      terrain cloning replaced each registered marker with an unregistered copy,
      so charting a team chunk hit a nil render entry and crashed
      (gridlocked::on_chunk_charted). MTS now detects Gridlocked and generates
      team surfaces natively (no cloning), the same path used for Space Is Fake,
      so Gridlocked manages its own markers per surface. As with that path, it's
      mutually exclusive with Nauvis terrain mods that decorate by surface name
      (VoidBlock, dangOreus) in the same run.
Version: 0.4.30
Date: 2026-05-20
  Bugfixes:
    - Space Age planets no longer relock after being unlocked. A team that
      researched and reached a planet (Vulcanus, etc.) could find it locked and
      dark again after a technology-effects reset or a mod update — both
      recompute tech effects, which re-points each discovery tech's unlock at
      the shared base planet, while MTS clean-slated the per-team variant locks
      and nothing rebuilt the team's variant unlock. MTS now re-derives each
      team's planet unlocks from the discovery techs it has actually researched
      whenever locks are reset, so earned planets stay unlocked. Updating to
      this version auto-repairs an already-bugged save on first load.
Version: 0.4.29
Date: 2026-05-20
  Features:
    - Space Is Fake compatibility. When space-is-fake is active each team's
      Nauvis generates natively from its pinned per-base seed instead of being
      terrain-cloned, so terrain stays identical across teams while SiF's
      demolisher territories survive (clone_area destroys segmented units). A
      new optional dependency makes MTS deep-copy the Nauvis prototype after
      SiF's data-final-fixes so the variant carries SiF's full map (terrain,
      ores, enemies, cliffs, demolishers). SiF's one-time starting area
      (chest, trees, lava-ash tiles, ruin attractor) is re-placed on each
      team's Nauvis after spawn. Inert without SiF; mutually exclusive with
      surface-name-filtering Nauvis overhauls, and SiF's obsidiax sub-mode is
      unsupported.
  Bugfixes:
    - Stopped the "Logistic request rewritten" chat notification from spamming
      when players set logistic requests on ground chests. The cross-team
      import_from rewrite now only acts on entities sitting on a space
      platform, where shipping cargo from a foreign team's planet is actually
      possible. A chest can still carry an import_from value copied from a hub
      via blueprint, paste-settings, or a shared logistic group, but on a
      planet surface that value is inert; rewriting it did nothing except
      print a message (once per logistic-group member, so a single placement
      could fire several identical lines).
    - Fixed the first-landing celebration firing once per team instead of once
      per save. surface.planet.name returns the per-team variant name
      (mts-vulcanus-1), not the canonical base, so the landing gate keyed on a
      distinct value for every team; all teams' copies of a planet now share
      one first-landing flag.
Version: 0.4.28
Date: 2026-05-20
  Changes:
    - Removed the /mts-replay admin command and its internal event-replay
      code. It only reached mods that had already generalized their
      surface-name filters (better served by the mts-v1 lifecycle events),
      and replaying setup events retroactively risked double-applying or
      wrongly re-granting per-team setup. Mods added mid-save now take effect
      on teams and surfaces created from that point on — the same boundary
      vanilla worldgen has.
  Bugfixes:
    - Demolisher territories work on team surfaces again (Space Age). On
      Vulcanus and other territory planets, team copies had lost their
      demolishers: those surfaces were terrain-cloned from the base planet,
      and the clone silently drops segmented units like demolishers (a
      regression from eagerly pre-creating base planet surfaces, which
      switched cloning on for the outer planets). Team copies of the outer
      planets now generate natively from a shared per-planet seed instead, so
      every team gets identical terrain AND working demolisher territories.
      Nauvis is still cloned for terrain-mod compatibility and is unchanged.
Version: 0.4.27
Date: 2026-05-19
  Bugfixes:
    - Re-release of 0.4.26 — the previous mod-portal upload was rejected
      because the packaged zip included link-mod.sh at the repo root, and
      the portal rejects any zip containing .sh / .py / .bat / .ps1 / .exe
      files. The release workflow now strips those extensions at packaging
      time. No in-game behaviour changes from 0.4.26; all 0.4.26 fixes are
      bundled in this release.
Version: 0.4.26
Date: 2026-05-19
  Bugfixes:
    - Naturally-generated structures stuck on force="player" can now be
      mined by team forces on every planet. On vanilla Fulgora the
      Fulgoran lightning attractors and ruined buildings, and on Nauvis
      the freeplay crash-site ship + chests, used to spawn on
      force="player" and were not mineable by any team because
      force="player" entities ignore cease_fire + friend diplomacy. A
      generic on_chunk_generated sweep now reassigns every force="player"
      entity on a team surface to the surface's owning team force, so the
      team naturally owns the structure (mineable, repairable, wires into
      the team's electric grid, etc.). Replaces the older Nauvis-only
      crash-site name allowlist (compat/krastorio2.lua) and extends the
      fix to every planet variant — including future modded planets and
      any future modded entity that ships on force="player". minable
      and destructible are no longer overwritten, so scenarios that
      intentionally mark an entity unmineable are preserved.
Version: 0.4.25
Date: 2026-05-14
  Bugfixes:
    - Blueprint import lock now also blocks the import_blueprint and
      import_blueprints_filtered input actions. The previous Default
      permission lock only covered import_blueprint_string and
      open_blueprint_library_gui, leaving the toolbar import-string
      button and the chat-paste path usable as cross-team blueprint
      transfer routes.
Version: 0.4.24
Date: 2026-05-14
  Features:
    - Team Stats: the Ores, Plates, and Science tabs now auto-expand
      to fit every item their respective prototype scans turn up,
      capped at 48 columns. Overhaul mods that introduce dozens of
      science packs / ores / plates (Krastorio 2, Periodic Madness,
      etc.) no longer truncate at the old 12-slot ceiling. Curated
      tabs (Intermediates, Custom) keep their 16-slot layout with
      trailing empty slots for ad-hoc additions.
    - Stats columns within every tab are now ordered by tech-unlock
      depth — the length of the longest prerequisite chain to the
      earliest tech that unlocks the item's primary recipe — instead
      of raw prototype order. Items available from game start sit on
      the left; deeper-tech items slide to the right. Trace
      byproducts no longer yank their parent items to the front of
      the sort. Items the modder has hidden (e.g. PM's vanilla
      science-pack stubs) are filtered out.
    - Slot buttons in the Stats GUI shrink in two tiers (40 → 32 →
      26 px) once a tab exceeds 16 or 24 columns, so wide overhaul
      tables stay within a reasonable horizontal footprint. The
      scroll-pane width grows to match the table up to a 1500 px
      ceiling. Column header tooltips now show a large item icon and
      its localised name above the click hint.
  Changes:
    - The Team Awards top-bar button now uses a bundled legendary
      starburst sprite (graphics/legendary.png) instead of probing
      for the Quality DLC's icon at runtime, so the button looks
      identical regardless of whether Quality is enabled.
Version: 0.4.23
Date: 2026-05-12
  Bugfixes:
    - Fixed crash on first spawn when Krastorio 2 is not installed.
      compat/krastorio2.lua passed K2-specific entity names
      (kr-spaceship-reactor, kr-spaceship-research-computer, etc.) to
      find_entities_filtered every chunk; the engine raises "Unknown
      entity name" rather than silently ignoring missing prototypes,
      so any team Nauvis chunk-gen crashed the mod. The crash-site
      entity list is now filtered against prototypes.entity once per
      Lua state and shrinks to the vanilla names when K2 is absent.
Version: 0.4.22
Date: 2026-05-12
  Features:
    - Server-wide celebration announcements: the first rocket launched
      and the first landing on each planet now broadcast to every
      player and draw a long, rainbow-cycling pop-text animation on
      every screen, accompanied by an achievement-unlocked sound
      (falls back to research-completed when unavailable), regardless
      of force. Planet detection uses
      LuaSurface.planet so per-team variants (mts-vulcanus-1 etc.) and
      modded planets are handled automatically. The starting planet is
      marked silently on first spawn so it doesn't fanfare during a
      routine team join, but a later return from a platform won't
      double-trigger it either.
Version: 0.4.21
Date: 2026-05-12
  Changes:
    - Teams GUI is now a taller, slimmer panel: width clamped to
      360-400 px (down from 480-560) and height allowed up to 900 px
      (up from 600). Players reported the previous panel hogged
      horizontal screen real estate; going vertical fits more team
      cards on screen without spilling sideways.
    - Maximum team name length reduced from 32 to 16 characters, both
      in the team-settings rename field and in /mts-rename, so long
      names cannot push the slimmer Teams GUI back out. The team-name
      textfield now shows a "N / 16" counter that turns red at the
      limit, truncates input as you type, and rejects over-limit
      submissions with a clear message instead of silently truncating.
Version: 0.4.20
Date: 2026-05-12
  Changes:
    - Team Awards GUI now has a search field that filters the table to
      rows whose internal name contains the query (case-insensitive).
      A "N / M match" counter and a clear (×) button appear next to
      the field while a search is active, and an empty result shows an
      inline "Clear search" button so a forgotten query is never a
      dead end.
    - Achievement icons in Team Awards are now interactive. Hovering an
      icon shows its localised name; clicking a tech opens the
      technology screen and clicking an item opens Factoriopedia. Icons
      were also shrunk to 32 px and row spacing tightened so each row
      takes much less vertical space than before.
Version: 0.4.19
Date: 2026-05-12
  Changes:
    - Team Awards now always ranks all teams regardless of online status.
      The "show offline" checkbox has been removed from the Awards GUI
      because filtering it made the leaderboard misleading -- a team
      could appear to hold first place simply because the actual leader
      was offline. Records are immutable history, so they no longer
      hide behind a session-state toggle.
Version: 0.4.18
Date: 2026-05-12
  Changes:
    - Teams GUI no longer auto-reopens after the player closes it and then
      changes surface via the remote map. The panel only refreshes when it
      is already open.
    - The "Exit remote view" button has been split out of the Teams GUI into
      its own small standalone frame. It now appears only when a compat that
      keeps players permanently in remote mode is active (Platformer today)
      and the player is remote-viewing another team's surface. Clicking it
      returns the remote view to your own physical character without leaving
      remote mode, matching what Esc does.
Version: 0.4.17
Date: 2026-05-11
  Bugfixes:
    - Space platform hub schedule destination list no longer shows other teams'
      planet variants. Each team now sees only their own nauvis / vulcanus /
      etc. variants when picking a route destination. Previously every team
      saw every other team's nauvis variant (inherited the base planet's
      default-unlocked status), and could in principle route a platform to a
      foreign team's planet.
    - Cross-team logistic-request planet selections on space-platform hubs are
      now reactively rewritten to the team's own variant of the same base
      planet. The "Import from" dropdown can't be filtered per-force in
      Factorio 2.x, so every team still sees every variant in the picker, but
      whichever entry the player selects, cargo will ship from their own team's
      planet. The player gets a coloured chat notification when a rewrite
      happens so the change isn't silent.
Version: 0.4.16
Date: 2026-05-11
  Bugfixes:
    - Fixed /mts-disband leaving Space Age planet surfaces behind. The surface
      cleanup matched the legacy "team-N-<planet>" naming only; Space Age uses
      "mts-<planet>-N", so variant surfaces were never deleted and the next team
      to recycle the slot inherited the previous occupants' explored terrain.
      Now also iterates the planet_map force→variant entries for deletion.
Version: 0.4.15
Date: 2026-05-11
  Bugfixes:
    - Fixed Space Age non-Nauvis planets (Vulcanus, Fulgora, Gleba, Aquilo, modded
      planets) generating different terrain across teams. clone_mirror needs the
      base planet's surface to exist when a team variant chunk is first generated;
      Space Age creates base surfaces lazily, so a team exploring their variant
      before the base existed got divergent terrain. We now eagerly create every
      base planet surface at init and on_configuration_changed.
    - Note: this only repairs terrain for newly generated chunks. Chunks that were
      already explored on diverged saves remain diverged.
Version: 0.4.14
Date: 2026-05-10
  Bugfixes:
    - Fixed map-reveal exploit: a player being followed by another player's Follow Cam
      could pan their camera in remote view to chart-paint fog onto the follower's
      force, exposing previously unexplored chunks without anyone walking there.
      The Follow Cam tick now charts around the target's physical body, not their
      camera position.
Version: 0.4.13
Date: 2026-05-10
  Bugfixes:
    - Fixed crash when sorting the stats GUI by an item column in descending order
      (operator-precedence bug produced an inconsistent comparator).
Version: 0.4.12
Date: 2026-05-08
  Features:
    - Disable Blueprint Imports admin flag (default ON): blocks importing external blueprints
      via chat-paste strings, the blueprint library, and the Import-string button. In-game
      blueprint creation (alt-shift-click, copy-paste of placed entities) still works. Toggle
      from the Admin panel to allow imports without restarting.
Version: 0.4.11
Date: 2026-05-08
  Features:
    - Krastorio 2 / Krastorio 2 Spaced Out compatibility: crash-site entities (vanilla
      wrecks plus K2 spaceship pieces and chests) on team Nauvis surfaces are now
      mineable. K2's planetary teleporter "standing on" detection and tesla coil
      targeting now fire correctly on team characters.
Version: 0.4.10
Date: 2026-05-06
  Features:
    - Animated pop-text notifications: floating text animations appear above players at key
      moments — a coloured elastic pop on spawn confirm, a snap-in jiggle on team join, a
      large comic bounce above all team members on production milestones and death. All
      animations use the player's own chat colour. Disabled via the popup_text_enabled admin
      flag.
    - Tech research record popups: the first team to research a tech sees a "First!" popup
      with the tech icon; a subsequent faster clear shows "New record!". Uses the same
      animated pop-text system as milestones.
    - /t <message> command: sends a private message to your team only. Factorio's command
      system ensures the message is never broadcast by the engine — teammates see a green
      [Team] label; other teams see nothing.
    - Deep_Core_Operations compatibility: when DCO is active each MTS team gets its own
      ship via the DCO remote interface; players spawn on the ship's interior surface with
      DCO-appropriate starter items. Spawn teleports now retry each tick until the target
      surface is ready rather than silently dropping.
    - Admin starter-items panel: pressing Enter in the count field now submits the item,
      equivalent to clicking the + button.
  Changes:
    - Pop-text spawn position raised and upward drift increased so notifications are less
      likely to be obscured by open GUI panels.
  Bugfixes:
    - Fixed crash when a player died while in remote view: pop_text.rip was reading
      surface.players on a space-platform surface, which Factorio does not support.
    - Fixed crash when a tech was researched via the map editor: text render scale was 0 on
      the first tick (ease-out starts at 0); clamped to 1e-4.
    - Fixed spawn confirm popup not appearing after buddy join acceptance.
    - Fixed spawn confirm popup incorrectly firing when exiting spectator mode or during
      team-to-team force transitions.
    - Fixed spectator permission group blocking translate_string input actions, causing mods
      that call player.request_translations() (e.g. factoriolab-export) to hang waiting for
      on_string_translated events that never fired.
Version: 0.4.9
Date: 2026-05-05
  Features:
    - Ultracube compatibility: each team gets its own starting cube on their own surface.
      Cube location alerts are shown only to players on the relevant force. Force slots are
      cleaned up when a team disbands so recycled slots get a fresh cube and a clean victory
      condition.
Version: 0.4.8
Date: 2026-05-05
  Features:
    - Teams panel now shows a research queue in each team card header: up to 7 tech icons
      with live progress bars that update at 10 FPS in-place. Hovering an icon shows the
      tech name, queue position, and current progress percentage.
    - Team cards show a colour-coded last-active indicator (green < 1 h, yellow < 24 h,
      red > 24 h). Hovering it shows each member's total playtime and when they were last
      online. The label refreshes in-place once per minute.
    - Production Stats item tracking is now per-player — each player independently
      explores which items to track; no longer a shared global list.
    - Production Stats columns are now sortable. Click any column header to cycle through
      unsorted → descending → ascending.
  Changes:
    - Max teams cap raised from 20 to 60 when Space Age is not installed (Space Age stays
      at 20 due to per-team planet variant pre-creation).
    - Team card header now shows only the display name; internal force name and player count
      appear in a tooltip on hover, freeing space for longer team names.
    - Research queue icons resized to 20 × 20 px; empty slots always reserve the progress
      bar row so the card height never changes when research starts or finishes.
  Bugfixes:
    - Fixed crash when an admin kicked an offline player.
Version: 0.4.7
Date: 2026-05-04
  Features:
    - New players receive a welcome announcement on first join that includes
      the Discord invite link. Returning players receive a "Welcome back"
      message that includes their team name if they are on one.
    - Periodic server-wide Discord reminder every 6 hours, prompting players
      to join for reset notifications and game polls.
    - Discord URL is configured via Settings → Map → Discord URL (defaults to
      the community Discord; leave blank to disable all Discord messages).
Version: 0.4.6
Date: 2026-05-03
  Changes:
    - Team color now syncs from the leader's player color regardless of
      source — the /color console command and Factorio's built-in GUI color
      picker are both detected.
    - Buddy-request events (request, cancel, accept, reject, join) are now
      announced to all connected players, not just the team involved.
    - Player leaving a team is now announced to all connected players.
    - Solo leader leaving their team now auto-disbands it and broadcasts the
      standard disband message.
    - Production Stats panel now colors each team name using the leader's
      current player color.
  Bugfixes:
    - Follow Cam frame is now closed on player disconnect; previously it
      persisted on reconnect with cleared state, making all buttons no-ops.
    - Follow Cam now renders immediately on open — the target area is charted
      at frame creation rather than on the next poll tick.
    - Clicking the Follow Cam toggle no longer rebuilds the Teams panel for
      all connected players, eliminating the per-click lag spike.
Version: 0.4.5
Date: 2026-05-01
  Features:
    - Broadcast starter-item additions to all players. Both admin
      add paths — manual single-item add and "Copy from inventory" —
      print a colorized "<Admin> added Nx [item] to the starter
      items list." Copy-from-inventory announces only the diff
      (new or increased items); empty diffs stay silent.
  Tweaks:
    - Welcome / About panel refresh: list the Admin nav button
      (admin only), add a Records & announcements section
      explaining tech-record and milestone broadcasts plus the
      per-team clock, and add a Commands section listing
      /mts-teams, /mts-players, /mts-rename, /mts-leave, /mts-kick.
Version: 0.4.4
Date: 2026-04-30
  Features:
    - Spawn labels: every team-owned surface (planet variants,
      cloned surfaces, and space platforms) now carries a persistent
      "<team_tag_with_leader>'s\n<location>" label at the spawn
      area. Platformer's existing hub label is rerouted through the
      same code so it picks up the team-and-leader prefix too.
      Live-refresh on /mts-rename, the Team Settings rename field,
      and leader auto-election after a leader leaves. Backfilled on
      on_configuration_changed for upgraded saves.
  Tweaks:
    - Landing pen: drop the "Same start. Different finish." subtitle
      and render the "Spawn when ready" prompt with default-large at
      scale 3 so it stays crisp instead of looking upscaled.
Version: 0.4.3
Date: 2026-04-30
  Features:
    - Dynamic planet enumeration. MTS now iterates data.raw.planet
      at data-final-fixes (and game.planets at runtime) instead of
      hardcoding the vanilla 5 base planets. Modded planets — those
      registered via data:extend or via planet libraries like
      PlanetsLib — get per-team variants, per-team space connections,
      force locks, and discovery-tech routing automatically.
      info.json declares ? PlanetsLib so its data stages run before
      MTS's, ensuring modded planets are present at enumeration time.
    - Generalized clone_mirror: any mts-{planet}-{N} surface mirrors
      from the matching {planet} surface, not just nauvis. Mods that
      decorate Vulcanus, Gleba, Fulgora, Aquilo, or any modded
      planet now reach team variants automatically.
    - Discovery tech detection scans every loaded technology for
      unlock-space-location effects rather than matching tech names.
      Works for vanilla planet-discovery-* techs and for custom
      naming schemes used by planet mods.
    - Teams GUI shows spectate buttons for own-team surfaces too
      (previously foreign-team only). Use case: viewing your own
      planet from your space platform without leaving the hub.
      Friend-view path (no force change, no crafting pause) for
      same-team views; full spectator path for foreign teams.
    - Teams GUI rebuilds automatically on on_surface_created when
      the new surface is team-owned (rocket launches a new platform,
      a new modded planet variant is instantiated, etc.).
    - Lignumis compat placeholder at compat/lignumis.lua: pure-comments
      brief documenting the three runtime hardcoded "lignumis" filters
      that break per-team variants and how to fix them upstream. No
      active code; revisit when actually playing Lignumis.
  Fixes:
    - Spectator: pre-spectate "sitting in a space platform hub" state
      is now correctly restored on exit. Uses the documented
      LuaPlayer.enter_space_platform(platform) API to re-establish
      the hub-pilot relationship — set_controller alone restored the
      camera but not the "Drop to a planet" / platform schedule UI.
    - Spectator: pressing escape in a platform-targeting spectator
      session no longer leaves the user silently stuck. The camera
      reverts to phys_surface (Factorio's escape behavior on
      platforms doesn't fire on_player_controller_changed); a new
      on_player_changed_surface check auto-exits the spectator when
      the camera leaves the target team's territory.
    - Spectator: viewing an own-team surface no longer forces the
      player into spectator force. needs_spectator_mode now
      short-circuits to false when viewer_force == target_force,
      routing the click through enter_friend_view (no force swap,
      no crafting pause).
    - Force-utils: on_foreign_surface now recognizes Space Age
      mts-{planet}-{N} variants via planet_map.get_force_by_planet.
      Fixes the case where bouncing-from-foreign-surface didn't
      trigger after exiting spectator on a team variant.
    - Surface-utils: get_home_surface preference order corrected.
      The player's stored player_surfaces entry takes priority over
      any team platform; platforms are now a last-resort fallback.
      Fixes the regression where "return to base" sent platform-
      owning teams to the platform instead of their planet.
    - vanilla / Space Age compat: pre-generate spawn-area chunks
      synchronously before teleporting the player. Without this
      pre-gen, clone_area runs on the chunk containing the player's
      character and overwrites it, dropping them into god mode.
    - Spectator: after exiting spectator via the on-screen button,
      the Teams GUI rebuilds immediately so the button hides on
      one click instead of the user needing a second click that
      teleports them home.
    - Spectator: crafting_queue_size guarded against the "No
      crafting queue" engine error when called on players in
      god/spectator/remote controllers.
    - Diagnostic: helpers.player_state now logs character entity,
      player.opened, nearby entity, and player.hub for spectator-
      related debugging.
Version: 0.4.2
Date: 2026-04-29
  Changes:
    - docs/COMPAT.md restructured around the clone_mirror default.
      The old four-layer framing gave each option equal weight; in
      practice clone_mirror handles the bulk of cases automatically
      and the rest are runtime gameplay rules that need narrower
      fixes. Three ranked options for mod authors are now spelled
      out: surface.planet.name predicate (smallest, generic), expose
      runtime rules as remote.add_interface functions (closed-
      source-friendly, multi-surface-mod-friendly), and mts-v1
      event subscription (MTS-coupled). The "expose runtime rules
      as remote functions" path is new — it wasn't called out
      before and is the cleanest answer for closed-source authors
      who'd rather not couple to MTS specifically.
Version: 0.4.1
Date: 2026-04-29
  Features:
    - Generic terrain compatibility via compat/clone_mirror.lua. Any
      third-party mod that decorates the real "nauvis" surface via
      on_chunk_generated and filters by hardcoded surface name is
      now automatically mirrored onto every team surface. The mod's
      handler runs once on nauvis; MTS clones the resulting tiles,
      entities, and decoratives to each team-N-nauvis (or
      mts-nauvis-N) variant. Verified with dangOreus, VoidBlock,
      Alien Biomes, Periodic Madness, and the vanilla worldgen
      stack. New mods that follow the same pattern work
      automatically with no per-mod compat code.
  Changes:
    - Every team gets the same map by design. A single nauvis
      source-of-truth is decorated by the mod stack, then cloned
      to all team surfaces. Per-team randomization (different ore
      patterns or biome layouts per team) is replaced with
      consistent terrain across teams. Suits competitive race
      formats; if you needed per-team variety this is a regression.
    - dangOreus compat shim drops ~400 lines of re-implemented
      perlin / voronoi / pie / spiral pattern code in favor of
      cloning. Runtime gameplay rules (block non-miners on ore,
      container spillage, floor-is-lava) are preserved as a thin
      ~150-line per-mod shim. dangOreus is now re-enabled on real
      nauvis (it was previously toggled off) so its chunk-gen
      output exists to clone from.
    - VoidBlock compat shim drops the entire on_chunk_generated
      body and the PLANETS / get_planet_config helpers. Surface
      creation with autoplace disabled stays, since it saves
      cloning over wasted vanilla worldgen.
    - vanilla compat now pre-generates spawn-area chunks before
      teleporting the player. Without pre-gen, clone_area would
      run on the chunk containing the player's character and
      overwrite it, dropping the player into god-controller mode.
  Removed:
    - compat/gridlocked.lua. The HUD-refresh stopgap and the
      voidblock pre-claim are gone. Gridlocked still partially
      works alongside MTS (its handlers don't filter by surface
      name) but the stale HUD label after force change, the
      voidblock + gridlocked landfill deadlock, and the
      recent_claims save crash on team-slot release are
      unaddressed pending upstream fixes.
Version: 0.4.0
Date: 2026-04-29
  Features:
    - Public mts-v1 remote interface for third-party mod
      compatibility. Exposes events (on_team_created,
      on_team_released, on_player_joined_team, on_player_left_team,
      on_team_surface_created) and queries (get_team_list,
      get_team_info, is_team_surface, get_surface_owner,
      list_team_surfaces). See scripts/remote_api.lua for the full
      contract and docs/COMPAT.md for integration patterns including
      examples for chunk-gen mods (dangOreus-style) and stateless
      surface decorators (VoidBlock-style).
    - Admin command /mts-replay [--chunks] to re-fire
      on_surface_created (and optionally on_chunk_generated for
      every existing chunk) on team surfaces, so a newly-installed
      third-party mod can apply its setup retroactively without
      starting a fresh save.
    - Admin commands /mts-pause, /mts-resume, /mts-trim for runtime
      team management. /mts-pause sets active=false on all entities
      owned by a team force; /mts-resume reverses it; /mts-trim
      deletes unused chunks on team nauvis surfaces, processing one
      surface per tick interval to avoid stutter.
    - Gridlocked compatibility. The voidblock compat shim now pre-
      claims the four chunks containing the starter island when
      Gridlocked is loaded, preventing the deadlock where landfill
      can't be placed on unclaimed chunks. The gl_points HUD label
      is refreshed when a player changes force (stopgap until
      upstream Gridlocked hooks on_player_changed_force itself).
  Changes:
    - Welcome screen About tab rewritten around the team-pool model.
      Mentions hidden-until-friendly surfaces, lists the actual nav
      buttons (Teams, Research, Production Stats, Team Awards, Team
      Settings), and adds a Space Age section that only renders when
      Space Age is active.
    - The voidblock compat shim's leftover-entity purge in
      on_chunk_generated is now restricted to vanilla worldgen types
      (tree, simple-entity, resource, fish, cliff, unit-spawner,
      turret, unit) instead of nuking every non-character non-cargo-
      pod entity. Mod-placed entities like Gridlocked's
      gl-unclaimed-chunk markers now survive the tile swap.
    - team_tag_with_leader helper promoted to scripts/helpers and
      adopted by /mts-pause and /mts-resume admin output for
      consistent rich-text formatting.
  Removed:
    - Per-team offline auto-pause checkbox in Team Settings, and the
      associated force_pause hooks for on_player_joined,
      on_player_left, and on_force_changed. /mts-pause and
      /mts-resume admin commands remain the only pause path. A
      one-shot migration in on_configuration_changed resumes any
      legacy paused or mid-pause forces so existing saves don't
      load with stuck active=false entities.
Version: 0.3.9
Date: 2026-04-24
  Features:
    - Team Awards GUI (new top-bar button): leaderboard window with
      Research, Science, and Resources tabs, each showing the top 3
      teams per achievement ranked by elapsed time since team birth.
      Gold / silver / bronze rows, team tag with current leader's name.
    - Follow Cam now charts a box around the tracked player every tick
      so the camera widget always has map data to render. Previously,
      non-friend viewers saw a black cell until the chart data happened
      to already exist for their force.
    - Follow Cam / Spectate on a player who is themselves spectating
      another team now shows that player's body (their physical
      surface/position) instead of chain-following whatever they're
      watching.
    - dangOreus compat: a small deepwater patch is now carved at the
      origin of every team surface during chunk generation, so
      offshore pumps still have water access when the dangOreus
      starting radius is shrunk far enough to bury vanilla's starter
      lake in ore.
  Changes:
    - Milestone announcements now render the item as an icon in the
      quantity text ("produce 100 [item=landfill]") instead of a
      plain word. The per-tracker `label` field is no longer used.
    - Spectate surface button now uses the map icon, visually
      distinct from the radar icon used by Follow Cam.
    - Team rename (/mts-rename or Team Settings) refreshes any open
      Awards windows so the new name appears immediately.
Version: 0.3.8
Date: 2026-04-20
  Features:
    - Team Settings GUI (new top-bar button): team leaders can rename their
      team and toggle offline auto-pause. Non-leaders see all options in a
      read-only state with an "only your team leader can change these
      settings" notice. Any change is broadcast to all players.
    - Offline auto-pause (opt-in per team): when enabled and every team
      member is offline, all entities on the team's surfaces are set to
      active = false, freezing production. They resume on reconnect. Work
      is amortized chunk-by-chunk across ticks (500-entity budget per
      tick) so large bases don't stutter.
    - Follow Cam per-camera controls: each tracked player now has its own
      zoom-out / zoom-in / close buttons. Zoom levels persist across
      rebuilds (default 0.5, range 0.05 - 0.5).
    - Spectator announcements include surface name: "Pirion is now
      spectating Avengers (Nauvis)" instead of "spectating Avengers".
      Works for start, stop, and follow-cam "expand" paths (which also
      include the target player's name).
    - Space Age: each team's Aquilo variant now has its own connection to
      the shared solar-system-edge, and the vanilla edge → shattered-planet
      connection remains shared. Every team can now reach the endgame.
  Bugfixes:
    - Space map button no longer disappears when a space platform is
      built. Root cause was on_surface_created re-running the full force-
      lock reset, which clobbered planet-discovery unlocks every time.
      Split into a narrow "hide-only" path for surface events vs the full
      reset for init / slot recycle / force reset.
    - Fix state leak between team-slot occupants on release/reclaim.
Version: 0.3.2
Date: 2026-04-16
  Other:
    - Release workflow: release notes now cover changes since the last
      PUBLISHED release (queried via the GitHub API) instead of just the
      current version's changelog entry. Handles cases where an intermediate
      version was tagged but never published — its changelog gets included
      in the next successful release's notes. Same notes used for both the
      GitHub release body and the Discord announcement.
Version: 0.3.1
Date: 2026-04-16
  Features:
    - dangOreus mod compatibility: when dangOreus is active, dangOreus's
      chunk-gen behavior (ore flooding, anti-building-on-ore, container
      spill, floor-is-lava) is applied to each team's nauvis surface
      (team-N-nauvis in base 2.0 / VoidBlock, mts-nauvis-N in Space Age).
      Default nauvis is disabled for dangOreus since no team plays there.
      All five dangOreus modes (pie, random, voronoi, perlin, spiral) work.
      Perlin mode also fixes an upstream bug where integer coordinates
      collapsed the noise output to a constant (ore variety restored via
      coordinate scaling).
  Bugfixes:
    - Platformer mode: fix player being teleported to the landing-pen
      surface after pressing Escape from a remote view. Root cause was
      Factorio's god-controller cursor following the last-viewed surface
      when there's no character to anchor position (Platformer players
      have no character by design). Mitigated by saving the god's
      physical_surface + physical_position before entering remote view
      and teleporting back on exit (god_pre_remote anchor in
      on_player_controller_changed).
    - Fix on_player_controller_changed handlers referencing the wrong
      event field. Factorio 2.0 uses event.old_type, not
      event.old_controller_type; the mismatched field silently read nil,
      so prior attempts at this fix never actually executed.
    - Re-enable hiding the default nauvis surface from team forces in
      all modes (base 2.0, VoidBlock, Platformer) now that the
      god_pre_remote guard protects against the related SurfaceList
      engine quirk.
  Other:
    - Diagnostic logging: helpers.diag() + helpers.player_state() instrument
      every surface/controller event and every teleport call site with
      force/surface/position/physical_surface/physical_position/controller
      type, making future position-state bugs far easier to diagnose.
    - helpers.set_surface_hidden() wrapper (with DISABLE_SURFACE_HIDING
      kill-switch) routes all force.set_surface_hidden calls through one
      place so they can be disabled globally for diagnosis.
Version: 0.3.0
Date: 2026-04-16
  Features:
    - Space Age support: per-team planet variants (mts-nauvis-1, mts-vulcanus-1, etc.)
      with space-connection topology mirrored from vanilla. Auto-detected at runtime.
    - Each team gets their own full solar system; base planets are locked and hidden
      for team forces so teams never collide on shared planets.
    - Researching planet-discovery techs unlocks the team's variant (not the base).
    - Teams GUI: replaces "Players & Platforms" with a card-based team-centric view.
      Each card shows members (★ leader, online/offline, friendship), surfaces, and
      per-player Follow Cam buttons.
    - Follow Cam: grid of live camera widgets tracking individual players across
      planets and surfaces. Updates at ~30 FPS. Click a cell's magnifier to expand
      into full spectator mode; Esc returns to the grid with state preserved.
    - Tech records & announcements: tracks first + fastest per technology across
      teams. Broadcasts "first to research [X]" and "new speed record" messages.
    - Milestone engine: generic production-threshold tracker (science, landfill,
      space platform tile). Editable via milestones/config.lua — add any category
      with its own thresholds and counters.
    - Team clock: each team's elapsed time starts when the first member spawns,
      used for all record comparisons regardless of team creation time.
    - Redesigned Landing Pen: "Start a new team" primary button + "OR join an
      existing team" section with per-team Request to Join. Request flow announces
      to all team members (only the leader can accept).
    - Cancel request button: requesters can withdraw before a response.
    - Leave/Kick confirmation dialogs explain consequences before executing.
    - Admin toolbar button (only visible to admins) replaces auto-open panel.
    - Commands: /mts-teams (list all teams + status), /mts-rename (leader renames).
  Changes:
    - Force naming reform: forces are now "team-1" through "team-N" (pre-created
      at game start via mts_max_teams startup setting; default 20). Forces no
      longer carry a player's name — any member can become leader without a swap.
    - Team names are customizable via /mts-rename or the Teams panel.
    - Force color always derived from team leader's player color.
    - Simplified team-leader logic: leader leaving elects a new leader; no
      complex force-swapping.
    - Landing pen players stay on the spectator force until they click Spawn,
      so game.forces.player stays clean as a research baseline.
    - Teams GUI and all chat announcements use "Team <name>" prefix and
      color-tag teams consistently.
    - Default nauvis surface is hidden from team forces (Space Age or not).
    - /mts-kick and /mts-leave now use confirmation dialogs (gui/confirm.lua).
    - Multi-player teams (buddy join) enabled by default.
  Bugfixes:
    - Research on leaving a team resets to baseline (was incorrectly carrying
      over the team's full research to the departing player's new force).
    - Team cards stay visible while a member is spectating (uses team_pool
      occupancy check, not force.players length, so spectating members don't
      hide their team).
    - Follow Cam tooltips update when targets are added/removed.
    - Buddy join request routes to team leader (not arbitrary member).
    - Admin nav button stays grouped with mod buttons after demote/promote.
Version: 0.2.20
Date: 2026-04-14
  Features:
    - Buddy join team size limit: admin dropdown (2-10, default 2) controls max players per team
    - /mts-leave command: any player can leave their team and return to the Landing Pen
    - /mts-kick command: team leader can kick members from their team
    - Team leadership transfer: when owner leaves, next member is promoted and all players are notified
    - Admin Starter Items tab: configure starting inventory by copying from inventory or adding items manually
    - Starter items auto-populated from first player's inventory on initial spawn
    - New admin-added starter items are distributed to all already-spawned players immediately
    - Anti-abuse: inventory cleared when rejoining a team previously left
    - Landing Pen GUI is now scrollable for large player counts
    - Team spawn announcement broadcast when a player starts their team
  Changes:
    - Rename force prefix from "player-" to "force-"
    - Rename commands from /st-* to /mts-*
    - Player names in system messages are now colorized with their chat color
    - Force name shown in grey brackets after every "team" mention in chat messages
    - Force name shown next to owner name in the Players GUI
    - Leave Team button removed from Players GUI (use /mts-leave instead)
  Bugfixes:
    - Fix multiplayer desync caused by storage writes in on_load
    - Fix team size not decrementing when force owner leaves
    - Fix Players GUI showing old owner name after team leadership transfer
    - Fix "Return to my base" button appearing for players in the Landing Pen
    - Fix crash from duplicate GUI element names in Starter Items tab
Version: 0.2.17
Date: 2026-04-08
  Features:
    - Players in the Landing Pen are now assigned the spectator permission group, preventing building or griefing in the pen area
  Changes:
    - Update README: remove Space Block references, add Platformer and VoidBlock links, remove installation section, fix command references
    - Update info.json description
Version: 0.2.16
Date: 2026-04-08
  Features:
    - Spectate now focuses on the target player's live position (or their saved position if they are away spectating someone else), instead of always starting at surface origin
    - Returning from spectate restores the player to their exact pre-spectate surface and position, with collision avoidance to prevent getting stuck in structures built by bots
    - Character remains vulnerable (destructible) while spectating, preventing players from using spectate mode to escape enemy attacks
  Changes:
    - Rename gui/platforms.lua to gui/surfaces.lua (internal variable: surfaces_gui)
  Bugfixes:
    - Players in the Landing Pen can no longer see or use the "request friend" option for spawned players
Version: 0.2.15
Date: 2026-04-07
  Changes:
    - Extract shared compat utilities (planet_display_name, process_pending_teleports, setup_player_surface) into compat_utils.lua to reduce duplication between vanilla and VoidBlock modules
  Bugfixes:
    - Fix spectator mode not exiting when spawning from the Landing Pen
Version: 0.2.14
Date: 2026-04-06
  Features:
    - VoidBlock mod compatibility: each player gets their own Nauvis with void-island terrain
    - Pre-generate chunks around spawn so players never see default terrain flash
  Changes:
    - Stats GUI: active category and time period buttons use green_button style for visibility
Version: 0.2.13
Date: 2026-04-06
  Features:
    - "Allow Friendship" admin flag: disabling dissolves all friendships and hides checkboxes
    - Per-player "show offline" toggle in Players panel (hidden by default)
    - Players in the Landing Pen are excluded from Research and Stats GUIs
  Changes:
    - Codebase reorganized into gui/, compat/ folders with shared helpers.lua
    - All module variables renamed from M/H to descriptive names
    - Extracted force_utils.lua, surface_utils.lua, gui/friendship.lua,
      gui/research_diff.lua, gui/landing_pen_terrain.lua for smaller files
    - Vanilla surface naming changed from "st-<index>-<planet>" to "<force>-<planet>"
    - Spectator exit always teleports player home (prevents god-mode stranding)
    - Stats GUI refreshes on player spawn (not just connect/disconnect)
    - Widened Players panel and Stats name column to prevent layout shifts
  Bugfixes:
    - Fix spectator bounce failing in Platformer god mode (force lookup used
      spectator force instead of effective force)
    - Fix landing pen player colors: use chat_color consistently instead of
      hardcoded yellow for self and grey for spawned players
Version: 0.2.12
Date: 2026-04-05
  Features:
    - Spectator system: view other players' surfaces via a dedicated spectator force
    - Spectate button (magnifying glass) on each player's platform/surface row
    - Friend-view: friends bypass spectator force and get direct remote view
    - Mutual friendship: both sides must agree to activate, either side can break
    - Friendship request states: request friend (blue), pending (yellow), friends (green)
    - Chat prefix shows "[on X's base][spectator]" or "[on X's base][friend]" context
    - Admin flag: "Spectate Notifications" to toggle spectation announcements
    - Admin flag changes now broadcast to all players
    - Crafting queue freezes while spectating, resumes on exit
    - "Stop spectating" button shows "(crafting paused)" when crafting queue is active
    - Surface visibility: other players' surfaces hidden from map sidebar unless friends
  Changes:
    - GPS ping buttons replaced with spectate buttons in Players GUI
    - Friendship is now mutual (requires both sides) instead of one-directional
    - Friend/unfriend downgrade: losing friendship while viewing switches to spectator mode
    - Spectator force hidden from all player-facing GUIs (Players, Research, Stats)
    - Players GUI uses effective force for all comparisons (correct during spectation)
    - Vanilla surface naming changed from "st-<index>-<planet>" to "<force>-<planet>"
  Bugfixes:
    - Fix player color showing as white when spectating (now uses game.get_player lookup)
Version: 0.2.11
Date: 2026-04-04
  Features:
    - Announce friend/unfriend actions to all players with mutual status indicator
  Bugfixes:
    - Fix players being stranded on foreign surfaces after exiting GPS remote view
    - Fix landing-pen players being moved to foreign surfaces via GPS tag clicks
Version: 0.2.9
Date: 2026-04-03
  Features:
    - Landing Pen visual overhaul: lab-dark-2 island, water moat, grass ring, ground text
    - Add "Buddy Join" admin feature flag (off by default) to gate buddy request system
    - New branding: "Solo by design. Legendary by choice."
  Changes:
    - Replace quality sync polling (every 30 ticks) with event-driven sync on research finished
    - Landing Pen chunks now handled via on_chunk_generated (no more grass outside the void)
  Bugfixes:
    - Fix nav bar buttons not working after server restart / save transfer
    - Fix welcome screen crash when on_player_created and on_player_joined_game both fire
Version: 0.2.8
Date: 2026-04-02
  Features:
    - Research GUI: collapsible player rows (1 row default, expand to see all)
    - Research GUI: "You both have researched" section in diff view
    - Research GUI: click any tech icon to open it in the tech tree
    - Research GUI: Escape navigates back from diff to overview before closing
    - Welcome window: added close button and About tab selected by default
    - Welcome window: Discord tab uses full logo image
    - Admin panel now visible to all admins, not just the host
    - Add GitHub Actions workflow to package mod zip on version tags
  Changes:
    - Remove all periodic GUI polling; all updates are now purely event-driven
    - Platforms and admin frames use clear() instead of destroy+recreate (fixes drag jitter)
    - Nav bar buttons doubled in size (56x56)
    - Landing Pen window positioned below top bar, above Players panel
    - Research play time now shows elapsed since spawn, not absolute game time
    - Remove em-dashes from About page and README
  Bugfixes:
    - Fix Players panel reappearing after closing (5-second poll was recreating it)
    - Fix admin and Players windows feeling jittery while dragging
Version: 0.2.7
Date: 2026-04-01
  Features:
    - Add Landing Pen: new players wait in a shared pre-game lobby before spawning
    - Add buddy system: pen players can request to join an active player's force
    - Add vanilla surface support: each player gets their own nauvis surface
    - Add admin panel with runtime feature flags (Landing Pen toggle)
    - Add per-player clock tracking (time since spawn)
    - Add research comparison panel with tech icon grid and 1-on-1 diff view
    - Show Platforms GUI to players in the Landing Pen
  Changes:
    - Rename Platforms GUI to Players GUI
    - Include vanilla surfaces in the player list as "<name>'s base on <Planet>"
    - Disabling Landing Pen mid-session immediately spawns all waiting players
  Bugfixes:
    - Fix landing pen surface shape: out-of-map tiles outside the circle
    - Fix spawn button double-fire and duplicate platform creation
    - Fix cutscene skip: exit_cutscene() before teleport
    - Fix solo force being reset by scenario after cutscene
    - Fix teleport retry: keep pending entry until teleport succeeds
Version: 0.2.6
Date: 2026-03-31
  Bugfixes:
    - Fix Stats button width in Platforms title bar
Version: 0.2.5
Date: 2026-03-31
  Features:
    - Add per-player production stats GUI with five categories (Ores, Plates, Intermediates, Science, Custom)
    - Categories built dynamically from game prototypes; works with overhaul mods
    - 12 choose-elem-button columns per category; players can swap any item
    - Time range selector: 1m / 10m / 1h / 10h / All time
    - Per-player column overrides persisted across sessions
  Changes:
    - Online/offline status updates instantly via events (no tick delay)
Version: 0.2.4
Date: 2026-03-30
  Features:
    - Add Platformer mod compatibility: per-player space platform creation and deferred teleport
    - Add "Return to my base" button when visiting a foreign surface
  Changes:
    - Hide the default "player" force from the platforms GUI
    - Declare optional dependency on Platformer for correct load ordering
Version: 0.2.3
Date: 2026-03-29
  Changes:
    - Remove GPS ping button from player name rows; GPS buttons now only appear on platform rows
Version: 0.2.2
Date: 2026-03-29
  Changes:
    - Remove all hub collision detection hacks (use /unstuck instead)
Version: 0.2.1
Date: 2026-03-29
  Bugfixes:
    - Fix hub collision fix and /unstuck to use physical_surface/position
    - Fix remote view (GPS clicks) incorrectly triggering the collision fix
Version: 0.2.0
Date: 2026-03-29
  Changes:
    - Remove automatic hub collision repositioning (caused issues with GPS pings)
    - Document /unstuck command as the manual alternative
Version: 0.1.1
Date: 2026-03-28
  Changes:
    - Add thumbnail image for mod portal
    - Add homepage URL to info.json
Version: 0.1.0
Date: 2026-03-28
  Features:
    - Separate forces: each player gets their own force with independent research
    - Quality unlocks and space platform access copied from default force
    - Neutral diplomacy: players start in cease-fire with all others
    - Per-player friend toggle via the Platforms GUI
    - Cross-force chat: normal messages broadcast to all forces
    - Draggable, collapsible Platforms GUI with live GPS locations
    - /platforms command with colored names and clickable GPS pings
    - /unstuck command to eject from vehicles and teleport to safety