Your markdown files are already your task system

CLI task manager where checkboxes are the database. Tasks live inside your PRDs, READMEs, and notes. No server, no GUI, no second system. Humans and AI agents read the same format.

npm install -g mdtask content_copy
View on GitHub
docs/features/search.md
# Core Features
- [x] MD-001 Basic CLI parser
- [ ] MD-002 Add priority filtering !high
- [ ] MD-003 Git-hook integration @v1.2
- [ ] MD-004 Documentation sweep #docs
Terminal — mdtask list
$ mdtask list --pending
ID      TITLE                       PRIO   TAGS
MD-002  Add priority filtering      HIGH   -
MD-003  Git-hook integration        -      v1.2
MD-004  Documentation sweep         -      #docs
3 tasks pending.
// 01. ARCHITECTURE

The format is the product

Every task is a markdown checkbox with an ID and inline metadata. Standard syntax, no extensions. Write it by hand, parse it with grep, read it with any LLM.

description
- [ ] CLI-042 Add export command #cli #export !high @status:in-progress

Status

Checkbox

ID

Unique key

Title

Plain text

Tags

#prefixed

Priority

!bang

Property

@key:val

// 02. RATIONALE

The Three Pains

AI Visibility

LLMs and AI agents can't "see" inside your Jira or Linear without complex API setups. If your tasks are in the file, the agent already knows what to do.

# claude / codex / opencode
❯ Read docs/features/search.md
  and complete all marked #urgent

Zero Overhead

No new accounts. No "Second Brain" apps. If you have a code editor, you have a task manager. Tasks are version controlled with your code.

$ git commit \
  -m "feat: finish CORE-01"

Single Source

Specs and backlogs stay in sync because they are the same document.
No more "the README says one thing, Jira says another."

# PRD - Search
- [ ] API-10 Pagination
- [x] API-11 Filters
// 03. INTERFACE

Everything you need, nothing you don't

mdtask list
List all pending tasks across all files in the current directory.
mdtask view [id]
Show full context and file location for a specific task.
mdtask done [id]
Mark a task as complete and update the source file checkbox.
mdtask open [id]
Open the specific file and line in your default $EDITOR.
mdtask move [id] [file]
Relocate a task checkbox from one markdown file to another.
mdtask set [id] [meta]
Update tags, priority, or custom @properties.
mdtask ids
Generate new sequential IDs for any checkboxes missing them.
mdtask validate
Check for duplicate IDs or broken syntax formatting.
// 04. FREQUENTLY ASKED

Got questions?

Is this an Obsidian plugin?

No, it's a standalone CLI. However, because it uses standard markdown, it works perfectly inside Obsidian, Logseq, or VS Code. It just reads your files.

Does it require a database?

The markdown files are the database. mdtask scans your folder, builds an in-memory index, and performs actions. No SQLite, no JSON stores.

How do I handle multi-user conflicts?

Use Git. Since tasks are lines of text, Git's merge logic handles conflicts naturally. If two people mark a task as done, it's a simple line merge.

What about performance with large repos?

mdtask uses multi-threaded regex scanning. It can parse 10,000 markdown files in under 200ms.

Start with the files you already have

Navigate to any project with markdown files and run the indexer. It will find existing checkboxes and offer to ID them.

cd my-project && mdtask ids
Get started →

Contribute

MDTASK is open source. We're looking for contributors to help with improved AI agent prompt templates and editor plugins.

terminal
"The best tool is the one you already have open."
View on GitHub →