I wanted a blog where writing was the only manual step. Everything else — formatting, SEO optimization, publishing, deployment — should happen automatically. So I built one.
Everything Blog uses Notion as a headless CMS. I write in Notion (which I already use for everything), and a custom script handles the rest: it pulls the content via the Notion API, applies SEO best practices, generates the metadata, and publishes to the website.
How it works
- Content in Notion — Posts live in a Notion database. Each row is a post with title, tags, status, and the body content in the page.
- Automated script — I run a command with just the title. The script creates the Notion page with SEO-optimized structure, proper headings, meta descriptions, and Open Graph tags.
- Next.js frontend — The website pulls from Notion at build time via ISR. Server-side rendering ensures search engines can index everything. Pages are fast, accessible, and properly structured.
- Zero manual deployment — Vercel watches the repo. Notion webhook triggers a rebuild. Post goes live within minutes of marking it as “Published” in Notion.
Technical decisions
Next.js with SSR was non-negotiable for SEO. The whole point is discoverability — if search engines can’t parse the content, the blog fails at its job. We use incremental static regeneration to keep pages fresh without rebuilding the entire site.
Notion as a CMS works surprisingly well. The API is stable, the editing experience is familiar, and the block-based content model maps cleanly to HTML. The tradeoff is speed — Notion’s API isn’t fast, so we cache aggressively.
What I learned
The best tool is the one you already use. Notion wasn’t designed to be a CMS, but it already had my content workflow. Building the bridge was cheaper than changing the workflow.
Automation compounds. The script I wrote in an afternoon saves me 15 minutes per post. Over a hundred posts, that’s 25 hours — and more importantly, it removes the friction that stops me from writing in the first place.