Repository navigation
Releases: RPGM-Tools/rpgm-tools-press
Release list
v0.2.0
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.
v0.1.0 - Initial public release
Initial public release of both sites: Relics & Reckonings (the blog) and
The Ledger (release notes for every tracked repo).
Added
- A subtle paper-grain texture (inline SVG noise, no network request) behind
every page, on top of the flat background color. Flourishnow draws itself in - a pen-stroke reveal on the blog, a
wax-seal-style stamp on The Ledger - the first time it scrolls into view,
instead of sitting fully rendered from first paint. Falls back to a plain,
fully-drawn static rendering with no JS dependency.- A "RPGM Tools, LLC" section on the About page, with the company's own
logo next to the heading - drafted as a first pass on the company itself
(not the tool suite), to be refined further. - [Visible] [Search] Site search: an always-visible inline filter on every
listing page (rather than a popup panel) matches a query against each
entry's full body text, not just its title or blurb. An exact match keeps
the page's normal reverse-chronological order; a genuine zero-result
search falls back to a semantic lookup instead, ranked "best match
first," using vectors generated per entry at content-sync time. A fixed
header Search link, and the existing "/" keyboard shortcut, focus the
field directly (or jump to it on the homepage, from a page with no
listing of its own to filter). - [Internal] [Infra] [Content-Sync] Both sites now deploy as a Cloudflare
Worker with static assets, rather than plain static assets, so a small
same-origin API endpoint can serve the semantic-search feature above;
that endpoint is rate-limited per client IP via Cloudflare's native
Worker rate-limit binding, and each entry's embedding vector is
generated once at content-sync time and cached by a content hash so a
normal sync only calls Workers AI for new or changed entries. - GitHub Discussions-backed comments via giscus on blog posts and release
pages, gated behind a real Discussion category ID per app. - Cloudflare Web Analytics wiring in the shared Layout, enabled per app via
aPUBLIC_CF_BEACON_TOKENbuild-time env var. - Release notes for mod repos, previously never synced since mods have no
formal GitHub Releases - a repo's tags are now read directly when it has
no Release objects at all. - Real download links (with file size) on release pages with binary assets,
and a per-product emoji seal on every release entry. - A release-listing card's blurb is now an AI-synthesized 1-2 sentence
summary (via MiniMax-M3) of that version's changelog section, generated
once at sync time and cached in frontmatter - not re-requested on later
syncs, and not requested at all for a tag that already has one, since a
git tag's content never changes. Falls back to the previous first-line
truncation when no key is configured or a call fails. - Each release card now carries a thin left-edge accent stripe in that
repo's own color, mirrored from the same repo'sdiscord-announce.mjs
color so one identity carries across Discord and the site. The hover
glow stays the site's single consistent gold, not recolored per repo. - Both sites now show their own logo in the header and as a favicon (The
Ledger, Relics & Reckonings), and a larger RPGM Tools emblem plus a
"Copyright RPGM Tools, LLC" line in the shared footer, linking to
rpgm.tools. - Blog posts now carry a byline (avatar and name) under the title.
- Blog post cards (and the post page itself) now carry a solid-tinted
category chip ahead of their plain tag chips, colored per category -
neo-angband reuses that repo's own accent so the category carries the
same identity everywhere else it appears. - A light/dark/system theme toggle in the header. Defaults to system (no
stored choice at all): an unvisited reader's OS preference decides,
and clicking the toggle stores an explicit override that wins from then
on. The Ledger carries its own cool graphite-toned light palette rather
than falling back to the base theme's warm parchment look. - Footer now also links to the site's RSS feed and its own source repo.
- An About page on the blog, linked from the nav, with a real author bio.
- The Ledger's release list is now a ruled register (date gutter, a thin
per-repo accent tick, monospace dates) instead of a stack of full-width
cards, with an entry/repo-count "last synchronized" line at the top -
it reads as a scannable log rather than the blog's own card list
wearing a different color. A new Repositories page (linked from the
nav) lists every tracked repo; its own per-repo pages were previously
unreachable from anywhere in the site. - Prose headings (h2/h3) inside a post or changelog body get a gold rule,
small-caps, and real top margin, and a post's opening paragraph gets a
manuscript-style drop cap - a section break used to read as barely more
than a line-height gap.
Changed
- The base body text size is bigger (1.0625rem to 1.25rem) and the page
shell narrower (76rem to 64rem): EB Garamond's narrow, small-x-height
letterforms meant the 42rem reading column was already landing around
85-95 characters per line at the old size - wide for its measure, not
narrow - and read as optically small rather than actually too narrow.
Raising the base size tightens that measure into the middle of a
comfortable range; narrowing the shell lets the header/footer chrome
actually bracket the text column instead of framing ~270px of bare
margin on each side that nothing (there's no advertising or sidebar
content) was ever going to fill. - A release-listing card's AI-synthesized summary is now capped to a fixed
length at render time (regardless of what the model actually returned),
and the prompt itself now asks for one short sentence instead of "at most
two" - the model's output was often long enough to read as a recap rather
than a scannable one-line blurb. - The About page bio is now three short paragraphs (what I do for work,
what I studied, what I build in my free time) instead of a longer
credentials-focused essay - the free-time paragraph deliberately doesn't
call RPGM Tools/Neo Angband "for fun," since the goal is a real business,
not a hobby. - A post/release page's title, byline, tags, and body are now all
constrained to the same centered 42rem column the page's own decorative
divider already used - previously only the divider was centered while the
words around it spanned the full page width. - Release notes now come from that version's own section of
CHANGELOG.md
at its tag, not a GitHub Release'sbody- drops the download-instructions
preamble and boilerplate footer that body carried, keeping only the actual
changelog. - A release page no longer repeats its title in the body, and its links are
reordered: notes, downloads, a link to play the game, the release/tag link,
the repo link, and (for a mod) a link to the main game repo. - A strict
vX.Y.Ztag, not GitHub's ownprereleaseflag, decides what
syncs - excludes rolling "edge" builds while including the full pre-1.0
alpha history, which GitHub's flag had also marked prerelease. - Release page URLs now keep a version's dots (
v1.3.0, notv130) -
the previous default id generation stripped them, which could collide
across distinct versions. - A synced entry's
publishedAtnow prefers the real release/commit
timestamp over the changelog heading's day-only date, so two releases on
the same calendar day sort correctly instead of tying and falling back to
the content loader's own (not guaranteed stable) file read order. - Emoji seals are larger on the release listing than on a release's own
page, to read better as a scannable list mark without overpowering the
page title. - The footer's top row no longer states a nonsensical "(c) Year " - a site's own display name was never the copyright holder.
It now shows the site name plus RSS/Source links, with the real
copyright (RPGM Tools, LLC) as its own centered block below: emblem,
then the copyright line, stacked. - The seed blog posts' body copy is now genuine Lorem Ipsum placeholder
text rather than fabricated first-person narrative - the earlier prose
read as real personal essays despite never having been written by
anyone. Frontmatter (title, tags, category, dates) is unchanged.
Fixed
- The About page's "RPGM Tools, LLC" heading had its logo before the gold
accent rule, reading as if the bar separated the logo from the text
rather than marking the whole heading - the rule now belongs to the row
as a whole (logo, then text, both after it), not to the heading text alone. - An AI-synthesized release summary that ran long (common for one written
before the sync prompt was tightened to one sentence) was still hard-
truncated with an ellipsis even after an earlier pass added a "prefer a
whole sentence" rule - that rule only applied when the sentence fit under
the display cap, and a real first sentence is very often longer than
that on its own. It no longer has a length gate at all: any complete
sentence is shown in full regardless of length, and the character-count
ellipsis is reserved for the rare case of text with no sentence-ending
punctuation anywhere (2 of 78 currently synced entries - themselves
incomplete at the source, not a rendering issue). - The smallest text sizes in the scale (chip labels, dates, the eyebrow
label) were tuned for a desktop reading distance and read as genuinely
tiny on a phone; bumped at narrow viewports only. - A global typography rule meant only for rendered post/changelog bodies
(li + li { margin-top }, plus the rest oftokens/typography.css's
list/table/blockquote/code rules) was never scoped to.rpgm-proseand
bled into every other<ul>on a page - it gave the second-and-later
chip in a card's tag list, the second nav link, and the second footer
link a phantom top margin, throwing off their flex-line stretch ...