A build log for this site — how it was made, what changed, and where things stand. Written for readers curious about the process, and as a reference for future maintenance.

Where We Started

  • Ribbonfarm ran as a WordPress blog from 2007 to 2024 — 17 years, 1,133 posts, 13,258 comments, 60 contributors (32 WordPress accounts, many bundled under a shared "Guest" handle).
  • The blog was retired in late 2024. The goal: preserve everything as a permanent static archive and redirect the domain here, with no server-side processing.
  • Source materials: a 527,000-line WordPress XML export (February 2026), a full media library (6,878 files, 1.1 GB), a complete MySQL database dump, and the original WordPress theme files for CSS reference.
  • All source materials are kept read-only. Nothing was regenerated from scratch; all work was done on editable copies.

The Approach

  • A custom Python static site generator (build_site.py) written from scratch. No Jekyll, Hugo, or other framework — direct control over every output file.
  • Content format: each post and page is a .html file with YAML frontmatter + original HTML body. Non-lossy: nothing was stripped that couldn't be reconstructed.
  • Images served from Cloudflare R2 (media.ribbonfarm.com), not bundled into the static build.
  • Hosted on Cloudflare Pages (direct upload, not git-connected CI).
  • Work done in iterative sessions with Claude (Sonnet): build → review → fix → deploy. Each session tackled one area at a time.
  • The build is fully reproducible from source. A "rebuild from scratch" procedure is documented in CLAUDE.md.

Where We Are Now

The site launched in April 2026. The static archive is complete and stable. A second layer — an AI-powered oracle called vgr_zirp — has been built on top of it and is actively evolving.

The Archive

  • 1,133 posts, 45 pages, 13,258 comments, 28 series, 32 authors — fully rendered as static HTML.
  • LLM-friendly plaintext dumps at /llm/<slug>.txt for all posts. llms.txt and robots.txt at site root.
  • A blog neighborhood map of 669 domains that linked to or were linked from Ribbonfarm, with a CSS Gantt timeline of their active years.
  • Post metadata: tags (120-vocabulary), Louvain clusters, external prominence scores (HN, Reddit, pingbacks), comment heat.
  • Each post and series links to vgr_zirp for deeper discussion.

vgr_zirp — the AI layer

  • Retrieval-augmented generation over the full Ribbonfarm corpus: 1,132 posts, the complete Twitter archive (2007–2022), and published books (Tempo, Be Slightly Evil, Breaking Smart, Art of Gig). Also indexes 4,175 high-quality reader comments.
  • Embeddings via Voyage AI; vectors in Pinecone; inference via Claude Sonnet. Deployed as a Cloudflare Worker.
  • Multi-turn conversation, bookmarkable URLs, transcript sharing (public or private, encrypted at rest).
  • Shared public transcripts indexed at /vgr_zirp_chats/, automatically titled and classified by conversation type (Consulting, Advice, Content Deep Dive, etc.).
  • Also accessible via MCP at ribbonfarm.com/mcp for use in Claude Code and Claude Desktop.
  • A private session logbook stored on-device (never on servers) lets users save and revisit their own conversations.

Search

  • Semantic search at /search/ across blog posts, Twitter archive, books, bibliography, and reader comments — with separate tabs per corpus.

Session Log