How to use Notion as your blog's CMS

This blog gets its content from Notion. I write the posts in a table in Notion, and whenever this site is rebuilt on Netlify, the site pulls in all the posts and formats them into HTML.

To build this blog, I first reverse-engineered Notion's private API. Notion is working on a public API, but for the time being I decided to build my own API by watching Chrome's dev tools while loading a Notion doc.

This turned into an open-source project called Potion, which includes hosted API endpoints that you can use.

Setting up Notion

My blog posts are written in a full-page table in Notion:

Because of Notion's structure for tables, each row in this table is also its own Notion document. This document contains the content of each blog post.

I also have a few other fields (columns) in the table, which include the URL of the blog post, when it was published, and whether it should be made public. I can use these to transfer each blog post (each row) onto my website.

Making it real

Now for the fun part: pulling in the blog posts from Notion.

As I mentioned earlier, building this blog relied heavily on API endpoints from my open-source project Potion, specifically /api/table for getting the list of blog posts and /api/html for getting the HTML for each blog post.

There's more documentation in Potion's README, and if you have any questions about how to use Potion feel free to send me an email.

Also make sure to set your Notion table to public sharing so the API can access it.

Essentially, when my site is built, I use node-fetch to make a request to /api/table and list out all the blog posts. It filters down to only blog posts where fields.Published is true, and then builds my site's /blog page to list those posts.

Then, for each published post, it takes the id of that row in the table and makes another request to /api/html using that page's ID. This endpoint returns fully-baked HTML of the document's contents. I now just have to insert that HTML into a template for each blog post, along with the title from the earlier /api/table call, and I can generate all the blog post pages (like the one you're looking at right now).

The end

That's it! You can now edit your blog from Notion.

If you have any questions about using Potion I'd love to help: just send me an email.