Type a brain dump → Claude parses it into Notion rows → review/edit → write.
Built on the Claude Agent SDK. Uses your Claude Code OAuth, so there's no API bill — inference runs on your Max subscription.
every productivity system fails at the same point: capture and triage live in the same moment.
you have a thought, and the system asks you to also pick a category, priority, due date, energy level, and project. so you pick none. the thought rots in an untagged row.
i've been a notion guy for years and watched my own database become a graveyard of half-captured ideas. the structure was there, i just never had the energy to fill it in mid-flow.
dumpr fixes that. dump first, let claude do the boring part, review the table, ship to notion. capture and triage stay separate, the way they should be.
Create a database with these 7 properties — exact names, case-sensitive:
| Property | Type | Options |
|---|---|---|
Title |
Title | — |
Type |
Select | Task, Project |
Domain |
Select | (you choose — see step 3) |
Priority Level |
Select | P1 – Critical, P2 – Important, P3 – Normal, P4 – Low ⚠ |
Effort |
Select | Low, Medium, High |
Status |
Select | Backlog, Planned, In Progress, Blocked, Done, Dropped |
Due Date |
Date | — |
⚠ Priority values use an em-dash (–), not a hyphen (-). Copy-paste
the exact strings from the table above. Notion select options match exactly,
so a hyphen will silently fail with a write error like
Priority "P1 - Critical" is not a valid option.
- Create an internal integration at https://www.notion.so/profile/integrations with capability Insert content.
- Open your database → … menu → Connections → grant your integration access.
- Copy the integration token (
secret_…). - Find your data source ID (this is what the v5 SDK writes to — not the database ID). Open the database as a full page, then … menu → Copy link to data source, and pull the UUID from the copied URL.
Domains are the life-buckets that mean something to you. The repo ships
with 14 generic example domains (Work, Clubs, Community, Coursework,
Family, Health, Deen, …) as a starting point — your real life buckets
are probably different. Edit three places:
lib/types.ts—DOMAIN_VALUESarray (the canonical list).lib/notion.ts—DOMAIN_ICONSmap (one emoji per domain; sets the per-page icon in Notion).skills/SKILL.md— the "Domain inference" section near the bottom. This is what the AI uses to decide which domain a dump line belongs to. The most important of the three.
For each domain you set, also add it as a select option on the Domain
property in your Notion database, otherwise writes will fail.
Copy .env.local.example → .env.local and fill in your values:
NOTION_TOKEN=secret_<your token>
NOTION_DATA_SOURCE_ID=<your data source UUID>
This app uses your Claude Code OAuth — there's no ANTHROPIC_API_KEY,
inference runs on your Max subscription. If you don't already use Claude
Code:
npm install -g @anthropic-ai/claude-code
claude /loginThis creates ~/.claude/config, which the agent SDK reads automatically.
npm install
npm run build
npm run startOpen http://localhost:3000 and bookmark it. For development:
npm run dev.
lib/skill.ts reads skills/SKILL.md, appends a JSON-output override, and
sends both as a system prompt to Claude via @anthropic-ai/claude-agent-sdk.
The model returns a JSON array of typed items. Zod validates the shape, the
UI shows a preview table for inline editing, and on confirm the rows are
written to Notion sequentially via @notionhq/client.
npm test34 tests covering SKILL.md prompt assembly, Item → Notion property mapping, batch writes with stop-on-first-failure, agent-SDK orchestration with JSON validation, and both API routes. All tests mock the agent SDK and Notion client — no live services touched.
MIT. See LICENSE.


