TL;DR : Each markdown file's frontmatter has a status field with values draft → ready → live → archived . A 30-line scanner reads all files and renders a kanban view by status column. No SaaS subscriptions, no syncing issues, files stay in git. The kanban states Every paste-ready content file uses one of: Status Meaning draft Started writing, not ready to publish ready Self-verified, ready to publish live Published (Substack/Gumroad) published Published (dev.to — the platform uses different terms) archived Done, kept for reference Other fields: priority : P0 (today) / P1 (this week) / P2 (this month) category : content / product / roadmap / kit publish_target_date : ISO 8601 date The scanner import yaml from pathlib import Path from collections import defaultdict def kanban_view ( root : Path ): """ Render kanban view across all markdown files with frontmatter. """ columns = defaultdict ( list ) for md_file in root . rglob ( " *.md " ): content = md_file .…