Repository navigation
Added
-
[Visible] [UI] 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.
-
[Visible] [Content-Sync] The Ledger now tracks Augur and Mercury under Other Projects. RPGM Tools Press moves there as well.
-
[Internal] [Content-Sync] Each sync looks for public repos in neostryder and RPGM-Tools that have no enrollment decision and lists them in
enrollment.jsonwith a suggested family. Theenroll-repoworkflow records the answer inrepos.json, and a declined repo is never offered again. -
[Visible] [Discord] 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_MODEis set tolive, since each Neo Angband repo still posts its own. -
[Visible] [UI] 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.
-
[Visible] [UI] 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.
-
[Visible] [UI] Entries that come back into view when a search changes or clears fade in instead of appearing all at once.
-
[Visible] [UI] The Ledger groups releases by month. On wide screens each month's name stays pinned beside its releases while they scroll past.
-
[Visible] [UI] Posts with three or more sections show a contents rail in the left margin on wide screens, and it marks the section being read.
-
[Visible] [UI] The newest post on the blog's homepage has a larger title and a gold top rule.
-
[Visible] [SEO] 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.
-
[Visible] [SEO] The blog now serves llms.txt, an index of its posts for AI answer engines, and a robots.txt that points to the sitemap.
-
[Visible] [Content] 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.
-
[Visible] [Content] 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.
-
[Internal] [Drafts] 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.
-
[Internal] [Drafts] 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.
-
[Internal] [Content-Sync] Each tracked repo now declares a
releaseSource
inrepos.json, eitherreleasesortags, instead of the sync inferring
it from whether any GitHub Releases happen to exist.tagsis the default,
because a tag is never lost by gaining a Release. -
[Internal] [Content-Sync] This repo's own releases are now tracked on The
Ledger alongside the game and its mods. -
[Visible] [Content-Sync] The Ledger now also tracks the Upstream Catchup
mod, the last Neo Angband mod repo that wasn't yet in the tracked list. -
[Visible] [UI] A release note's own changelog chip tags (
[Visible],
[Internal], and open-ended category tags like[UI]or[Balance]-
see thechangelog-conventionskill) now render as small pills ahead of
each bullet, instead of showing as literal bracket text. A[Visible]
tag gets the same solid-tinted treatmentEntryCardalready 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. -
[Visible] [Discord] 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
- [Internal] [Content-Sync]
repos.jsonis the one source for each repo's name, emoji and color. Entries gainfamily,status,enrolledAtand an optionaltagPrefixfor version tags that carry a prefix. - [Visible] [UI] The Play Neo Angband link only appears on Neo Angband release pages.
- [Visible] [UI] 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.
- [Visible] [Search] The search hint below the field is shorter and less
technical: "Searches for exact matches first, then approximate matches."
Removed
- [Visible] [Content] The blog's three placeholder posts are gone, so the home page lists no entries until the first real post goes up.
Fixed
- [Internal] [CI] 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.
- [Internal] [CI] 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.
- [Visible] [Content-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. - [Visible] [Content-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 tovX.Y.Z, so a prerelease switched a repo to a set the filter
then rejected, leaving no entries and pruning everything already published. - [Internal] [Content-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. - [Visible] [Search] 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 adisplay: gridauthor 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
hiddenattribute gets set. The blog's post list never hit this, since
its cards sit inside a plain<li>with no competingdisplayrule of
its own. - [Internal] [Search] 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. - [Internal] [Infra] 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.