I cobbled together PubEngine because I was tired of choosing between bloated CMS platforms and static site generators that require a PhD in configuration. I wanted something fast, simple, and actually enjoyable to use. So I made it and now it runs this very site at eringen.com.
The Philosophy: Three Core Goals
1. Simplicity Above All
One binary. One SQLite database. No Docker containers to wrestle with, no plugin ecosystems to navigate, no build pipelines that take longer than writing the actual post.
PubEngine is built with Go, HTMX, and SQLite technologies that are boring in the best possible way. They work today, they'll work tomorrow, and you won't spend weekends debugging dependency hell.
The entire architecture fits in a single mental model:
- `main.go` handles routing and HTTP
- `store.go` manages your data
- `views/` contains your templates
- That's it.
2. Performance That Shows
Modern web development often forgets that users care about speed more than your fancy tech stack. PubEngine is obsessively optimised for performance:
- No Javascript frameworks Just HTMX for interactions, keeping bundle sizes tiny
- In memory caching Posts are cached with TTL, so repeat visits are instant
- Minimal CSS Tailwind generates only what you use
- SQLite Zero network overhead, zero connection pooling complexity
The result? Near perfect Lighthouse scores out of the box. No optimization sprints required. Above all, no spinners required. Your blog loads fast because there's simply not much to load.
3. Ease of Use for Humans
Writing should feel like writing, not like configuring a server.
Environment driven configuration: Set four `SITE_*` environment variables and your entire site's branding nav, footer, RSS, sitemap, JSON-LD, OpenGraph tags updates automatically. No theme files to edit, no database migrations to run.
Markdown with superpowers: The custom renderer handles standard markdown plus small hack features like `^` suffixes for external links and inline image styling.
Admin that stays out of your way: Log in, write, publish. Draft support means you can iterate without pressure.
Real World?
eringen.com runs on PubEngine right now, and I spend my time writing, not tweaking webpack configs or wondering why my Node version broke the build.
Who This Is For
- Developers who want a blog that just works
- People tired of static site generators that require 420 npm packages after 69 tries
- Anyone who believes that "simple" shouldn't mean feature poor
- Those who care about web performance but don't want to obsess over it
Get Started in 30 Seconds
git clone https://github.com/eringen/pubengine.git
cd pubengine
make run
That's it. Your blog is running on localhost:3000.
Check out the source on GitHub or see it live at HERE!