In software projects, you keep running into the same issue. Planning lives in one place, implementation in another, and context gets lost between sessions. When an LLM became a regular collaborator, I needed a shared way of working. Something both I and the AI could read, write, and navigate without extra tools or integrations.

The solution I have currently ended up with: plain text files, Obsidian Kanban, and Git.
LLMs work best when context is explicit and easy to read. A Markdown file in version control is a perfect shared format. It is human-readable, versioned, linkable, and the LLM can read and write it directly without any APIs or special formats.
Each project has two core files:
- research.md is about understanding the system. It captures what actually exists in the codebase, where edge cases are, and what architectural constraints affect implementation. The LLM reads source code, migrations, tests, and docs, then writes down its findings before anything is changed. This step is critical. Without it, plans are based on assumptions, and assumptions break quickly.
- plan.md is the implementation plan. It is structured into phases, backed by checklists, and updated as work progresses. It is not a spec or a design doc. It is a practical roadmap that evolves as you go.
Research before implementation
Before planning anything, the LLM goes through the relevant code in detail. The goal is not to explain the code, but to understand contracts, inconsistencies, and risks.
In practice, you give it a concrete question or goal, for example:
“what prevents deterministic synchronization between a C++ codebase and a Django database”
It then goes through the code and finds real issues such as schema mismatches, missing discriminators, or side effects in export logic. These are written into research.md as structured findings, not vague summaries.
The result is a document that describes what actually exists, not what we assume exists. It becomes the foundation for planning and later a reference when validating correctness and regressions.
Planning and phasing
Once the technical picture is clear, implementation is broken into phases inside plan.md.
A phase is a concrete unit of work. It has a clear outcome, it can be validated, and it does not depend on unfinished work unless necessary.
Each phase gets its own file:
- 1.1 Fix writer schema compatibility.md
- 1.2 Pure payload export.md
These files contain the details: tasks, dependencies, validation steps, and open questions. plan.md links to them but does not duplicate their content. This keeps plan.md readable at a high level, while the details stay in separate files. In later sessions, the LLM can load just one phase instead of the entire project.
Turning into a kanban view
Obsidian Kanban turns this file structure into something easy to navigate. Cards are just links:
- Metaprojects link to research.md and plan.md
- Phases link to their own files
The columns are simple:
- High-Level Metaprojects: overall project view
- Planning LLM: phases ready to be implemented
- In Progress: active work
- Completed: finished work in version control
Since cards are just links, updating the board is the same as updating files. The Git log becomes the project timeline.
Win: Continuity between sessions
This setup solves one of the biggest problems in LLM-assisted development: losing context between sessions.
When starting a new session, the LLM reads plan.md and the current phase file. It immediately sees what has been done, what is left, and what decisions have already been made. There is no need to re-explain anything.
Git acts as long-term memory when chat history is gone. Commit messages naturally reflect progress because the structure encourages it.
Why it works
- No extra tools Everything is Markdown and Git. Obsidian is just a way to view it.
- LLM is used where it works best Reading code, finding inconsistencies, and structuring information. Once the plan is clear, implementation is straightforward.
- You stay in control The Kanban board shows the state at a glance. Phases keep work scoped. Checklists define what done actually means.
- It scales well The same structure works for small fixes and large projects. Numbering (N for projects, N.M for phases) keeps everything consistent as it grows.
How the Kanban board actually works
At this point, the Kanban board is not a separate system. It is just a view into the same files.
There is one board, stored as obsidian obsidian/[project]/devkanban.md in git. It is not regenerated or replaced. It evolves as the repository evolves. Updating the board is the same as updating the underlying Markdown files. Of course there may be another kanban board for e.g. higher level project or business vision.
Each project appears once as a metaproject card. The naming is simple and consistent: N. Project Title. That number is not cosmetic. It becomes the anchor for everything else. From that one card, you can jump straight into the project’s Research.md and Planning.md.
Projects can start as messy folders or single files, but they all end up in the same shape. One research document that explains what is actually going on, and one planning document that defines what should happen next. The structure of the repository is preserved, but the naming becomes explicit so you can navigate it without guessing.
The real work, though, does not live at the project level. It lives in phases.
Every actionable piece of work inside Planning.md is pulled out into its own unit. Each one gets a number like N.M, a clear title, and its own file. The Kanban card links to that file, and the planning document links to it as well. Instead of scrolling through a long plan, you jump directly into the exact slice of work you care about.
Those phase files carry the weight of execution. They contain the checklist, the dependencies, the validation steps, and whatever open questions still exist. The main plan stays readable because it stops trying to hold all the details at once.
Not everything becomes a phase. Only work that can actually be executed and verified makes the cut. General notes, process instructions, or vague ideas stay in the plan. The board reflects real work, not intent.
The system can also contain smaller TODO items. If something is waiting to be done, it shows up in the planning column like everything else. If it turns into a concrete phase, it gets a number and a planning file. If it is already done, it skips straight to completed. The system does not care where something came from, only what state it is in now.
Completion is equally straightforward. When the checklist is done, or the work has clearly been implemented and validated, the card moves to Completed. It does not stay duplicated in multiple places. The board shows the current truth, not history.
Underneath all of this is a small set of constraints that keep things from drifting. Projects have a single index. Phases derive from that index. Cards always point to real files. Files link back to their context when needed. Content is moved rather than copied, so there is only ever one source of truth.
What you end up with is not a Kanban tool in the traditional sense. It is a thin layer over your repository. The board shows you where things stand, the planning files explain what should happen, the phase files define what you are actually doing.
All of it lives in the same place, changes together, and can be understood by both you and the LLM without translation.
Skill
You can add this to your SKILLS.md file:
---
name: obsidian-plan
description: Create or update Obsidian planning, research, and kanban entries for a new project or feature in obsidian/project/. Creates the top-level project entry, Research.md, Planning.md, and individual phase cards, then wires all links into Dev planning.md kanban board.
argument-hint: [project-number] [project-name] [brief-description]
---
You are creating or updating Obsidian planning documents for a new project or feature in this repo.
The Obsidian vault is at `obsidian/project/`. The kanban board is at `obsidian/project/Dev planning.md`.
All phase cards and top-level planning/research files live under `obsidian/project/LLM planning/`.
## Arguments
$ARGUMENTS
If a project number, name, and brief description are provided, use them.
If no arguments are given, ask the user what the project is about before proceeding.
## What to produce
### 1. Top-level kanban entry in `obsidian/project/Dev planning.md`
Add to the `## High-level metaprojectss` section (keep numeric order):
```
- [ ] NN. Project Name ([[NN. Project Name/Research|Research]] · [[NN. Project Name/Planning|Planning]])
```
### 2. Project folder and files
Create `obsidian/project/LLM planning/NN. Project Name/` with:
**Research.md** — frontmatter: `project`, `status: research complete`. Content:
- Problem statement / context
- Key architectural decisions and trade-offs
- Relevant existing code / systems involved
- Limitations and open questions
**Planning.md** — frontmatter: `project`, `status: planned`. Content:
- Goal paragraph
- `## Phases` section listing all phase cards as `- ⬜ [[NN. Project Name/NN.X Project Name — Phase Title|NN.X Phase Title]] — one-line description`
- Design principles (numbered list)
- Non-goals
### 3. Phase cards
One file per phase: `obsidian/project/LLM planning/NN. Project Name/NN.X Project Name — Phase Title.md`
Phase cards live **inside** the numbered project directory, not loose in `LLM planning/`.
Each card frontmatter:
```yaml
---
phase: "NN.X"
project: "NN. Project Name"
status: pending
---
```
Each card body:
- `# NN.X Project Name — Phase Title`
- Back-links: `Kanban: [[Dev planning]]` and `Planning: [[NN. Project Name/Planning]]`
- `## Goal` — one paragraph
- `## Context` — why this phase exists, what it depends on
- `## Files` — relevant files to create or modify (with paths)
- `## Tasks` — numbered implementation steps
- `## Done Criteria` — bullet list of verifiable exit conditions
### 4. Phase sub-tasks in kanban
Add to `obsidian/project/Dev planning.md` under `## planning LLM`, in numeric order after any existing entries for the same project:
```
- [ ] NN.X Project Name — Phase Title ([[NN.X Project Name — Phase Title]])
```
## Conventions to follow
- Phase cards live inside `NN. Project Name/` subdirectory, not loose in `LLM planning/`
- Links to Research/Planning use path: `[[NN. Project Name/Research|Research]]`
- Phase card links in Planning.md use path: `[[NN. Project Name/NN.X ...|display name]]`
- Kanban phase sub-task links use short `[[NN.X ...]]` — unique filename resolves correctly
- Phase card filenames use em-dash ` — ` between project name fragment and phase title
- `status` in frontmatter: `pending` for not started, `in progress`, `done`
- Number phases from 0; use 0 for any prerequisite/foundation phase
- Deferred or optional phases get `status: deferred` and a note explaining the condition
- Keep phase descriptions in Planning.md to one line; detail lives in the phase card
## After creating files
Confirm what was created and offer to commit with an appropriate message.