Pilgrimage

Pilgrimage: Skirmish

Versions

Pilgrimage Online is generated from the canonical rules in Notion, and the git commit of synced content is the version freeze — no edition is "live" until it is committed. Each rules page also carries its own status (v1.0 or Reconciled) and sync date in its footer. The history below is the plain-English record; newest first.

  • DriveThruRPG PDF, generated from the same source. New /skirmish/book

route renders the whole Skirmish rulebook on one page — a cover, then every

chapter in reading order, each starting on a fresh page — reusing the shared

print stylesheet so the PDF matches the site's print output. npm run pdf

builds, then scripts/make-pdf.mjs serves dist/ and drives headless Chrome

to print it to pdf/pilgrimage-skirmish-v1.pdf (A5). Zero new dependencies

(shells out to an installed Chrome/Chromium, in the spirit of

sync-notion.mjs); falls back to system fonts if Google Fonts can't be

reached. pdf/ is gitignored — the PDF is a build artifact. Full notes in

PDF.md. The per-chapter "Terms on this page" appendix is suppressed in the

book (it carries the full glossary chapters).

  • Page-break follow-up (review): large tables now flow and break *between

rows* rather than jumping whole to the next page — a chapter that is "short

intro + one big table" (e.g. Effects) no longer strands its heading on a

near-empty page. Rows themselves are still never split.

  • Book/PDF now A4, two-column (review): the DriveThruRPG book page prints as

A4 at 9 pt in two balanced columns, with chapter headings and wide tables

spanning the full width — a denser, more rulebook-like format that roughly

halves the page count vs single-column A5 (~57 → ~33 pages). The per-chapter

website print is unchanged (single-column A5).

  • Print button on the content pages. A small reusable PrintButton

(window.print() → the dialog also offers "Save as PDF") now sits in the

apparatus rail of every rules chapter and in the header of the reference and

glossary pages. Hidden in the printed output; needs no layout of its own. The

rules index links to the new one-page book/print view.

  • Refactor: the prose typography + print rules moved to a shared

src/styles/rules-content.css, imported by both the reading view and the book

page, so the per-page and PDF print output can't drift. Verified byte-identical

per-chapter output after the move.

  • Print stylesheet QA across every chapter and table. Hardened page-break

discipline on the rules pages: headings stay with the text that follows

(break-after: avoid), table rows and blockquotes never split across a page

boundary, and a table that won't fit in the remaining space moves whole to the

next page rather than tearing mid-row. Paragraphs/list items carry

orphans/widows: 2.

  • Fixed a real print bug: the running chapter footer was position: fixed,

so in paged output the last lines of body text printed underneath it. The

version stamp now flows once at the end of the chapter — clean, no overlap.

  • Glossary print term-list appendix (the deferred Phase-C item). Each rules

chapter now ends, in print only, with a "Terms on this page" list — every

linked glossary term and its definition, alphabetised, built at build time by

the same rehype plugin that links the terms (rehype-glossary.mjs). Screen is

unchanged (tooltips + /glossary carry the definitions there); paper becomes

self-contained. Kept out of the heading pipeline so it never appears in the

contents tree or the "On this page" rail.

  • Glossary page: long letter groups may now flow across columns/pages, but a

single term's name never splits from its definition (.term breaks as a unit)

— replacing the old whole-letter-group break-inside: avoid that broke on the

big letters. Verified end-to-end by rendering chapters, the glossary, and the

reference page to PDF (A5 / A4) via headless Chromium.

  • /roster is now an interactive Oathband journal, replacing the static

sheet (its print output still yields the printable sheet). Mirrors the paper

roster's three pages — Oathband (name/cause/road/season, the Supplies ·

Renown · Legacy · Hope · Hallowed · Doom tracks, the ten Skills, eight

Blessings, Vows by Song, Marks/Hoard/Landmarks/Waymarks), Pilgrims (the

six stats M·A·V·W·P·E, armour/2 weapons/3 items, Lore), and Shadow

(name, Nature, opponent types, Shadow Lore) — and adds a Chronicle: the

weekly Travel → Trial → Camp loop, the Company-weeks instrument.

  • Local only, no accounts/server: state persists in the browser, keep

multiple Oathbands and switch between them, and export/import an Oathband

as JSON. Live helpers the paper can't do: Oathband Renown (sum of Pilgrims),

Camp Actions available (⌈Pilgrims ÷ 2⌉), and the Shadow-generation count

(⌊(Renown + Doom) ÷ 10⌋ + Pilgrims). Vows track as five increment pips.

  • Two print modes, no fudging between them — both landscape. *Print —

filled* lays out what you've entered (form chrome stripped — no dropdown

arrows, spinners or placeholder text), flowing the cards into two columns

so the page width is used rather than a narrow central ribbon. Print — blank

prints a proper panelled hand-fill sheet modelled on the paper roster's

distribution of space: page 1 Oathband (tracks · Marks · Skills · Vows ·

Blessings · Hoard), page 2 the Roster table, page 3 the Shadow. The Vows panel

gives structure but not content — ruled rows with five blank pips each, to fill

in by hand. Clean B&W.

  • Home rebuilt as the ascending masthead (direction chosen from a First

Bronze design-canvas exploration): a two-tone Fraunces wordmark — Pilgrim in

ink, age in bronze, the Bronze Age built into the logotype — over the pitch

line, one bronze CTA, and a foot-strip of quick facts. The illustration is one

original inline SVG: the Oathband climbing a mile-ticked road toward a

cup-and-ring sun-disc — the road that makes them pay for every mile, and

the light at its end. Flat black + bronze on the pale field; prints B&W and

reflows to a foot-strip on small screens. On the home page the header shows the

byline (the giant wordmark is the masthead). Plus the company-as-character

thesis.

  • /world: a grim-bright, type-led introduction to Lurûn (stone → bronze →

verdigris, the road, the Shadow, the Oathband), with carved cup-and-ring

dividers and a drop-initial. Copy is a first-pass scaffold drawn from

established language — to be replaced with canonical Lurûn worldbuilding.

  • Rules chapters now render as a three-column reading view: a contents tree

anchored to the left edge (its own chrome tone, a full-height divider from the

content) with collapsible book sections — the active book open with the

current chapter highlighted, the rest collapsed by default; the measured rules

column in the middle; and an apparatus rail on the right (its own divider)

with an auto "On this page" built from the chapter's headings.

  • First piece of interactive marginalia: on Naming the Oathband, a live

name generator in the rail rolls 2×D12 against the two naming tables

already on the page (no duplicated data) — e.g. "Wayworn Sons".

  • Wide rules tables now scroll inside their own container (never the page); the

view collapses to a single column with a "Contents" disclosure on small

screens; the header nav wraps to its own line on narrow widths. Prints as the

centre column only.

  • A build-time rehype plugin (src/lib/rehype-glossary.mjs) links the first

occurrence of each core glossary term in every rules chapter to its

/glossary#<term> anchor, with the definition in a native hover tooltip.

  • Matcher is built from the Core vocabulary only (src/lib/glossary.mjs),

first-occurrence-per-term-per-page, skipping headings/code/tables and the

glossary chapters themselves — so links are useful, not noisy. Verified: no

dead anchors across all 25 chapters. Plain black in print.

  • Synced all 25 Skirmish chapters from the Rules (Canonical) Notion DB into

src/content/rules/ (the committed version freeze). The full site builds — 25

routes under /skirmish/<slug>, tables and glossary rendering in First Bronze.

  • Deploy model settled: commit the synced content; Cloudflare Pages runs only

npm run build (no NOTION_TOKEN in CI). Setup steps in DEPLOY.md.

  • Added wrangler.toml (pages_build_output_dir = dist), bumped .nvmrc to 22,

and made npm run sync CI-safe (--env-file-if-exists).

  • Layout: Notion header-row tables (first row in <td>) now styled as headers.

Note: content was sourced through the Notion MCP because this build sandbox blocks

egress to api.notion.com. Re-running npm run sync where egress is open

reproduces the canonical freeze — review the diff, commit (the Phase D loop).

First commit. Phase B/C vertical slice stood up end-to-end: **sync → one rules

chapter rendering → committed**.

  • Minimal Astro project scaffolded (package.json, astro.config.mjs,

tsconfig.json).

  • rules content collection (src/content.config.ts) with the schema matching

the sync frontmatter: title, order, book, status, collections,

notion_id, synced.

  • Homebrew sync-notion.mjs (zero-dependency, built-in fetch) pulls chapters

from the Pilgrimage — Rules (Canonical) Notion database → Markdown in

src/content/rules/. npm sync script; NOTION_TOKEN read from gitignored

.env.

  • One dynamic route src/pages/skirmish/[...slug].astro +

RulesLayout.astro render the chapter in the First Bronze look, with a

first-pass B&W A5 print stylesheet and a version/status footer.

  • Proof chapter synced and rendering locally: Deployment & Turn Structure

(Book of Ordeals, Skirmish v1.0) at /skirmish/deployment-turn-structure.

Scope held to the slice deliberately — remaining Phase C pages come next, after

review.

No public release yet — the soft launch (site up, DriveThruRPG listed, version stated honestly) comes at the end of Phase C.