I killed WordPress and replaced it with a bunch of text files

Here’s the secret to a stress free blog.

4 min read

A while back, I decided I wanted to write a blog. I didn't want it to be anything fancy, just a place to express my thoughts about tech, programming and cybersecurity. I first checked the major blg-building sites - Wordpress, Medium and Substack. Before I could even write a single word, I was bombarded with constant upsells, themes I didn't like, non-removable footer promoting them, and being forced to into a design system of their choosing. Something felt wrong here. I also didn't want to get vendor-locked into using a site that could wipe my work for a "TOS VIOLATION" whenever they felt like it.

I looked at static templates to throw something together quickly, but soon I ran into a problem: I had to keep switching between "writing" mode and "dev" mode due to the templating syntax. What's more, a previous dev deployment turned into an unreadable stack trace due to a misplaced {% endif %} in my jinja2 template, which took me hours to. untangle, even with AI's help.

I also considered PicoCMS, but decided that instead of using an off-the-shelf solution, I could write one myself. It could be a great learning opportunity for me, allow me to sharpen my skills for my upcoming internship, and also flex a little bit.

Why Markdown?

Markdown is the closest thing to raw text, while having structure a machine (and a human) can parse. There is a reason why all the latest AI models are trained to output all their answers using markdown unless instructed otherwise. It is easy to type, easy to read, easy to edit, and easy to massage into a working website. It supports all the formatting you'll realistically need for a blog - bold, italic, underline, and strikethrough. It also supports images, URLs, tables, code blocks, quotes, and much more.

How The Site Works Behind The Scenes

This site's content is driven almost entirely by markdown. There is no support for authors, since I'm the only one. I created a simplistic admin panel since I got tired of creating a new deployment everytime I wanted to post. This admin panel allows me to see a live preview of my markdown. Any additional information can be provided by "frontmatter", or a block of text at the top of the file. I also began to host my files on an R2 bucket so I can write without having to open my editor.

Here's an example:

Markdown
---
title: "This is a normal title"
subtitle: "This is a less normal subtitle"
date: "2025-12-29"
tags: ["A", "list", "of", "tags", "to", "help", "categorize", "posts"]
featuredImage: "" 
---

Yes, it's this page's frontmatter, and yes, this is it. All the smart functionality, tag system, related posts, and more, is driven by this short block. I don't need to process excerpts since that's what the subtitle is for.

Directories and files

Every post lives in a single folder on a Cloudflare R2 bucket: posts/. That's it. I don't do the date-based navigation like 2025/12/29 because it sucks. If the post's date has to change, so does the URL. This stops permalinks from working. Instead, I use the markdown file's filename as the URL slug. It's simpler, cleaner, and also permanent.

Also, my draft handling system is simple: All new posts I create are marked as drafts by default, unless I select "Marked for deployment". When I click deploy, A depoyment is created in Vercel, used to build markdown into static pages.

But this is expensive, right?

Not really. The version of the site you are reading right now uses something called SSG or Server Side Generation. Simply put, all my posts are converted into HTML pages during the build step, so there is no costly compile step and no live translation of posts to pages. This build only takes like 20 to 30 seconds.

The site is blazingly fast and scores almost a 100 on Lighthouse, if you care about that sort of thing.

Security and Privacy Considerations

Not much to write home about. I control 100% of the content on my site, so input validation is not necessary. There are no comment sections to moderate, no user account data to store and manage, no cookies to hand out, and no cookies to hand out.

Tradeoffs

This system seems fine for now, but can start to break once I cross like 500 posts or so. Build times can balloon, and the site can slow to a crawl.

Future Plans

  1. Support RSS/Atom feeds, so you get my latest posts in one convenient place
  2. Newsletter support, in case you prefer to check your inbox
  3. Improve my SEO, so Google actually cares about my blog