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:
-
Trying to add an axis β
project: true/false?type: idea? Each option polluted my clean ZK schema. -
Researching best practices β ZK forums, org-mode, todo.txt, GTD. Everyone had different approaches.
-
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 approach | Org-mode approach |
|---|---|
| βTend card to become TODO" | "Add TODO to cardβ |
| Card changes identity | Card stays the same |
| Binary choice | Optional overlay |
ZK-First vs TODO-First
Then I realized the historical context:
| System | Year | Primary | Secondary |
|---|---|---|---|
| Org-mode | 2003 | TODO/GTD | Notes (later) |
| Org-roam | 2020 | ZK linking | Added to org |
| My system | 2026 | Zettelkasten | Action (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-01Key principles:
- Cards keep their identity β a claim stays a claim, whether or not it has action
- Action is optional β most cards are pure knowledge, no todo field needed
- Layers are independent β add/remove action without changing content
- Query by layer β Dataview can filter by
todoor bytags
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:
| Before | After |
|---|---|
| Store todo items | Query cards with todo: |
| Maintain task lists | Generate lists via Dataview |
| Push mechanisms | Push 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
-
Donβt change what something IS to add what it DOES. A cardβs type is its identity. Action is a temporary state.
-
Study existing systems before inventing. Org-mode solved this 20 years ago. I could have saved time by studying it first.
-
ZK-first and TODO-first need different designs. Donβt copy TODO-first systems directly into a knowledge base.
-
Layers beat categories. Instead of βknowledge cards vs project cards,β use βcards with optional action layer.β
-
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.