STNH Game Log Analyzer

Stellaris: Star Trek New Horizons — Debug Log Analysis
v2.0.02026-04-07

Upload Log or Save File

Drag & drop or click to select .log files or a Stellaris .sav file

Note: All logs and saves are processed entirely locally in your browser — no data is ever sent to a server. Without "Save to Log Library" enabled, uploaded logs are lost when you close or reload the page. Logs stored in the library are also only available in this browser. Stellaris .sav files are unpacked and analyzed in-browser (ZIP + Clausewitz parser).
Drag & drop or click to browse. You can upload multiple files at once. Give your upload an optional name — if left blank, the original filename is used. Check "Save to Log Library" to keep the file for future sessions.

Log Library

Previously saved logs appear here. Select one or more and click "Analyze" to load them — you can combine saved logs with new uploads. Use "Select All" for a quick multi-file analysis.
No saved logs yet. Upload a file to get started.
0 selected
Select saved logs or upload new files to analyze
Parsing log file...
How to use

Overview of all loaded log data. Shows total entry counts, faction count, date range, and detected human players. When multiple logs are loaded, data is combined across all files. Use the global filter bar above to restrict all tabs to a specific date range or file. Full docs

Date Range

How to use

Revenue data per faction for the selected game date. Use the search box to filter factions. Use the category quick-select buttons to select all empires of a category (Major, Significant, etc.) at once. Check the boxes next to empires and click "Show Selected Empires Graph" to compare their revenue over time in a line chart (supports zoom via mouse wheel). Human players are highlighted in green. Click "Export CSV" to download the current table as a CSV file. Full docs

0 selected
How to use

Net income per faction after upkeep/expenses (contrasts with Revenue which shows gross production). Example: an empire may show +365 energy revenue but -67 energy income — the delta is upkeep burden. Sub-toggle switches between Major resources (9 cols), Rare resources (17 cols), or All (26 cols). Requires STH_test_events from April 2026 or later. Full docs

0 selected

Revenue Comparison

How to use

Empire statistics (naval cap, planets, technologies, etc.) for the selected date. Works like the Revenue tab — use category quick-select buttons to select entire empire groups, or select empires via checkboxes to graph and compare metrics over time. Chart supports mouse-wheel zoom and vertical hover line. "Export CSV" downloads the table. Full docs

0 selected
How to use

Top empires ranked by any revenue resource or stat metric at a chosen date. Change the metric dropdown to switch between resources and stats. Set "Top" to "All" to show every faction without a cutoff. Use the search box to filter by faction name. "Export CSV" downloads the rankings. Full docs

RankFactionValue
How to use

Chronological war event log: declarations, invasions (win/fail), and active war status. Filter by faction, event type, or free-text search. Results are paginated (100 per page). "Show Network" opens a force-directed graph visualization of war relationships — click a node to filter the list. "Export CSV" downloads filtered wars. Full docs

How to use

Pivot table view. Pick a resource or stat, then choose a timeframe: all dates as columns, a single date, a decade, or alltime averages. Toggle the heatmap for visual intensity. Sort by name, latest value, total, or growth. "Hide zero-only" removes factions with no data. Large datasets (100+ factions) use virtual scrolling for performance. "Export CSV" downloads the table. Full docs

How to use

Deep dive into a single empire. Shows revenue and stats over time as tables and sparkline charts, plus full war history. Defaults to a human player if one is detected. Select any faction from the dropdown — use the search box to filter the list. "Export CSV" downloads the faction's complete data. Full docs

How to use

Compare 2–4 factions side by side. Select factions from the dropdown to add them, then choose a resource or stat to compare. Revenue/stat values are shown in a table with dates as rows and factions as columns. Sparklines overlay the trends for visual comparison. Full docs

How to use

Chronological event stream combining war events and detected resource/stat spikes or drops (>30% change between consecutive dates). Filter by faction, event type, or date range. Paginated at 100 events per page. Full docs

How to use

Auto-detected trends and anomalies: resource crashes (>50% drop), naval cap spikes, vanished factions, war frequency spikes, and economic dominance shifts. Filter by type or faction. Severity levels: info (grey), warning (yellow), critical (red). Full docs

How to use

Animated galactic map showing where each empire sits in the STNH galaxy and how their power evolves over time. Switch the size mode to compare different power dimensions (Military / Economy / Population / Research). Use the play button to scrub through time. Hover an empire for details. Click ⛶ for fullscreen. Full docs

How to use

Cross-file comparison — most useful when multiple logs are loaded. Shows per-file summaries, human player detection across files, a faction presence matrix (green dot = present in file), and auto-generated observations about data consistency. All data respects the global date and file filters set in the filter bar above. Full docs

Loaded Files

Human Players (all files)

Cross-File Faction Presence

Factions appearing across multiple files — useful to spot recurring or missing empires.

FactionFilesPresence

Systemic Observations

How to use

Independent re-scan of the raw log text to confirm the parser's output matches what's actually in your log. Three checks run: (1) parser-independent regex counters per pattern, compared to the analyzer's internal counters; (2) random spot-checks that pull values shown in the UI back to the exact source line; (3) a parse coverage summary. Click "Run validation" to execute. A green stamp means the displayed numbers match the raw log line-for-line. A red stamp shows you exactly which lines diverge.

Validation re-scans the original log text bytes that were uploaded. It does not depend on the parser's internal counters — it counts lines independently using regex patterns and reports any discrepancy. Pick a target faction to verify every parsed value for that empire (not just a random sample).

Counter cross-check

Lines that match each pattern, counted directly from the raw log vs. counted by the parser. Identical numbers = parser saw every line.

Pattern Raw count Parser count Δ Status

Spot checks

Random values pulled from the parsed dataset, then re-found in the raw log. Each ✓ proves the analyzer's number came from a real, intact log line. Click any row to see the raw line.

Date Faction Metric Parsed value Status

Conflict detection

Lines where the same (date, faction, metric) tuple appears multiple times in the raw log with different values. For Stats and Revenue the parser keeps the last value seen; for Income it keeps the first. Either way, divergent duplicates mean the displayed value depends on emit order in the source mod. If you see your faction here with conflicting pop counts, that's the likely cause of the mismatch you noticed.

Date Faction Metric Values seen Parser kept

Source log line

This is the exact line in that the highlighted value came from.


      

Meta Information

Required DLCs

DLC Reducer & Export

Got a save that requires DLCs you don't own? Uncheck the DLCs you want to drop, then click Export modified .sav. The exported file will only require the DLCs you keep checked. Gamestate is unchanged — if the save uses DLC-exclusive content (e.g. a Federation if you remove "Federations"), the game may still complain at load time, so test in-game.

Players

ID Name Species Government Ethos Authority Origin Mil. Power Econ. Power Tech Power Fleet Size Planets Pops Techs Traditions Naval
Empire Techs Traditions Trees Done Ascension Perks Tradition Trees Ascension Perks
Flag Name Type Set Date Expires
Event ID Prefix
ID Event Country Date

Top-Level Sections in gamestate

Section Direct Children Start Line End Line Lines

STNH Game Log Analyzer — Documentation

What's New — Patch Notes

Short-form release highlights. The full CHANGELOG lives on GitHub.

v2.11.0 — 2026-04-28

  • Galaxy tab — animated map of the STNH galaxy with empire bubbles sized by your chosen power dimension (Military / Economy / Population / Research). Play button scrubs through time, hover an empire for details, ⛶ fullscreen for immersion. Empire positions from the STNH Wiki galaxy data (96 empires across all quadrants).

v2.10.0 — 2026-04-27

  • Validation tab — Faction-targeted full check. Pick any empire from the new "Target faction" dropdown to verify every parsed value for that empire against the raw log (not just a random sample). Lets you hand-verify a single faction exhaustively.
  • Validation tab — Conflict detection. Surfaces every (date, faction, metric) tuple where the raw log contains the same entry multiple times with different values. This is the silent kind of mismatch you spot when hand-comparing pop counts. Shows distinct values seen + the value the parser actually kept.

v2.9.0 — 2026-04-26

  • Save DLC Reducer (Save mode) — load any Stellaris .sav in Save mode, scroll to the new "DLC Reducer & Export" card on the Overview tab, uncheck the DLCs you don't own, and click Export modified .sav. The exported file requires only the DLCs you kept checked, so saves that demanded DLCs you don't have become loadable. Gamestate is unchanged — if the save uses DLC-exclusive content (Federations, megastructures, ascension perks added by an unchecked DLC), the game may still complain at load. Test in-game.

v2.8.0 — 2026-04-26

  • Validation tab — new tab next to Meta Analysis. Independently re-scans the raw log text to confirm the parser's numbers match what's actually in your log. Three checks: (1) parser-independent regex counters per pattern compared against the parser's internal counters; (2) random spot-checks (default 20) that pull a parsed value back to its exact source line; (3) parse coverage. A green stamp says "trust the numbers"; a red stamp shows you exactly where they diverge. Click any spot-check row to open the raw source line in a modal.
  • Listener-stacking fixes (v2.7.2) — Re-uploading after "New Analysis" no longer multiplies click handlers on static controls. ResizeObserver / spreadsheet scroll listener / save-mode sort directions are now cleaned up properly on reset.

v2.7.0 — 2026-04-24

  • New Income tab (between Revenue and Stats) surfaces net income (after upkeep) from Orion's new STH_test_events logging. Contrasts with the existing Revenue tab which shows gross production. Example: an empire can have +365 energy revenue but -67 energy income — the delta is upkeep burden, previously invisible.
  • Sub-toggle Major / Rare / All inside the Income tab: 9 columns for major resources, 17 for rare, or all 26 at once.
  • Chart integration: selecting empires in the Income tab and hitting "Show Graph" opens a line chart in income mode, with the metric dropdown filled from the active sub-view.
  • Scalable date picker (Income tab): replaces the plain dropdown with a searchable combobox, prev/next buttons, and a slider. Stays usable even if Russ switches the logging interval from decadal to monthly (2400+ snapshots).

v2.6.0 — 2026-04-24

  • Fleet Power stat — first real military-strength metric (previously only naval capacity was tracked). Available across Stats, Rankings, Chart, Spreadsheet, Faction Detail, Compare, Timeline.
  • Unemployed pops estimate stat + derived Unemployment % (= unemployed / owned pops × 100).
  • Influence revenue added to the resource family (was the one missing major resource).
  • Income stream parser: net-income data for 9 major + 17 rare resources is now captured (surfaced in UI in v2.7.0). Dedupes upstream double-logging.
  • Dashboard / Meta tab gain Income counters.

v2.5.0 — 2026-04-19

  • Run Comparison (A vs B) in the Spreadsheet tab: upload 2+ logs, pick any two runs + a shared date, see per-empire deltas (Run A | Run B | Δ | Δ%) with per-category averages. Heatmap uses red (negative) ↔ green (positive).
  • Upload checkbox "Merge all files into a single run" (default OFF when 2+ files queued) — check it to keep pre-v2.5 merge behavior.

v2.4.0 — 2026-04-19

  • Chart average line (dashed white) across selected empires.
  • Spreadsheet category filter bar (Major / Significant / Fallen / Static / Medium / Minor / Human) with tri-state include/exclude buttons.

v2.3.x — 2026-04-13/14

  • Wiki links throughout save analysis (events, chains, flags, traditions, perks).
  • Events & Flags tab (Save mode): event chains, global / country flags, variables (dual-mode views), fired & player events.

Overview

The STNH Game Log Analyzer is a browser-based tool for analyzing debug log files generated by the Star Trek: New Horizons mod for Stellaris. It parses structured log entries and visualizes empire revenue, statistics, wars, and faction dynamics across game dates.

Everything runs entirely in your browser — no data is ever sent to a server. Log files are processed locally using JavaScript. You can optionally save logs to your browser's local storage (IndexedDB) for future sessions.

The analyzer supports loading multiple log files at once. Data from all files is merged and can be compared using the Meta Analysis tab.

Getting Started

Step 1: Obtain your log files

The STNH mod writes debug information to Stellaris log files during gameplay. These files are typically found in your Stellaris user data directory:

  • Windows: %USERPROFILE%\Documents\Paradox Interactive\Stellaris\logs\
  • Linux: ~/.local/share/Paradox Interactive/Stellaris/logs/
  • macOS: ~/Documents/Paradox Interactive/Stellaris/logs/

The primary log file is game.log. The STNH mod logs its debug data (revenue, stats, wars, categories) as part of the normal game log output. You can also upload the game.log itself to detect the Stellaris game version.

Step 2: Upload

Drag and drop one or more .log files onto the upload area, or click to browse. You can upload multiple files at once. Optionally give your upload a custom name and check "Save to Log Library" to persist the file in your browser for later sessions.

Step 3: Analyze

Click the Analyze button. The parser processes all uploaded and selected library files, then opens the analysis view with all tabs populated.

Step 4: Explore

Navigate through the tabs to explore your data. Use the global filter bar to narrow down by date range or specific file. Every tab supports CSV export.

Log Format & Parsing

The analyzer recognizes the following line formats in log files:

STNH Debug Lines

The primary format follows this pattern:

[YYYY.MM.DD] Log effect, file: events/STH_*.txt line: NNN. <payload>

The parser extracts the game date and payload, then matches the payload against known patterns:

Payload PatternData TypeExample
<Faction> <value> <resource> revenueRevenueUnited Federation of Planets 1523.91 energy revenue
<Faction> <value> <stat>StatsKlingon Empire 450 used naval cap
<Faction> entered war against <Target>War DeclarationRomulan Star Empire entered war against United Federation of Planets
<Faction> Invade Win/Fail On <Date>: <Target> - <Planet>InvasionKlingon Empire Invade Win On 2260.5.1: Federation - Earth
<Faction> is at warWar StatusRomulan Star Empire is at war
<Faction> is <category>Faction CategoryUnited Federation of Planets is major_faction
<Faction> is human playerHuman PlayerUnited Federation of Planets is human player
Game difficulty is <level>DifficultyGame difficulty is Captain

Game Version (from game.log)

If you upload the Stellaris game.log alongside your STNH logs, the analyzer detects the game version from lines like:

[06:50:00][game_application.cpp:248]: Game Version: Cetus v4.3.3

The detected version is displayed as a banner on the Dashboard.

Tracked Resources

ResourceDisplay Name
energyEnergy
mineralMinerals
foodFood
consumer goodsConsumer Goods
alloyAlloys
unityUnity
engineering researchEngineering
physics_researchPhysics
society researchSociety
dilithiumDilithium
crewCrew
ketracel whiteKetracel White
influenceInfluence (v2.6.0+)

Tracked Stats

StatDisplay Name
used naval capNaval Cap
used naval cap percentage (0.0-1.0)Naval %
fleet powerFleet Power (v2.6.0+)
owned planetsPlanets
researched technologiesTechnologies
tradition categories pickedTraditions
owned popsPops
unemployed pops estimateUnemployed (v2.6.0+)
derived
unemployment %Unemp % = unemployed ÷ pops × 100 (v2.6.0+)

Tracked Income (net, after upkeep) — v2.6.0+

Payload pattern: <Faction> <value> <resource> income (optionally followed by AI only). Dedup: duplicate lines for the same (date, faction, key) — first value wins. 26 keys total: 9 major (energy, mineral, food, alloy, unity, engineering, physics, society, dilithium) + 17 rare (latinum, water, brizeen, deuterium, luxuries, cordrazine, duranium, tallonian, kemocite, topaline, magnesite, boronite, time_crystal, pergium, trellium, holographic, sr_new_horizons) + ketracel white.

Dashboard

The Dashboard is the landing page after analysis. It provides a high-level summary of all loaded data:

  • Summary Cards: Total entry count, number of factions, unique dates, and breakdowns by data type (revenue entries, stat entries, war declarations, invasions, etc.).
  • Human Player Banner: If the log contains <Faction> is human player entries, they are highlighted in a teal banner. This detection is used throughout the tool to visually distinguish human-controlled empires.
  • Stellaris Version: If a game.log was loaded alongside STNH logs, the detected game version is shown here.
  • Game Difficulty: The most recent difficulty setting found in the logs.
  • Faction Categories: A breakdown showing how many empires fall into each category (Major, Significant, Fallen Empire, Static, Medium, Minor) at the latest logged date.
  • Date Range: The full span of game dates covered by the loaded logs.

Revenue Tab

Shows per-empire gross revenue (production before upkeep) for a selected game date. Each row displays the empire's production for all 13 tracked resources: energy, minerals, food, consumer goods, alloys, unity, engineering, physics, society, dilithium, crew, ketracel white, influence. For net income (after upkeep), see the Income tab.

Controls

  • Date dropdown: Select which game date to display. Defaults to the latest date.
  • Search box: Filter the table by empire name (case-insensitive).
  • Export CSV: Download the current table as a CSV file.

Category Quick-Select

The coloured buttons above the table let you quickly select empires by their faction category. Selection is additive — click "Major" to select all major empires, then "Human" to also select human players. Use "Clear All" to deselect everything.

Graphing

Check the boxes next to empires you want to compare, then click "Show Selected Empires Graph". This opens a line chart overlay where you can:

  • Choose which resource to graph from the dropdown.
  • Set a date range using the From/To selects.
  • Hover over the chart to see values at each date (vertical crosshair + tooltip).
  • Scroll the mouse wheel to zoom in/out on the time axis.

Table Features

  • Click any column header to sort by that column. Click again to reverse the sort order.
  • The "Select All" checkbox in the header toggles all visible factions.
  • Human players are highlighted with a teal row and a HUMAN badge.
  • Faction category badges (Major, Significant, etc.) are shown inline next to each empire name.
  • A TOTAL row at the bottom sums all visible values.

Income Tab

Shows net income per empire for a chosen date — i.e. resource production after upkeep and expenses. This is the complement to the Revenue tab (which shows gross production before upkeep). The delta between the two reveals upkeep burden.

Example: Klingon Empire 2180 — Revenue tab shows +365 energy, Income tab shows -67 energy. That 432-unit gap is what the empire spends on ship/building upkeep each month. A previously invisible signal now on one screen.

Requirements

Income data requires STH_test_events from April 2026 or later. Older logs show an empty-state message. Gross Revenue works with any log (has been parsed since v1.0).

Sub-view Toggle

Three column presets above the table:

  • Major (9) — energy, minerals, food, alloys, unity, engineering, physics, society, dilithium. This is the default and matches the Revenue tab's column set.
  • Rare (17) — latinum, water, brizeen, deuterium, luxuries, cordrazine, duranium, tallonian, kemocite, topaline, magnesite, boronite, time crystal, pergium, trellium, holographic, new horizons, ketracel white.
  • All (26) — everything at once (horizontal scroll).

Date Picker (new in v2.7.0)

The Income tab uses a scalable date picker instead of a plain dropdown. Four sub-controls stay in sync:

  • Combobox — type part of a date (e.g. "2180") to filter.
  • ◀ ▶ buttons — step to the previous/next available snapshot.
  • Slider — drag to scrub through time (hidden when fewer than 10 snapshots exist).
  • Span label — shows full range and snapshot count (e.g. "2150.01.01 — 2180.01.01 · 3 snapshots").

The picker stays usable even if the logging interval is very fine-grained (monthly over 200 years = 2400 entries).

Other controls

Search, category quick-select, checkbox-to-graph, sort-by-column, and CSV export work the same as in the Revenue tab. The CSV filename includes the active sub-view (e.g. income_rare_2180.1.1.csv).

Stats Tab

Identical in structure to the Revenue tab, but displays empire statistics instead of revenue: Naval Capacity, Naval %, Fleet Power, Planets, Technologies, Traditions, Pops, Unemployed Pops, and Unemployment %. Fleet Power, Unemployed, and Unemployment % were added in v2.6.0 (Unemployment % is derived from Unemployed ÷ Pops).

All controls work the same way — category quick-select, search, sort, graph, and CSV export. The chart overlay uses stat metrics instead of resources.

Rankings Tab

Shows the top empires ranked by any single resource or stat at a chosen date.

  • Date: Select the game date to rank.
  • Metric: Choose any revenue resource or stat metric from the grouped dropdown.
  • Top N: Limit results to the top 10, 20, 50, or show all factions.
  • Search: Filter by empire name.

Ranked #1 is the empire with the highest value for the selected metric. Human players are highlighted.

Wars Tab

A chronological log of all war-related events extracted from the logs.

Event Types

TypeColourDescription
War DeclarationRedEmpire A entered war against Empire B
Invasion (Win)TealSuccessful planetary invasion
Invasion (Fail)YellowFailed planetary invasion
At War StatusGreyPeriodic "is at war" status entry

Filters

  • Faction: Show only events involving a specific empire (as attacker or defender).
  • Type: Show only a specific event type.
  • Search: Free-text search across event descriptions.

Results are paginated at 100 events per page.

War Network Graph

Click "Show Network" to open a force-directed graph visualization. Each node is an empire, and edges represent war declarations between them. Node size reflects the number of wars. Human players are highlighted in teal. Click a node to filter the war list to that empire.

The graph uses a physics simulation (repulsion + spring forces) that runs for 300 frames to reach a stable layout.

Spreadsheet Tab

A full pivot table view of any resource or stat across all empires and dates.

Controls

  • Resource/Stat: Select which metric to display from the grouped dropdown.
  • Timeframe:
    • All Dates: One column per game date — full timeline view.
    • Alltime (Average): One column per resource/stat showing the average across all dates.
    • Per Decade: Filters to dates within a specific in-game decade (e.g. 2200–2209).
    • Single Date: Shows data for one specific date only.
  • Sort by: Name, Latest Value, Total, or Growth (absolute change from first to last date).
  • Sort direction: Ascending or Descending.
  • Search: Filter by empire name.
  • Heatmap: Toggle colour intensity on cells — darker red = higher value relative to the column maximum.
  • Hide zero-only: Remove empires where all values are zero or absent.

Performance

For datasets with more than 100 empires, the table uses virtual scrolling — only visible rows are rendered in the DOM, enabling smooth performance even with hundreds of factions and dozens of dates.

Faction Detail Tab

A deep dive into a single empire's complete history across all loaded data.

  • Faction dropdown: Defaults to the detected human player, or the first faction alphabetically. Use the search box to filter the dropdown.
  • Category History: A table showing how the empire's faction category changed over time (e.g. from Minor to Significant to Major).
  • Revenue Over Time: Scrollable table with all 12 resources for every date where this empire has data.
  • Revenue Sparklines: One mini bar chart per resource, showing the trend from first to last date. Useful for spotting growth or decline at a glance.
  • Stats Over Time: Same format as revenue, but for the 6 stat metrics.
  • Stats Sparklines: Mini bar charts for each stat.
  • War History: All war events involving this empire, filtered from the global war list.

Compare Tab

Side-by-side comparison of 2 to 4 empires on a single metric.

  • Add factions: Select empires from the dropdown. Each added empire appears as a coloured chip. Click the × on a chip to remove it.
  • Metric: Choose any revenue resource or stat.
  • Comparison Table: Dates as rows, empires as columns. Each column is colour-coded to match its chip.
  • Sparkline Overlay: Stacked sparklines on a shared Y scale for visual trend comparison.
You need at least 2 factions to see the comparison. Maximum is 4 to keep the chart readable.

Timeline Tab

A chronological event stream that goes beyond just war events. The timeline detects and displays:

  • War Events: All war declarations, invasions, and status changes (same data as the Wars tab).
  • Resource Spikes: Any resource that increases by more than 30% between consecutive game dates for an empire.
  • Resource Drops: Any resource that decreases by more than 30% between consecutive dates.
  • Category Changes: When an empire's faction category changes (e.g. Medium to Significant).

Events are colour-coded: red for war, teal for spikes, yellow for drops, purple for category changes. Filter by faction, event type, or use the global date filter. Paginated at 100 events per page.

Insights Tab

Automatically detected trends, anomalies, and notable patterns across all loaded data. Each insight has a severity level:

SeverityColourMeaning
CriticalRedSignificant event that likely affects gameplay
WarningYellowNotable change worth investigating
InfoGreyInformational observation

Detected Insight Types

  • Resource Crash (Critical): A resource drops by more than 50% between consecutive dates — may indicate economic collapse, war damage, or budget crisis.
  • Naval Spike (Warning): Naval capacity increases by more than 100% — rapid military buildup.
  • Pop Spike (Warning): Owned pops increase by more than 100% — may indicate conquest or migration event.
  • Vanished Faction (Warning): An empire present in the early dates disappears entirely from later dates — possible defeat or integration.
  • War Frequency (Info): An empire involved in 3 or more war declarations — highly aggressive or frequently targeted.
  • Dominance Shift (Info): The #1 empire for a resource changes between the first and last date.
  • Category Shift (Info/Warning): An empire's category priority changes by 2 or more levels (e.g. Minor to Significant).

Galaxy Tab v2.11.0+

Animated galactic map of the STNH universe. Shows where each empire sits in the galaxy and how their power evolves over time. Empire positions come from the STNH Wiki galaxy data (96 empires across Major Powers, Alpha, Beta, Gamma, Delta quadrants, and the Alternate Timeline).

Size modes

The "Size by" dropdown controls what determines each empire's circle radius:

  • Military — fleet power (the in-game observer outliner number)
  • Economy — combined energy + mineral + alloy revenue
  • Population — owned pops
  • Research — combined engineering + physics + society research output

Circles are area-proportional to the value (square-root scaling), so visual emphasis is honest. The largest empire on the current frame is the largest bubble.

Animation

The ▶ Play button steps through every available date in the loaded log. Speed controls (0.5× / 1× / 2× / 4×) adjust how long each frame is shown — at 1× each date holds for ~700 ms. Stops automatically at the last date. Click again to replay.

Manually scrubbing the date picker (combobox or slider) cancels auto-play so you can pause on any specific moment.

Hover and details

Hover any empire on the map to see a detail card on the right with its system, quadrant, fleet, pops, planets, and current revenue/income. Mouse off to see a "Top 10 by mode" list instead.

Visual cues

  • Circle color = faction category (Major / Significant / Fallen / Static / Medium / Minor)
  • Gold ring around the circle = canonical Major Power (UFP, Klingons, Romulans, Cardassians, Dominion, Borg, Ferengi, Undine)
  • White ring = human player
  • Quadrant background tints (subtle): Alpha = blue, Beta = red, Gamma = purple, Delta = green

Fullscreen

Click ⛶ Fullscreen for an immersive view that takes over the whole window. ESC closes it.

Off-Map empires

If your log contains empires that the analyzer can't match to a wiki coordinate (different name spelling, custom faction, sub-faction like "Orion Syndicate"), they show up in the right-hand "Off-Map" panel. The most common case is a name divergence between log and wiki — these can be added to the GALAXY_FACTION_OVERRIDES table inside index.html to fix them. Sub-factions and minor groups that don't have wiki entries (because they aren't proper empires) will simply not appear on the map.

Note on time resolution

The animation looks smooth when the log has many date snapshots (annual or monthly logging). With decadal logging (Orion's current default: 2160 / 2170 / 2180), the animation is essentially a 3-frame slideshow — still useful for seeing each "before / after" state, but no fluid motion. If Russ ever switches to finer-grained logging, the same view animates fluidly without code changes.

Meta Analysis Tab

Most useful when multiple log files are loaded. Provides cross-file analysis:

  • Per-File Summaries: Each loaded file shown as a card with its name, date range, faction count, total entries, and a breakdown by type. Human players detected per file are shown as badges.
  • Human Player Detection: Which human players were detected across all files, and in how many files each appears.
  • Faction Presence Matrix: A table with factions as rows and files as columns. A teal dot means the faction appears in that file; grey means absent. Sorted by presence count, with human players at the top.
  • Auto-Observations: Automatically generated notes about data consistency, such as:
    • Factions present in all files vs. only some files
    • Inconsistent human player detection across files
    • Files with zero parseable entries (potential format issues)
    • Large record count differences between files (may indicate truncation)

Validation Tab v2.8.0+

Answers the question "Can I trust the numbers I see in this app?" by re-scanning the raw log text independently of the parser, then comparing the two views. Click Run validation to execute three checks:

1. Counter cross-check

For each pattern the parser recognizes (Revenue, Income, Stats, War declarations, Invasions, etc.), the validator counts matching lines directly from the raw log using a regex that doesn't share code with the parser. Then it compares to the parser's internal counter (the number you see on the Dashboard). Identical = ✓ Match. Different = ✗ with a delta.

Special case — Income. Upstream STH_test_events currently emits each (date, faction, key) income tuple twice per date (line 1772 and 1824). The parser dedupes — so the raw count will be roughly 2× the parser count. The validator recognizes this pattern and reports it as ✓ Dedup, not as a mismatch.

2. Spot checks

Picks N random parsed values (default 20, configurable up to 200) and locates each one back in the raw log text. Each ✓ proves the analyzer's number came from a real, intact log line — not a parsing artifact, not a derived value, not a coincidence.

Click any spot-check row to open a modal showing the exact source line. This is the strongest proof you can give a skeptic: "Here's the displayed value. Here's the bytes from your log. They're identical."

3. Parse coverage

How much of the raw log the analyzer recognized. Most lines in a Stellaris game.log are engine messages, save-load events, system inits — not STNH events. So coverage is typically low (10–30% is normal). The interesting signal is a sudden drop between updates, which suggests the mod added a new event format the parser doesn't handle yet.

4. Faction-targeted full check v2.10.0+

The "Target faction" dropdown above the Run button switches the spot-check from random sampling to full coverage of one specific empire. Pick UFP, hit Run, and every single parsed value for UFP (every metric × every date) is verified back to a raw log line. Use this when you've spotted a suspicious number for one faction and want to know whether any of its values diverge.

5. Conflict detection v2.10.0+

Surfaces every (date, faction, metric) tuple where the raw log emits the same entry multiple times with different values. This card stays hidden when there are no conflicts; when there are, it shows the distinct values seen plus the value the parser actually kept. Why this matters: for Stats and Revenue the parser keeps the last value seen, for Income the first. So if STH_test_events ever logs the same pop count twice with different numbers (which can happen because of mid-tick re-evaluations), the displayed value depends on emit order. This is the most common cause of "I saw a different number in the log file than the analyzer shows".

When validation says "No raw log text retained"

This means the file was loaded before v2.8.0 and the raw text wasn't kept in memory. Click New Analysis and re-upload the file to re-enable validation. Files loaded from the IndexedDB library always have raw text available.

DLC Reducer (Save mode) v2.9.0+

You received a Stellaris save that requires DLCs you don't own? Strip the DLC requirements without breaking the save:

  1. Switch to Save mode (the toggle near the upload area).
  2. Drop a .sav file. After parsing, scroll to the "DLC Reducer & Export" card on the Overview tab.
  3. Uncheck the DLCs you want to drop (you can also use Check all / Uncheck all).
  4. Click Export modified .sav. The browser downloads <original>_reduced_dlcs.sav.
  5. Drop the new file into %USERPROFILE%\Documents\Paradox Interactive\Stellaris\save games\<empire>\ and load it from the in-game menu.

What happens technically

A Stellaris save is a ZIP archive with two members: meta (small, contains version, DLCs, save date) and gamestate (the bulk). The launcher only reads meta for the DLC requirements check — so the reducer surgically rewrites the required_dlcs={ ... } block in meta while leaving gamestate byte-identical. The new ZIP is rebuilt uncompressed (STORED method), which Stellaris accepts.

Caveats

  • Gamestate isn't touched. If the save uses content exclusive to a DLC you removed (e.g. a Federation while removing the "Federations" DLC, a megastructure from "Utopia", an ascension perk from a story pack), the game may complain or behave unexpectedly when loading. The cleaner the DLC's content was used, the safer it is to drop.
  • Ironman saves. The reducer doesn't touch the ironman flag. An ironman save will load as ironman; if Stellaris detects modifications it may break achievements. We don't strip the flag automatically — that's a separate decision.
  • Always test in-game before relying on the modified save. Make a backup of the original first.

What this is NOT

This isn't a "convert save to a different Stellaris version" tool — version compatibility is an in-game concern (loading a 4.3 save in 4.4 etc.) and isn't affected by DLC manipulation. It also isn't a save editor; the only field touched is required_dlcs.

Global Filters

The global filter bar appears at the top of the analysis view (below the tab navigation). It affects all tabs simultaneously.

  • Date From / Date To: Restrict all data to a specific game date range. Dates outside this range are excluded from tables, charts, rankings, and all calculations.
  • File Filter: When multiple files are loaded, restrict all data to factions that appear in a specific file. This is useful for isolating a single campaign's data.
  • Reset: Click the reset button to clear all filters and show all data again.

The active filter state is shown as a text label on the right side of the filter bar.

Date dropdowns in Revenue, Stats, and Rankings tabs automatically update to show only dates within the filtered range.

Log Library

The Log Library uses your browser's IndexedDB to persist uploaded log files between sessions. Saved logs remain available even after closing the browser.

  • Saving: Check "Save to Log Library" before clicking Analyze. The file is stored with its content, name, upload date, and size.
  • Loading: Check saved logs in the library panel and click Analyze to parse them — works exactly like uploading fresh files.
  • Renaming: Click the pencil icon next to a saved log to rename it inline.
  • Deleting: Click the × button to delete individual logs, or use "Delete Selected" for bulk removal.
  • Storage quota: The library shows used storage vs. browser quota. A warning appears when logs exceed 50 MB or storage usage exceeds 80%.
Saved logs are local to this browser and this origin. They are not synced across devices. Clearing browser data (IndexedDB) will remove all saved logs.

Charts & Graphs

Line charts are available in the Revenue and Stats tabs. They are drawn using the HTML5 Canvas API (no external libraries).

Chart Controls

  • Resource/Metric dropdown: Switch which data series to display.
  • From / To: Set the date range for the X axis.
  • Legend: Colour-coded list of all selected empires on the right side.

Interactions

  • Hover: A vertical crosshair follows your cursor. A tooltip shows all empire values at the nearest date.
  • Zoom: Scroll the mouse wheel up/down to zoom in/out on the time axis. Minimum zoom is 3 dates.
  • Resize: The chart automatically redraws when the browser window is resized.
  • Close: Click the × button, click outside the chart panel, or press Escape.

Exporting Data

Every data tab has an "Export CSV" button that downloads the current view as a comma-separated values file. The exported data respects the currently active filters and search terms.

CSV files can be opened in Excel, Google Sheets, LibreOffice Calc, or any text editor.

  • Revenue CSV: All visible factions and their resource values for the selected date.
  • Stats CSV: Same format for stat metrics.
  • Rankings CSV: Rank, Faction, Value for the selected metric.
  • Wars CSV: Date, Type, Faction, Target, Details for all filtered war events.
  • Spreadsheet CSV: Full pivot table including all dates/metrics and Total/Growth columns.
  • Faction Detail CSV: Complete revenue + stats time series for the selected empire.
  • Compare CSV: Comparison table for the selected factions and metric.
  • Timeline CSV: All filtered timeline events.

Faction Categories

The STNH mod classifies empires into categories based on their power level. These categories are logged periodically and can change over time.

CategoryColourPriorityDescription
MajorRed6 (highest)The most powerful empires in the galaxy
SignificantYellow5Strong empires with notable influence
Fallen EmpirePurple4Ancient empires with advanced technology
StaticOrange3Empires with fixed/stable status
MediumTeal2Mid-tier empires
MinorGrey1 (lowest)Small or weak empires

Categories are used throughout the tool for sorting, grouping, and quick-selection. The priority order determines sort position — higher priority empires appear first in dropdowns and sorted lists. Human players always appear before any category.

When an empire appears with multiple categories at the same game date, the highest priority category wins.

Frequently Asked Questions

Why are some empires missing from the table?

An empire only appears if the log contains data for it at the selected date. If a file filter is active (global filter bar), only empires present in that specific file are shown. Try changing the date or clearing global filters.

Why is no human player detected?

The log must contain lines like United Federation of Planets is human player. If the STNH mod version doesn't log this, or the log file was truncated, no human detection is possible.

Can I compare data from different game sessions?

Yes. Upload multiple log files (or save them to the library). All data is merged. Use the Meta Analysis tab to see per-file breakdowns and the global file filter to isolate specific sessions.

What happens if I load the same file twice?

Data entries will be duplicated. Revenue and stat values will be overwritten (same date + faction = last value wins), but war events will be counted twice. Avoid loading the same file more than once.

How do I get the Stellaris version to show up?

Upload the game.log file from your Stellaris logs directory alongside your STNH debug logs. The analyzer detects the Game Version: line automatically.

Is my data safe?

Yes. Everything runs locally in your browser. No data is uploaded or transmitted. The Log Library uses IndexedDB (browser-local storage). Clearing your browser data will remove saved logs.

Why is the chart empty?

Make sure at least one empire is checked in the table before clicking "Show Selected Empires Graph". If the chart shows but has no lines, the selected empires may not have data for the chosen resource/stat in the selected date range.