Skip to main content
A flat-file blog engine that grew an admin panel, a media library, a photo gallery with real EXIF data, and a graph connecting all of it together.

The Short Version

Everything you're looking at right now — this post, the photos, the games log, all of it — is Markdown files sitting in a folder on a server I pay for myself. No database, no CMS-as-a-service, no monthly bill for the privilege of owning my own words. Just PHP reading .md files with a bit of YAML frontmatter on top, and a home-built admin panel so I don't have to SSH in and hand-edit files every time I want to post something.

It started as the simplest possible thing that could work. It did not stay that way, and I regret nothing.

The Editor

The admin panel used to be the part of this site I was least proud of — a form that was always on screen whether you needed it or not, wasting half the width next to a sidebar that never collapsed. It's been rebuilt from the ground up:

  • Picker first. Landing in the editor shows a real overview of everything you've written — searchable, filterable by draft status, one click to delete, one click to start something new — instead of an empty form nobody asked for.
  • Fullscreen when it matters. Pick a post and the sidebar tucks itself away, handing the whole screen to the thing you're actually trying to write. It remembers whether you had it open or closed, so it doesn't fight you on every single post.
  • It doesn't get in the way. Markdown toolbar, split-view live preview, autosave that survives a closed tab, drag-and-drop image uploads, a social-preview card so I stop finding out my og:image is broken after I've posted the link. There's even a button that reads a draft and suggests tags for it, which is either the AI helping or the AI quietly judging my writing — hard to say.

The Media Library

Photos, uploaded media, "collected" items, and posts all live behind one shared picker component, so inserting an image into a post or linking to something I collected uses the exact same interface no matter where you're doing it from. Drag a photo in and it gets its GPS-derived location, its camera EXIF, its color palette, all pulled out automatically — I don't type any of that by hand.

The Photography Page

The gallery isn't just a wall of thumbnails. Open any photo and you get the actual EXIF off the file — camera, lens, aperture, shutter speed, ISO — laid out like a proper photography site instead of buried in a right-click-properties dialog somewhere. Photos with a location attached link out to an actual map. It's the difference between "here's a picture" and "here's a picture, and here's where I was standing and what my camera was doing when I took it."

The Part I'm Actually Proud Of: Connections

None of the content on this site exists in isolation. Write a blog post that mentions a game, and if that game is sitting in my collected list, the post links to it — and the collected entry links back. Tag a photo with the same thread as a blog post and they'll surface each other as related. It's a small content graph running quietly in the background, built specifically so that clicking around this site feels like wandering through one connected place instead of hopping between disconnected pages that just happen to share a domain.

That was the actual design goal, if there was one: make this feel like somewhere worth moving into, not just a folder of files with a nice font.

Under the Hood

  • PHP + Markdown, no database for content — everything's a file, everything's in git.
  • Self-hosted on a box I administer myself, deployed with a couple of rsync scripts instead of a CI pipeline that costs more than the server does.
  • Type-colored throughout — every content type (blog, portfolio, photos, collected) has a consistent accent color, used sparingly on borders and structure, never smeared across the text itself.

It's still, at its core, just Markdown files in a folder. I just stopped being embarrassed about how much is holding that idea up.