This repository contains the source files for levineuwirth.org in their entirety and is automatically updated whenever the website is rebuilt. https://levineuwirth.org
Go to file
Levi Neuwirth daa0ea4c3c library: fine-press typography + muted-warm palette
Scoped warm accent tokens (--library-accent and friends) defined at
:root inside library.css — page-scoped since the file only loads on
/library.html and /search.html. Section headings become Spectral
small-caps chapter markers at 1.2rem in the accent color, so the
ornament span inherits it via currentColor. Divider and "more on
this shelf" link pick up the muted variant. The leading blockquote
gets an epigraph treatment: narrower measure, italic, warm intro
ink, with the attribution line dropping to the accent-muted tone.
Card-level refinements (oldstyle figures on dates, small-caps on
item-kind) scoped via .library-section so /new.html and tag pages
retain their lining-figure UI treatment.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 21:21:47 -04:00
build library: sidecar-driven curation plumbing 2026-04-20 21:19:36 -04:00
content library: sidecar-driven curation plumbing 2026-04-20 21:19:36 -04:00
data content: BCI essay v2 + modern_idolatry to drafts 2026-04-10 17:41:46 -04:00
nginx major visual changes - dingbats, footer, etc 2026-04-17 12:48:22 -04:00
static library: fine-press typography + muted-warm palette 2026-04-20 21:21:47 -04:00
templates library: portal ornaments + inter-shelf divider 2026-04-20 21:20:35 -04:00
tools major visual changes - dingbats, footer, etc 2026-04-17 12:48:22 -04:00
.env.example audit: tooling, deploy ordering, README, repo hygiene 2026-04-10 17:41:33 -04:00
.gitignore audit: tooling, deploy ordering, README, repo hygiene 2026-04-10 17:41:33 -04:00
.python-version GPG signing, embedding pipeline, visualization filter, search timing, sig popups 2026-03-20 20:14:49 -04:00
HOMEPAGE.md affiliation, cabal helper script 2026-03-26 08:14:50 -04:00
LICENSE Add MIT License to the project 2026-03-15 19:02:33 +00:00
Makefile visual enhancements 2026-04-15 22:25:38 -04:00
README.md audit: tooling, deploy ordering, README, repo hygiene 2026-04-10 17:41:33 -04:00
WRITING.md visual enhancements 2026-04-15 22:25:38 -04:00
cabal.project initial deploy! whoop 2026-03-17 21:56:14 -04:00
cabal.project.freeze major visual changes - dingbats, footer, etc 2026-04-17 12:48:22 -04:00
levineuwirth.cabal Navigation refactor 2026-04-19 14:35:41 -04:00
migrate_html.md sync semantic embeddings 2026-04-11 14:35:01 -04:00
pyproject.toml audit: tooling, deploy ordering, README, repo hygiene 2026-04-10 17:41:33 -04:00
uv.lock audit: tooling, deploy ordering, README, repo hygiene 2026-04-10 17:41:33 -04:00

README.md

levineuwirth.org

Personal site of Levi Neuwirth — essays, blog posts, poetry, fiction, and music. Built with Hakyll and Pandoc, with a custom build system in build/ and a Haskell + JS + Python toolchain.

Quickstart

make build              # one-shot production build into _site/
make dev                # dev build (drafts visible) + local server on :8000
make watch              # cabal-watch rebuild (drafts visible)
make clean              # cabal run site -- clean
make deploy             # clean → build → sign → push → rsync to VPS

make build always runs make clean implicitly when invoked from make deploy. For day-to-day work, prefer make dev (which serves the site on http://localhost:8000) or make watch (rebuilds on save without a server).

Run make build any time you add or replace binary assets (JPEG/PNG figures, PDFs, music assets). make dev and make watch skip the convert-images.sh / pdf-thumbs preprocessing steps, so a fresh JPEG will have no .webp companion and a fresh PDF will have no thumbnail until a full make build regenerates them. Once the companions exist they survive subsequent make dev runs.

Optional features

  • Similar-links and embeddings. tools/embed.py precomputes page-level embeddings for the "Related" block. To enable:

    uv sync                 # creates .venv with sentence-transformers, faiss-cpu
    

    The build silently skips embedding when .venv is absent.

  • Client-side semantic search. Downloads a quantized ONNX model used by static/js/semantic-search.js (run once; files are gitignored):

    make download-model
    
  • Image conversion. make build calls tools/convert-images.sh to produce .webp companions next to every JPEG/PNG. Requires cwebp (libwebp on Arch, webp on Debian/Ubuntu).

  • PDF thumbnails. make pdf-thumbs generates first-page thumbnails for PDFs in static/papers/ using pdftoppm (poppler on Arch, poppler-utils on Debian/Ubuntu). Skipped silently when missing.

Configuration

.env (gitignored, copy from .env.example) holds the GitHub PAT and the VPS rsync target consumed by make deploy. Never commit it.

Repository layout

  • build/ — Haskell build system (Hakyll rules, Pandoc filters, contexts). See build/Filters/ for the Pandoc AST transforms (sidenotes, wikilinks, transclusion, score embedding, viz, …).
  • content/ — authored Markdown (essays, blog, poetry, fiction, music).
  • templates/ — Hakyll/Pandoc HTML templates.
  • static/ — CSS, JS, fonts, images, vendored PDF.js.
  • tools/ — Python tooling (embeddings, importers) and shell scripts.
  • data/ — generated and source data (commonplace.yaml, annotations.json, bibliographies, similar-links.json).
  • paper/ — LaTeX source for in-progress academic papers.
  • spec.md — full architectural notes and design intent.

Architecture pointers

  • build/Site.hs is the Hakyll rules entry point.
  • build/Patterns.hs defines canonical content patterns shared by Backlinks, Authors, Tags, and Site.
  • build/Compilers.hs wires the Pandoc filter chain into Hakyll.
  • build/Filters/Images.hs does WebP <picture> wrapping; requires the .webp companions produced by tools/convert-images.sh.

For deeper architectural detail, see spec.md.

License

See LICENSE.