Colophon
- 1966 words
- 9 min
This site is my small corner of the web. It is where I write, experiment, and keep a record of things that matter to me.
Michael’s Journal is built from Markdown, generated with Zola, versioned in GitHub, and deployed on Cloudflare Pages. Zola is a static site generator, and Cloudflare Pages supports Git-based deployment workflows for Zola sites, which fits the way this site is published today.
Why This Site Exists
I have been writing online for 25 years this August, a quarter century that has ebbed and flowed, starting with Microsoft FrontPage and Blogger. When Blogger started to feel limited, I moved to WordPress and stayed there for years, but never really felt comfortable with it and eventually left.
After that I returned to Blogger, then found Write.as and later Micro.blog. Micro.blog changed how I think about publishing on the web, and it eventually led me to platforms like Scribbles that I still enjoy using.
Today I still publish across several platforms, including Blogger, Micro.blog, Scribbles, and Write.as. This is a custom-built system, designed with help from Claude and ChatGPT. My Blog Poster CMS lets me post to any or all of them at the same time, unless I decide otherwise.
This site is where everything comes together. It is built with Zola, managed through GitHub, and deployed on Cloudflare Pages, and it is becoming my primary home on the web.
How The Site Is Built
The site is made from a few small pieces working together.
Generator
The site is built with Zola, a fast static site generator written in Rust. Zola generates complete static files, which makes it a good fit for a simple, fast, low-maintenance personal site.
Content lives as Markdown with TOML frontmatter, all tracked in Git. The design started from the Ergo theme and has been customized over time with things like a rotating avatar, an expanded archive view, custom stats pages, an On This Day page, and a blogroll.
Hosting
The site is hosted on Cloudflare Pages. Cloudflare Pages connects to Git repositories and automatically deploys changes when new code is pushed, which matches the way this site is built and published.
Cloudflare also handles DNS, CDN delivery, HTTPS, and related edge infrastructure. At this scale, it remains a remarkably practical setup for a personal site.
Writing and Publishing
Posts begin in Blog Poster, a publishing tool I built for myself. It handles drafts, scheduling, image cleanup, AI-assisted feature image creation, alt text, and deciding where a post should go.
Most of the time, Blog Poster can publish to all of my platforms at once. That means this site is part of a broader publishing flow, not a separate manual process.
When a post is ready for this site, Blog Poster exports it to the repository as Markdown and commits it. From there, GitHub and Cloudflare Pages handle the rest of the build and deployment flow.
POSSE and Syndication
Blog Poster coordinates POSSE, Publish (on your) Own Site, Syndicate Elsewhere, through my Personal Events Poster (PEP) service for Mastodon, Bluesky, Sharkey, Pixelfed, and Nostr. Blog Poster records the syndicated URLs so posts on this site can point back to their copies elsewhere, while this site remains the canonical version.
Town Square
At the bottom of most pages, and on its own Town Square page, there is a small live park where anyone visiting at the same time shows up as a little figure. You can wander around, sit on a bench, and chat. It is a playful bit of real-time presence on an otherwise quiet static site.
The TownSquare server and widget are self-hosted. Its live connection, operational statistics, and moderation data are described fully in the Privacy Policy. If TownSquare goes offline, the rest of the site is unaffected and the empty element hides itself.
Bubbles.town
Bubbles.town is a community-ranked blog discovery service that reads this site's public Atom feed. On eligible post pages, its optional, pinned widget supplies the vote count and a link to the corresponding Bubbles entry. Bubbles does not host or control the Journal or its posts.
Listening
The Listening card on post pages shows what I am playing now and my five most recent listens from my public ListenBrainz profile. When ListenBrainz supplies MusicBrainz cover-art identifiers, the card retrieves artwork from the Cover Art Archive, a joint project of the Internet Archive and MusicBrainz.
Built With
Built with ❤️ using Zola
IndieWeb
The site leans into IndieWeb ideas. Posts include h-entry style markup, the Atom feed lives at /atom.xml, and the JSON Feed lives at /feed.json.
New Webmentions now arrive through a Cloudflare public edge at a receiver I operate. My receiver verifies the source link and sends the event into my self-hosted personal inbox app. webmention.io, the hosted service that handled this job for years, still serves the older mentions that live there, and both sources appear together under each post.
Reactions to the syndicated copies of my posts on Mastodon, Bluesky, Sharkey, and Nostr are gathered by my own engagement sync and mirrored back onto each post here, so the conversation around a post stays visible on the canonical page.
Bridgy Fed makes the public Journal identity and posts available to compatible Fediverse and AT Protocol services. A repository workflow reads the public Standard.site records from Bridgy Fed's PDS and stores the resulting post map with the site, allowing each article to advertise its matching site.standard.document record. Those services provide discovery and interoperability; Michael's Journal remains the canonical source and neither service publishes or edits the Journal itself.
There is also a Gemini capsule at gemini://gemini.michaelreflects.com for readers who prefer the quietest corner of the small web.
In the future, I might implement a webring.
Design Choices
The design is intentionally quiet. I want the writing and images to do most of the work, not motion, popups, or interruption.
The layout stays simple: a readable column, light and dark themes, and semantic HTML. The goal is not to impress anyone with tricks. It is to make the site comfortable to read and easy to maintain, and it takes inspiration from Jim Mitchell's mnml for Micro.blog.
A few pages differ from the rest of the site, including my Twitter Archive page, my Tweets On This Day page, and my Privacy page. All are intentionally designed.
Body text is set in Montserrat, and the post metadata line uses Raleway. I picked them because they work well together and, after a while, stopped seeing any reason to keep fussing with it.
Two details I am especially fond of are the rotating avatar in the corner and the footer counter showing how long the site has been online. Neither is necessary, which is probably why I like them so much.
Privacy
There are no ads or advertising trackers. I prefer a site that feels like a place to read, not a place to be measured. But there are plenty of interaction points, like a water cooler for civil, polite dialogue.
The site uses lightweight Tinylytics and Cloudflare Web Analytics, and the self-hosted TownSquare keeps bounded operational visitor-activity and message-count statistics. The Privacy Policy documents those systems, the third-party resources a browser may contact, and the limited information involved.
On the production domain, the contact link is obfuscated through Cloudflare’s email protection. It works well enough for normal use and makes scraping a little more annoying.
Standards
I would rather the validators be bored than have the site break in small, avoidable ways.
A recent cleanup fixed a number of long-standing HTML and CSS issues, including missing attributes, duplicate values, outdated embed markup, and other small errors that are easy to live with until you finally stop ignoring them.
The validation links below point to live checks for HTML, CSS, feed output, security observations, and the standard.site records that connect posts here to the AT Protocol. They are there partly for transparency and partly because I like being standardized and conforming to established standards.
Credits
This site exists because of the work of other people whose tools made it possible.
- Zola by Vincent Prouillet.
- The Ergo theme by Andrew Plaza, which I have heavily customized.
- Jim Mitchell, whose work on Clodd CMS and encouragement inspired me to keep improving this site.
- Kev Quirk, whose steady, consistent posting has encouraged me to keep showing up and publishing here.
- webmention.io by Aaron Parecki, which received this site's webmentions for years and still serves the older ones.
- Bridgy Fed by Ryan Barrett and Anuj Ahooja.
- Bubbles.town for community-ranked blog discovery and the optional per-post vote-count widget.
- TownSquare by Cauê Napier, the open-source live-presence widget that powers the town square.
- Tinylytics by Vincent Ritter, which powers the lightweight analytics, the kudos hearts, and the footer counters.
- ListenBrainz, which supplies the public playing-now and recent-listen data shown on post pages.
- The Cover Art Archive, a joint Internet Archive and MusicBrainz project, which supplies available artwork for the Listening card.
- Simple Icons, whose logo set appears on the share buttons under each post.
- Dave Winer, whose work on RSS gave the web its feeds and made a site like this one worth following, and Sam Ruby, Mark Nottingham, and Robert Sayre, whose work with the IETF community produced the Atom format this site publishes.
- JSON Feed by Brent Simmons and Manton Reece, the other feed this site publishes.
- Cloudflare Pages for hosting and deployment.
- The wider IndieWeb community for continuing to keep the small web alive. Special mention goes to Manton Reece of Micro.blog and Vincent Ritter of Scribbles.page, whose IndieWeb principles helped guide the structure of this website.
- AI, including ChatGPT, Claude, Codex, and other cloud or local AI models, helps me maintain this site for full transparency, but it does not publish any content that is not made by me. These tools help with theming, maintenance, editing, proofreading, alt text, and feature image creation. But I cannot stress this enough: they make no posts of their own. All posts are mine and mine alone.