The Ledger

October 10, 2026

RPGM Tools Press v0.2.0

Added

  • VisibleUI Each project family has its own page and RSS feed on The Ledger. A row of links above the release list switches between all releases, Neo Angband, RPGM Tools and Other Projects, and the Repositories page groups repos the same way.

  • VisibleContent-Sync The Ledger now tracks Augur and Mercury under Other Projects. RPGM Tools Press moves there as well.

  • InternalContent-Sync Each sync looks for public repos in neostryder and RPGM-Tools that have no enrollment decision and lists them in enrollment.json with a suggested family. The enroll-repo workflow records the answer in repos.json, and a declined repo is never offered again.

  • VisibleDiscord New releases are posted to their family’s Discord announcements forum after the site deploys. Releases from before a repo was enrolled, or older than seven days, are never posted. Neo Angband only logs its posts until DISCORD_NEO_ANGBAND_MODE is set to live, since each Neo Angband repo still posts its own.

  • VisibleUI The header stays pinned to the top of the page. Once you scroll, it shrinks to a slim bar, and on phones its links tuck away until you scroll back up.

  • VisibleUI Opening a post or a release from a list slides its title into the page heading, and moving between pages cross-fades, in browsers that support cross-document view transitions. A reduced-motion setting turns both off.

  • VisibleUI Entries that come back into view when a search changes or clears fade in instead of appearing all at once.

  • VisibleUI The Ledger groups releases by month. On wide screens each month’s name stays pinned beside its releases while they scroll past.

  • VisibleUI Posts with three or more sections show a contents rail in the left margin on wide screens, and it marks the section being read.

  • VisibleUI The newest post on the blog’s homepage has a larger title and a gold top rule.

  • VisibleSEO Every post now carries structured data naming its author and publisher, article Open Graph tags and Twitter cards, and every page has a canonical URL.

  • VisibleSEO The blog now serves llms.txt, an index of its posts for AI answer engines, and a robots.txt that points to the sitemap.

  • VisibleContent Posts take an optional cover field in frontmatter (a path such as /covers/.webp, with coverAlt). The image renders above the post body at 1200 by 630 and replaces the logo in Open Graph and Twitter previews.

  • VisibleContent Posts can use three topic categories: Software Engineering, UI/UX Design, and AI & Harness Tips. Any other category slug still builds, labeled from the slug, and the Discord announcer tags the topic categories with the closest existing forum tag.

  • InternalDrafts A new drafts app serves private previews of blog posts at drafts.blog.rpgm.tools, behind Cloudflare Access. Each draft renders with the blog’s own theme and has a review panel for comments on passages, notes, and approve, revise, park or kill. Draft text never enters this repo: the site is built on the deploying machine from a private folder.

  • InternalDrafts The drafts index shows running totals: posts published, posts approved without notes, notes per published post, and posts killed. A draft page shows its cover image when one exists, lists a suggested post for each social platform with a Copy button, and has a button to request a cover. Comment boxes are larger and grow as you type. Sending a review shows a notice saying what happens next, and the notice updates as the draft moves through revision.

  • InternalContent-Sync Each tracked repo now declares a releaseSource in repos.json, either releases or tags, instead of the sync inferring it from whether any GitHub Releases happen to exist. tags is the default, because a tag is never lost by gaining a Release.

  • InternalContent-Sync This repo’s own releases are now tracked on The Ledger alongside the game and its mods.

  • VisibleContent-Sync The Ledger now also tracks the Upstream Catchup mod, the last Neo Angband mod repo that wasn’t yet in the tracked list.

  • VisibleUI A release note’s own changelog chip tags ([Visible], [Internal], and open-ended category tags like [UI] or [Balance] - see the changelog-convention skill) now render as small pills ahead of each bullet, instead of showing as literal bracket text. A [Visible] tag gets the same solid-tinted treatment EntryCard already gives its one category chip; everything else is a plain neutral-bordered pill, matching that same component’s open-ended tags. The listing-card blurb (which is plain text, not rendered markdown) drops any leading tags outright rather than showing them unstyled.

  • VisibleDiscord Each newly published blog post now opens a post in the Discord #blog forum, tagged with its category. The forum post arrives without a notification, and a reply in its thread pings the opt-in Blog News role.

Changed

  • InternalContent-Sync repos.json is the one source for each repo’s name, emoji and color. Entries gain family, status, enrolledAt and an optional tagPrefix for version tags that carry a prefix.
  • VisibleUI The Play Neo Angband link only appears on Neo Angband release pages.
  • VisibleUI The search field moved into the header and stays visible in the slim bar while you scroll. Typing on the blog or The Ledger filters the list where you are and jumps to the first match. From a post or release page, pressing Enter opens the homepage with that search. Press / to focus the field.
  • VisibleSearch The search hint below the field is shorter and less technical: “Searches for exact matches first, then approximate matches.”

Removed

  • VisibleContent The blog’s three placeholder posts are gone, so the home page lists no entries until the first real post goes up.

Fixed

  • InternalCI The Discord announcer no longer reports a failure after posting the role ping into a new thread, which Discord answers with an empty 204 response.
  • InternalCI The Discord announcer no longer fails when Cloudflare challenges its feed check from GitHub’s runners. After three challenged checks it links the post’s own URL, and it logs the status of every failed check.
  • VisibleContent-Sync A repo read from its tags no longer loses versions when it gains a GitHub Release. A matching Release is now enrichment on top of a tag, supplying assets, a canonical URL, a publish timestamp, and a body when the changelog section is missing, rather than replacing the tag list entirely. Adding Releases to a repo one version at a time is now additive.
  • VisibleContent-Sync A single prerelease can no longer empty a repo’s page. The source set was previously chosen by counting all releases and then filtering to vX.Y.Z, so a prerelease switched a repo to a set the filter then rejected, leaving no entries and pruning everything already published.
  • InternalContent-Sync A sync pass that finds no entries for a repo that already has some is now reported as an error and skipped rather than committing the deletion, since that state is far more likely a fetch failure or a misconfiguration than a real one.
  • VisibleSearch A release row on The Ledger never actually disappeared when search filtered it out - the status line above it (“N matches”) updated correctly, but every row stayed visible regardless. LedgerRow’s own root has a display: grid author rule, which (same trap as the old search-trigger button earlier this session) always beats the browser’s built-in [hidden] { display: none } no matter how the hidden attribute gets set. The blog’s post list never hit this, since its cards sit inside a plain <li> with no competing display rule of its own.
  • InternalSearch The semantic-fallback similarity floor was recalibrated against real production data: a genuine match (“wedding” against a post titled ”…After the Honeymoon”) scored 0.229 - under the original 0.25 floor - while unrelated gibberish scored as high as 0.29 on the larger Ledger corpus. There’s no single cutoff that cleanly separates real matches from noise at this embedding model’s actual score distribution; lowering the floor to 0.20 favors surfacing a genuine but modest-scoring match over hiding it, at the cost of occasionally showing a low-confidence result for a truly unrelated query.
  • InternalInfra A Workers AI authentication failure while regenerating embeddings took down the entire release sync + deploy pipeline (caught live: adding this repo’s own entry to the tracked-repos list failed to deploy at all because the embedding call for that one new entry hit an auth error). Embedding regeneration is now non-fatal in both deploy workflows - a Cloudflare hiccup falls back to stale-but-present embeddings instead of blocking every other change from shipping.