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>
Ready or Published, and set a Slug.node publish.mjs, then commit + push (Netlify deploys).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.
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.