- Cloudflare DNS
- Cloudflare workers
- Reverse proxy implementation
- TypeScript
- Custom meta tags
- Page slugs
- Dark mode toggle
- Custom JS for head and body
- Custom fonts (using Google Fonts)
- Subdomain redirect (e.g. www)
- Add your domain to Cloudflare. Make sure that DNS doesn't have
A
records for your domain and noCNAME
alias forwww
- Create a new worker on Cloudflare and give it a meaningful name, e.g.
yourdomain-com-notion-proxy
- Keep the default example worker code, we will overwrite it anyway during deploy (see below)
Tip
A bit outdated but detailed description on how to add your domain to Cloudflare and create a worker is here.
Search for "Step 1: Set up your Cloudflare account".
If someone wishes to create an up-to-date tutorial for NoteHost, please submit a pull request 😉
Go into your working directory and run:
npx notehost init <domain>
Follow the prompts to confirm your domain name and enter the requested information. You can change these settings later via the configuration file.
NoteHost will create a directory with the name of your domain. In this directory you will see the following files:
.
├── build-page-script-js-string.sh helper script, details below
├── package.json test & deploy your website, see realtime logs
├── tsconfig.json types config
├── wrangler.toml your Cloudflare worker config
└── src
├── _page-script-js-string.ts generated by helper script
├── index.ts runs reverse proxy
├── page-script.js your custom JS page script
└── site-config.ts your domain and website config
Go into this directory and run
npm install
Make sure that wrangler is authenticated with your Cloudflare account
npx wrangler login
- Edit
wrangler.toml
and make sure that thename
field matches your worker name in Cloudflare - Edit
site-config.ts
and set all the necessary options: domain, metadata, slugs, subdomain redirects, etc. All settings should be self explanatory, I hope 😊
import { NoteHostSiteConfig, googleTag } from 'notehost'
import { PAGE_SCRIPT_JS_STRING } from './_page-script-js-string'
// Set this to your Google Tag ID from Google Analytics
const GOOGLE_TAG_ID = ''
export const SITE_CONFIG: NoteHostSiteConfig = {
domain: 'yourdomain.com',
// Metatags, optional
// For main page link preview
siteName: 'My Notion Website',
siteDescription: 'Build your own website with Notion. This is a demo site.',
siteImage: 'https://imagehosting.com/images/preview.jpg',
// URL to custom favicon.ico
siteIcon: 'https://imagehosting.com/images/favicon.ico',
// Social media links, optional
twitterHandle: '@mytwitter',
// Additional safety: avoid serving extraneous Notion content from your website
// Use the value from your Notion settings => Workspace => Settings => Domain
notionDomain: 'mydomain',
// Map slugs (short page names) to Notion page IDs
// Empty slug is your main page
slugToPage: {
'': 'NOTION_PAGE_ID',
about: 'NOTION_PAGE_ID',
contact: 'NOTION_PAGE_ID',
// Hint: you can use '/' in slug name to create subpages
'about/people': 'NOTION_PAGE_ID',
},
// Rewrite meta tags for specific pages
// Use the Notion page ID as the key
pageMetadata: {
'NOTION_PAGE_ID': {
title: 'My Custom Page Title',
description: 'My custom page description',
image: 'https://imagehosting.com/images/page_preview.jpg',
author: 'My Name',
},
},
// Subdomain redirects are optional
// But it is recommended to have one for www
subDomains: {
www: {
redirect: 'https://yourdomain.com',
},
},
// The 404 (not found) page is optional
// If you don't have one, the default 404 page will be used
fof: {
page: 'NOTION_PAGE_ID',
slug: '404', // default
},
// Google Font name, you can choose from https://fonts.google.com
googleFont: 'Roboto',
// Custom CSS/JS for head and body of a Notion page
customHeadCSS: `
.notion-topbar {
background: lightblue
}`,
customHeadJS: googleTag(GOOGLE_TAG_ID),
customBodyJS: PAGE_SCRIPT_JS_STRING,
}
npm run deploy
🎉 Enjoy your Notion website on your own domain! 🎉
Important
You need to run deploy every time you update page-script.js
or site-config.ts
.
The file src/page-script.js
contains an example of a page script that you can run on your Notion pages.
This example script removes tooltips from images and hides optional properties in database cards.
🔥 This script is run in the web browser! 🔥
You can use document
, window
and all the functionality of a web browser to control the contents and behavior of your Notion pages.
Also, because this is a JS file, you can edit it in your code editor with syntax highlighting and intellisense!
To incorporate this script into a Notion page, NoteHost must transform the file's contents into a string. Consequently, the build-page-script-js-string.sh
script is executed whenever you run npm run deploy
.
So just add your JS magic to page-script.js
, run deploy and everything else will happen automagically 😎
You can see realtime logs from your website by running
npm run logs
Based on Fruition, which is no longer maintained 😕
Lots of thanks to @DudeThatsErin and her code snippet.