Skip to content

Releases: RPGM-Tools/rpgm-tools-press

v0.2.0

Choose a tag to compare

@neostryder neostryder released this 10 Oct 19:28

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.json with a suggested family. The enroll-repo workflow records the answer in repos.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_MODE is set to live, 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
    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.

  • [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 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.

  • [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.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.
  • [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 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.
  • [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 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.
  • [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

Choose a tag to compare

@neostryder neostryder released this 30 Aug 21:54

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.
  • Flourish now 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
    a PUBLIC_CF_BEACON_TOKEN build-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's discord-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's body - 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.Z tag, not GitHub's own prerelease flag, 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, not v130) -
    the previous default id generation stripped them, which could collide
    across distinct versions.
  • A synced entry's publishedAt now 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 of tokens/typography.css's
    list/table/blockquote/code rules) was never scoped to .rpgm-prose and
    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 ...
Read more