Zettelkasten + Action

How I learned from 40 years of Emacs wisdom to design a better personal knowledge system.

The Problem

I started with a pure Zettelkasten β€” atomic cards, links, MOCs. The underlying file organization that makes this work is in Physical vs Conceptual File Organization. It worked beautifully for knowledge. Then I wanted to track project ideas, and everything got complicated.

My first instinct: add a project: true field. But that felt wrong. Was I turning my knowledge base into a todo list?

The Journey

I spent a day exploring:

  1. Trying to add an axis β€” project: true/false? type: idea? Each option polluted my clean ZK schema.

  2. Researching best practices β€” ZK forums, org-mode, todo.txt, GTD. Everyone had different approaches.

  3. Finding the key insight β€” from Emacs org-mode, created in 2003 by Carsten Dominik.

The Org-mode Revelation

Org-mode doesn’t separate β€œnotes” from β€œtasks.” Instead, it makes TODO state an optional overlay on any content.

* TODO [#A] Build practice skill                    :agent:@work:
  SCHEDULED: <2026-02-01>
 
  Content here...

Any heading can have a TODO keyword added or removed. The content doesn’t change β€” you just add an action layer.

This is the opposite of what I was trying to do.

My approachOrg-mode approach
”Tend card to become TODO""Add TODO to card”
Card changes identityCard stays the same
Binary choiceOptional overlay

ZK-First vs TODO-First

Then I realized the historical context:

SystemYearPrimarySecondary
Org-mode2003TODO/GTDNotes (later)
Org-roam2020ZK linkingAdded to org
My system2026ZettelkastenAction (adding now)

Org-mode is TODO-first β€” it started as a task manager and grew into a note system. I’m ZK-first β€” I started with knowledge and I’m adding action capability.

This explains why I need a status field that org-mode doesn’t have. My status: seedling β†’ growing β†’ evergreen tracks knowledge maturity. Org-mode doesn’t care about that β€” it cares about action states.

The Solution: Content + Layers

The final design separates concerns into layers:

# Content Layer (ZK core)
type: claim
status: seedling
tags: [agent, learning]
 
# Action Layer (optional overlay)
todo: incubating
project: language-practice
context: personal
scheduled: 2026-02-01
deadline: 2026-03-01

Key principles:

  1. Cards keep their identity β€” a claim stays a claim, whether or not it has action
  2. Action is optional β€” most cards are pure knowledge, no todo field needed
  3. Layers are independent β€” add/remove action without changing content
  4. Query by layer β€” Dataview can filter by todo or by tags

What I Learned Along the Way

Failed Attempt: Prefixed Tags

I tried using +project and @context in tags, inspired by todo.txt. Elegant in theory, but Dataview doesn’t support special characters in tags.

The Trigger System Still Matters

My existing _trigger/ folder isn’t obsolete β€” it just changed roles:

BeforeAfter
Store todo itemsQuery cards with todo:
Maintain task listsGenerate lists via Dataview
Push mechanismsPush mechanisms (unchanged)

Data lives in cards. Engine lives in trigger.

Historical Echo

My β€œtrigger system” idea β€” adding push mechanisms to a knowledge base β€” echoes what Carsten Dominik did 40 years ago when he combined outlining with TODO management. Same problem, same solution pattern, discovered independently.

The Final Schema

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Card = Content + Layers            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Content Layer (required)                       β”‚
β”‚  β”œβ”€β”€ type: concept | claim | procedure          β”‚
β”‚  β”œβ”€β”€ status: seedling | growing | evergreen     β”‚
β”‚  └── tags: [subjects]                           β”‚
β”‚                                                 β”‚
β”‚  Action Layer (optional)                        β”‚
β”‚  β”œβ”€β”€ todo: incubating | active | waiting | done β”‚
β”‚  β”œβ”€β”€ project: project-name                      β”‚
β”‚  β”œβ”€β”€ context: personal | work | school          β”‚
β”‚  └── deadline: YYYY-MM-DD                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Takeaways

  1. Don’t change what something IS to add what it DOES. A card’s type is its identity. Action is a temporary state.

  2. Study existing systems before inventing. Org-mode solved this 20 years ago. I could have saved time by studying it first.

  3. ZK-first and TODO-first need different designs. Don’t copy TODO-first systems directly into a knowledge base.

  4. Layers beat categories. Instead of β€œknowledge cards vs project cards,” use β€œcards with optional action layer.”

  5. Historical patterns repeat. My β€œnovel” trigger system idea was Carsten Dominik’s solution in 2003.


This post was written after a day-long design session with Claude, where I used it to compare org-mode’s approach with Zettelkasten principles and prototype the layered schema. The full discussion is preserved in my vault as schema-evolution-content-plus-layers.md.