- Sign up with email + password (handled by Supabase Auth)
- Login with email + password
- Automatic session refresh
- Logout
- Protect backend API routes using JWT middleware
- Attach
req.userto backend requests
- Store username
- Store account settings (theme, profile data, etc.)
Even in a minimal version, Notion has the concept of workspaces.
- Each user has a default workspace
- A workspace contains pages
- User can switch between workspaces (optional for later)
- Name
- Created date
- Owner
(For Mini-Notion, multi-user workspace membership can be skipped until later.)
A page is the main document in Notion.
- Create a new page
- Rename a page
- Delete a page
- Duplicate a page (optional)
- Favorite/star a page
- List all pages belonging to the current workspace
- Pages can be nested under other pages (optional)
- Sidebar tree-style navigation
- Recent pages list (optional)
A page contains blocks β you donβt store raw text on the page itself.
Blocks are the heart of Notion. Your Mini-Notion needs a simplified block system.
Include at least:
- Paragraph
- Heading 1 / Heading 2 / Heading 3
- To-do item with checkbox
- Bulleted list item
- Numbered list item
- Quote
- Divider
- Toggle block
- Code block
- Image block (optional)
You can add more later, but these give you full Notion-like behavior.
- Add a new block
- Update the block content
- Delete a block
- Move blocks up/down
- Change block type (e.g., paragraph β heading)
- Duplicate a block
- Nest a block inside another block
- Un-nest a block out of a parent
Each block has:
idpage_idparent_block_idordertypecontentcreated_atupdated_at
Blocks can be inside other blocks.
Your system needs to support:
- Parent-child relationships
- Arbitrarily deep nesting
- Correct ordering among siblings
- Expanding/collapsing nested blocks
A full Notion parser is complex, so Mini-Notion can use a simpler approach:
- Bold
- Italic
- Underline
- Strikethrough
- Inline code
You can store inline formatting as:
- Markdown
- HTML
- A mini rich-text AST (more advanced)
Markdown is easiest.
- Upload an image to Supabase Storage
- Insert image block
- Delete image block
To behave like Notion:
Entercreates a new blockBackspaceon an empty block deletes it- Tab / Shift+Tab handles nesting
- Arrow keys move between blocks
Later you can add:
- Real-time editing using Supabase Realtime or websockets
- Live cursors
- Multi-user collaboration
Not needed in v1 but good for long-term goals.
- Search pages by title or block content
- Global search bar
- Filter pages by updated date
Simple preferences:
- Light/dark theme
- Font size
- Editor width
Notion supports version history. Mini-Notion can do a simpler version:
- Track last 5 versions of page content
- Restore a previous version
- POST
/pagesβ create - GET
/pagesβ list - GET
/pages/:idβ get page - PATCH
/pages/:idβ rename / update - DELETE
/pages/:id
- POST
/blocksβ create block - PATCH
/blocks/:idβ update content / type / order / parent - DELETE
/blocks/:id - POST
/blocks/moveβ reorder blocks - POST
/blocks/nestβ set parent - POST
/blocks/unnestβ remove parent
To launch a simple Mini-Notion, you only need:
Login + JWT verification
Create, rename, list, delete
Paragraph blocks Add, edit, delete, reorder (You don't even need nesting at MVP stage)
Markdown or simple formatting
Supabase + Drizzle
Once MVP works, you expand block types, nesting, etc.
A Mini-Notion app should include:
- Auth system
- Workspaces
- Pages
- Blocks
- Block editing (CRUD)
- Nested blocks
- Rich text support
- Image support (optional)
- Keyboard-driven UX
- Real-time sync (optional)
- Search (optional)
- Themes
- Version history (optional)
- Full backend API