Each row in the Posts database is one blog post. The properties are your CMS fields; the page body below them is the article. Running node publish.mjs renders every Ready/Published row to a static HTML page, with no hand-written HTML.

Live example: see every block rendered through the theme →

<aside> 💡 New here? The fastest way to learn the format is to open one of the example posts and read its body next to this guide.

</aside>

Publishing a post

  1. Add a row to the Posts database and fill in the properties (below).
  2. Write the article in the page body using normal Notion blocks (mapping below).
  3. Set Status to Ready or Published, and set a Slug.
  4. Run node publish.mjs, then commit + push (Netlify deploys).

Properties

Every property maps to a CMS or SEO field. Fill what you need; the optional ones fall back sensibly (see the Notes column).

Property Maps to Notes
Title H1, page title, og:title Required.
Subtitle On-page dek under the title Also the fallback for Meta description.
Author Byline + article:author Defaults to author in site.config.json.
Published Byline date, sitemap, sort order Set this to publish (drives ordering).
Slug URL → /posts/<slug>/ Required. Lowercase-with-dashes. Don't change after publishing.
Tags Taxonomy Flat list.
Cover image Hero + default og:image (1200×630) Downloaded at build (Notion file URLs expire).
Featured Flag for standout posts Captured for your own use; not styled by default.
Status Publish gate Only Ready / Published render. Draft is skipped.
Meta description meta description + social Optional, 155 chars or fewer. Falls back to Subtitle.
SEO title page title / og:title override Optional. Falls back to Title.
Social image og:image override Optional. Falls back to Cover image.
Canonical URL canonical tag Optional, for cross-posted content. Falls back to the post's own URL.
No-index robots noindex + excluded from sitemap Optional.

Auto-generated (don't set): reading time, the self-referencing canonical URL, and article:published_time / article:modified_time.


Body formatting

Write the body with normal Notion blocks. Here is what each one becomes on the site:

In Notion On the site
Heading 2 Section heading + a Table-of-Contents entry
Heading 3 Sub-section (indented ToC entry)
Heading 1 Same as Heading 2. The Title is the page H1, so start your sections at Heading 2.
Paragraph, bold, italic, inline code, links As written
Bulleted / numbered list List
Quote Blockquote with an accent rule
Callout (plain) Aside box; bold the first word for an uppercase label
Callout with a 💬 icon Pull-quote (large, accented)
Code block Code block (set the language)
Image Figure; the caption becomes the on-page caption
Table Table
Divider Horizontal rule
Toggle Collapsible details

Table of contents builds automatically from your Heading 2s. It appears once a post has more than two.

Summary / TL;DR box: begin the body with a Heading 2 titled Summary (or TL;DR). Everything until the next Heading 2 renders as a highlighted box at the top of the post.

Footnotes: type ^1, ^2, etc. inline. At the end, add a Heading 2 titled Sources followed by a numbered list. The markers become superscript links to that list.