Reading Progress Tracker
Track pages read in one book, with progress saved on this device.
A meetings database with a template that writes its own action items.
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 “meeting-notes-os” container page under the page you chose
/v1/databasesCreate the “Meetings” database with 10 base properties
/v1/databases/{meetings_database_id}Read back Meetings to get its default data source id
/v1/data_sources/{meetings_data_source_id}Add 6 deferred properties to Meetings: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/databasesCreate the “Action Items” database with 6 base properties
/v1/databases/{actions_database_id}Read back Action Items to get its default data source id
/v1/data_sources/{actions_data_source_id}Add 2 deferred properties to Action Items: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/databasesCreate the “Projects” database with 4 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 2 deferred properties to Projects: relations (with resolved data_source_ids), then the rollups and formulas that read them
/v1/viewsCreate the “Calendar” calendar view on meetings
/v1/viewsCreate the “Notes owed” table view on meetings
/v1/viewsCreate the “By type” board view on meetings
/v1/viewsCreate the “My open actions” table view on actions
/v1/viewsCreate the “Overdue” list view on actions
/v1/viewsCreate the “Meetings per project” chart view on meetings
/v1/pagesSeed 2 rows into Meetings so the views are not empty on first open (one request per row; Notion has no bulk insert)
/v1/pagesSeed 2 rows into Action Items so the views are not empty on first open (one request per row; Notion has no bulk insert)
/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/pagesCreate the “Meeting page template body” page
/v1/blocks/{meeting_page_template_body_page_id}/childrenAppend 16 blocks of page body
3 steps cannot be scripted: Database template: “Meeting”; Button: “New meeting”; Automation: close the loop after the meeting.
curl -X POST https://notionarena.vercel.app/api/install \
-H 'content-type: application/json' \
-d '{
"component": "meeting-notes-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: meetingsn/a1:1 · Team · Project · Client +2n/an/aScheduled → Happening → Notes written → Actions closed +1→ projects (two-way)→ actions (two-way)n/an/an/an/aunchecked(Action items.Done)count_values(Action items.Name)if(prop("All actions") == 0, "n/a", format(prop("All actions") - prop("Open actions")) + "/" + format(prop("All actions")))if(and(prop("Date") < now(), prop("Status") == "Scheduled"), "🔴 Notes not written", "")n/aref: actionsn/an/an/an/aHigh · Medium · Low→ meetingsn/aifs(prop("Done"), "✅ Done", empty(prop("Due")), "⚪ No date", prop("Due") < now(), "🔴 Overdue", dateBetween(prop("Due"), now(), "days") == 0, "🟠 Today", true, "🟢 " + format(dateBetween(prop("Due"), now(), "days")) + "d")ref: projectsn/adefault Not started / In progress / Donen/an/a→ meetingscount_values(Meetings.Name)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 meetings
on meetings
filter: {"property":"Is overdue","string":{"does_not_equal":""}}…
on meetings
on actions
filter: {"and":[{"property":"Done","checkbox":{"equals":false}},{"proper…
on actions
filter: {"property":"Due state","string":{"contains":"Overdue"}}…
on meetings
Appended with real block types (headings, toggles, callouts, to-dos, column lists) in chunks of 100, the Append block children limit.
Date
@Attendees
Type
Project
Notes
Embed the Action Items database as a linked view filtered to this meeting. Then each row you add is a real tracked action with an owner and a due date.
Anything unresolved from the last meeting with this group. Linked view: same Type, same Attendees, Status ≠ Actions closed.
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 create a page with this body and can apply an existing template when creating a page, but it cannot author the template itself.
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.
Database automations have no public API surface. They are configured per-database in the Notion app under ••• → Automations.
The highest-leverage recipe in the kit. One database, one page template with agenda / notes / decisions / action items sections, a relation from action items back to a Tasks database, and a button that opens a pre-filled new meeting in one click.
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.