Reading Progress Tracker
Track pages read in one book, with progress saved on this device.
Projects, Areas, Resources, Archive, wired with relations and a home dashboard.
Exactly what Notion Arena sends to Notion, in order. Notion's data-source model forces two passes: relations, rollups and the formulas that read them need data_source_ids that only exist once the databases do.
/v1/pagesCreate the “para-life-os” container page under the page you chose
/v1/databasesCreate the “Projects” database with 5 base properties
/v1/databases/{projects_database_id}Read back Projects to get its default data source id
/v1/data_sources/{projects_data_source_id}Add 9 deferred properties to Projects: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/databasesCreate the “Areas” database with 5 base properties
/v1/databases/{areas_database_id}Read back Areas to get its default data source id
/v1/data_sources/{areas_data_source_id}Add 5 deferred properties to Areas: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/databasesCreate the “Resources” database with 7 base properties
/v1/databases/{resources_database_id}Read back Resources to get its default data source id
/v1/data_sources/{resources_data_source_id}Add 1 deferred properties to Resources: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/databasesCreate the “Notes” database with 5 base properties
/v1/databases/{notes_database_id}Read back Notes to get its default data source id
/v1/data_sources/{notes_data_source_id}Add 2 deferred properties to Notes: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/databasesCreate the “Tasks” database with 5 base properties
/v1/databases/{tasks_database_id}Read back Tasks to get its default data source id
/v1/data_sources/{tasks_data_source_id}Add 2 deferred properties to Tasks: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/viewsCreate the “Active” board view on projects
/v1/viewsCreate the “Areas” gallery view on areas
/v1/viewsCreate the “Today” list view on tasks
/v1/viewsCreate the “Inbox” table view on notes
/v1/viewsCreate the “Quick capture” form view on notes
/v1/viewsCreate the “Library” table view on resources
/v1/viewsCreate the “Needs a review” table view on areas
/v1/pagesSeed 2 rows into Projects so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesSeed 3 rows into Areas so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesSeed 2 rows into Resources so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesSeed 1 rows into Notes so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesSeed 2 rows into Tasks so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesCreate the “Home” page
/v1/blocks/{home_page_id}/childrenAppend 16 blocks of page body
3 steps cannot be scripted: Synced block duplicates across dashboards; Button: “Start my day”; Recurring template: weekly review.
curl -X POST https://notionarena.vercel.app/api/install \
-H 'content-type: application/json' \
-d '{
"component": "para-life-os",
"mode": "plan"
}'
# add "token" and "parentPageId" and switch to "mode": "api" to install for realThe real property schemas, not a description of them. Every formula below is a Notion Formula 2.0 expression you can paste into a property by hand if you would rather not use the API at all.
ref: projectsn/aSomeday → Next up → Active → Blocked +2→ areas (two-way)n/an/an/a→ tasks (two-way)→ notes (two-way)checked(Tasks.Done)count_values(Tasks.Name)if(prop("Tasks total") == 0, 0, round(prop("Tasks done") / prop("Tasks total") * 100))slice("██████████", 0, round(prop("% complete") / 10)) + " " + format(prop("% complete")) + "%"if(empty(prop("Deadline")), 0, dateBetween(prop("Deadline"), now(), "days"))ifs(prop("Status") == "Blocked", "🔴 Blocked", prop("Days to deadline") < 0 and prop("Status") != "Done", "🔴 Overdue", prop("Days to deadline") < 7 and prop("% complete") < 70, "🟡 Tight", prop("Status") == "Active", "🟢 On it", true, "⚪")ref: areasn/an/an/aWeekly · Monthly · Quarterlyn/a→ projects→ notes (two-way)→ resources (two-way)count(Projects.Status)ifs(prop("Review cadence") == "Weekly", dateBetween(now(), prop("Last reviewed"), "days") > 7, prop("Review cadence") == "Monthly", dateBetween(now(), prop("Last reviewed"), "days") > 31, true, dateBetween(now(), prop("Last reviewed"), "days") > 92)ref: resourcesn/aArticle · Book · Tool · Course +2n/aDesign · Engineering · Writing · Business +1→ areas★ · ★★ · ★★★ · ★★★★n/an/aref: notesn/an/aFleeting · Literature · Permanent · Meeting→ projects→ areasidea · question · quote · decisionn/aref: tasksn/an/an/a2m · 15m · 1h · Half day→ projectsToday · This week · Laterifs(prop("Done"), "✅", empty(prop("Due")), "⚪", prop("Due") < now(), "🔴", dateBetween(prop("Due"), now(), "days") == 0, "🟠", true, "🟢")Created through POST /v1/views, which shipped in March 2026 and is the reason provisioning a workspace from code finally works end to end.
on projects
filter: {"property":"Status","status":{"equals":"Active"}}…
on areas
on tasks
filter: {"and":[{"property":"Done","checkbox":{"equals":false}},{"proper…
on notes
filter: {"property":"Process this","checkbox":{"equals":true}}…
on notes
on resources
on areas
filter: {"property":"Review due","checkbox":{"equals":true}}…
Appended with real block types (headings, toggles, callouts, to-dos, column lists) in chunks of 100, the Append block children limit.
One entry point. Everything else is a linked view.
Today
· linked view of Tasks → Today
Active
· linked view of Projects → Active
Linked view: Tasks, filtered to Where = Today and Done is unchecked.
Linked view: Projects, Status = Active, sorted by Days to deadline.
Archive is a status, not a place. Everything you have ever written stays searchable.
Every recipe ships with its manual steps written out, because pretending the API covers everything is how people end up with a half-built workspace. These are real Notion limitations, quoted from the API reference.
The API can append an original synced_block, but the duplicate instances that reference it must be created in the app.
Button properties are response-only in the Notion API: the schema is returned on read, but the API ignores button settings on write and cannot create a button or configure its actions.
Recurring database templates (daily/weekly/monthly) are configured in the app on the template's ••• menu; the API can create pages from a template but cannot schedule recurrence.
Tiago Forte's PARA method as a real Notion system rather than four empty pages. Notes and Tasks relate into Projects and Areas, Resources hold reference material, and Archive is a filtered view rather than a fourth silo. Ships with the home dashboard page.
Track pages read in one book, with progress saved on this device.
A due-card queue with simple local review intervals.
A focused question-and-answer deck with active-recall progress.