Skip to content

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:

  1. Phase A, create all 17 DBs without relations (just title + simple property types)
  2. Phase B, patch relation properties between DBs that need linking
  3. Phase C, verify schemas via notion-get-database
  4. Phase D, create the Master Tasks page (empty: Justin adds linked views in UI)
  5. Phase E, write status report

DB schemas (Phase A, no relations yet)

For each DB below, call:

scripts/n8n/call.sh notion-create-database '<json>'

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:

{
  "lifeos": {
    "inbox": "<id>",
    "tasks": "<id>",
    ...
  },
  "jwvr": {
    "content_ideas": "<id>",
    ...
  }
}

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": {} }
  }
}
Note: leave Status to defaults (Notion auto-creates "Not started / In progress / Done"). Justin can rename/extend in UI later.

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"}
    ]}}
  }
}
Seed (in Phase C, after creation): rows for Health, Wealth, Family, Career, Mind, Hobbies, Home, JWVR, Nova Design, Gus Outdoor, all Active? = true.

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": {} }
  }
}
Note: long-format DB (one row per habit per day). Streak formula is too complex for first scaffold: Justin can add via UI later (or we add in v2).

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": {} }
  }
}
Title is Date as text: Justin (or brain) names rows like 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": {} }
  }
}
Seed (Phase C): rows for "VR Reviews", "Tutorials", "Family Vlogs", "Industry News", all Active? = true. Justin can edit.

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

  1. Call notion-get-database for each new DB id โ†’ confirm properties match expected schema. Log any drift.
  2. Seed the DBs flagged "Seed (Phase C)" above:
  3. Life OS / Areas: Health, Wealth, Family, Career, Mind, Hobbies, Home, JWVR, Nova Design, Gus Outdoor (all Active? = true)
  4. JWVR / Content Pillars: VR Reviews, Tutorials, Family Vlogs, Industry News (all Active? = true)
  5. Use notion-create-page with 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:

{
  "title": [{"type":"text","text":{"content":"๐Ÿ“‹ Master Tasks"}}]
}

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

  1. 17 Notion databases created under their correct parent pages
  2. Relation properties added per the table in Phase B
  3. Areas DB seeded with 10 canonical Areas
  4. Content Pillars DB seeded with 4 canonical Pillars
  5. notion-patch-database workflow built (if needed for Phase B)
  6. Status file at comms/inbox/parent-session-notion-scaffold-status.md
  7. 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.json becomes a tool registry constant in inbox_brain.py. Save them carefully.