Frontend (permanent)
Lives inside the client's webroot at /blog/. Renders pages, generates the sitemap and RSS, outputs full SEO metadata on every URL. Once it's there it never needs touching.
Open source · MIT · v1.2.0
Nano CMS bolts a fast, SEO-driven blog onto any existing HTML/CSS client site. No database. No plugins. No build step. The admin uploads via SFTP when you publish, then leaves. What's on disk is the database.
What it is
Nano CMS solves a specific problem: client websites that should stay as fast static HTML, but need a steady stream of fresh blog content for search ranking. Rather than converting the whole site to WordPress or Joomla, Nano CMS slots a small blog system into an existing static site with minimal disruption.
It is deliberately not a general-purpose CMS. It does one thing and tries to do it well: serve a blog with strong SEO output in as little code as possible. If you've ever installed WordPress just to publish four blog posts a year on a client site, this is for you.
How it works
Lives inside the client's webroot at /blog/. Renders pages, generates the sitemap and RSS, outputs full SEO metadata on every URL. Once it's there it never needs touching.
A universal folder, identical for every site. Upload it via SFTP when you want to publish. Edit posts. Remove the folder when done. No persistent admin = drastically reduced attack surface on client sites.
Password hash and site settings live in a JSON file outside the document root, structurally unreachable via HTTP. Backup is rsync /posts/ /media/ /config.json. That's the entire CMS state.
/public_html/blog/ <-- permanent
├── posts/ Markdown files (the "database")
├── media/ Uploaded images
├── core.php Parser, renderer, ~600 lines
├── index.php Category landing + archives
├── post.php Single post
└── template.php Per-site HTML wrapper
/blog-config/ <-- OUTSIDE webroot
├── config.json Password hash, site settings
└── rate-limit.json Login attempt tracking
/public_html/blog/admin/ <-- ephemeral
Uploaded via SFTP to publish, removed after.
Features
Markdown posts with YAML frontmatter. No SQLite, no MySQL. Backups are an rsync.
/blog/<category>/<slug>/ via .htaccess. No ?p=42 nonsense, ever.
Toolbar, autocomplete on categories, draft preview behind admin auth. Shortcodes for YouTube and Vimeo.
Homepage shows a card grid of categories sorted by post count. Each can have its own hero image. Click in, read articles.
Every upload generates a pre-cropped thumbnail. Card grids stay light; single-post heroes keep the original.
Independent 3- or 4-column settings for the homepage and the article archive. Tune separately from admin.
HTTPS enforced. CSRF on every POST. bcrypt password hash. Rate-limited login. Sessions invalidated on password change.
Uploads are decoded and re-encoded through GD or Imagick. Strips embedded payloads (EXIF smuggling, the works).
Sole-developer-friendly. Upload, publish, remove. Nothing for an attacker to find when you're not actively editing.
SEO output
<title> and meta description from frontmatterBlogPosting schema for rich results in Google<article>, <time>, breadcrumb nav)loading="lazy" and descriptive alt on every image/sitemap.xml, regenerated on every save/feed.xml, regenerated on every saveInstall
/public_html/blog/ on your client's host.
bootstrap.php with the path to your config directory (sample provided).
/public_html/blog/admin/.
https://yoursite.com/blog/admin/setup.php. Set a password. The wizard writes config.json and goes away.
Backups are a single line of cron: rsync -az clientsite:/blog/posts/ /backups/clientname/. The whole CMS state is files.
Comparison
Those are all excellent for sites that need them. For a static HTML client site that needs occasional SEO content, they aren't.
~500,000 lines
Hundreds of thousands of lines
~30,000 lines
~4,500 lines
Who it's for
Nano CMS assumes operators are fluent with Markdown and comfortable with SFTP. It is not aimed at non-technical end users. For those, WordPress is genuinely the right answer.
If you build static sites for clients and want to add ranking blog content without taking on the weight of a full CMS, this is for you.
Nano CMS is solo-developed and MIT-licensed. If it saved you the cost of a WordPress install on a client site, a coffee covers a lot of late-night debugging.