From acb3ae7066fa6219ab0f5a2f2e748d9a0125a99c Mon Sep 17 00:00:00 2001 From: Levi Neuwirth Date: Wed, 15 Apr 2026 22:25:38 -0400 Subject: [PATCH] visual enhancements --- *Minibuf-1* | 1 - Makefile | 1 + WRITING.md | 166 ++++++- build/Contexts.hs | 23 + build/Filters.hs | 2 + build/Filters/Aftermatter.hs | 19 + cabal.project.freeze | 2 +- favicon.zip | Bin 144734 -> 0 bytes levineuwirth.cabal | 1 + spec.md | 742 ---------------------------- static/css/components.css | 168 ++++++- static/js/copy.js | 2 +- templates/composition.html | 3 + templates/essay.html | 9 + templates/partials/page-footer.html | 43 ++ templates/reading.html | 9 + 16 files changed, 421 insertions(+), 770 deletions(-) delete mode 100644 *Minibuf-1* create mode 100644 build/Filters/Aftermatter.hs delete mode 100644 favicon.zip delete mode 100644 spec.md diff --git a/ *Minibuf-1* b/ *Minibuf-1* deleted file mode 100644 index 0e58e14..0000000 --- a/ *Minibuf-1* +++ /dev/null @@ -1 +0,0 @@ -Search: diff --git a/Makefile b/Makefile index 9b95bc2..e894e01 100644 --- a/Makefile +++ b/Makefile @@ -63,6 +63,7 @@ deploy: clean build sign @test -n "$(VPS_USER)" || (echo "deploy: VPS_USER not set in .env" >&2; exit 1) @test -n "$(VPS_HOST)" || (echo "deploy: VPS_HOST not set in .env" >&2; exit 1) @test -n "$(VPS_PATH)" || (echo "deploy: VPS_PATH not set in .env" >&2; exit 1) + @command -v notify-send >/dev/null 2>&1 && notify-send "make deploy" "Ready to rsync — waiting for SSH auth" || true rsync -avz --delete _site/ $(VPS_USER)@$(VPS_HOST):$(VPS_PATH)/ git push -u origin main diff --git a/WRITING.md b/WRITING.md index 50e9fac..421e73a 100644 --- a/WRITING.md +++ b/WRITING.md @@ -10,12 +10,15 @@ frontmatter fields, and every authoring feature available in the Markdown source | Type | Location | Output URL | |------|----------|------------| | Essay | `content/essays/my-essay.md` | `/essays/my-essay.html` | +| Essay (with co-located assets) | `content/essays/my-essay/index.md` | `/essays/my-essay/index.html` | | Blog post | `content/blog/my-post.md` | `/blog/my-post.html` | | Poetry | `content/poetry/my-poem.md` | `/poetry/my-poem.html` | +| Poetry collection | `content/poetry/collection-name/*.md` | `/poetry/collection-name/*.html` | | Fiction | `content/fiction/my-story.md` | `/fiction/my-story.html` | | Composition | `content/music/{slug}/index.md` | `/music/{slug}/` | | Standalone page | `content/my-page.md` | `/my-page.html` | | Standalone page (with co-located assets) | `content/my-page/index.md` | `/my-page.html` | +| Draft essay | `content/drafts/essays/my-draft.md` | `/drafts/essays/my-draft.html` (dev only) | File names become URL slugs. Use lowercase, hyphen-separated words. @@ -26,6 +29,27 @@ Score fragment paths are resolved relative to the source file's directory; a fla --- +## Drafts + +In-progress essays go under `content/drafts/essays/`. Both flat files +(`content/drafts/essays/my-draft.md`) and directory-based essays +(`content/drafts/essays/my-draft/index.md`) are supported. + +Drafts are **included** in `make watch` and `make dev` (which set `SITE_ENV=dev`) +and **excluded** from every production build (`make build`, `make deploy`). +They are also invisible to tags, author pages, backlinks, stats, and feeds. + +To preview a draft: + +```bash +make watch # Hakyll live-reload with drafts visible +make dev # clean build + Python HTTP server with drafts visible +``` + +When the draft is ready, move it into `content/essays/`. + +--- + ## Frontmatter Every file begins with a YAML block fenced by `---`. Keys are read by Hakyll @@ -56,6 +80,7 @@ further-reading: # optional; see Citations section bibliography: data/custom.bib # optional; overrides data/bibliography.bib csl: data/custom.csl # optional; overrides Chicago Author-Date no-collapse: true # optional; disables collapsible h2/h3 sections +repository: https://git.levineuwirth.org/levi/repo # optional; "Repository" link in metadata js: scripts/my-widget.js # optional; per-page JS file (see Page scripts) # js: [scripts/a.js, scripts/b.js] # or a list @@ -93,6 +118,20 @@ Same fields as essays. Poetry uses a narrow-measure codex reading mode `poetryCompiler` enables `Ext_hard_line_breaks` — each source newline becomes a `
`, so verse lines render without trailing-space tricks. +**Poetry collections** — poems can be grouped into subdirectories: + +``` +content/poetry/shakespeare-sonnets/ +├── index.md ← collection landing page (uses pageCtx) +├── sonnet-1.md ← individual poem +├── sonnet-2.md +└── … +``` + +Collection index pages (`content/poetry/*/index.md`) compile as standalone +pages. Poems inside collections (`content/poetry/*/*.md`, excluding +`index.md`) compile with `poetryCompiler` just like flat poems. + **External / non-original poems** — use `poet:` instead of `authors:` to credit an external author without generating a (broken) author index page: @@ -272,6 +311,26 @@ not derivable from the page title. --- +## Transclusion + +Embed the rendered content of another page (or a section of it) inline using +`{{slug}}` directives. The directive must be on its own line. + +```markdown +{{my-essay}} → embeds the full body of /my-essay.html +{{essays/deep-dive}} → embeds /essays/deep-dive.html +{{my-essay#introduction}} → embeds only the "introduction" section +``` + +At build time, `Filters.Transclusion` rewrites these to `
` placeholders. At runtime, +`transclude.js` fetches the target page and injects the content. + +Transclusions inside code blocks or inline prose are not replaced — only +block-level directives (sole content of a line) are processed. + +--- + ## PDF Embeds Embed a hosted PDF in a full PDF.js viewer (page navigation, zoom, text @@ -343,26 +402,82 @@ $$ ## Links -Internal links: standard Markdown or wikilinks. +Internal links: standard Markdown or wikilinks. Internal links get a +`link-internal` class and an internal icon. External links are classified automatically at build time: - Opened in a new tab (`target="_blank" rel="noopener noreferrer"`) - Decorated with a domain icon via CSS `mask-image` +Links to sibling subdomains (e.g. `git.levineuwirth.org`) are classified as +external — only `levineuwirth.org` and `www.levineuwirth.org` are treated as +the content host. + | Domain | Icon | |--------|------| | `wikipedia.org` | Wikipedia | | `arxiv.org` | arXiv | | `doi.org` | DOI | +| `worldcat.org` | WorldCat | +| `orcid.org` | ORCID | +| `archive.org` | Internet Archive | | `github.com` | GitHub | +| `git.levineuwirth.org` | Forgejo | +| `tensorflow.org` | TensorFlow | +| `anthropic.com` | Anthropic | +| `openai.com` | OpenAI | +| `twitter.com` / `x.com` | Twitter/X | +| `reddit.com` | Reddit | +| `youtube.com` / `youtu.be` | YouTube | +| `tiktok.com` | TikTok | +| `substack.com` | Substack | +| `news.ycombinator.com` | Hacker News | +| `nytimes.com` | New York Times | +| `nasa.gov` | NASA | +| `apple.com` | Apple | | Everything else | Generic external arrow | ### Link preview popups -Hovering over an internal link shows a popup: title, abstract, authors, tags, -reading time. Hovering over a Wikipedia link shows an article excerpt. -Citation markers (`[1]`) show the full reference. All automatic. +Hovering over a link shows a context-aware popup. All automatic — no +markup needed. + +| Target | Popup content | +|--------|--------------| +| Internal page | Title, abstract, authors, tags, word count, reading time | +| Citation marker (`[1]`) | Full bibliography reference (multi-cite groups supported) | +| Wikipedia | Lead section extract via MediaWiki API | +| arXiv | Title, authors, abstract via Atom API | +| DOI / CrossRef | Title, authors, journal, year, abstract | +| GitHub | Repo name, description, language, stars | +| Forgejo (`git.levineuwirth.org`) | Repo name, description, language, stars | +| Open Library | Book title, description | +| bioRxiv / medRxiv | Title, authors, abstract | +| YouTube | Video title, channel name (oEmbed) | +| Internet Archive | Title, creator, description | +| PubMed | Title, authors, journal, year | +| PDF link | First-page thumbnail (from build-time `pdftoppm`) | +| Epistemic jump link (`#epistemic`) | Clone of the full epistemic profile | +| Epistemic term label (`data-ep-term`) | Term definition from colophon | +| PGP signature link | ASCII armor of the `.sig` file | + +**Custom annotations** — author-defined previews for any URL. Add entries +to `data/annotations.json`: + +```json +{ + "https://example.com/article": { + "title": "Article Title", + "annotation": "A brief note about why this link is relevant." + } +} +``` + +Annotation entries take priority over all other popup providers. + +Popups are disabled on touch-primary devices and inside nav/TOC/footer +elements. --- @@ -864,24 +979,48 @@ when the Python environment is set up (`uv sync`). No markup needed. --- +## Auto-generated pages + +These pages are built automatically and require no content files or markup: + +| Page | URL | Description | +|------|-----|-------------| +| Essay index | `/essays/` | All essays, newest first | +| Blog index | `/blog/` | Paginated blog posts | +| New | `/new.html` | All content types sorted by date, newest first | +| Library | `/library.html` | All content grouped by portal (AI, Fiction, Music, etc.) | +| Build telemetry | `/build/` | Corpus stats, word-length distribution, tag frequencies, link analysis, epistemic coverage, output metrics, repository overview, build timing, and a 52-week writing activity heatmap | +| Tag indexes | `//` | Paginated pages per tag, auto-generated | +| Author indexes | `/authors//` | All content attributed to an author | +| Random manifest | `/random-pages.json` | JSON array of page URLs for the random-page button | +| Atom feeds | `/feed.xml`, `/music/feed.xml` | All content feed + music-only feed | +| Search | `/search.html` | Pagefind full-text search + client-side semantic search (`nomic-embed-text-v1.5` ONNX model) | + +--- + ## Build ```bash -make build # auto-commit content/, compile, run pagefind + embeddings, clear IGNORE.txt -make sign # GPG detach-sign every _site/**/*.html → .html.sig (requires passphrase cached) -make deploy # build + sign + optional GitHub push + rsync to VPS -make watch # Hakyll live-reload dev server at http://localhost:8000 -make dev # clean build + python HTTP server at http://localhost:8000 +make build # auto-commit content/, convert images, PDF thumbs, compile, + # run pagefind + embeddings, clear IGNORE.txt +make sign # GPG detach-sign every _site/**/*.html → .html.sig +make deploy # clean + build + sign + rsync to VPS + git push +make watch # Hakyll live-reload dev server (SITE_ENV=dev — includes drafts) +make dev # clean build + Python HTTP server (SITE_ENV=dev — includes drafts) make clean # wipe _site/ and _cache/ ``` +`make watch` and `make dev` set `SITE_ENV=dev`, which includes drafts under +`content/drafts/essays/` in the build. All other targets exclude drafts. + `make watch` hot-reloads changes to Markdown, CSS, JS, and templates. **After any change to a `.hs` file, always run `make clean && make build`** — Hakyll's cache is keyed to source file mtimes and will serve stale output after Haskell-side changes. -`make deploy` pushes to GitHub if `GITHUB_TOKEN` and `GITHUB_REPO` are set in -`.env` (see `.env.example`), then rsyncs `_site/` to the VPS. +`make deploy` requires `VPS_USER`, `VPS_HOST`, and `VPS_PATH` to be set in +`.env` (see `.env.example`). It runs `clean → build → sign`, sends a desktop +notification, rsyncs `_site/` to the VPS, and pushes to `origin main`. **GPG signing:** `make sign` and `make deploy` require the signing subkey passphrase to be cached. Run once per boot (or per 24h expiry): @@ -890,6 +1029,11 @@ passphrase to be cached. Run once per boot (or per 24h expiry): ./tools/preset-signing-passphrase.sh ``` +**Image conversion:** `make build` automatically runs `tools/convert-images.sh` +to generate WebP companions for JPEG/PNG images (requires `cwebp`). It also +generates first-page PDF thumbnails via `pdftoppm` (requires `poppler`). +Both are skipped silently when the tools are not installed. + **Python environment:** the embedding pipeline requires `uv sync` to be run once. After that, `make build` invokes `uv run python tools/embed.py` automatically. If `.venv` is absent, the step is skipped with a warning and diff --git a/build/Contexts.hs b/build/Contexts.hs index 151ed41..8c1fa73 100644 --- a/build/Contexts.hs +++ b/build/Contexts.hs @@ -211,6 +211,28 @@ abstractField = field "abstract" $ \item -> do isPara (Para _) = True isPara _ = False +-- --------------------------------------------------------------------------- +-- Summary field +-- --------------------------------------------------------------------------- + +-- | Renders the @summary@ frontmatter key through Pandoc, preserving full +-- block structure (paragraphs, bold, lists). Unlike 'abstractField', no +-- paragraph flattening is applied because the summary renders inside its +-- own styled box rather than inline in the metadata strip. +summaryField :: Context String +summaryField = field "summary" $ \item -> do + meta <- getMetadata (itemIdentifier item) + case lookupString "summary" meta of + Nothing -> fail "no summary" + Just src -> do + let pandocResult = runPure $ do + doc <- readMarkdown defaultHakyllReaderOptions (T.pack src) + let wOpts = defaultHakyllWriterOptions { writerHTMLMathMethod = MathML } + writeHtml5String wOpts doc + case pandocResult of + Left err -> fail $ "Pandoc error rendering summary: " ++ show err + Right html -> return (T.unpack html) + siteCtx :: Context String siteCtx = constField "site-title" "Levi Neuwirth" @@ -218,6 +240,7 @@ siteCtx = <> buildTimeField <> pageScriptsField <> abstractField + <> summaryField <> defaultContext -- --------------------------------------------------------------------------- diff --git a/build/Filters.hs b/build/Filters.hs index 9f00073..0f532e1 100644 --- a/build/Filters.hs +++ b/build/Filters.hs @@ -19,6 +19,7 @@ import qualified Filters.Transclusion as Transclusion import qualified Filters.EmbedPdf as EmbedPdf import qualified Filters.Code as Code import qualified Filters.Images as Images +import qualified Filters.Aftermatter as Aftermatter -- | Apply all AST-level filters in pipeline order. -- Run on the Pandoc document after reading, before writing. @@ -33,6 +34,7 @@ applyAll :: FilePath -> Pandoc -> IO Pandoc applyAll srcDir doc = do imagesDone <- Images.apply srcDir doc pure + . Aftermatter.apply . Sidenotes.apply . Typography.apply . Links.apply diff --git a/build/Filters/Aftermatter.hs b/build/Filters/Aftermatter.hs new file mode 100644 index 0000000..a1535df --- /dev/null +++ b/build/Filters/Aftermatter.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE GHC2021 #-} +{-# LANGUAGE OverloadedStrings #-} +module Filters.Aftermatter (apply) where + +import Text.Pandoc.Definition (Pandoc (..), Block (..), Format (..)) + +apply :: Pandoc -> Pandoc +apply (Pandoc meta blocks) = Pandoc meta (concatMap go blocks) + where + go (Div attr@(_, classes, _) content) + | "aftermatter" `elem` classes + = [dividerBlock, Div attr content] + go b = [b] + +dividerBlock :: Block +dividerBlock = RawBlock (Format "html") + "
\ + \\ + \
" diff --git a/cabal.project.freeze b/cabal.project.freeze index c4a3e57..3897fe4 100644 --- a/cabal.project.freeze +++ b/cabal.project.freeze @@ -100,7 +100,7 @@ constraints: any.Glob ==0.10.2, http-conduit +aeson, any.http-date ==0.0.11, any.http-types ==0.12.4, - any.http2 ==5.1.0, + any.http2 ==5.1.1, any.indexed-traversable ==0.1.4, any.indexed-traversable-instances ==0.1.2, any.integer-conversion ==0.1.1, diff --git a/favicon.zip b/favicon.zip deleted file mode 100644 index 5f1eb7d55fd78f7fa8c75aeed3c60d9e2297e15c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144734 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 z 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%0A{z^_Yq}RTq=(7g9 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 Bo2UQ) diff --git a/levineuwirth.cabal b/levineuwirth.cabal index 747f0a2..b27b131 100644 --- a/levineuwirth.cabal +++ b/levineuwirth.cabal @@ -39,6 +39,7 @@ executable site Filters.Code Filters.Images Filters.Score + Filters.Aftermatter Filters.Viz Utils build-depends: diff --git a/spec.md b/spec.md deleted file mode 100644 index 7e96da4..0000000 --- a/spec.md +++ /dev/null @@ -1,742 +0,0 @@ -# levineuwirth.org — Design Specification v11 - -**Author:** Levi Neuwirth -**Date:** March 2026 (v11: 21 March 2026) -**Status:** LIVING DOCUMENT — Updated as implementation progresses. - ---- - -## I. Vision & Philosophy - -This website is an **intellectual home** — the permanent residence of a mind that moves freely between computer science, music composition, poetry, fiction, and whatever else catches fire. - -### Commitments -1. **Long content over disposable content.** Essays are living documents. -2. **Semantic zoom.** Title → abstract → headers → body → sidenotes → citations → sources. -3. **Earned ornament.** Every decorative element serves a purpose. -4. **The site is the proof.** Entirely FOSS. No tracking. No analytics. No fingerprinting. -5. **Reader > Author.** -6. **Configuration is code.** The build system is a Haskell program. -7. **No homepage epigraph.** -8. **Extensible metadata.** Future-proofed for semantic embeddings via external JSON injection. - ---- - -## II. All Resolved Decisions - -### Typography - -| Role | Font | License | Notes | -|------|------|---------|-------| -| **Body** | **Spectral** | SIL OFL | Screen-first serif. True smallcaps (`smcp`), four figure styles, ligatures, seven weights + italics. Self-hosted from source — Google Fonts strips OT features. | -| **UI / Headers** | **Fira Sans** | SIL OFL | Humanist sans-serif. Complements Spectral. | -| **Code** | **JetBrains Mono** | SIL OFL | Ligatures, excellent legibility. | - -Font pairing has been tested across screens and confirmed. - -**Self-hosting workflow:** -```bash -pyftsubset Spectral-Regular.ttf \ - --output-file=spectral-regular.woff2 \ - --flavor=woff2 \ - --layout-features='liga,dlig,smcp,c2sc,onum,lnum,pnum,tnum,frac,ordn,sups,subs,ss01,ss02,ss03,ss04,ss05,kern' \ - --unicodes='U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD' \ - --no-hinting --desubroutinize -``` - -### LaTeX Math - -Client-side KaTeX (not pure build-time SSR — see Implementation Notes): -- Pandoc outputs math spans with `class="math inline"` / `class="math display"` -- KaTeX renders client-side from a deferred script -- KaTeX CSS/fonts loaded conditionally only on pages with math (`$if(math)$` in head template) - -### Navigation - -``` -Home | Me | Current | New | Links | Search [⚙] -─────────────────────────────────────────────── -▼ Portals -AI | Fiction | Miscellany | Music | Nonfiction | Poetry | Research | Tech -``` - -- **Primary row (always visible):** Home, Me, Current (now-page), New (changelog), Links, Search; settings gear (⚙) on the right -- **Settings panel** (⚙ button): Theme (Light/Dark), Text size (A−/A+), Focus Mode, Reduce Motion, Print — managed by `settings.js`; state persisted via `localStorage` -- **Expandable portal row:** AI, Fiction, Miscellany, Music, Nonfiction, Poetry, Research, Tech -- Portal row collapsed by default; expansion state persisted via `localStorage` -- Fira Sans smallcaps for primary row - -### Layout - -- **Left margin:** Interactive sticky TOC (`IntersectionObserver`). Collapses on narrow screens. -- **Center column:** Body text in Spectral. 650–700px max-width. -- **Right margin:** Sidenotes only (right column). - -### Color - -Pure monochrome. No accent color. Light mode default (`#faf8f4` background, `#1a1a1a` text). Dark mode via `[data-theme="dark"]` + `prefers-color-scheme`. - -### Content Systems - -- **Tag system:** Hierarchical, slash-separated (`research/mathematics`). Hakyll `buildTags` + custom hierarchy. Tag pages at `//` with no `/tags/` namespace prefix. -- **Pagination:** Blog index 20/page, tag pages 20/page. Essay index all on one page. -- **RSS:** Atom feed at `/feed.xml` (all content types, sorted by `date`) and `/music/feed.xml` (compositions only). -- **Citations:** Numbered superscript markers `[1]` linked to a bibliography section. Hover preview via `citations.js`. Further Reading section separate from cited works. `data/bibliography.bib` + Chicago Author-Date CSL. -- **Collapsible sections:** h2/h3 headings toggle their content via `collapse.js`. Smooth `max-height` transition. State persisted in `localStorage`. - -### Gwern Codebase: Selective Adoption - -| Component | Action | Actual outcome | -|-----------|--------|----------------| -| `sidenotes.js` | Adopt directly (Said Achmiz, MIT) | **Written from scratch** — purpose-built for our HTML structure | -| `popups.js` | Fork and simplify (Said Achmiz, MIT) | Exists in `static/js/popups.js`; Phase 3 | -| CSS typographic foundations | Extract and refactor | Done | -| Pandoc AST filters | Write from scratch | Done | -| Hakyll architecture | Rewrite, informed by gwern | Done | -| Everything else | Ignore | — | - -### Metadata - -Extensible YAML frontmatter. Hakyll strips frontmatter before passing to Pandoc, so all frontmatter access goes through Hakyll's metadata API (`lookupStringList`, `getMetadataField`, etc.), not through Pandoc `Meta`. - -**Frontmatter keys in use:** -```yaml -title: # page title -date: # ISO date (YYYY-MM-DD) — used for sorting, feed, reading-time -abstract: # short description (1–3 sentences). Rendered via Pandoc to support LaTeX math and Markdown. -tags: # hierarchical tag list -authors: # list of author names (defaults to Levi Neuwirth) -further-reading: # list of BibTeX keys for the Further Reading section -bibliography: # path to .bib file (optional; defaults to data/bibliography.bib) -csl: # path to .csl file (optional; defaults to data/chicago-notes.csl) -repository: # external URL pointing to the content's source code or data repository - -# Epistemic profile (all optional; section shown only if `status` is present) -status: # Draft | Working model | Durable | Refined | Superseded | Deprecated -confidence: # 0–100 integer (%) -importance: # 1–5 integer (rendered as filled/empty dots) -evidence: # 1–5 integer (rendered as filled/empty dots) -scope: # personal | local | average | broad | civilizational -novelty: # conventional | moderate | idiosyncratic | innovative -practicality: # abstract | low | moderate | high | exceptional -stability: # volatile | revising | fairly stable | stable | established - # (auto-computed from git history; use IGNORE.txt to pin) -last-reviewed: # ISO date — overrides git-derived date when in IGNORE.txt -confidence-history: # list of integers — trend derived from last two entries (↑↓→) - -# Version history (optional; falls back to git log, then to date-created/date-modified) -history: - - date: "2026-03-01" # ISO date string (quote to prevent YAML date parsing) - note: Initial draft # human-readable annotation - - date: "2026-03-14" - note: Expanded typography section; added citations -``` - -Auto-computed at build time: `word-count`, `reading-time`. -Auto-derived at build time: `stability` (from `git log --follow`), `last-reviewed` (most recent commit date), `confidence-trend` (from `confidence-history`). - -**`IGNORE.txt`:** A file in the project root listing content paths (one per line) whose `stability` and `last-reviewed` should not be recomputed. Cleared automatically after every `make build`. Useful for pinning manually-set stability labels on pages whose git history is misleading. - -**Top metadata block:** -1. **Tags** — hierarchical tag list with links to tag index pages -2. **Description** — the `abstract` field, rendered via Pandoc (supporting LaTeX math and Markdown formatting), typically in italic -3. **Authors** — `authors` list -4. **Page info** — jump links to bottom metadata sections (Epistemic/Bibliography/Backlinks shown conditionally) - -**Bottom metadata footer:** -- **Version history** — three-tier priority: (1) frontmatter `history` list with authored notes → (2) git log dates (date-only) → (3) `date-created` / `date-modified` fallback. `make build` auto-commits `content/` before building, keeping git history current. -- **Epistemic** (if `status` set) — primary row: trust-score chip + status; labeled rows beneath: confidence · importance · evidence · scope · novelty · practicality (each shown only if its frontmatter field is set); always-visible `
`: stability · last reviewed · confidence trend -- **Bibliography** — formatted citations + Further Reading -- **Backlinks** — auto-generated; each entry shows source title (link) + collapsible context paragraph - -### Licensing - -- **Content:** CC BY-SA-NC 4.0 -- **Code:** MIT - ---- - -## III. Deployment & Infrastructure - -### Deployment Pipeline - -``` -[Local machine] [Arch Linux VPS / DreamHost] - -content/*.md - ↓ -cabal run site -- build nginx serving - ↓ /var/www/levineuwirth.org/ -pagefind --site _site - ↓ -rsync -avz --delete \ - _site/ \ - vps:/var/www/levineuwirth.org/ ──→ Live site -``` - -```makefile -build: - @git add content/ - @git diff --cached --quiet || git commit -m "auto: $(date -u +%Y-%m-%dT%H:%M:%SZ)" - @date +%s > data/build-start.txt - @./tools/convert-images.sh # WebP conversion (skipped if cwebp absent) - cabal run site -- build - pagefind --site _site - @if [ -d .venv ]; then \ - uv run python tools/embed.py || echo "Warning: embedding failed"; \ - fi - > IGNORE.txt # clear stability pins after each build - @BUILD_END=$(date +%s); BUILD_START=$(cat data/build-start.txt); \ - echo $((BUILD_END - BUILD_START)) > data/last-build-seconds.txt - -sign: - @./tools/sign-site.sh # detach-sign every _site/**/*.html; requires passphrase cached via preset-signing-passphrase.sh - -deploy: build sign - rsync -avz --delete _site/ vps:/var/www/levineuwirth.org/ - -watch: - cabal run site -- watch - -clean: - cabal run site -- clean - -download-model: - @./tools/download-model.sh # fetch quantized ONNX model to static/models/ (once per machine) - -convert-images: - @./tools/convert-images.sh # manual trigger; also runs in build -``` - -### Hosting Timeline - -1. **Immediate:** Deploy to DreamHost (rsync static files) -2. **Phase 5:** Provision Arch VPS (Hetzner), configure nginx + certbot, migrate DNS - -### VPS: nginx config (Arch Linux) - -```nginx -server { - listen 443 ssl http2; - server_name levineuwirth.org www.levineuwirth.org; - root /var/www/levineuwirth.org; - - # TLS (managed by certbot) - ssl_certificate /etc/letsencrypt/live/levineuwirth.org/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/levineuwirth.org/privkey.pem; - - # cdn.jsdelivr.net required for transformers.js (semantic search library). - # Model weights served same-origin from /models/ — connect-src stays 'self'. - add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self'; font-src 'self';" always; - - gzip on; - gzip_types text/html text/css application/javascript application/json image/svg+xml; - - location ~* \.(woff2|css|js|svg|png|jpg|webp)$ { - expires 1y; - add_header Cache-Control "public, immutable"; - } - location ~* \.html$ { - expires 1h; - add_header Cache-Control "public, must-revalidate"; - } - - try_files $uri $uri.html $uri/ =404; - error_page 404 /404.html; -} -server { - listen 80; - server_name levineuwirth.org www.levineuwirth.org; - return 301 https://$host$request_uri; -} -``` - ---- - -## IV. Repository Structure - -``` -levineuwirth.org/ -├── content/ -│ ├── essays/ -│ │ └── test-essay.md # Feature test document -│ ├── blog/ -│ ├── music/ -│ │ └── {slug}/ -│ │ ├── index.md # Composition frontmatter + program notes -│ │ ├── scores/ # LilyPond SVG pages + PDF -│ │ └── audio/ # Per-movement MP3s -│ └── *.md # Standalone pages (me, colophon, etc.) -├── static/ -│ ├── css/ -│ │ ├── base.css # CSS variables, palette, dark mode -│ │ ├── typography.css # Spectral OT features, dropcaps, smallcaps, link icons -│ │ ├── layout.css # 3-column layout, responsive breakpoints -│ │ ├── sidenotes.css # Sidenote positioning -│ │ ├── popups.css # Link preview popup styles -│ │ ├── syntax.css # Monochrome code highlighting (JetBrains Mono) -│ │ ├── components.css # Nav (incl. settings panel), TOC, metadata, citations, collapsibles -│ │ ├── viz.css # Visualization figure layout (.viz-figure, .vega-container, .viz-caption) -│ │ ├── gallery.css # Exhibit system + annotation callouts -│ │ ├── selection-popup.css # Text-selection toolbar -│ │ ├── annotations.css # User highlight marks + annotation tooltip -│ │ ├── images.css # Figure layout, captions, lightbox overlay -│ │ ├── score-reader.css # Full-page score reader layout -│ │ ├── catalog.css # Music catalog page (`/music/`) -│ │ └── print.css # Print stylesheet (media="print") -│ ├── js/ -│ │ ├── theme.js # Dark/light toggle (sync, not deferred) -│ │ ├── sidenotes.js # Written from scratch — collision avoidance, hover/focus -│ │ ├── toc.js # Sticky TOC + scroll tracking + animated collapse -│ │ ├── nav.js # Portal row expand/collapse + localStorage -│ │ ├── collapse.js # Section collapsing with localStorage persistence -│ │ ├── citations.js # Citation hover previews -│ │ ├── gallery.js # Exhibit overlay + annotation toggle -│ │ ├── popups.js # Link preview popups (internal, Wikipedia, citations) -│ │ ├── settings.js # Settings panel (theme, text size, focus mode, reduce motion, print) -│ │ ├── selection-popup.js # Context-aware text-selection toolbar -│ │ ├── annotations.js # localStorage highlight/annotation engine (UI deferred) -│ │ ├── score-reader.js # Score reader: page-turn, movement jumps, deep linking -│ │ ├── viz.js # Vega-Lite render + dark mode re-render via MutationObserver -│ │ ├── semantic-search.js # Client-side semantic search: transformers.js + Float32Array cosine ranking -│ │ ├── search.js # Pagefind UI init + ?q= pre-fill + search timing (#search-timing) -│ │ └── prism.min.js # Syntax highlighting -│ ├── fonts/ # Self-hosted WOFF2 (subsetted with OT features) -│ ├── gpg/ -│ │ └── pubkey.asc # Ed25519 signing subkey public key (master: CD90AE96…; subkey: C9A42A6F…) -│ ├── models/ # Self-hosted ONNX model (gitignored; run: make download-model) -│ │ └── all-MiniLM-L6-v2/ # ~22 MB quantized — served at /models/ for semantic-search.js -│ └── images/ -│ └── link-icons/ # SVG icons for external link classification -│ ├── external.svg -│ ├── wikipedia.svg -│ ├── github.svg -│ ├── arxiv.svg -│ └── doi.svg -├── templates/ -│ ├── default.html # Outer shell: nav, head, footer JS -│ ├── essay.html # 3-column layout with TOC -│ ├── composition.html # Music landing page (metadata block, movements, body, recording player) -│ ├── music-catalog.html # Music catalog index (`/music/`) -│ ├── score-reader.html # Minimal score reader body (top bar + SVG stage) -│ ├── score-reader-default.html # Minimal HTML shell for score reader (no nav/footer) -│ ├── blog-post.html -│ ├── page.html # Simple standalone pages -│ ├── essay-index.html -│ ├── blog-index.html -│ ├── tag-index.html -│ └── partials/ -│ ├── head.html # CSS, conditional JS (citations, collapse) -│ ├── nav.html # Two-row nav with portals -│ ├── footer.html -│ ├── metadata.html # Essay metadata block (top) -│ └── page-footer.html # Essay footer (bibliography, backlinks) -├── build/ -│ ├── Main.hs # Entry point -│ ├── Site.hs # Hakyll rules (all routes + Atom feed) -│ ├── Compilers.hs # Pandoc compiler wrappers -│ ├── Contexts.hs # Template contexts (word-count, reading-time, bibliography) -│ ├── Citations.hs # citeproc pipeline: Cite→superscript + bibliography HTML -│ ├── Filters.hs # Re-exports all filter modules -│ ├── Filters/ -│ │ ├── Typography.hs # Smart quotes, dashes -│ │ ├── Sidenotes.hs # Footnote → sidenote conversion -│ │ ├── Dropcaps.hs # Decorative first-letter drop caps -│ │ ├── Smallcaps.hs # Smallcaps via smcp OT feature -│ │ ├── Wikilinks.hs # [[wikilink]] syntax -│ │ ├── Links.hs # External link classification + data-link-icon attributes -│ │ ├── Math.hs # Simple LaTeX → Unicode conversion -│ │ ├── Code.hs # Prepend language- prefix for Prism.js -│ │ ├── Images.hs # Lazy loading, lightbox data-attributes, WebP wrapper for local raster images -│ │ ├── Score.hs # Score fragment SVG inlining + currentColor replacement -│ │ └── Viz.hs # Visualization IO filter: runs Python scripts, inlines SVG / Vega-Lite JSON -│ ├── Authors.hs # Author-as-tag system (slugify, authorLinksField, author pages) -│ ├── Backlinks.hs # Two-pass build-time backlinks with context paragraph extraction -│ ├── Catalog.hs # Music catalog: featured works + grouped-by-category HTML rendering -│ ├── Stability.hs # Git-based stability auto-calculation + last-reviewed derivation -│ ├── Metadata.hs # Stub (Phase 2+) -│ ├── Tags.hs # Hierarchical tag system -│ ├── Pagination.hs # 20/page for blog + tag indexes -│ └── Utils.hs # Shared helpers (wordCount, readingTime) -├── data/ -│ ├── bibliography.bib # BibTeX references -│ ├── chicago-notes.csl # CSL style (in-text, Chicago Author-Date) -│ └── (future: embeddings.json, similar-links.json) -├── tools/ -│ ├── subset-fonts.sh -│ ├── viz_theme.py # Matplotlib monochrome helpers (apply_monochrome, save_svg, LINESTYLE_CYCLE) -│ ├── sign-site.sh # Detach-sign every _site/**/*.html → .html.sig (called by `make sign`) -│ ├── preset-signing-passphrase.sh # Cache signing subkey passphrase in gpg-agent (run once per boot) -│ ├── download-model.sh # Fetch quantized ONNX model to static/models/ (run once per machine) -│ ├── convert-images.sh # Convert JPEG/PNG → WebP companions via cwebp (runs automatically in build) -│ └── embed.py # Build-time embedding pipeline: similar-links + semantic search index -├── levineuwirth.cabal -├── cabal.project -├── cabal.project.freeze -├── Makefile -└── CLAUDE.md -``` - ---- - -## V. Implementation Phases - -### Phase 1: Foundation ✓ -- [x] Init Hakyll project, modular Haskell build system -- [x] Font subsetting + self-hosting (Spectral, Fira Sans, JetBrains Mono) -- [x] CSS: base (palette, variables, dark mode), typography (Spectral features), layout (3-column), sidenotes -- [x] `sidenotes.js` — written from scratch (not adopted; see Implementation Notes) -- [x] Two-row navigation with expandable portals -- [x] Templates: default, essay, blog-post, index -- [x] Dark/light toggle with `localStorage` + `prefers-color-scheme` -- [x] Basic Pandoc pipeline (Markdown → HTML, smart typography) -- [x] Deploy to DreamHost via rsync — deployed to Hetzner VPS instead - -### Phase 2: Content Features ✓ -- [x] Pandoc filters: sidenotes, dropcaps, smallcaps, wikilinks, typography, link classification, code, math -- [x] Interactive sticky TOC — IntersectionObserver, animated expand/collapse, page-title display, auto-collapse on scroll -- [x] Citation system — numbered superscript markers, hover preview, bibliography + Further Reading sections -- [x] Monochrome syntax highlighting (Prism.js + `Filters.Code`) -- [x] Collapsible h2/h3 sections (`collapse.js`) — `max-height` transition, localStorage persistence -- [x] Hierarchical tag system + tag index pages -- [x] Pagination (blog index and tag pages, 20/page) -- [x] Metadata: YAML frontmatter + auto-computed word count / reading time -- [x] Single Atom feed (`/feed.xml`, all content, sorted by date) -- [x] External link icons (SVG mask-image, domain-classified via `Filters.Links`) -- [x] Gallery / Exhibit system (`gallery.js`, `gallery.css`) — added (not in original spec) - -### Phase 3: Rich Interactions -- [x] Link preview popups (`popups.js`) — internal page previews (title, abstract, authors, tags, reading time), Wikipedia excerpts, citation previews; relative-URL fix for index pages -- [x] Pagefind search (`/search.html`) — `search.js` pre-fills from `?q=` param; `#search-timing` shows elapsed ms (mono, faint) via `MutationObserver` on search results subtree -- [x] Author system — authors treated as tags; `build/Authors.hs`; author pages at `/authors/{slug}/`; `authorLinksField` in all contexts; defaults to Levi Neuwirth -- [x] Settings panel — `settings.js` + `settings.css` section in `components.css`; theme, text size (3 steps), focus mode, reduce motion, print; all state in `localStorage`; `theme.js` restores all settings before first paint -- [x] Selection popup — `selection-popup.js` / `selection-popup.css`; context-aware toolbar appears 450 ms after text selection; see Implementation Notes -- [x] Print stylesheet — `print.css` (media="print"); single-column, light colors, sidenotes as indented blocks, external URLs shown -- [x] Current page (`/current.html`) — now-page; added to primary nav -- [x] Annotations — `annotations.js` / `annotations.css`; localStorage storage, text re-anchoring, highlight marks, tooltip with delete; color-picker UI in selection popup (four swatches + optional note field) - -### Phase 4: Creative Content & Polish -- [x] Image handling (lazy load, lightbox, figures, WebP `` wrapper for local raster images) -- [x] Homepage (replaces standalone index; gateway + curated recent content) -- [x] Poetry typesetting — codex reading mode (`reading.html`, `reading.css`, `reading.js`); `poetryCompiler` with `Ext_hard_line_breaks`; narrower measure, stanza spacing, drop-cap suppressed -- [x] Fiction reading mode — same codex layout; `fictionCompiler`; chapter drop caps + smallcaps lead-in via `h2 + p::first-letter`; reading mode infrastructure shared with poetry -- [x] Music section — score fragment system (A): inline SVG excerpts (motifs, passages) integrated into the gallery/exhibit system; named, TOC-listed, focusable in the shared overlay alongside equations; authored via `{.score-fragment score-name="..." score-caption="..."}` fenced-div; SVG inlined at build time by `Filters.Score`; black fills/strokes replaced with `currentColor` for dark-mode; see Implementation Notes -- [x] Music section — composition landing pages + full score reader (C): two-URL architecture per composition; `/music/{slug}/` (rich prose landing page with movement list, audio players, inline score fragments) and `/music/{slug}/score/` (minimal dedicated reader); Hakyll `version "score-reader"` mechanism; `compositionCtx` with `slug`, `score-url`, `has-score`, `score-page-count`, `score-pages` list, `has-movements`, `movements` list (Aeson-parsed nested YAML); `score-reader-default.html` minimal shell; `score-reader.js` (page navigation, movement jumps, `?p=` deep linking, preloading, keyboard); `score-reader.css`; dark mode via `filter: invert(1)`; see Implementation Notes -- [x] Accessibility audit — skip link, TOC collapsed-link tabbing (`visibility: hidden`), section-toggle focus visibility, lightbox/gallery/settings focus restoration, popup `aria-hidden`, metadata nav wrapping, footer `onclick` removal; settings panel focus-steal bug fixed (focus only returns to toggle when it was inside the panel, preventing interference with text-selection popup) -- [~] Visualization pipeline — Pandoc filter approach (`Filters.Viz`): `.figure` fenced divs run `python3