Anyone who keeps a blyg can now propose one of their public hoppers for World Machines at /hoppers. Aneesh approves or rejects them at /admin/hoppers. Approved hoppers are listed on that page, and a rejection blocks that blyg and email from submitting again. The World Machines blyg at blyg.worldmachines.org will start following approved hoppers once blygger ships hopper feeds.
A running log of non-trivial changes, maintained by contributors.
The site nav now links to Prime Radiant, our sister project, from every page including the wiki.
Links added to newwritinginbox.md as resource now get read too, the same way as resources submitted on the web form. If one is 1,500–60,000 characters, wm-feeder writes reading notes for it in raw-notes/commons/reading/. The web form and the inbox share one ingest function and one reusable feed workflow.
Members can submit a third-party essay or paper as a resource, and it is now read rather than stored as a bare link. Ingest extracts the text. If the text is 1,500–60,000 characters, it goes to the feeder's private R2 bucket, and wm-feeder (Gemma on Workers AI) writes reading notes into raw-notes/commons/reading/ for the Oracle. The essay's own text never enters git or the public site. Its verbatim chunks are loaded into the personal catalog only, with wmlake load-feeder. Books and anything longer stay link-only, marked with why.
The Oracle can now draw on members' submitted essays. Until now it indexed only raw-notes/, so a question about falling insect numbers missed Sean's "The Art of Nature". Every contribution is now mirrored into raw-notes/commons/contributions/ as sections of 5,000 characters or less, credited to the member who wrote it. That's 142 sections from 34 essays, and each new submission is added at ingest. The lake files them under a new contribution category.
Link submission works again: the GITHUB_TOKEN Pages secret is back. Ingest also stops storing contributions as link-only. GitHub's runners get a Cloudflare 403 challenge from Substack and from many blogs, so the bot now falls back to a token-gated relay, /api/ingest-relay, that fetches from Cloudflare's network. It reads Substack posts through Substack's API, Google Docs through their plain-text export, and identifies itself as worldmachines-ingest. /submit has an optional "Article text" box for paywalled or blocked contributions. scripts/reextract.py recovered the full text of all 8 link-only contributions.
Andrea Wulf's *Magnificent Rebels: The First Romantics and the Invention of the Self* (2022) is now in commons (taken over from Florian's list): 36 reading notes, 15 new canon pages — a book summary, andrea-wulf, entity pages for Fichte, Schelling, Caroline Schelling and August Wilhelm Schlegel, concept pages such as jena-set-wulf, symphilosophie-wulf, invention-of-the-self-wulf and art-of-being-selfish-wulf, and syntheses poeticising-the-mechanical-world-wulf and inwardness-without-a-state-wulf — plus append-only sections on 7 existing pages, including johann-wolfgang-von-goethe, alexander-von-humboldt and infrastructure-of-bourgeois-inwardness. The lake chunk/embed/publish is personal only (in copyright).
Robert Irwin's *Ibn Khaldun: An Intellectual Biography* (2018) is now in commons (taken over from Florian's list): 23 reading notes, 6 new canon pages — a book summary, robert-irwin, asabiyya-irwin, and syntheses terminal-medievals-vs-early-moderns-irwin, muqaddima-enchanted-frame-irwin and psychohistory-and-world-machines-irwin — plus append-only sections on ibn-khaldun, civilization-undone-by-its-own-success, giambattista-vico, niccolo-machiavelli and bruce-chatwin. Irwin's reading of Ibn Khaldun as a man of his own Maghribi, Sufi and Mamluk world, not a proto-modern sociologist, tempers the psychohistory genealogy. The lake chunk/embed/publish is personal only (in copyright).
Robin Douglass's *Rousseau and Hobbes: Nature, Free Will, and the Passions* (2015) is now in commons (taken over from Florian's list): 33 reading notes, 8 new canon pages — a book summary, robin-douglass, the vault's first thomas-hobbes page, concept pages hobbism-douglass, amour-propre-douglass, sovereignty-inverted-douglass and love-and-fear-douglass, and the synthesis making-a-people-one-douglass — plus append-only sections on jean-jacques-rousseau, adam-smith, voltaire and the-legible-commonwealth. The lake chunk/embed/publish is personal only (in copyright).
Charles C. Mann's *1493: Uncovering the New World Columbus Created* (2011) is now in commons (taken over from Florian's list): 41 reading notes, 9 new canon pages — a book summary, charles-c-mann, concept pages columbian-exchange-mann, homogenocene-mann, silk-for-silver-trade-mann, disease-regimes-and-extractive-states-mann, agro-industrial-complex-mann and maroon-societies-mann, and the synthesis control-breeds-its-own-counterflows-mann — plus append-only sections on 10 existing pages, including braudel-world-economy, archaic-globalization-bayly, colonial-botanical-garden-grove, adam-smith and david-s-landes. The lake chunk/embed/publish is personal only (in copyright).
The production Pages project had no GITHUBTOKEN or GITHUBREPO, so /api/submit and /api/join could not reach GitHub. They were likely lost in the account cutover. GITHUB_REPO is now declared in wrangler.jsonc, and both endpoints return a clear 503 instead of calling repos/undefined. The token still has to be set as a Pages secret.
Christopher Clark's *Revolutionary Spring: Fighting for a New World, 1848–1849* (2023) is now in commons (taken over from Florian's list): 49 reading notes, 8 new canon pages — a book summary, christopher-clark, robert-blum, and concept pages revolutionary-cascade-clark, politics-of-description-clark, entropy-of-revolution-clark, post-revolutionary-synthesis-clark and four-emancipations-clark — plus append-only sections on 6 existing pages, including caesarism-gay, converging-world-crises-bayly, the-mass-as-fiction and alexander-herzen. The lake chunk/embed/publish is personal only (in copyright).
Link submission was failing with Safari's "The string did not match the expected pattern." /submit and /api/submit share one Cloudflare Access app, while /wiki is a separate one, and there is only one CF_Authorization cookie per hostname. So after someone opened the wiki, or their session expired, Access answered the form's POST with a login redirect, and the page tried to parse the HTML as JSON. The form now detects that redirect, keeps the draft, sends the member through /login to refresh their session, and restores the fields so they can press Submit again. /profile, /mcp and the Resources team-library list get the same handling, with a sign-in link or prompt instead of a broken JSON parse.
Frances Yates's *Giordano Bruno and the Hermetic Tradition* (1964) is now in commons, the first of Florian's assigned books taken over by aneesh: 35 reading notes, 6 new canon pages — a book summary, frances-yates, concept pages casaubon-dating-yates, hermetic-magus-yates and will-to-operate-yates, and the synthesis talismanic-city-yates — plus append-only sections on giordano-bruno, cosimo-de-medici and thomas-more. The lake chunk/embed/publish is personal only (in copyright).
Peter Gay's *The Tender Passion* (Vol. II of *The Bourgeois Experience*, 1986) is now in commons, completing the five-volume series: 26 reading notes, 7 new canon pages — a book summary, charles-kingsley (scoped to Gay's reading), concept pages two-currents-of-love-gay, stratagems-of-sensuality-gay, community-of-fantasies-gay and dividends-of-denial-gay, and the synthesis price-of-repression-gay — plus the Volume II section of the-bourgeois-experience (replacing its placeholder) and append-only sections on peter-gay, bourgeois-defenses-against-eros, bourgeoisophobia, bourgeois-privacy-as-conquest, mabel-loomis-todd and michel-foucault. The lake chunk/embed/publish is personal only (in copyright).
Richard Grove's *Green Imperialism: Colonial Expansion, Tropical Island Edens and the Origins of Environmentalism, 1600–1860* (1995) is now in commons: 49 reading notes, 9 new canon pages — a book summary, richard-grove, concept pages desiccation-theory-grove, tropical-island-eden-grove, colonial-botanical-garden-grove and indigenous-knowledge-in-colonial-environmentalism-grove, and syntheses conservation-as-control-grove, diagnosis-waits-for-crisis-grove and more-utopia-grove — plus append-only sections on 7 existing pages, including alexander-von-humboldt, johann-gottfried-herder and the legibility syntheses. The scanned two-page-spread PDF was re-OCR'd page by page. The lake chunk/embed/publish is personal only (in copyright).
Elizabeth Eisenstein's *The Printing Revolution in Early Modern Europe* (2nd ed., 2005) is now in commons: 28 reading notes, 7 new canon pages — a book summary, elizabeth-eisenstein, concept pages typographical-fixity-eisenstein, master-printer-workshop-eisenstein, standardization-and-individuation-eisenstein and printing-press-and-information-overload-eisenstein, and the synthesis scripture-and-nature-parting-eisenstein — plus append-only sections on 8 existing pages, including marshall-mcluhan, benedict-anderson, giordano-bruno and contested-uniformity-bayly. The lake chunk/embed/publish is personal only (in copyright).
C. A. Bayly's *The Birth of the Modern World, 1780–1914* is now in commons: 42 reading notes, 8 new canon pages — a book summary, c-a-bayly, concept pages such as contested-uniformity-bayly and archaic-globalization-bayly, and syntheses converging-world-crises-bayly and legibility-hardens-hierarchy-bayly — plus append-only sections on 12 existing pages, including braudel-world-economy, david-s-landes and benedict-anderson, which tie Bayly's global history to the Braudel, Landes and Gay material already in the corpus. Bayly-framed concepts carry a -bayly suffix so the bare names stay free for broader pages. The lake chunk/embed/publish is personal only (in copyright).
Four of the five volumes of Peter Gay's *The Bourgeois Experience: Victoria to Freud* are now in commons: *Education of the Senses* (32 reading notes), *The Cultivation of Hatred* (42), *The Naked Heart* (29) and *Pleasure Wars* (24). They add 23 canon pages — a peter-gay page, a series page the-bourgeois-experience with one section per volume, a summary per volume, and concepts such as alibis-for-aggression, bourgeoisophobia and bourgeois-privacy-as-conquest — plus append-only sections on 8 existing pages, including mass-man, the-mass-as-fiction and michel-foucault. Vol II (*The Tender Passion*) is missing: the file labelled as it turned out to be a second scan of Vol III, so it waits for a genuine copy. Each volume passed both validators with 0 quarantine. The lake chunk/embed/publish (personal only; the books are in copyright) is still pending.
Braudel's *Civilization and Capitalism* is now in commons in full: Vol II (*The Wheels of Commerce*, 43 reading notes) and Vol III (*The Perspective of the World*, 38) join Vol I. They add 6 new canon pages, among them braudel-world-economy, braudel-succession-of-dominant-centres and the synthesis capitalism-keeps-the-floor-competitive, plus append-only sections on 9 existing pages, including fernand-braudel and braudel-three-storey-house. The two volumes were ingested in parallel runs; both passed both validators with 0 quarantine. The lake chunk/embed/publish (personal only; both books are in copyright) is still pending, so the Oracle can't quote them yet.
/wiki had stopped updating: every Rebuild wiki run since #59 (the move of raw-notes/aneesh/{entities,summaries} into commons) crashed with FileNotFoundError on an old aneesh/entities path. The workflow's git diff reported each moved note only under its new path, so the incremental build never dropped the old one from its manifest. The diff now runs with --no-renames, and build_wiki.py also drops any manifest note whose file is gone, so a move or deletion can't wedge the build again; merging this triggers a full rebuild that clears the stale entries.
The DuckLake catalogs behind the Oracle and Witness now shut down after 10 idle minutes instead of running around the clock: the container's idle-stop signal had been silently ignored (the sidecar ran as PID 1 with no SIGTERM handler), which cost ~$38 of a ~$47 monthly Cloudflare bill (wm-infra #15). The trade-off is a ~20s wake-up on the first question after a quiet spell, so /oracle now explains the wait if an answer takes more than 20 seconds. Separately, the Witness now summarizes private passages in parallel rather than one by one (wm-oracle #6); the sequential version took 55–84s per question and had been pushing Oracle answers past the ~100s edge timeout since Sep 21.
Website PRs now need Aneesh's approval instead of Venkat's; PRs Venkat authors are exempt and need no review. The enforced approval-policy check, CODEOWNERS (which now auto-requests Aneesh on website/ PRs), CLAUDE.md and CONTRIBUTING.md all say the same thing, and a Venkat approval on someone else's website PR no longer clears it on its own. Wiki and raw-notes rules are unchanged.
The Witness install command on /mcp never ran for anyone: it placed --header before the server name, and Claude Code's CLI declares that flag variadic, so it swallowed both the name and the URL and died with error: missing required argument 'name'. Name and URL now come first and the header last — the order claude mcp add --help itself demonstrates — verified end to end against CLI 2.1.247. The Oracle snippet was never affected; it carries no header.
The MCP endpoints moved onto World Machines hostnames: the Oracle is now oracle.worldmachines.org/mcp and the gated Witness witness.worldmachines.org/mcp, replacing the *.aneeshsathe.workers.dev URLs /mcp had been handing out for people to paste into their own client config — a personal subdomain that, once installed, sits in someone's setup indefinitely. The old hostnames still answer and every existing token keeps working, so nothing needs re-adding; only the copy-paste snippets changed. Prime Radiant made the same move the same day and now lives at primeradiant.worldmachines.org, with its old address redirecting.
Consolidated the crowded 11-link nav into five places — Theory, Library, Wiki, Ask, Club — each opening a second row on hover (desktop) or a chevron tap (touch), with zero JavaScript: pure CSS :hover/:focus-within/:target, keyboard- and 320px-safe. On wiki pages the wiki toolbar simply *is* the Wiki group standing open, so there's one bar and one row everywhere. build.py now owns the hand-written nav copies (syncstaticnavs()) — they had quietly drifted into four different versions. Also gated /wiki* behind member login for now.
Rebuilt /wiki from a rendered folder tree into a concept-first knowledge space. The decisive find: 394 of its 713 "dangling" link targets — 3,734 occurrences, two-thirds of the corpus's connective tissue — were mere case/punctuation variants of notes that exist, so link resolution now runs in tiers (exact → glossary alias → unambiguous normalised slug → red link), with every normalised match listed on /wiki/loose-links for tightening at source. New surfaces: hub concepts ranked by inbound links, tag-derived topic pages, a wanted-pages worklist (the 313 titles the club keeps naming but never wrote, each with a start-this-note link), orphans, recent changes, and client-side search — resolved links 6,409 → 10,199, orphans 281 → 87, note URLs unchanged, and the incremental rebuild proven byte-equivalent to a full one by a committed verifier.
Scribe went live: **scribe.worldmachines.org**, an installable phone-first PWA (behind its own Access application, JWT-verified) through which members capture thoughts, book notes, glossary entries and link-notes straight into their raw-notes/ directory as [trivial] commits — no git required. Access provisioning learned to split applications under Cloudflare's 5-destination-per-app cap, MCP joined the site navigation on every page (it was unreachable except by URL), Kyle's contribution-workflow docs merged (#37), and the July DNS-incident handoff PRs (#29, #31) closed as completed history.
Published raw-notes/ as a browsable wiki at /wiki/ — 999 notes indexed by contributor and by book, with resolved [[wiki-links]], backlinks ("linked from"), bylines and source-on-GitHub links on every page; dangling links render as muted text instead of dead hrefs, which is what 4,600 of the 11,000 links in the corpus currently are. Added a /wiki/glossary/ layer where members develop the club's own definitions (raw-notes/commons/glossary/, one term per file, status seed → developing → settled), seeded with *World Machine*, *Legibility* and *Psychohistory*. The generator (website/scripts/build_wiki.py, stdlib only) is deterministic and incremental: wiki-rebuild.yml diffs each push against its base and re-renders only the pages a note change actually invalidates (~0.1s for one note vs ~1s for all 1,000), so Pages re-uploads a handful of files rather than the whole tree.
Shipped member login and closed two auth holes. /api/admin/handles (the contributor registry, emails included) was reachable unauthenticated because the old Access policy covered /admin/* but not /api/admin/*; it now enforces an admin allowlist in-function, fail-closed. Worse, every member endpoint would also accept an email read from the *unverified* CFAuthorization cookie payload — a client-forgeable identity — so identity now flows through one shared library (functions/lib/access.js) that cryptographically verifies the Access JWT when ACCESSTEAMDOMAIN is configured. The Witness/MCP panel gains a real "Sign in" button, sign-out, and self-service token list/revoke; a new scripts/provision-access.mjs creates the members + admin Access applications idempotently from the command line.
Expanded the Evolution guide with a substantial Biology toolkit that teaches DNA, genes, traits, inheritance, populations, variation, selection, drift, and ancestry before the advanced material. Added /evolution/dennett, a wide-ranging 2026 companion to *Darwin’s Dangerous Idea* that connects contemporary evolutionary science with consciousness, agency, culture, AI, meaning, ethics, and a carefully sourced constellation of successors and critics—including explicit World Machines guardrails against historical fatalism and simplistic memetics.
Added **Evolution** to the site navigation and reshaped /evolution/ into an easy-to-browse field reference for the *Darwin’s Dangerous Idea* book club rather than a formal course. The new topic guide opens with a plain-language causal map, lets readers enter by question, moves technical model details behind optional disclosures, improves keyboard/mobile access, and retains simulations, a glossary, and expert sources for deeper dives.
Moved the worldmachines.org registration from Venkat's Cloudflare account to Aneesh's, completing the custom-domain cutover left pending since the July 16 bindings flip. The EPP auth-code route was a dead end — the domain was already at Cloudflare Registrar, so there was no registrar-to-registrar transfer to make and the zone could never leave pending in the receiving account; the working path is Cloudflare's inter-account transfer, which the *source* account initiates and the target accepts within five days. That move carries WHOIS contacts only, so the zone arrived holding stale A/AAAA records Cloudflare had auto-imported from Venkat's proxied DNS — all Cloudflare-owned IPs, which trips error 1000 and took the site down until they were deleted and the Pages custom domain provisioned its own proxied apex CNAME to worldmachines-2rd.pages.dev. Oracle, MCP, and every binding were unaffected: they already lived in Aneesh's account.
Updated the approval-policy workflow so website/ changes can be approved by **either** @aneeshsathe or @vgururao (previously @vgururao only), and added an author-bypass: because GitHub blocks a PR author from approving their own PR, an owner who *opens* a website/ or wiki/ PR now self-clears that gate — otherwise an owner could never merge their own gated PR. Reflects the stack's move to Aneesh's account while keeping Venkat as a co-owner of the site gate. (This PR itself still requires Venkat's approval, since it touches website/ under the current policy.)
Put the Oracle's running costs on the Oracle page. A collapsible "health stats" box above the chat reports questions answered and dollars spent, split web vs MCP, against the hourly/daily spend caps that keep a public Oracle affordable — served by a new /api/stats Pages Function proxying the Oracle worker. The meter fails soft by design: any upstream trouble hides the box entirely rather than showing a broken number, so the chat is never blocked by its own dashboard. Asking a question now refreshes the numbers, and hitting a spend cap returns a plain-language "try again later" instead of an HTTP error.
Consolidated the Oracle-page, MCP, and account-cutover work into one PR (supersedes #17, #20, #23). The Oracle at /oracle is now multi-turn chat with clean citations — [chunk:…] passages collapse into per-book "Sources" chips and concept [[…]] links become explorable buttons, so answers read as prose instead of raw tokens. Adds a public /mcp page (documenting the no-auth Oracle MCP + a gated Witness-token mint via /api/mcp-token, MCPTOKENS KV) and flips the Pages bindings back to Aneesh's account (HANDLES namespace + ORACLEURL → wm-oracle-dev.aneeshsathe.workers.dev); merging is itself the corrective cutover deploy. Also points the "Project Chat" nav link (every page + build.py's template) at the project Discord (discord.gg/tqUFztN3r) instead of the old Zulip server.
Completed the Oracle/Witness stack transfer from Aneesh's Cloudflare account to Venkat's, and reorganized all five project repos into a single worldmachines/ container folder (wm-site, wm-infra, wm-oracle, wm-encyclopedia-kb, wm-feeder). The full deploy: R2 buckets provisioned, catalog workers deployed via GitOps CI, 817 notes synced and embedded into both shared and personal DuckLake catalogs, Witness and Oracle workers stood up with fresh credentials, and PR #15 merged — bringing server-side /api/ask proxy, citation-enabled oracle.html, and the feeder ingest workflow. Oracle is now fully live on Venkat's account at worldmachines.org.
Embedding correctness fix for the Oracle preview: EmbeddingGemma's asymmetric prefixes are now applied on both sides — documents in the notes pipeline (title: … | text: …) and queries in /api/embed (task: search result | query: …). Until now both embedded bare text, costing retrieval quality. Merging triggers a full re-embed of the notes parquet (758 notes) via notes-ingest.yml. Part of the wm-encyclopedia-kb Oracle/Witness (ADR 0002) Phase 1 work.
Three things shipped today. (1) **Full-text library**: new worldmachines-library R2 bucket serves PDFs under public/ (open) and private/ (CF Access JWT gated); article JSON schema gained license and pdfkey fields; resources page shows download badges and dynamically loads a Team Library section for registered members. First document: Darnton's The Business of Enlightenment_ (CC BY), plus a companion supplement of all 1,197 French passages translated into English with page and chapter context (viewable at /supplements/business-of-enlightenment-translations). (2) **Self-service join flow**: CF Access can now be set to allow any email OTP; unregistered users who authenticate see a "not registered" panel redirecting to /join, where they submit a request that creates a GitHub issue with the exact wrangler kv approval command — one admin step instead of two. New /api/me endpoint provides consistent auth state across submit, profile, and library pages. (3) **ADR 0002** (PR #13) proposes how to ingest library books into the Oracle, pending Aneesh's input on retrieval quality tradeoffs.
Added a direct-push inbox flow for submitting new writing without going through the web form or a fork/merge. Contributors add lines to newwritinginbox.md in the repo root (handle | type | url) and push to main; a GitHub Actions workflow ingests the entries, clears the file, rebuilds the site, and deploys — same pipeline as the web form. Also populated the HANDLES KV with all contributor emails (several were missing due to the May 20 binding fix arriving after initial setup) and synced the Cloudflare Access allowlist to match.
Fixed a silent infrastructure breakage: the HANDLES KV binding had been dropped when Aneesh's Oracle commit introduced wrangler.jsonc on May 12, causing the contributors page, submit form, and admin UI to fail silently ever since. Fixed by adding the binding to wrangler.jsonc and manually writing the missing KV entry for Sean Stevenson. Added ARCHITECTURE.md as a full technical reference for the website stack (bindings, deployment, APIs, pipelines), and a proper README.md for the GitHub repo landing page.
Added rebuild.yml GitHub Actions workflow — pushes to devlog.md or blurbs.md now auto-rebuild and deploy the site, no manual build.py or wrangler step needed. Added session wrap-up checklist to CLAUDE.md and a security policy (no credentials in tracked files) to CONTRIBUTING.md. Opened issue #10 proposing wiki generation pipeline and browsing layer options.
Promoted Aneesh's Oracle preview to /oracle — the stub is now the live RAG interface. /notes redirects to /oracle. Oracle is public (no auth gate). Nav updated to include Devlog. Also merged PR #9 (Oracle infrastructure): created R2 bucket worldmachines-notes, applied Pages R2+AI bindings, set up CFAITOKEN/CFR2TOKEN GitHub secrets, ran first notes-ingest (743 notes embedded). Added two raw notes: Prime Radiant and Stigmergic-Verbose Cycle. Opened issue #10 proposing wiki generation pipeline.
Working Oracle preview at /notes: a personal-notes Parquet on R2 with EmbeddingGemma-300M vectors per row, in-browser DuckDB-WASM does cosine-similarity retrieval, Gemma-4-26B answers via a Pages Function — single-voice Oracle output, no citations. tools/notes-pipeline/ uv project builds the parquet (single- or multi-contributor mode). A new notes-ingest GitHub workflow rebuilds and uploads the parquet on every push to raw-notes/. ADR at wiki/decisions/0001-notes-oracle-architecture.md. Page is unlinked from site nav and not at /oracle — that stub stays until Venkat reviews.
Added a "Project Chat" link to the site nav pointing to the Zulip server (worldmachines.zulipchat.com), so contributors can find the chat from any page.
Governance and tooling session. Reviewed and merged Kyle's repo restructure PR; resolved a ruleset conflict where the hard PR-gate was blocking the ingest bot, settling on soft governance (CODEOWNERS and approval-policy workflow active but advisory). Added this devlog page and a devlog-check workflow to flag non-trivial commits that skip the log.
Reorganized the repository for multi-person collaboration. Three zones now: raw-notes/ for per-collaborator working notes, wiki/ for the shared AI-organized knowledge layer, and website/ for the public site. Added CODEOWNERS and an approval-policy workflow enforcing zone-specific review requirements (website PRs need Venkat; wiki PRs need any admin; raw-notes are self-owned).
Metadata backfill. Recovered publication dates for all 22 essays via trafilatura URL extraction, and first-publication years for 31 of 38 books via the Open Library API. Seven books still need manual correction — the API returned edition or translation dates rather than original publication years.
Site structure and contributor tooling. Split content into a blurb landing page, /contributions for member essays, and /resources for the curated reading list. Added self-service /profile editing, a /theory introduction page, and a comprehensive CSS overhaul. Batch-loaded all 60 articles (22 contributions, 38 resources/books).
Project launch. Stood up the full pipeline: Cloudflare Pages hosting at worldmachines.org, Access email-OTP gate for contributors, Pages Functions backed by KV for the handle registry, and GitHub Actions ingest (trafilatura text extraction → build.py HTML generation → Pages deploy).