Colophon

This site is called rommy.blog. It is a personal blog.

The pages are plain HTML, generated by a Node.js build script. No framework, no bundler, and no npm dependencies at runtime. Content lives in a Cloudflare D1 database — Writing posts, drafts, Reading, Sharing, and the current Thinking blurb (text plus an optional photo). The build script reads D1 at deploy time and writes out static HTML. Source code is on GitHub. The site rebuilds on every push and is hosted on Cloudflare Pages (it previously ran on GitHub Pages). A scheduled GitHub Action also hits a Cloudflare deploy hook once an hour as a safety net.

Editing happens in a password-protected admin UI. A Cloudflare Worker handles the API: it writes to D1, uploads photos to R2 (public bucket) for both Thinking and Writing, cross-posts Thinking to Micro.blog via Micropub, and cross-posts to Bluesky when configured. Thinking accepts optional text and an optional photo (icon picker). Writing uses Quill: insert images from the toolbar, keep typing in the same paragraph so text wraps, then click a photo to show controls below the toolbar — Left, Right, Center, Full, or Delete. On save, the Worker and build script merge image-only paragraphs with the following paragraph so floats render correctly in static HTML. Drafts and explicit Save draft; published posts keep a version history in D1. Saving Thinking triggers a Pages rebuild via deploy hook (and a delayed second rebuild so the archive can catch up with Micro.blog).

Photos are served from R2 at full size on rommy.blog and Micro.blog (up to 5 MB). Bluesky receives a compressed JPEG when the original exceeds 2 MB. Portrait-oriented photos default to half width on the site; click once to enlarge, again to shrink back (Thinking and Writing).

The homepage Thinking section comes from D1 (including R2-hosted images). The Thinking archive and per-post pages are built from Micro.blog’s JSON feed at deploy time, so older notes and their HTML (including images hosted on Micro.blog) stay in sync with the timeline there. URLs in Thinking notes are plain links on rommy.blog — no embedded preview cards on the site itself.

When someone shares a rommy.blog URL elsewhere (iMessage, Bluesky, and so on), the build script emits Open Graph and Twitter meta tags: Writing posts use the summary and the first in-post image when available; Thinking permalinks use a text snippet and the first image in the note, with a favicon fallback.

The design is intentionally minimal — warm off-white, a single typeface (Inter), and photos where they belong (Thinking and Writing). Dark mode is toggled in the footer and remembered between visits. Aside from theme toggle, archive “load more,” and the portrait photo expand/collapse, there is no client-side framework.

Reading is a running log of books, linked to Bookshop.org. Sharing is a linklog. The Changelog is generated from Git commit history. Dates on the site display in US Eastern time.

Visitor analytics use Google Analytics 4. There are no comments and no tracking pixels beyond that. The contact form is handled by Formspree.

Source code is MIT licensed on GitHub. Built and maintained with the help of Cursor.