Command-line utilities for my Notion workflow. Minimal, practical, and consent-gated where writes occur.
TSV → Notion tasks importer.
- Golden path only
- Reads
tasks.tsv
(tab-separated) and auto-maps TSV headers to Notion properties (case-insensitive). - Supports:
title
,rich_text
,select
,status
,multi_select
,number
,checkbox
,date
,url
,email
,phone_number
, andpeople
(single or multiple via comma/semicolon). - Flow: PREVIEW (no writes) → Write gate
ALL / YES / NO
→ per-rowYES / SKIP / ALL
. - Before every write (POST), prints the purpose, payload length, and a 256-char JSON preview.
# go to the tool
cd task_tsv_import
# install dependency
pip install requests
# place your data as tasks.tsv (tab-separated) next to the script
# headers should match your Notion property names (case-insensitive)
# run (prompts for Notion token and Database ID)
python notion_tsv_import.py
Title Status Assigned to Tags Due Date
Pay Bills In Progress SMichelle Finance, Bills 2025-09-30
Book dentist Done Michelle Health 2025-10-15
- Header → Property by name (case-insensitive 1:1).
- Title value comes from the TSV column that matches your Notion title property; if none, uses the first column.
- People fields accept lists:
alice@example.com, Bob
orAlice; Bob
.
-
PREVIEW: prints counts and samples — no writes here.
-
Write?
[ALL/YES/NO]
ALL
: write all without further promptsYES
: ask per rowNO
: exit
-
Per row (if not ALL): shows purpose/length/preview, then
[YES/SKIP/ALL]
.
- Keep tokens secret (never commit). Rotate immediately if exposed.
- Start with a small TSV, verify the preview, then choose
ALL
when confident.
.
├─ README.md
└─
└─ task_tsv_import/
└─ task_tsv_import.py
This layout keeps the root clean and leaves room for additional tools later without changing the existing paths.