A Notion-backed blog platform with a modern tech stack.
This is a full-stack web application that transforms your Notion workspace into a published blog. Content is managed entirely through a Notion database, providing a seamless publishing experience without the need for traditional CMS backends.
Status: Work in progress 🚧
- react 19
- react-router 7
- suspend-react
- @orpc/client
- vite 4
- sass
- Node.js 18+
- express 4
- @orpc/server
- typescript 5
- zod 3
- ts-pattern 5
This is a monorepo using npm workspaces and typescript compose builds with following packages:
-
common - Shared types, schemas, and DTOs
- Location: common
- Exports: API contracts, Notion schema definitions
-
api - Backend server (Express + ORPC)
- Location: api
- Features: Notion API integration, RSS feed generation
-
web - Frontend app (React + Vite)
- Location: web
- Features: Blog post listing and viewing
The blog reads content from a Notion database with the following properties.
See common/src/dto/notion/blog-post.ts for the complete schema definition.
Page Properties:
- Title (rich text)
- Status (status)
- Tags (multi-select)
- Publication Date (date)
git clone git@github.com:gabiseabra/notion-site.git
cd notion-sitenpm run installCopy .env.example file to .env, and change the NOTION_TOKEN and NOTION_DATABASE_ID with values
obtained from
the steps below.
cp .env.example .env- Go to Notion Integrations
- Click "Create new integration"
- Copy the Internal Integration Secret (your NOTION_TOKEN)
- Open your posts database in Notion
- Copy the ID from the URL:
https://www.notion.so/{NOTION_DATABASE_ID}?v=... - Use only the UUID part (without special characters)
Use the dev command to run in dev mode:
npm run devUse the start command to run in production mode:
npm run build
npm run startThere are enhanced visibility tools in dev mode you help with editing:
- List hidden posts
- Go to edit mode
This project is deployed on Render at blog.gabiseabra.dev.
The deployment runs npm run build; npm run start in a node container,
which starts the server serving static files from the web and API routes from the api build.
- Support unsupported blocks (e.g. code, callout)
- Add RSS feed or mailing list
- Don't show posts published in the future
- Add feature flags
- Optimize bundle size
- Link previews
- use nuqs