Notion Scaffold: Life OS + JustinWieb-VR DBs¶
Date: 2026-04-28
Owner: the Sonnet worker spawned to do this build
Parent session: n8n-telegram_Opus47 (Building The Brain conversation)
Estimated effort: ~1-2 hours (mostly grunt API calls)
Related handoffs:
- Building The Brain, master vision
- MkDocs Build, sister build, runs in parallel
The Goal¶
Scaffold 17 databases in Notion to hold Justin's Life OS + JustinWieb-VR second brain:
| Section | Parent page ID | DBs |
|---|---|---|
| Life OS | 37e5e724-ba79-4182-a270-9949b714fab8 |
Inbox, Tasks, Projects, Areas, Habits, Knowledge, Daily Log, Reading & Watch, Goals (9) |
| JustinWieb-VR | 9d19c2ab-6c93-48e1-ab4c-262541fbdb06 |
Content Ideas, Production, Published, Content Pillars, Sponsors, Tasks, Projects (7) |
| Plus | inside Life OS | Master Tasks page (not DB), empty page Justin will populate with linked views manually |
After done, Justin can use Notion as the structured layer of his second brain. The brain (forthcoming) will write directly to these via the existing notion-create-page workflow + DB IDs.
How to call the API (the only tools you need)¶
All calls go through n8n via scripts/n8n/call.sh <workflow> '<json>'. The relevant workflows already exist + are active:
| Workflow | What it does |
|---|---|
notion-create-database โ USE THIS |
Create a new DB under a parent page with schema. Returns DB id + URL. |
notion-update-page |
Update a page's properties (used here to add relation properties to a DB after creation) |
notion-create-page |
Create a row in a DB OR a subpage under a page |
notion-get-database |
Read schema (for verification) |
notion-search-databases |
List all accessible DBs |
The Notion creds are wired (cred id mgQHSiQOlbURyLs1, "Notion account"). All workflows handle auth via X-Forge-Auth header automatically when called via call.sh.
Critical: order of operations for relations¶
You cannot create a relation property to a DB that doesn't exist yet. So:
- Phase A, create all 17 DBs without relations (just title + simple property types)
- Phase B, patch relation properties between DBs that need linking
- Phase C, verify schemas via
notion-get-database - Phase D, create the Master Tasks page (empty: Justin adds linked views in UI)
- Phase E, write status report
DB schemas (Phase A, no relations yet)¶
For each DB below, call:
Capture the returned id for each DB into a JSON file at /tmp/notion-scaffold-ids.json so Phase B + C can reference them. Suggested format:
Life OS (parent_page_id: 37e5e724-ba79-4182-a270-9949b714fab8)¶
1. ๐ฅ Inbox¶
{
"parent_page_id": "37e5e724-ba79-4182-a270-9949b714fab8",
"title": "๐ฅ Inbox",
"properties": {
"Title": { "title": {} },
"Source": { "select": { "options": [
{"name": "Telegram", "color": "blue"},
{"name": "iOS Shortcut", "color": "purple"},
{"name": "Claude Code", "color": "green"},
{"name": "Manual", "color": "gray"},
{"name": "Email", "color": "orange"},
{"name": "Other", "color": "default"}
]}},
"Tags": { "multi_select": { "options": [
{"name": "idea", "color": "yellow"},
{"name": "todo", "color": "red"},
{"name": "question", "color": "purple"},
{"name": "research", "color": "blue"}
]}},
"Sorted?": { "checkbox": {} },
"Notes": { "rich_text": {} },
"Created": { "created_time": {} }
}
}
2. โ Tasks¶
{
"parent_page_id": "37e5e724-ba79-4182-a270-9949b714fab8",
"title": "โ
Tasks",
"properties": {
"Task": { "title": {} },
"Status": { "status": {} },
"Priority": { "select": { "options": [
{"name": "๐ฅ Urgent", "color": "red"},
{"name": "High", "color": "orange"},
{"name": "Medium", "color": "yellow"},
{"name": "Low", "color": "gray"}
]}},
"Due": { "date": {} },
"Source": { "select": { "options": [
{"name": "Telegram", "color": "blue"},
{"name": "iOS Shortcut", "color": "purple"},
{"name": "Brain", "color": "green"},
{"name": "Manual", "color": "gray"}
]}},
"Notes": { "rich_text": {} },
"Created": { "created_time": {} },
"Completed": { "last_edited_time": {} }
}
}
3. ๐ฆ Projects¶
{
"parent_page_id": "37e5e724-ba79-4182-a270-9949b714fab8",
"title": "๐ฆ Projects",
"properties": {
"Project": { "title": {} },
"Status": { "status": {} },
"Start": { "date": {} },
"Due": { "date": {} },
"Outcome": { "rich_text": {} },
"Notes": { "rich_text": {} },
"Created": { "created_time": {} }
}
}
4. ๐ฏ Areas¶
{
"parent_page_id": "37e5e724-ba79-4182-a270-9949b714fab8",
"title": "๐ฏ Areas",
"properties": {
"Area": { "title": {} },
"Description": { "rich_text": {} },
"Active?": { "checkbox": {} },
"Color": { "select": { "options": [
{"name": "Health", "color": "red"},
{"name": "Wealth", "color": "green"},
{"name": "Family", "color": "pink"},
{"name": "Career", "color": "blue"},
{"name": "Mind", "color": "purple"},
{"name": "Hobbies", "color": "yellow"},
{"name": "Home", "color": "orange"},
{"name": "Brand", "color": "gray"}
]}}
}
}
5. ๐ Habits¶
{
"parent_page_id": "37e5e724-ba79-4182-a270-9949b714fab8",
"title": "๐ Habits",
"properties": {
"Entry": { "title": {} },
"Habit": { "select": { "options": [
{"name": "Workout", "color": "red"},
{"name": "Meditate", "color": "purple"},
{"name": "Read", "color": "blue"},
{"name": "Journal", "color": "yellow"},
{"name": "Walk", "color": "green"},
{"name": "No alcohol", "color": "orange"},
{"name": "Sleep before 11", "color": "pink"}
]}},
"Date": { "date": {} },
"Done?": { "checkbox": {} },
"Category": { "select": { "options": [
{"name": "Health", "color": "red"},
{"name": "Mind", "color": "purple"},
{"name": "Skill", "color": "blue"},
{"name": "Social", "color": "yellow"}
]}},
"Notes": { "rich_text": {} }
}
}
6. ๐ง Knowledge¶
{
"parent_page_id": "37e5e724-ba79-4182-a270-9949b714fab8",
"title": "๐ง Knowledge",
"properties": {
"Title": { "title": {} },
"Body": { "rich_text": {} },
"Tags": { "multi_select": { "options": [
{"name": "fact", "color": "blue"},
{"name": "insight", "color": "purple"},
{"name": "quote", "color": "yellow"},
{"name": "lesson", "color": "green"},
{"name": "tool", "color": "gray"}
]}},
"Source": { "select": { "options": [
{"name": "Conversation", "color": "blue"},
{"name": "Reading", "color": "green"},
{"name": "Observation", "color": "yellow"},
{"name": "Other", "color": "default"}
]}},
"Topics": { "multi_select": {} },
"Created": { "created_time": {} }
}
}
7. ๐ Daily Log¶
{
"parent_page_id": "37e5e724-ba79-4182-a270-9949b714fab8",
"title": "๐ Daily Log",
"properties": {
"Date": { "title": {} },
"Mood": { "select": { "options": [
{"name": "๐ 5", "color": "green"},
{"name": "๐ 4", "color": "blue"},
{"name": "๐ 3", "color": "yellow"},
{"name": "๐ 2", "color": "orange"},
{"name": "๐ 1", "color": "red"}
]}},
"Energy": { "select": { "options": [
{"name": "โก 5", "color": "green"},
{"name": "4", "color": "blue"},
{"name": "3", "color": "yellow"},
{"name": "2", "color": "orange"},
{"name": "1", "color": "red"}
]}},
"Wins": { "rich_text": {} },
"Lessons": { "rich_text": {} },
"Notes": { "rich_text": {} },
"Created": { "created_time": {} }
}
}
2026-04-28.
8. ๐ Reading & Watch¶
{
"parent_page_id": "37e5e724-ba79-4182-a270-9949b714fab8",
"title": "๐ Reading & Watch",
"properties": {
"Title": { "title": {} },
"Type": { "select": { "options": [
{"name": "๐ Book", "color": "blue"},
{"name": "๐ฐ Article", "color": "yellow"},
{"name": "๐บ Video", "color": "red"},
{"name": "๐ง Podcast", "color": "purple"},
{"name": "๐ Course", "color": "green"}
]}},
"Status": { "status": {} },
"Source URL": { "url": {} },
"Author": { "rich_text": {} },
"Notes": { "rich_text": {} },
"Started": { "date": {} },
"Finished": { "date": {} },
"Rating": { "select": { "options": [
{"name": "โญโญโญโญโญ", "color": "green"},
{"name": "โญโญโญโญ", "color": "blue"},
{"name": "โญโญโญ", "color": "yellow"},
{"name": "โญโญ", "color": "orange"},
{"name": "โญ", "color": "red"}
]}}
}
}
9. ๐ฏ Goals¶
{
"parent_page_id": "37e5e724-ba79-4182-a270-9949b714fab8",
"title": "๐ฏ Goals",
"properties": {
"Goal": { "title": {} },
"Timeframe": { "select": { "options": [
{"name": "Annual", "color": "purple"},
{"name": "Quarterly", "color": "blue"},
{"name": "Monthly", "color": "green"},
{"name": "Weekly", "color": "yellow"}
]}},
"Year": { "select": { "options": [
{"name": "2026", "color": "blue"},
{"name": "2027", "color": "green"}
]}},
"Quarter": { "select": { "options": [
{"name": "Q1", "color": "default"},
{"name": "Q2", "color": "default"},
{"name": "Q3", "color": "default"},
{"name": "Q4", "color": "default"}
]}},
"Status": { "status": {} },
"Notes": { "rich_text": {} }
}
}
JustinWieb-VR (parent_page_id: 9d19c2ab-6c93-48e1-ab4c-262541fbdb06)¶
10. ๐ก Content Ideas¶
{
"parent_page_id": "9d19c2ab-6c93-48e1-ab4c-262541fbdb06",
"title": "๐ก Content Ideas",
"properties": {
"Idea": { "title": {} },
"Platform": { "multi_select": { "options": [
{"name": "YouTube", "color": "red"},
{"name": "Instagram", "color": "pink"},
{"name": "TikTok", "color": "default"},
{"name": "X", "color": "default"},
{"name": "Newsletter", "color": "blue"}
]}},
"Hook": { "rich_text": {} },
"Status": { "status": {} },
"Tags": { "multi_select": {} },
"Notes": { "rich_text": {} },
"Created": { "created_time": {} }
}
}
11. ๐ฌ Production¶
{
"parent_page_id": "9d19c2ab-6c93-48e1-ab4c-262541fbdb06",
"title": "๐ฌ Production",
"properties": {
"Title": { "title": {} },
"Stage": { "status": {} },
"Platform": { "multi_select": { "options": [
{"name": "YouTube", "color": "red"},
{"name": "Instagram", "color": "pink"},
{"name": "TikTok", "color": "default"},
{"name": "X", "color": "default"},
{"name": "Newsletter", "color": "blue"}
]}},
"Due": { "date": {} },
"Asset URLs": { "rich_text": {} },
"Notes": { "rich_text": {} }
}
}
12. โ Published¶
{
"parent_page_id": "9d19c2ab-6c93-48e1-ab4c-262541fbdb06",
"title": "โ
Published",
"properties": {
"Title": { "title": {} },
"Platform": { "select": { "options": [
{"name": "YouTube", "color": "red"},
{"name": "Instagram", "color": "pink"},
{"name": "TikTok", "color": "default"},
{"name": "X", "color": "default"},
{"name": "Newsletter", "color": "blue"}
]}},
"Posted": { "date": {} },
"URL": { "url": {} },
"Views": { "number": {} },
"Likes": { "number": {} },
"Comments": { "number": {} },
"Notes": { "rich_text": {} }
}
}
13. ๐จ Content Pillars¶
{
"parent_page_id": "9d19c2ab-6c93-48e1-ab4c-262541fbdb06",
"title": "๐จ Content Pillars",
"properties": {
"Pillar": { "title": {} },
"Description": { "rich_text": {} },
"Color": { "select": {} },
"Active?": { "checkbox": {} }
}
}
14. ๐ค Sponsors / Brand Deals¶
{
"parent_page_id": "9d19c2ab-6c93-48e1-ab4c-262541fbdb06",
"title": "๐ค Sponsors",
"properties": {
"Brand": { "title": {} },
"Contact Name": { "rich_text": {} },
"Contact Email": { "email": {} },
"Stage": { "status": {} },
"Value": { "number": { "format": "dollar" } },
"Last Touched": { "date": {} },
"Source": { "select": { "options": [
{"name": "Inbound", "color": "green"},
{"name": "Outbound", "color": "blue"},
{"name": "Referral", "color": "purple"},
{"name": "Existing", "color": "gray"}
]}},
"Notes": { "rich_text": {} }
}
}
15. โ Tasks (JWVR)¶
Same shape as Life OS Tasks (so cross-brand linked views work):
{
"parent_page_id": "9d19c2ab-6c93-48e1-ab4c-262541fbdb06",
"title": "โ
Tasks",
"properties": {
"Task": { "title": {} },
"Status": { "status": {} },
"Priority": { "select": { "options": [
{"name": "๐ฅ Urgent", "color": "red"},
{"name": "High", "color": "orange"},
{"name": "Medium", "color": "yellow"},
{"name": "Low", "color": "gray"}
]}},
"Due": { "date": {} },
"Source": { "select": { "options": [
{"name": "Telegram", "color": "blue"},
{"name": "iOS Shortcut", "color": "purple"},
{"name": "Brain", "color": "green"},
{"name": "Manual", "color": "gray"}
]}},
"Notes": { "rich_text": {} },
"Created": { "created_time": {} },
"Completed": { "last_edited_time": {} }
}
}
16. ๐ฆ Projects (JWVR)¶
Same shape as Life OS Projects:
{
"parent_page_id": "9d19c2ab-6c93-48e1-ab4c-262541fbdb06",
"title": "๐ฆ Projects",
"properties": {
"Project": { "title": {} },
"Status": { "status": {} },
"Start": { "date": {} },
"Due": { "date": {} },
"Outcome": { "rich_text": {} },
"Notes": { "rich_text": {} },
"Created": { "created_time": {} }
}
}
Phase B, relations¶
After all 17 DBs exist + you have IDs in /tmp/notion-scaffold-ids.json, add these relations via PATCH (use the Notion API directly, notion-update-page is for pages, not DBs). Build a small one-off n8n call OR shell out to curl:
TOKEN=$(grep '^N8N_WEBHOOK_SECRET' ~/.forge-secrets/n8n.env | cut -d= -f2 | tr -d '"')
NOTION_TOKEN=$(docker exec n8n n8n credential:list 2>/dev/null | grep -i notion ... ) # use existing /decrypt-n8n
Alternative simpler: build a tiny one-shot notion-patch-database workflow mirroring notion-update-page but PATCH-ing https://api.notion.com/v1/databases/{id} with the relation property. Reuse the same notion cred. Then call it for each relation.
Required relations (each is dual-property unless noted):
| From DB | Property name | To DB | Notes |
|---|---|---|---|
| Life OS Tasks | Project |
Life OS Projects | dual_property |
| Life OS Tasks | Area |
Life OS Areas | dual_property |
| Life OS Projects | Area |
Life OS Areas | dual_property |
| Life OS Knowledge | Linked Areas |
Life OS Areas | dual_property |
| Life OS Reading & Watch | Linked Knowledge |
Life OS Knowledge | dual_property |
| Life OS Goals | Area |
Life OS Areas | dual_property |
| Life OS Goals | Linked Projects |
Life OS Projects | dual_property |
| JWVR Tasks | Project |
JWVR Projects | dual_property |
| JWVR Content Ideas | Pillar |
JWVR Content Pillars | dual_property |
| JWVR Production | Pillar |
JWVR Content Pillars | dual_property |
| JWVR Production | Linked Idea |
JWVR Content Ideas | dual_property |
| JWVR Published | Pillar |
JWVR Content Pillars | dual_property |
PATCH body for adding a relation property:
{
"properties": {
"Project": {
"relation": {
"database_id": "<target db id>",
"type": "dual_property",
"dual_property": {}
}
}
}
}
Phase C, verify + seed¶
- Call
notion-get-databasefor each new DB id โ confirm properties match expected schema. Log any drift. - Seed the DBs flagged "Seed (Phase C)" above:
- Life OS / Areas: Health, Wealth, Family, Career, Mind, Hobbies, Home, JWVR, Nova Design, Gus Outdoor (all Active? = true)
- JWVR / Content Pillars: VR Reviews, Tutorials, Family Vlogs, Industry News (all Active? = true)
- Use
notion-create-pagewith each DB's id + the appropriate properties dict.
Phase D: Master Tasks page¶
Inside Life OS, create an empty subpage titled "๐ Master Tasks". Body: a single rich_text paragraph saying:
Add linked-database views here from Life OS / Tasks and JustinWieb-VR / Tasks (and future brand Tasks DBs). Use Notion UI: type
/linkedโ pick the source DB โ configure filter/sort/group.
That's it for Phase D: Justin builds the linked views in the UI (much easier than via API).
Use notion-create-page with parent_page_id = Life OS id (37e5e724-ba79-4182-a270-9949b714fab8) and a properties payload like:
Wait, that's for a database row. For a regular subpage under a page, the structure is different. Use:
# Need a different workflow for "create subpage of a page"
# We don't have one yet. Either:
# (a) Skip Phase D โ Justin creates the page manually
# (b) Build a notion-create-subpage workflow first
# Recommend (a) for v1. Document for Justin to do.
Decision: skip Phase D programmatically. In your status report, tell Justin to create the Master Tasks page manually (one click in Notion UI).
Phase E, status report¶
When done, write a status file at:
/home/justinwieb/forge/comms/inbox/parent-session-notion-scaffold-status.md
Include: - Bottom line (created N DBs across Life OS + JWVR) - Table of every DB with its ID + URL (so Justin can click into each) - Phase B relation results (list each one + ok/fail) - Phase C seed results (any rows created) - Phase D handoff note (Justin needs to manually create Master Tasks page) - Anything that failed or surprised you - Next steps for the parent session (brain v1 build can start once verified)
Also commit all the new workflow JSONs (if you built notion-patch-database) to infra/n8n/workflows/.
Files you'll work with¶
| File | Purpose |
|---|---|
infra/n8n/workflows/notion-create-database.json |
Already exists, use it |
infra/n8n/workflows/notion-patch-database.json |
NEW, you'll build this for Phase B |
infra/n8n/workflows/*.json |
Reference, all existing workflows |
scripts/n8n/call.sh |
The helper |
/tmp/notion-scaffold-ids.json |
Your working file, capture IDs as you go |
comms/inbox/parent-session-notion-scaffold-status.md |
Your final output |
~/.claude/projects/-home-justinwieb-forge/memory/MEMORY.md |
Update Tools & Pipelines with the new workflow |
~/.claude/projects/-home-justinwieb-forge/memory/reference_notion_scaffold.md |
NEW, register the scaffold + DB IDs as a reference doc |
Don't do¶
- โ Don't touch any DBs OTHER than Life OS + JWVR (e.g. don't modify Gus Outdoor / Wiebelhaus Fishing / Nova / Gus The Bass, those are scoped for later, after the Odoo decision)
- โ Don't archive any existing DBs. Justin's old Personal Tasks/Projects + JustinWieb-VR's existing Content Idea/Shakespeare Plays subpages stay alone for now. Cleanup is a separate task after he validates the new structure.
- โ Don't build a complex streak formula for Habits, defer. Basic checkbox is enough for v1.
- โ Don't seed lots of test rows. Only the canonical Areas (10) + Pillars (4). Justin populates the rest as he uses it.
- โ Don't try to build the Notion dashboard page (with embeds + linked views). Notion API support for those block types is partial + tedious. Justin builds the dashboard page in UI after.
- โ Don't change the renamed top-level pages (Life OS, JustinWieb-VR). They're already set.
- โ Don't restart n8n more than once. Each restart is ~10s downtime; batch your work + restart at the end if you imported a new workflow.
Deliverables¶
- 17 Notion databases created under their correct parent pages
- Relation properties added per the table in Phase B
- Areas DB seeded with 10 canonical Areas
- Content Pillars DB seeded with 4 canonical Pillars
notion-patch-databaseworkflow built (if needed for Phase B)- Status file at
comms/inbox/parent-session-notion-scaffold-status.md - Reference doc + MEMORY.md entry
Done when¶
- All 17 DBs visible in Notion sidebar under Life OS + JustinWieb-VR
- Each DB's schema verified via
notion-get-database - All 12 relations from Phase B added (or failures explicitly logged)
- Areas seeded (10 rows) + Pillars seeded (4 rows)
- Status report written
- MEMORY.md updated
Conversation pointers¶
- Parent session:
n8n-telegram_Opus47, currently waiting on you + the MkDocs worker - Sister build:
mkdocs-build_Opus47(different worker, Cloudflare Access setup in progress) - Master vision:
memory/handoffs/building-the-brain-life-os-inbox-2026-04-27.md - Notion existing DB inventory + page IDs: in Building The Brain handoff ยง4
- The brain (forthcoming) will use these DBs, every DB id you capture in
/tmp/notion-scaffold-ids.jsonbecomes a tool registry constant ininbox_brain.py. Save them carefully.