Building a Local-First CMS for a Static Site

Over the past few weeks, I’ve been building a lightweight, custom admin interface for my 11ty website — a small-but-mighty setup that gives me the flexibility of a CMS without losing the simplicity and performance of static content.

Why 11ty

I love 11ty for how it keeps everything close to the metal. It doesn’t abstract away HTML or force me into a framework — it lets me write Markdown, sprinkle in Nunjucks or shortcodes, and build exactly what I need. But once a site grows past a handful of posts, managing Markdown by hand can get old.

That’s where this project began: how can I keep the static workflow but add the ease of editing and publishing?

The Admin Interface

I wrote a local admin app using Node, Express, and React. It runs at http://localhost:4001, connects to my local content directory, and provides a clean Markdown editor for managing blog entries and pages.

Each post is a Markdown file inside a content folder, so the system remains fully Git-based and deploys statically — no database, no external CMS. With the admin panel, I can preview, edit, and publish without leaving the browser.

Current features:

How It Works

Example content structure:

content/
  posts/
    2025-01-03-local-first-cms.md
  pages/
    about.md
assets/
  images/

Why Local-First

Running the admin panel locally keeps me in control of the content pipeline. There’s no hosted dependency, no login, and no vendor lock-in — just local files, Git, and a small API for talking to the live site when needed.

It feels like the best of both worlds:

What’s Next

Example Front Matter

Here’s the shape I’m standardizing on for posts:

---
title: Building a Local-First CMS for a Static Site
date: 2025-01-03
draft: false
tags: [engineering, cms, 11ty]
description: A lightweight admin interface for 11ty with a local-first workflow.
canonical: https://example.com/blog/local-first-cms
coverImage:
  src: /assets/images/local-first-cover.jpg
  alt: A screenshot of the admin interface in edit mode
  credit: ""
---

Notes and Trade-offs

If you’re happy in Markdown but want less friction, a local-first CMS adds just enough ergonomics without giving up the benefits of static sites.