Skip to content

Releases: Bobby-Gray/open-tabletop-gm

v0.14.1 — Non-English display fixes

Choose a tag to compare

@Bobby-Gray Bobby-Gray released this 23 Aug 20:16

Two bugs reported from a Russian-language install. Neither reproduces on an English UTF-8 machine, and neither fails loudly enough to notice from the developer side.

Fixed

Campaign text no longer corrupted on a non-English Windows install. An in-world date rendered as 18 Серпань, 412 РѕС‚ Падения РЎРІРѕРґРѕРІ instead of 18 Серпань, 412 от Падения Сводов. That is UTF-8 bytes decoded as cp1251, the Windows ANSI code page for Russian. Python open() falls back to the locale encoding when none is given, so every bare open() was a corruption site (67 of them, across 15 files).

The fix is three layers deep, because pinning encoding= on todays call sites regresses on the next one somebody writes:

  • encoding="utf-8" on all 67 text-mode open() calls
  • PYTHONUTF8=1 in start-display.sh, which fixes the default rather than the call sites, and so covers future code and dependencies too
  • stdin/stdout/stderr reconfigured in scripts/paths.py — reading a file correctly is only half of it, since printing Cyrillic to a cp1251 console raises UnicodeEncodeError on the first non-ASCII character

Chinese users hit the same bug as GBK/cp936. (#36)

Display icons no longer 404. This fork carried display/templates/ without display/icons/ or the Flask route that serves it, so every icon in the UI returned 404 and rendered as a blank box. The 39-icon set and the /icons/ and /favicon.ico routes are now in place. (#37)

Internal

Both bugs had no detector, so both got one, and both guards were break-tested in each direction. The encoding guard works two ways since neither is sufficient alone: -X warn_default_encoding is Python own mechanism and catches read_text/write_text too, but only on code that runs; an AST walk covers the paths no test executes. The icon guard reads names out of the template the way the browser does, including the three tables the JS assembles names from at runtime.

Upgrading: python3 scripts/update_skill.py (or /gm update).

v0.14.0 — GM-discipline sync from claude-dnd-skill v2.4.0

Choose a tag to compare

@Bobby-Gray Bobby-Gray released this 23 Aug 20:16
a04cd2c

Ports the GM-discipline and quality-of-life work from claude-dnd-skill v2.4.0, generalized to OTGM's system-agnostic core.

See CHANGELOG.md for the full entry.

Tag backfilled 2026-08-23; this release shipped without one.