The only Notion reverse proxy with full SEO, zero dependencies, and complete customization.
Quick Start Β· Why Nooxy Β· Features Β· Configuration Β· Examples
You built something great in Notion. Now you want to share it with the world on your own domain.
Your options today:
| Solution | Cost | SEO | Customization | Interactivity |
|---|---|---|---|---|
| Notion Sites | $10-22/mo | Limited, noindex issues | Minimal | Full |
| Super.so | $12-28/mo | Good, but subdomain-only hurts rankings | Good | Lost (static) |
| Fruition | Free | Poor, outdated | Limited | Full |
| Nooxy | Free | Full SEO suite | Complete | Full |
Notion Sites charges $10/month per domain with limited SEO and customization. Super.so costs $12-28/month and converts your pages to static HTMLβyou lose Notion's live databases, filtering, and real-time updates. Fruition is no longer maintained and lacks modern SEO features.
Nooxy gives you everything. For free.
These sites run on Nooxy right now:
- os.draphy.org β Life documented as a file system
- draphy.org β Personal site
View source, check the SEO tags, test the interactivity. It works.
|
|
Nooxy rewrites Notion's HTML to give search engines exactly what they need:
- Removes
noindextags β Your pages get indexed by Google - Canonical URLs β
https://yourdomain.com/aboutnot/About-abc123def - Structured data β JSON-LD schema for rich search results
- Open Graph & Twitter Cards β Beautiful social media previews
- Custom meta tags β Title, description, keywords, author per page
- AI attribution β Proper source credits for ChatGPT, Claude, Perplexity
- XML sitemap β Auto-generated at
/sitemap.xml - Robots.txt β Proper crawler directives at
/robots.txt
- Custom CSS β Override any Notion style, add your brand
- JavaScript injection β Analytics, interactions, custom functionality
- HTML headers β Navigation bars, announcements, CTAs
- Google Fonts β Apply any font family site-wide
- Google Analytics β Built-in GA4 support
- Zero dependencies β Nothing to break, nothing to update
- Edge computing β Runs on Cloudflare Workers' global network
- Node.js support β Works with any modern Node.js runtime (18.17+)
- Multi-tenant β Host multiple sites from one deployment
- Local development β Test locally before deploying
- TypeScript β Full type safety and IntelliSense
- CLI tools β
npx nooxy initandnpx nooxy generate - Auto-minification β CSS, JS, HTML optimized automatically
- Clean URLs β
/aboutinstead of/About-Page-abc123def456
npm install nooxynpx nooxy initThis creates a nooxy/ folder with all configuration files.
Edit nooxy/config.js:
export const SITE_CONFIG = {
// Your custom domain
domain: 'yourdomain.com',
// Your Notion workspace (e.g., yourname.notion.site)
notionDomain: 'yourname.notion.site',
// Site name for SEO
siteName: 'Your Site Name',
// Map URLs to Notion page IDs
slugToPage: {
'/': 'YOUR_HOME_PAGE_ID', // yourdomain.com/
'/about': 'YOUR_ABOUT_PAGE_ID', // yourdomain.com/about
'/blog': 'YOUR_BLOG_PAGE_ID', // yourdomain.com/blog
},
// SEO configuration (optional but recommended)
seo: {
indexing: true, // Enable search engine indexing
keywords: 'your, keywords, here',
defaultAuthor: 'Your Name',
},
// Required: Generated files (don't modify)
customHeadCSS: HEAD_CSS_STRING,
customHeadJS: HEAD_JS_STRING,
customBodyJS: BODY_JS_STRING,
customHeader: HEADER_HTML_STRING,
};npx nooxy generateCloudflare Workers (recommended):
import { initializeNooxy } from 'nooxy';
import { SITE_CONFIG } from './nooxy/config';
const proxy = initializeNooxy(SITE_CONFIG);
export default {
async fetch(request: Request): Promise<Response> {
return proxy(request);
},
};Node.js:
import { initializeNooxy } from 'nooxy';
import { SITE_CONFIG } from './nooxy/config';
import http from 'node:http';
const proxy = initializeNooxy(SITE_CONFIG);
http.createServer(async (req, res) => {
const request = new Request(`http://${req.headers.host}${req.url}`);
const response = await proxy(request);
res.statusCode = response.status;
response.headers.forEach((v, k) => res.setHeader(k, v));
res.end(Buffer.from(await response.arrayBuffer()));
}).listen(8787);| Field | Description |
|---|---|
domain |
Your custom domain (e.g., example.com) |
notionDomain |
Your Notion workspace domain (e.g., yourname.notion.site) |
siteName |
Site name for SEO and social sharing |
slugToPage |
URL path to Notion page ID mapping |
customHeadCSS |
Generated CSS string |
customHeadJS |
Generated head JavaScript string |
customBodyJS |
Generated body JavaScript string |
customHeader |
Generated header HTML string |
seo: {
// Enable search engine indexing (default: true)
indexing: true,
// Canonical domain (if different from domain)
// Useful when nooxy runs on subdomain but SEO points to main domain
canonicalDomain: 'example.com',
// Path mapping for canonical URLs
// Maps nooxy paths to canonical domain paths
canonicalPathMap: {
'/': '/home', // os.example.com/ β example.com/home
'/docs': '/documentation',
},
// Meta keywords for SEO
keywords: 'notion, website, custom domain',
// Default author for pages
defaultAuthor: 'Your Name',
// Replace "Notion" branding with custom text
brandReplacement: 'Your Brand',
// AI crawler attribution (ChatGPT, Claude, etc.)
aiAttribution: 'Your Name - yourdomain.com',
}pageMetadata: {
'NOTION_PAGE_ID': {
title: 'Custom Page Title',
description: 'Custom meta description for this page',
image: 'https://yourdomain.com/og-image.jpg',
author: 'Page Author Name',
},
}nooxy: {
// Show "Made with Nooxy" badge in header
// Default: true
// Set to false to hide it... π it'll break my heart, but hey,
// if it helps your site look cleaner, I'll survive... probably π’
showBadge: true,
}| Field | Description |
|---|---|
twitterHandle |
Twitter/X handle for social cards (e.g., @yourusername) |
siteIcon |
Custom favicon URL |
googleFont |
Google Font family name (e.g., Inter) |
googleTagID |
Google Analytics measurement ID |
fof |
Custom 404 page configuration |
subDomains |
Subdomain redirect rules |
npx nooxy initCreates the nooxy/ directory with all configuration templates.
# Standard generation (with minification)
npx nooxy generate
# Custom path
npx nooxy generate --path=./my-project
# Without minification (for debugging)
npx nooxy generate --no-minifyConverts your custom files to optimized, importable strings.
/* Hide Notion's default elements */
.notion-topbar { display: none !important; }
/* Custom styling */
.notion-page-content {
max-width: 900px;
margin: 0 auto;
font-family: 'Inter', sans-serif;
}
/* Dark mode support */
.dark .notion-page-content {
background: #1a1a1a;
}// Analytics, interactions, custom functionality
document.addEventListener('DOMContentLoaded', () => {
console.log('Site loaded with Nooxy!');
// Track page views, add smooth scrolling, etc.
});<nav class="site-nav">
<a href="/">Home</a>
<a href="/about">About</a>
<a href="/contact">Contact</a>
</nav>User Request β Nooxy β Notion
β
Rewrite URLs, inject SEO, add customizations
β
User Response β Modified HTML
- Intercepts requests to your custom domain
- Maps clean URLs (
/about) to Notion page IDs - Fetches content from Notion's servers
- Rewrites meta tags, URLs, and structured data for SEO
- Injects your custom CSS, JavaScript, and headers
- Serves the optimized response to visitors
| Notion Sites | Nooxy | |
|---|---|---|
| Price | $10-22/mo | Free |
| Custom domain | Paid add-on | Included |
| SEO control | Limited | Full |
| CSS/JS injection | No | Yes |
| noindex removal | Manual | Automatic |
| Super.so | Nooxy | |
|---|---|---|
| Price | $12-28/mo | Free |
| Notion interactivity | Lost (static) | Preserved |
| Database filtering | No | Yes |
| Real-time updates | No | Yes |
| Hosting type | Subdomain | Your domain |
| Fruition | Nooxy | |
|---|---|---|
| Maintained | No (2020) | Yes (2024+) |
| SEO features | Basic | Comprehensive |
| TypeScript | No | Yes |
| CLI tools | No | Yes |
| Multi-tenant | No | Yes |
src/
βββ index.ts # Main export
βββ proxy.ts # Core reverse proxy
βββ types.ts # TypeScript definitions
βββ helpers/ # Utilities
βββ handlers/ # Request handlers (sitemap, robots, etc.)
βββ rewriters/ # HTML rewriting (meta, data, headers)
βββ cli/ # CLI commands (init, generate)
- Verify Notion page IDs are correct (32-character hex)
- Ensure pages are published publicly in Notion
- Check
notionDomainmatches your Notion workspace
- Run
npx nooxy generateafter changes - Use
!importantto override Notion styles - Check browser console for errors
- Ensure
seo.indexingistrue(default) - Check that you're viewing the source (not rendered DOM)
- Verify your deployment is using the latest build
- GitHub Issues: Report bugs or request features
- Discussions: Ask questions
- Email: contact@draphy.org
See CONTRIBUTING.md for guidelines.
MIT License - see LICENSE for details.
Inspired by Fruition and NoteHost, rebuilt for the modern web with comprehensive SEO, TypeScript, and zero dependencies.
Made with β€οΈ by David Raphi
npm install nooxy && npx nooxy initStar this repo if it saved you $120+/year.