Fun Fact: I Built the Custom CMS Powering This Website

Pugmill is an open source CMS I built on Next.js 15, PostgreSQL, and TypeScript, with native answer engine optimization and an MCP server plugin.

Fun Fact: I Built the Custom CMS Powering This Website

Fun fact

This website runs on a CMS I built from scratch. It's called Pugmill, and it's open source. You can grab the code on Github.

What it is

Pugmill is a headless-ready CMS built on Next.js 15, PostgreSQL, Drizzle ORM, and TypeScript. It ships with a native theme system, a plugin architecture, Markdown-first editing, and built-in answer engine optimization.

Plugins extend the core without forking it: an MCP server, outbound webhooks, and AI-powered content generation when a provider is connected.

Why I built it

I wanted a modern stack CMS without the weight of WordPress or the rigidity of typical headless platforms. Pugmill assumes a workflow pairing one human with one AI agent, tested against Claude Code and similar environments. The human sets direction; the agent handles context and execution.

Features work without an AI provider configured. Connecting one adds generation and automation on top.

Native AEO

Answer engine optimization is built into the core, not bolted on through plugins or third-party services. Pugmill ships with:

  • An auto-generated llms.txt file that exposes site structure to AI crawlers
  • Per-post Q&A metadata for direct question answering
  • Bot analytics that separate AI crawler traffic from human and search engine visits
  • Structured data output for posts, pages, and authors
  • Canonical URLs and sitemap generation aligned with AEO conventions

The goal is to make content legible to language models without extra configuration.

Integration features

  • MCP server plugin: Exposes content operations over the Model Context Protocol, letting agents read, create, and update posts through a typed interface.
  • Outbound webhooks: Fire on content events (publish, update, delete) with HMAC-signed payloads. Useful for triggering builds, syncing to other systems, or notifying downstream services.
  • API key management: Per-key scopes, expiration dates, and revocation. Keys are hashed at rest and shown once at creation.

Stack highlights

  • Next.js 15, TypeScript 5, React server components
  • PostgreSQL 16 with Drizzle ORM
  • NextAuth v5 (credentials and OAuth)
  • Tailwind CSS 3, Tiptap 3 editor
  • S3-compatible storage abstraction
  • Public REST API with CORS and pagination
  • Revision snapshots on every save
  • Pre-commit secret scanning

The site you're reading is the proof. Every post, page, and pixel runs through code I created.