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.

Session Log

February 2026 — Extraction and Foundation

  • Wrote extract.py to parse the WordPress XML export into per-post .html files with YAML frontmatter. Extracted 1,133 posts, 45 pages, 1,021 comment sidecar files.
  • Wrote the initial build_site.py: post pages at /YYYY/MM/DD/slug/, series index pages, author archive pages, full archive, homepage, CSS/JS, _redirects.
  • WordPress artifacts stripped at build time: Gutenberg block comments, <!--more--> tags, Amazon rcm iframes, tracking pixels.
  • Image URLs rewritten from ribbonfarm.com/wp-content/uploads/ to R2.
  • Wrote upload_media_r2.py for idempotent rclone-based media sync to R2.
  • Built a link graph pipeline (mine_links.py, compute_graph.py): 2,773 internal link edges, PageRank scores, interactive D3.js visualization. (Later archived — the 921-node graph was too dense to be useful.)

April 2026, Sessions 1–2 — Content Cleanup and Hardening

  • Ran a full content audit (audit_content.py): 184 dead trailmeme links, 26 dead images, 8 broken PDF links, 276 broken internal page links flagged.
  • Applied corpus-wide formatting fixes: bold/underline pseudo-headings promoted to real <h2>/<h3> (149 fixes across 39 posts), [caption] shortcodes → <figure> (97 posts), [embed] shortcodes → iframes (8 posts), wpautop paragraph spacing, TinyMCE artifacts removed.
  • Wrote test_pipeline.py: 61 tests covering all content transforms.
  • Reviewed all 45 WordPress pages against a kept-pages list; expanded from 9 to 14 published pages.
  • Built external prominence pipeline: extracted pingbacks from the WordPress XML (302 posts, 1,215 pings), fetched Hacker News and Reddit mentions (41 posts each), computed composite influence scores. Used for "Most influential" archive sort and post-page coverage notes.
  • Moved Static Site into its own private git repo (github.com/vgururao/ribbonfarm-site).

April 2026, Sessions 3–4 — Tagging, Clustering, and Navigation

  • Tag vocabulary design: Read a sample of posts and iterated on a controlled vocabulary, balancing coverage against overlap. Final vocabulary: 120 tags. Tags are thematic (e.g., systems-thinking, narrative, economics) rather than keyword-based, designed to be useful for browsing rather than search.
  • Tagging runs: Two full tagging passes were run. The first (72-tag vocabulary) used the synchronous API at full price — ~$26. After expanding the vocabulary to 120 tags, a second full pass was submitted via the Batch API at 50% discount — ~$18. A third Batch API pass synthesized the glossary definitions — ~$5. Total API spend to date: ~$43. The Batch API submits all requests asynchronously and returns results within 24 hours — practical for a one-time corpus-scale task.
  • Tag rollup: After tagging, manually reviewed low-frequency tags. Over two cleanup passes, reduced the vocabulary from ~160 effective tags down to 100 by merging singletons and low-count tags (minimum 15 posts per tag) into their nearest covering tag. One rename: cloudworkingfree-agency.
  • Cluster detection: Built a tag co-occurrence graph (edges weighted by number of posts sharing two tags). Ran Louvain community detection at resolution 2.0 to find 15 thematic clusters — groups of tags that tend to appear together. Two earlier attempts with label propagation produced degenerate results (one giant cluster); Louvain at the right resolution gave clean, interpretable groupings. Clusters were given descriptive names manually.
  • Lexicon synthesis: A second Batch API pass asked Claude to synthesize a definition for each term that appears across Ribbonfarm posts with some consistency — terms coined by the blog or given special meaning. Prompt was structured to produce dictionary-style entries grounded in actual usage across the archive. Output: 344 definitions. Total additional cost: ~$5.
  • Pages built: /clusters/ (index + 15 individual cluster pages, each listing member tags and all tagged posts), /glossary/ (alphabetical, configurable frequency filter, suppress list for overly generic terms), /tags/ (wordcloud2.js canvas word cloud with log-compressed sizing + alphabetical list).
  • Restructured navigation: added an Explore dropdown (Series, Clusters, Glossary, Tags, Bibliography).
  • Merged the old About and History pages into a single /history/ page with sections: Timeline, Design History slideshow (22 Wayback Machine screenshots), Maps, The Name, Taglines.
  • Centralized all page blurbs in data/page_blurbs.md — a single editable file read at build time, supporting Markdown formatting and template variables.

April 2026, Sessions 5–9 — Bibliography, Homepage, and Polish

  • Built build_bibliography.py: scanned all 1,133 posts for Amazon affiliate links, academic URLs, and frequently-cited external links. Output: 616 books, 95 papers, 79 essays.
  • Wrote enrich_bibliography.py: fetched canonical titles for papers via arXiv, CrossRef, NCBI, and for books via Open Library's ISBN lookup. Fixed 94 of 116 bad-title book entries; removed 13 non-book entries (Amazon help pages, games, expired links).
  • Expanded homepage Essential Posts from 28 to 73 (28 Venkat + 45 guest), sorted oldest-first. Added a Highlights Tour series page with the full 73-post set in chronological order.
  • Archive improvements: default sort set to "Oldest first"; within-year sort fixed; "Most discussed externally" sort option added; author attribution moved inline.
  • Glossary: bold terms, inline post-list expansion on click.
  • Multi-series navigation fixed: posts in multiple series (e.g., a post in both Highlights Tour and Worlding Raga) now show separate nav blocks per series.
  • Tag rollup: reduced vocabulary from ~160 tags to 100 (minimum count: 15) by manually merging low-count tags into their nearest covering tag.
  • Dead essay links in bibliography: 9 marked with "(dead link)"; 2 essays by Gregory Rader (onthespiral.com) noted as unrecoverable pending contact with the author.

April 2026, Sessions 10–11 — Content Fixes, Redirects, and History

  • Fixed 54 broken post-to-post links caused by a WordPress permalink artifact (doubled date paths like /2011/12/31/2011/12/31/slug/).
  • Fixed 276+ broken internal page links: added contact stub page, rewrote all /now-reading/ links to /bibliography/, documented 7 missing PDFs as a manual to-do.
  • Added /contact/ page (stub: "contact via venkateshrao.com"), resolving 40 inbound links.
  • Added /nfts/ page (restored from archive).
  • Added Refactor Camp section to /history/: a year-by-year narrative (2012–2019) and an 8-frame photo/poster slideshow using the same component as the Design History section.
  • Added redirects for all Refactor Camp year variants (/refactor-camp-2012/ through /refactor-camp-2019/) → /refactor-camp/.
  • Added redirect: /tempo/*https://books.venkateshrao.com/tempo/.
  • Added bitrot warning box to 30 posts containing dead trailmeme links.
  • Stripped all Skeletor (the blog's former cat mascot) links and images from 4 posts; excluded the Skeletor page from the build.
  • Removed dead Livestream embed from one post; replaced with a "(no longer available)" note.

April 2026, Sessions 12–13 — Author Attribution and Link Cleanup

  • Author attribution: Resolved all 31 posts previously attributed to a generic "Guest" handle — each reassigned to the actual author's named handle, with display names added. The archive author dropdown was narrowed to contributors with 3 or more posts.
  • Author index: Built /authors/ page listing all 60 contributors with post counts, sorted by volume.
  • Tempo Blog merge: The 137 posts from the Tempo book blog (originally a companion site to the 2011 book, later folded into Ribbonfarm) were attributed to a separate "Tempo" handle. These were merged into Venkat's author page, bringing his total to 891 posts. Series identity is preserved via a static slug list so the Tempo Blog series page still works.
  • Trailmeme link cleanup: Trailmeme was a link-curation tool Venkat built at Xerox (2009–2011). Many early posts linked heavily into Trailmeme trails, all of which are now dead. Audited all 31 flagged posts: stripped dead links from 27 (keeping anchor text), leaving 4 with a bitrot warning where the linked content was too integral to remove cleanly. One post (Safar aur Musafir) had 13 song links replaced with verified YouTube URLs from official label channels.

April 2026, Sessions 14–15 — Statistics, Comments, and Explore Expansion

  • Built /stats/ page: wrote build_stats.py to compute site-wide statistics, and a Chart.js rendering layer (static/stats-page.js) for three charts — posts by year (stacked bar by author type), cumulative words (line), word-count distribution (bar). Also includes five ranked tables: top posts by comments, top linked, top commenters, top tags, and top authors. Added median reference lines to distribution charts.
  • Built /comments/ page: lists all 1,175 commenters with two or more comments, sorted by comment count, with collapsible per-comment links to the original discussion anchor.
  • Added "Most commented" sort option to the archive (using comment counts computed at build time).
  • Built /for-researchers/ stub page: a placeholder landing page for internet historians and researchers interested in the archive data, under the Explore nav.
  • Planned the post-launch backlog in detail: comment analysis pipeline, blog neighborhood map, Twitter mention map (blocked on ~$5k API cost), press mentions map, and search. Documented lost signals (Digg, StumbleUpon, Technorati, Delicious, Google Analytics, Feedburner, Jetpack) — data that would have been useful but is unrecoverable.

April 2026, Session 17 — Comment Scoring Pipeline and Blog Neighborhood Map

  • Commenter identity resolution: Wrote build_commenter_map.py to parse the WordPress XML for email addresses (stored as SHA-256 hashes — never written to output) and group commenters by email. Found 410 confirmed alias merges across 11,925 comments. Output: data/commenter_aliases.json.
  • Comment scoring pipeline: Wrote analyze_comments.py — a multi-phase pipeline to score all reader comments for quality (1–5), tone (−2 to +2), and substance (1–5) using the Claude Batch API. Pre-computed structural signals (thread depth, reply count, Venkat-replied flag, word count) for all 11,924 approved comments. Submitted 11,895 comments to the Batch API in two jobs (Sonnet, ~$21, ~7-hour turnaround). Once results arrive: collect → score → heat → rebuild adds a "Hottest discussion" archive sort and a /comments/archive/ page.
  • Blog neighborhood map: Wrote build_blog_neighbors.py to aggregate the 1,215 inbound pingbacks across 669 unique external domains, run HTTP liveness checks on each (alive / dead / parked / redirected), and query the Wayback Machine CDX API for the last successfully archived date of dead domains. The build script is resumable (skips already-checked domains) and saves incrementally. The /neighbors/ page shows a CSS Gantt timeline (active span per domain, colored by status) and a full neighbor table. Archive gets a "Cited by blogosphere" sort option using distinct-source-domain counts per post.
  • Bibliography cleanup: Fixed bad anchor-text title ("Ben" → Bad Pharma by Ben Goldacre); corrected a duplicate amzn.to link for Astounding by Alec Nevala-Lee; moved 5 academic PDFs (Baumeister, Ericsson, Sosis, Peterson, Ainslie) from the essays section to papers. Papers: 51 → 56; essays: 75 → 70.

April 2026, Sessions 18–19 — Comment Analysis Complete and Bibliography Enrichment

  • Comment analysis pipeline complete: Collected Batch API results, computed per-comment scores (quality 1–5, substance 1–5, tone −2 to +2), and aggregated per-post heat scores. Built /comments/ page ranking all 1,175 commenters with two or more comments by weighted quality score, with collapsible per-comment links. Built /comments/archive/ page listing the highest-scoring individual comments, filterable by quality threshold and tag.
  • Bibliography enriched from comments: Added 130 books and 36 papers and essays surfaced from the comment threads — resource mentions made by readers over 17 years. Added a Source filter to the bibliography page to view post-cited and comment-cited entries separately.
  • Blog neighborhood map: The /neighbors/ page went live with liveness data for all 669 domains. Demoted from the main Explore nav to the For Researchers page — a useful research resource but less central to casual browsing.

April 2026, Sessions 20–21 — DNS Cutover and Subdomain Cleanup

  • DNS cutover (April 19, 2026): ribbonfarm.com now serves the static site on Cloudflare Pages. The domain moved to Cloudflare nameservers; ribbonfarm.com was added as a custom Pages domain. Image URLs were switched from the R2 dev domain to media.ribbonfarm.com, which was activated as a Cloudflare R2 custom domain. Google Search Console property added; sitemap submitted.
  • www redirect: Fixed a redirect misconfiguration — adding both apex and www as Pages custom domains caused an apex→www redirect (wrong direction). Resolved by removing www from Pages custom domains and replacing it with a Cloudflare Redirect Rule pointing www.ribbonfarm.comribbonfarm.com.
  • Subdomain cleanup: studio.ribbonfarm.com, school.ribbonfarm.com, and consulting.ribbonfarm.com were each configured in Cloudflare with appropriate redirects, handled natively without any additional GitHub infrastructure.

April 2026, Sessions 22–24 — Launch, WPEngine Wind-Down, and Roadmap

  • Percent-encoded slug bug fixed: The post ε/δ Thinking (2022-09-16) was returning 404 because WordPress stored its slug as percent-encoded ASCII (%ce%b5-%ce%b4-thinking), which the build wrote as a literal directory name with % characters. Cloudflare Pages decodes incoming URLs before looking up files, so it couldn't find the directory. Fixed by adding unquote() to post_url_from_slug_and_date() — safe for all slugs, a no-op on ASCII. This was the only percent-encoded slug in the archive.
  • Favicon added: No favicon existed; browsers were alternating between a stale WordPress favicon (cached) and a 404. Generated favicon.ico (16px + 32px), favicon-32x32.png, favicon-16x16.png, and apple-touch-icon.png (180px) from the square Ribbonfarm logo (GraceWork/Ribbonfarm Logo Update/Square Logo/ribbonfarmsquarered300dpi.png). Added <link> tags to every page; files copied to build by the static assets step.
  • OG default image fixed: The default og:image was redfull.png (5640×300 — wrong shape for social cards). Generated static/og-default.png (1200×630) by centering the square logo on the site's #fafaf8 background using pure-Python PNG compositing. All pages now use this as the fallback social card image.
  • Copy editing pass: Rewrote for-new-readers.html (reframed as archive, updated ages section tenses, converted absolute URLs to relative, replaced dead Now Reading reference with /bibliography/); updated you-are-here.html and the-rust-age.html image URLs from old WP domain to media.ribbonfarm.com; removed stale Bitcoin donation text from sponsor.html; expanded contact.html; added sessions 18–21 to this dev log; expanded the History page blurb in data/page_blurbs.md.
  • Copywriting task list: Created copywriting_tasks.md cataloguing all remaining copy work — creative tasks left for Venkat (history timeline, homepage blurb polish, Refactor Camp photos, for-researchers expansion).

April 2026, Session 23 — Directory Reorg and WP Archive Relocation

  • Directory reorg: Moved the static site project into Publishing/ribbonfarm_site/ and renamed the book pipeline project to ribbonfarm_books/. Updated all path constants in build_online_book.py, extract.py, seed_book.py, seed_series_books.py, seed_guest_folders.py, vgr-books/sync.py, registry.json, and five CLAUDE.md files.
  • WP archive relocation: The source materials (WordPress XML, MasterArchive, Media library, Reference) were moved from ribbonfarm_books/ into this project, where they belong — the book pipeline only needed derivatives. An offsite backup (~1.5 GB, locked read-only) was created at Dropbox/Archives/ribbonfarm-wp-2026/.
  • Roadmap documented: Archived the old CLAUDE.md and status.md from the build phase; wrote clean replacements with a three-track roadmap: Track 1 (site finishing → ossification), Track 2 (AI layer), Track 3 (IPFS permanent archival).

April 2026, Session 24 — WPEngine Cancellation and Transition Monitoring

  • WPEngine cancelled: Cancellation submitted April 22, 2026. Account remains active for ~29 days (expires ~May 21). DNS has been fully on Cloudflare since April 19; WPEngine is no longer in the data path. The site cost $1,200/year on WPEngine's annual Growth Plan plus occasional overage charges — approximately $1,500/year total. Cloudflare Pages serves the same traffic on the free tier. The migration pays for itself within weeks.
  • Transition monitoring: Set up a weekly automated health check running every Monday at 9am PT through May 18. Checks DNS integrity, Cloudflare serving headers, six key page URLs, the www redirect, the media CDN, and the WPEngine hostname (to confirm the old install goes offline after the account expires).
  • Analytics archived: Exported six months of WPEngine traffic data (October 2025 – April 2026) as CSVs and captured dashboard screenshots from both WPEngine and Cloudflare at the handover moment. Archived to data/analytics/. WPEngine baseline: ~9,000 visits/day (75–85% bots); notable viral spike March 10, 2026 (~38,000 visits, 4× normal). Cloudflare first-day peak: ~20,000 unique visitors on April 20 (first full Monday on the new platform).
  • CF domain status fixed: The ribbonfarm.com custom domain in Cloudflare Pages was showing "Inactive (error)" — caused by a manually-created CNAME that blocked Pages from completing its verification. Fixed by removing the record and re-adding the domain through the Pages UI, which creates the DNS record automatically.
  • vgr_zirp: Created a stub project for a combined AI layer over the full ZIRP-era output: 1,133 Ribbonfarm posts and ~153,000 tweets from the Twitter archive. Each source project will build its own AI oracle independently; vgr_zirp will combine them into a unified ghost-of-author system, inspired by the soul.md identity-transfer framework. Sequencing: ribbonfarm oracle first, then twitter archive oracle, then the merge.

April 2026, Session 25 — Analytics Review and Logo Fix

  • Traffic analytics: Reviewed Cloudflare traffic for the first full week post-launch (April 20–26): 1.09M total requests, ~155k/day average, declining from a 184k peak on the first Monday. Cache rate ~1.4% by request count (normal for Cloudflare Pages — HTML is intentionally not cached; only static assets like CSS/JS are cached). Bandwidth cache rate was 22% in the launch week. Semantic search had 58 Worker invocations across the week (~8/day) — negligible relative to total traffic.
  • Core Web Vitals: Reviewed the CF web vitals report for April 20–27: LCP 93% good, P50 499ms, P75 1,020ms, P99 10,116ms. The logo (redfull.png) was identified as the primary LCP element on most pages.
  • Logo fix: The site logo had two problems — its warm cream background didn't match the page background (#fafaf8), and the source file was a 5640×300px, 642 KB image being displayed at 64px CSS height. Fixed by generating a pre-processed web copy at static/redfull.png: background removed via luminance threshold (soft-edged for anti-aliasing), cropped to the text area (1900px wide), resized to 811×128 (2× retina). 642 KB → 155 KB. Added fetchpriority="high" and explicit dimensions to the img tag to prevent layout shift. The GraceWork master is untouched; the build sources from the pre-processed copy.
  • Analytics snapshot system: Created data/analytics-snapshots/ and file_analytics.py — a script to file dropped screenshots and PDFs from the project root into the archive with a consistent name. Handles the macOS narrow no-break space (U+202F) that appears in screenshot filenames before "AM"/"PM" and silently breaks shell glob and pathlib.
  • _routes.json removed: The build was generating a _routes.json intended to prevent Cloudflare Pages from intercepting the search API path. It was inert (no Pages Functions are deployed) but semantically wrong — the missing include field implies include: [/*], which would silently route all traffic through Functions if any were ever added. Search Worker routing is correctly handled by wrangler.toml.

April 2026, Session 26 — Refactor Camp Page and History Overhaul

  • Refactor Camp page: Built a full dedicated page at /refactor-camp/ with a 45-slide photo slideshow (7 year-transition title cards + 38 photos across all seven editions) and a year-by-year visual timeline with per-year blurbs, post links, and photo thumbnails. The slideshow uses the same component as the Design History section but extends it to support mixed <img> and <div> children — the title cards display year, venue, and theme on a dark background as full-frame slides.
  • Photo gathering: Converted 32 HEIC photos from the 2019 edition to JPEG. Brightened the dark 2012 and 2013 event posters (PIL 1.7× brightness, saved as -bright.png variants). Downloaded two video frame grabs from the 2018 YouTube archive using yt-dlp and ffmpeg. Added five phone photos from 2018 found in downloads. For 2016 (the online-only edition), found two Zoom talk screenshares already in the media library: Michael Costigan's Funny Money and Jordan Peacock & Sam Penrose's The Weirding — actual presentation slides from the Zoom sessions.
  • History page restructured: The Refactor Camp section moved from the bottom of the History page to just after the main timeline — more logical placement. The long narrative blurb was replaced with a single sentence linking to /refactor-camp/. All seven RC editions were added to the timeline itself with venue and theme for each year.
  • Editable blurbs: Per-year blurb stubs added to data/page_blurbs.md (keys refactor-camp/2012 through refactor-camp/2019) for easy copy editing without touching the build script. Each year's timeline entry links to related posts (announcements, recaps, wrap-ups, post-mortems).
  • Bug fixes: The title card slides were invisible on first load due to two separate bugs. First, the CSS rules for .rc-slide-header.active used double-braces ({{ }}) in a plain string, not an f-string — browsers received invalid CSS and the opacity: 1 rule was never applied. Second, unlike <img> elements which had explicit width: 100%; height: 100%, the <div> title cards only had inset: 0 — some browsers don't stretch absolutely-positioned non-image elements to fill their container from inset alone.
  • Errata documented: Created plans/errata.md and plans/recover-tempo-blog-posterous-posts.md to document known missing content: four diagram images originally on tempobook.com (unrecoverable without original source files) and sixteen posts from a 2011 Tempo book tour blog hosted on Posterous (images gone since Posterous shut down in 2013; posts deleted from the archive; restoration depends on finding original photos).

April 2026, Session 27 — Roadmap Audit, GP Book Callout, Homepage Spotlight

  • Roadmap audit: Corrected several items incorrectly marked as pending. PDF links were resolved in session 26 (6 PDFs recovered from the Media library and staged to R2; 1 dropped). LLM plaintext dumps (/llm/<slug>.txt) had been live since an earlier session (1,117 files). The blog neighborhood map (/neighbors/) had been live since sessions 17–18. The dead Livestream embed had been handled in sessions 10–11. The tempobook.com image recovery (81 of 105 images found in the Media library and staged to static/media/) was documented as session 26 work. Stripped the last ebook promo banner (gpbanner.png) from the Gervais Principle genealogy post; confirmed all other GP posts clean.
  • Gervais Principle book callout: Added all 8 Gervais Principle series posts to data/book_posts_extra.json. The existing book callout component now renders a "Collected in The Gervais Principle →" card with cover thumbnail on each post in the series, linking to books.venkateshrao.com.
  • Homepage Spotlight box: Added a weekly-rotating featured post above the essential posts list. Picks randomly from all 73 Highlights Tour posts (36 Venkat, 37 guest) using an ISO year+week seed — consistent within a build, rotates each week. Implemented as a <fieldset>+<legend> so the word "Spotlight" sits embedded in the top border frame. Title uses post year in parentheses; meta shows author only (no date); excerpt is pulled from the opening lines of the post body (240 chars) rather than the generic highlights blurb. "Read →" link appended after the ellipsis. Styled to match post typography throughout: Palatino title at accent color, small sans meta, Palatino body excerpt.
  • Working copy migration plan: Documented a proposed architecture improvement in plans/working-copy-migration.md. The current build applies several transforms to post bodies on every build (WP block comment stripping, URL rewriting, shortcode rendering, etc.) that could be applied once as a permanent migration to a v2 working copy. The plan defines a principled partition: Bucket A (content transforms that produce identical output every build — collapse into migration) vs Bucket B (dynamic injections from separate data files — stay in build script permanently). Key open question before implementing: whether to drop or preserve --local preview mode.
  • Homepage roadmap expanded: Added four new sub-tracks under homepage showcase improvements: museum entrance blurb rewrite, pointer to current work, two-column essential posts improvements, and visual flavor options.

Where We Are Now

  • Domain: ribbonfarm.com — live on Cloudflare Pages since April 19, 2026. WPEngine cancelled April 22, 2026.
  • Hosting cost: $0/year (Cloudflare Pages free tier). Previously ~$1,500/year on WPEngine.
  • Posts: 1,133 (2007–2024)
  • Static pages: 16
  • Series: 30 (+ index)
  • Authors: 60 (+ individual archive pages; Venkat: 891 posts)
  • Thematic clusters: 15
  • Glossary terms: 344
  • Tags: 100 (min 15 posts each)
  • Bibliography: 746 books, 68 papers, 94 essays (post + comment sources)
  • Comments: 11,924 reader comments scored; commenter rankings and best-comments archive live
  • Blog neighbors: 669 domains checked; /neighbors/ page live
  • Semantic search: Live at /search/ — 1,132 posts embedded via Voyage.ai voyage-3, stored in Pinecone, queried via Cloudflare Worker
  • Logo: Transparent background, cropped to text area, 811×128 (2× retina), 155 KB (down from 642 KB). fetchpriority="high" set — LCP element loads first.
  • Refactor Camp: /refactor-camp/ live with 45-slide slideshow, year-by-year timeline, per-year post links, and editable blurb stubs
  • Homepage: Spotlight box live — weekly-rotating featured post from the 73-post Highlights Tour, with opening-lines excerpt and "Read →" link
  • Ahead: Homepage improvements (museum entrance blurb, current work pointer, two-column redesign, visual flavor); Pagefind search; AI oracle (Track 2); IPFS archival (Track 3)