Skip to content

Release v2026.9.0

Choose a tag to compare

@github-actions github-actions released this 04 Sep 16:38

Downloads

OS Download
Windows GameSentenceMiner-Setup-2026.9.0.exe
Windows (unpacked) GameSentenceMiner-2026.9.0-win-unpacked.zip
Linux GameSentenceMiner-2026.9.0.AppImage
macOS (Apple Silicon) GameSentenceMiner-2026.9.0-arm64.dmg

Intel Mac builds are no longer provided. If you need GSM on Intel Mac, run it from source.

What's Changed

GameSentenceMiner 2026.9.0 leads with Linux/Wine text hooking, adds an opt-in Overlay text-presence check and experimental Windows Speech Recognition, then expands OCR-area editing, game and text-hook support, controller-driven mining, local transport recovery, and troubleshooting across NVL games, Wayland, and Windows.

Highlights

  1. Added Linux Wine/Proton text hooking for supported games, with stronger window/process resolution and Wayland compatibility.
  2. Added an opt-in Overlay text-presence check that clears stale lookups when the last OCR text is no longer visible, without issuing another OCR request.
  3. Added experimental Windows Speech Recognition for English and Japanese game audio. You can enable this in the Settings Tab by selecting that tab. It's pretty niche since most games have subtitles and OCR is 1000x more accurate.
  4. Added a hosted OCR Area Selector at /select_areas that can edit scene configurations from any browser connected to the GSM server, using a live OBS frame or a local image.
  5. Improved NVL and controller-driven mining: appended dialogue stays separated, the latest line receives focus, Anki can identify the correct captured line from context, Yomitan lookups are more stable.
  6. Mouse side-button bindings are available to use in the overlay.
  7. Updated Agent to use QuickJS which is much faster and more reliable, and added an option to detach agent sessions (useful for emulators in case you need to restart GSM)

Try it: clear stale Overlay lookups when text disappears

This experimental Overlay option watches the tight crop of the last OCR result. When that text is no longer visible, GSM invalidates its lookup target, so the Overlay no longer treats an old line as if it were still on screen. No additional OCR request is made.

Text-presence check example 1

Text-presence check example 2

Why enable it?

  • Lookups disappear with the text, freeing the mouse to move around the game without selecting a stale result.
  • Yomitan and controller lookups cannot act on dialogue that has already advanced.
  • It makes rapid scene changes, menus, and auto-advancing dialogue feel less "sticky."
  • The capture stays focused on the last text crop instead of re-scanning the whole screen.

Trade-offs

  • A visual change near the text can occasionally look like the text disappeared, causing a false positive.
  • The image comparison runs in the background while a result is active, so it uses a small amount of additional CPU.
  • If you prefer persistent lookups while reading slowly, leave it off.

Enable stale-lookup invalidation

Keep stale-lookup invalidation disabled

Windows Speech Recognition

  • Added native Windows process-loopback audio capture plus embedded Microsoft speech and SAPI helper backends.
  • Added an opt-in Windows Speech tab with scene selection, per-scene settings, start/stop controls, status, and a session-local recognition log.
  • Recognition stays attached to the GSM/OBS target while another app has focus, and it invalidates immediately when the OBS scene changes.
  • Partial hypotheses revise one text-feed record until the final result arrives, avoiding a trail of duplicate fragments.
  • The embedded backend downloads its model/runtime bundle on first use (about 358 MB compressed and 492 MB extracted), reuses the local cache afterward, and supports advanced path and license overrides.
  • Packaged Windows builds now compile and include the Rust audio helper and C++ recognition helpers automatically.

Windows Speech Recognition demo

Text Capture, Overlay, and Mining

  • Added a hosted OCR Area Selector at /select_areas. It lists scene and overlay configs, can capture the current OBS frame or open a local image, supports normal, exclusion, secondary, exclusive, and black-hole regions, and saves changes back in the format used by GSM. Saving invalidates the OCR caches so the running process can use the updated areas.
  • Made the hosted selector fit its complete toolbar inside the available screen work area and tolerate maximize/snap resizes without distorting the capture geometry.
  • Preserved recent overlay block boundaries so NVL games can append new dialogue without merging it into older visible text.
  • Matched mined lines using the bold expression occurrence and aligned surrounding context, including cases where OCR or hooks transliterate part of the sentence.
  • Added a default-on General option to remove the matching cumulative prefix from subsequent text-hook lines, so hooks that repeatedly send a growing buffer produce only the newly appended text.
  • Suppressed consecutive duplicate observations and centralized skip-spam filtering across text sources.
  • Local OCR1 now compares the active text crop against recent frames, keeps the initial warm-up calls, and skips redundant OCR work until the crop changes. The gate falls back to running OCR when the crop or frame cannot be compared safely.
  • Avoided stale Yomitan lookups after overlay token refreshes.
  • Game-library artwork is excluded from Yomitan scans, preventing images and controls on the library page from becoming accidental lookup targets.
  • Improved OWocr ordering and reduced OCR runtime and memory overhead.
  • Replay-buffer expiry events now update the TextFeed state without restarting a paused-feed timer; active authoritative lines still resume it when configured to do so.

OCR Area Selector

Hooks, Controllers, and Automation

  • Enabled Linux Wine/Proton text hooking and improved window/process resolution for supported hooks.
  • Added the Unity/TextMeshPro Aokana engine hook and supporting decoder/probe tooling. (Untested, Thanks @manhao)
  • The VLR Zero Escape hook now emits plain text when glyph layout extraction fails, so dialogue remains mineable even when positioned overlay data is unavailable.
  • Switched Frida Agent scripts to QuickJS and improved script matching from captured game titles.
  • Windows Agent hooks can run in a detached host process that survives GSM closing and restarting; the Text Hook tab reconnects to the session when GSM starts again and exposes its detached status.
  • Added opt-in gamepad actions to Anki confirmation, made button choices explicit, and stabilized Yomitan navigation.
  • Gamepad overlay navigation now focuses the latest captured line, with an NVL fallback that chooses the lowest block in the current appended dialogue chain.
  • Anki confirmation warns when a gamepad audio choice conflicts with completed voice-activity detection; the warning can be confirmed or cancelled with the configured gamepad buttons.
  • Added mouse side-button hotkeys and improved automatic scene/window handling.
  • OBS scene switching now rechecks the foreground window and actual OBS scene continuously, retries unverified switches, and releases stale manual holds when focus returns to GSM.
  • Stopped Discord waiting-status updates and consistently used the master Discord settings.

Linux and Wayland

  • Added Wayland-compatible OBS and overlay capture paths, plus clearer guidance for optional PipeWire cropping.
  • Installed a stable hidden desktop identity for AppImage profiles and supported Electron 42's desktop identity behavior.
  • Made Wayland portal prerelease packaging more deterministic.

Desktop, Library, and Stats

  • Organized optional tools into focused tabs, expanded settings search, and compacted OCR controls.
  • Added renderer development previews for faster UI iteration.
  • Expanded game-library status, detail, completion, difficulty, and reading-statistics presentation.
  • Daily hour goals retain minutes in their progress and required values instead of rounding a short goal up to a full hour.
  • Improved Tadoku synchronization time handling and hid completed live goals.

Reliability and Release Engineering

  • Reduced memory pressure and refreshed npm and Python lock metadata across the beta line.
  • Prevented the Discord RPC worker from holding Python open after GSM or the test suite finishes.
  • Preserved Python post-release version suffixes during version synchronization.
  • Moved development releases to main, improved prerelease workflows, and repaired cross-platform release-test fixtures.
  • Let CMake select the installed Windows toolchain when building speech-recognition helpers.
  • The Rust input server now asks the OS for an available port, announces the bound loopback endpoint after binding, and passes that exact endpoint to Electron and overlay children, avoiding check-then-bind races and hard-coded-port conflicts.
  • Overlay and TextHooker WebSockets now discover the live direct ingress when the single-port gateway fails. The Advanced Direct WebSocket Port (Fallback) setting can reserve a stable direct port; 0 uses automatic fallback discovery, and conflicting primary/input-server ports are rejected.
  • Missing legacy OWOCR config files now use in-memory defaults without creating a hidden file or downloading one. Existing files remain readable for compatibility.
  • Pinned aiohttp to 3.14.1 for a consistent runtime dependency.
  • Added scripts/GSM-Troubleshoot.ps1, a Windows collector that records redacted config, environment, process, port, HTTP/WebSocket, graphics, Defender, and log diagnostics. It can also perform reversible OneOCR-cache and OBS-backend repairs with backups.
  • Updated star-history automation and its generated chart.

Commit Inventory

  • d0f396cf - Add Unity/TextMeshPro engine hook for Aokana/Aokana EXTRA1/Aokana EXTRA2 (#559)
  • 02927479 - Tadoku sync time, OWocr ordering, UI & tests
  • 455fb9f6 - Suppress consecutive duplicate text observations
  • af5f647b - Improve text hook guidance
  • ae7c11e7 - Compact OCR controls
  • a09f38b5 - Add renderer development previews
  • 953d6b62 - Use master Discord settings for activity updates
  • f51095d0 - Preserve Python post-release versions during sync
  • 40a475ad - Avoid lookups after overlay token refreshes
  • 17c69143 - Improve Agent script search from captured titles
  • 1f13361e - Add opt-in gamepad controls to Anki confirmation
  • f90569b6 - Expand game library status and detail statistics
  • fe425bf8 - Organize optional features into focused tabs
  • 3d6a9246 - Expand the settings search catalogue
  • a76e5958 - ci: use write token for star history push
  • 2f5d1edf - chore: update star history chart [skip ci]
  • 63a939c6 - Merge branch 'main' of https://github.com/bpwhelan/GameSentenceMiner
  • 58b047e4 - fix: stabilize gamepad Yomitan lookups
  • 674f3791 - feat: support mouse side-button hotkeys
  • 8bda3320 - feat: hide completed live goals
  • 055e3226 - fix: centralize skip-spam filtering
  • 67794745 - feat: make Anki gamepad choices explicit
  • dc101f74 - fix: stop Discord waiting status updates
  • cc7d1814 - chore: refresh uv lock metadata
  • 9c1c0e3a - feat: enable Linux Wine text hooking (#561)
  • 140ee2cd - Run development release workflow from main
  • 65d41e86 - fix: add Wayland compatibility for overlay and OBS
  • 5acd7f51 - fix: explain optional PipeWire capture cropping
  • 6fd8aa83 - fix: support Electron 42 desktop identity
  • ba859689 - fix: make Wayland portal prereleases reliable
  • 2b70be65 - memory fixes, npm bumps
  • 180e5d60 - chore: update star history chart [skip ci]
  • 65f734c0 - fix: preserve appended NVL overlay blocks
  • acc9002c - fix: match mined lines by highlighted context
  • 3f1d3ccb - feat: add opt-in Windows speech recognition
  • 04fe7cdc - chore: rely on default NSIS one-click mode
  • f0ae8ddb - fix: run Frida agent scripts with QuickJS
  • 42241bb5 - test: repair cross-platform release checks
  • a286242b - fix: let Discord RPC exit with the app
  • 532ab50d - chore: ignore native extension swap files
  • 3e93da4b - fix: detect the installed Windows build toolchain
  • ef9a8aa8 - Add hosted OCR area selector
  • 73b49ad1 - feat: strip cumulative text hook prefixes
  • 2d068047 - fix: confirm conflicting gamepad audio choices
  • 432df422 - feat: focus overlay controls on the latest text
  • e2c8c0a7 - fix: exclude game artwork from Yomitan scans
  • dd6e77a4 - style: format Yomitan manifest
  • 27b38e9d - fix: retain minutes in daily goal displays
  • 5049c9e9 - fix: emit VLR text when layout extraction fails
  • 767c2c87 - feat: keep Agent hooks running across GSM restarts
  • cb598468 - fix: continuously reconcile OBS scene switching
  • 4e191bb0 - chore: sync package version in uv lockfile
  • 26fb89b8 - Add overlay text presence monitoring
  • 59664e0c - chore: pin aiohttp to 3.14.1
  • 97c78953 - fix: publish the input server's bound endpoint
  • 07286f73 - fix: skip redundant OCR frames safely
  • 1a84fa8e - fix: keep replay expiry from restarting textfeed
  • dd2fd6ca - chore: add GSM troubleshooting collector
  • 89b9f7f5 - Remove legacy owocr config, fix texthooker unpausing, websocket fallback + config

Release Metadata

  • Stable baseline: v2026.8.2, published 2026-08-20.
  • Repository comparison: v2026.8.2...main.
  • New-release commit window: v2026.8.2..main.
  • Reviewed head: main at 89b9f7f5.
  • Reviewed behavior and CI scope: 59 commits across 279 changed files, excluding the release-prep metadata commits f62daa92 and 7f9d49bf.