From cb705651eb6fd8d5bdc5eb5ce05339379b17d210 Mon Sep 17 00:00:00 2001 From: Julian Kahnert Date: Wed, 2 Sep 2026 18:08:13 +0200 Subject: [PATCH 1/2] Set the headings in Charter Charter is Matthew Carter's 1987 text face, which Bitstream contributed to the X Consortium for any use. It ships self-hosted as WOFF2 in the regular and bold weights the headings actually ask for, with the licence beside the files, as it has to travel with them. --- Resources/assets/fonts/charter-bold.woff2 | Bin 0 -> 15028 bytes Resources/assets/fonts/charter-license.txt | 3 +++ Resources/assets/fonts/charter-regular.woff2 | Bin 0 -> 14648 bytes Resources/css/styles.css | 20 +++++++++++++++++++ 4 files changed, 23 insertions(+) create mode 100644 Resources/assets/fonts/charter-bold.woff2 create mode 100644 Resources/assets/fonts/charter-license.txt create mode 100644 Resources/assets/fonts/charter-regular.woff2 diff --git a/Resources/assets/fonts/charter-bold.woff2 b/Resources/assets/fonts/charter-bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..008c4f55c258f7eef1b2d2c9b3687486e5458223 GIT binary patch literal 15028 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 >x8qulQ9MNl_tttDuz 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 literal 0 HcmV?d00001 diff --git a/Resources/css/styles.css b/Resources/css/styles.css index 08325bd9..71a4b117 100644 --- a/Resources/css/styles.css +++ b/Resources/css/styles.css @@ -2,6 +2,24 @@ Warm paper throughout, one dark card for "Keep it.", and the filename as the page's signature: typed out in the hero, at rest at the end, its separators reused as dividers. */ +/* Charter, Matthew Carter's 1987 text face. Bitstream gave it to the X Consortium for any use; + its licence has to travel with the files, so it sits next to them as charter-license.txt. */ +@font-face { + font-family: Charter; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("/assets/fonts/charter-regular.woff2") format("woff2"); +} + +@font-face { + font-family: Charter; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("/assets/fonts/charter-bold.woff2") format("woff2"); +} + :root { color-scheme: light dark; @@ -23,6 +41,7 @@ --wrap: 72rem; + --font-heading: Charter, Georgia, "Times New Roman", serif; --font-body: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; } @@ -63,6 +82,7 @@ h1, h2, h3 { margin: 0; + font-family: var(--font-heading); line-height: 1.08; letter-spacing: -0.02em; text-wrap: balance; From 42bb41a6e0b7068b6f5fc1fbef36b1fd0ea42c71 Mon Sep 17 00:00:00 2001 From: Julian Kahnert Date: Wed, 2 Sep 2026 18:08:19 +0200 Subject: [PATCH 2/2] Add CLAUDE.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Written for Claude Code sessions, alongside the README rather than in place of it: the build and preview commands, why each custom publishing step exists, and the invariants that are easy to break — the language living in the URL, the trailing-slash rule the canonical tags depend on, and the hidden .well-known folder. --- CLAUDE.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..2cc1cefe --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,75 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +The [pdf-archiver.io](https://pdf-archiver.io) website: a Swift package that generates static HTML +with [Publish](https://github.com/JohnSundell/Publish) and Plot. `README.md` documents the project +for contributors — the paths, the language layout, and how to add a page or a language. This file +adds what is not written there. + +## Commands + +```bash +swift run # build the generator and write the site to Output/ +swift build # compile only +python3 -m http.server --directory Output # serve the generated site +``` + +There are no tests and no linter. Verification is `swift run` finishing green plus reading the files +it wrote to `Output/`. Every asset is linked absolutely (`/css/styles.css`), so opening +`Output/index.html` over `file://` renders unstyled — serve the folder instead. + +`Output/` and `.publish/` are generated and git-ignored; never edit anything below them. + +## Pipeline + +`SiteGenerator.swift` lists the publishing steps, and their **order is the architecture** — each +custom step in `PublishingSteps.swift` repairs something Publish does that this site cannot use: + +- `.buildPressKitArchive()` zips `presskit/` into `presskit.zip` at publish time, so the archive is + never versioned. +- `.moveGermanIndexPageToLanguageRoot()` turns `Content/de/index.md` into `/de` rather than + `/de/index`. +- `.removeFAQEntryPages()` deletes the per-question pages after HTML generation — the entries only + ever appear collected on `/faq` and `/de/faq`. +- `.generateCanonicalSiteMap(excluding:)` replaces Publish's site map, which omits the home pages + and spells URLs without their trailing slash. +- `.moveNotFoundPageToRoot()` writes `/404.html`, the only error page GitHub Pages serves. + +## Invariants worth knowing before changing anything + +- **The URL is the language.** `SiteLanguage(path:)` reads the leading path component, so a page's + language, strings and `lang` attribute all follow from where its file sits. Nothing carries the + language in front matter. +- **Every internal link ends in a slash.** GitHub Pages 301-redirects `/faq` to `/faq/`, so + `Path.directoryPath` and `canonicalURL(for:)` in `CanonicalPaths.swift` exist to keep the + canonical tag, the `hreflang` links and the site map pointing at the page instead of a redirect. + Use them for anything URL-shaped; `url(for:)` alone is one redirect off. +- **The home pages have no Markdown body.** `/` and `/de` are built from `SiteStrings`; their + Markdown files carry only `title` and `description`. Copy changes on the home page happen in + `Localization/SiteStrings+English.swift` and `+German.swift`, which must stay structurally + identical — `SiteStrings` has no optional members. +- **FAQ entries are ordered by file name.** `Content/faq/NN-slug.md`, sorted by path; the number is + the running order on the page. `/de/faq` renders the same English entries, because the FAQ itself + is not translated. +- **`Resources/` is copied verbatim into the site root; `root-resources/` holds files that must sit + unchanged at the root** (`CNAME`, `robots.txt`, `.well-known/`). Folder traversal skips dotted + folders, so `apple-app-site-association` is copied by name in a separate step, and the Pages + workflow needs `include-hidden-files: true` — universal links break silently otherwise. +- **The head is hand-assembled** in `Theme/DocumentHead.swift`: the full favicon set, `hreflang` + pairs, and JSON-LD that is emitted on the home pages only. `Website.favicon` and + `tagHTMLConfig` are deliberately `nil` so Publish adds nothing of its own. + +## Front end + +`Resources/css/styles.css` is the whole stylesheet, token-driven (`--font-heading`, `--font-body`, +`--font-mono`, the colour tokens) with a `prefers-color-scheme` block that only redefines tokens. +Headings are set in Charter, self-hosted from `Resources/assets/fonts/` under the Bitstream licence +that ships beside it as `charter-license.txt`. The other font files in that folder are leftovers of +the previous site and are referenced by nothing. + +## Conventions + +Base branch `develop`; branches are named `feature/…`. Pushing to `develop` builds on GitHub Actions +and publishes the Pages artifact — no branch holds the generated HTML. Pull requests build too, so a +broken generator surfaces before the merge.