Beta Early version. Issues and ideas are very welcome.

Your markdown files are already your task system

CLI task manager where checkboxes in your .md files 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] SRCH-001 Basic CLI parser
- [ ] SRCH-002 Add priority filtering !high
- [ ] SRCH-003 Git-hook integration @version:1.2
- [ ] SRCH-004 Documentation sweep #docs
Terminal
$mdtask list
ID          TITLE                       PRIO   TAGS
SRCH-002    Add priority filtering      HIGH   -
SRCH-003    Git-hook integration        -      @version:1.2
SRCH-004    Documentation sweep         -      #docs
3 tasks pending.
// 01. ARCHITECTURE

The format is everything

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

[ ]

ID

CLI-042

Title

Add export command

Tags

#cli #export

Priority

!high

Property

@status:in-progress
// 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-010 Pagination
- [x] API-011 Filters
// 03. INTERFACE

Everything you need, nothing you don't

$ mdtask --help
Usage:
  $ mdtask <command> [options]
Commands:
list [...filters]List tasks view <id>View task details done <id>Toggle task done/open open <id>Open task in $EDITOR move <id> <file>Move task to another file validateCheck task integrity set <...args>Add metadata to tasks idsAuto-assign IDs to unidentified tasks
$
// 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