Markdown-file task manager for solo devs building with Claude Code
Project description
vault-tasks
Markdown-file task manager for solo devs building with Claude Code.
Tasks are plain markdown files with YAML frontmatter. They live in your repo (or Obsidian vault), are version-controlled with git, and are readable by humans and LLMs alike. Zero runtime dependencies.
Install
npm install -g vault-tasks
Or use without installing:
npx vault-tasks <command>
Requires Node.js >= 20.
Python projects (pip / uv)
If your project's lockfile is Python-based and you'd rather pin vault-tasks alongside your other dev dependencies:
pip install vault-tasks
# or
uv add --dev vault-tasks
The pip wheel is small (~100 KB) and bundles the same compiled JS that ships on npm. It still requires node (>= 20) on PATH — the wheel does not vendor a Node.js runtime.
Quick start
# Initialize in your repo/vault root
vt init
# Create a task
vt new "Fix login redirect bug" --priority high --tags auth,bug
# See what's open
vt list
# Start working on it
vt start 1
# Mark it done (auto-archives by default)
vt done 1
vt init creates a .vault-tasks.toml config and a backlog/ directory. Tasks are markdown files with ULID prefixes (e.g., 01HYX3KQPD7NG8RRGSSFQ9XNHY-fix-login-redirect-bug.md). Sequential numeric IDs (0001-...) are also supported via config.
Commands
| Command | Description |
|---|---|
vt new <title> |
Create a task. Options: --priority, --tags, --source, --commit |
vt list |
List open tasks. Options: --status, --priority, --tag, --all |
vt search <keyword> |
Search titles and body text. --all includes archived. --mode bm25 ranks by relevance; --like <id> finds similar tasks; --limit N caps results |
vt show <id> |
Print full task file |
vt start <id> |
Set status to in-progress |
vt done <id> |
Set status to done (auto-archives) |
vt edit <id> |
Update fields: --status, --priority, --tags |
vt stale |
List open tasks older than 14 days. --days to customize |
vt archive |
Move all completed tasks to the archive directory |
vt tags |
List all tags and their counts |
vt lint |
Audit the vault: broken wikilinks, orphan evergreens, stale refs, drift. --only, --scope, --json, --quiet, --no-suggestions |
vt init |
Initialize config and backlog directory |
vt install-skills |
Install Claude Code skills and rules. --install, --list, --update |
Task lookup (<id>) accepts a ULID prefix (e.g., vt done 01HYX), a numeric ID for sequential vaults (e.g., vt done 1), or a substring match against the filename (e.g., vt done login).
Task format
Each task is a markdown file with YAML frontmatter:
---
title: "Fix login redirect bug"
status: open
priority: high
tags:
- auth
- bug
created: 2026-04-02
source: "[[2026-04-02 Session Log]]"
---
# Fix login redirect bug
After OAuth callback, users are redirected to `/` instead of the page they came from.
- Status:
open,in-progress,done,wont-do - Priority:
high,medium,low - Tags: freeform, filterable via
vt list --tag - Source: where the task was noticed (supports
[[wikilinks]])
Extra frontmatter fields (e.g. due, assignee) are preserved through all operations.
Configuration
vt init creates .vault-tasks.toml at your vault root:
[paths]
backlog_dir = "backlog" # where task files live
archive_dir = "archive" # relative to backlog_dir
# journal_dir = "journal" # build logs and session notes
# projects_dir = "projects" # project folders with CONTEXT.md
# evergreen_dir = "evergreen" # evergreen/zettelkasten notes
[task]
# statuses = ["open", "in-progress", "done", "wont-do"]
# priorities = ["high", "medium", "low"]
# default_priority = "medium"
# default_status = "open"
# archive_statuses = ["done", "wont-do"]
# auto_archive = true
[id]
# strategy = "ulid" # "ulid" | "sequential" | "timestamp"
# pad_width = 4 # zero-pad width (only used with sequential)
[slugify]
# max_length = 60
The config file is discovered by walking up from the current directory, so it works from any subdirectory.
Claude Code skills
vault-tasks ships with skill templates that teach Claude Code how to work with your task backlog:
vt install-skills --install
This installs into .claude/skills/ and .claude/rules/:
| Skill | What it does |
|---|---|
/brief |
Pre-session briefing: open tasks, last session context, stale threads |
/build-log |
End-of-session log: what was built, learned, decided. Extracts tasks |
/weekly-review |
Consolidates journal entries, creates evergreen notes, triages backlog |
/task |
Quick task creation/management from within a session |
/lint |
Vault health check: broken wikilinks, orphans, stale refs, convention drift |
Skills reference configurable vault paths (journal_dir, projects_dir, evergreen_dir) which are substituted from your .vault-tasks.toml at install time. Customize any skill by creating a SKILL.local.md next to the installed SKILL.md -- local files are never overwritten.
An Obsidian Bases dashboard (backlog.base) is also installed for visual task management.
Library API
vault-tasks also exports a programmatic API:
import { loadConfig, TaskStore } from "vault-tasks";
const config = loadConfig();
const store = new TaskStore(config);
// Create
const task = store.create({ title: "My task", priority: "high", tags: ["api"] });
// Query
const all = store.loadAll();
const results = store.search("login");
const stale = store.stale(14);
const tags = store.allTags();
// Update
store.update(task, { status: "done", priority: "low", tags: ["api", "shipped"] });
store.archiveCompleted();
Exports
TaskStore-- all CRUD operationsloadConfig/findConfigFile-- config discovery and parsingparseFrontmatter/writeFrontmatter-- YAML frontmatter utilitiesslugify-- title to kebab-case filenamelintVault-- run all lint checks; returns aLintReport- Lower-level lint primitives:
buildIndex,resolveTarget,collectWikilinks,findBrokenLinks,findOrphanEvergreens,findStaleReferences,findEvergreenDrift,attachSuggestions - Types:
Task,CreateTaskOpts,Config,LintReport,LintOptions,WikiLink,VaultFile,BrokenEntry,Suggestion,SearchHit,SearchMode,SearchOptions
Ranked search (vault-tasks/search)
A separate, zero-dependency subpath export provides BM25-ranked search and
task-to-task similarity. Imported only when needed -- the core vault-tasks
entry point is unaffected.
import { TaskStore, loadConfig } from "vault-tasks";
import { searchTasks, similarTasks, BM25Index, tokenize } from "vault-tasks/search";
const store = new TaskStore(loadConfig());
// Free-text query, ranked by BM25
const hits = await searchTasks(store, "auth callback", { mode: "bm25", limit: 10 });
// Tasks similar to a given task (by title + tags)
const target = store.findIncludingArchive("0042");
const related = await similarTasks(store, target, { mode: "bm25" });
Available modes: keyword (substring matching across title, body, AND tags;
priority-sorted; the default for both the CLI and searchTasks) and bm25
(ranked by BM25 score; title-weighted document construction). Semantic and
hybrid modes are planned and will require an optional embedder peer
dependency; until then they are deliberately excluded from the SearchMode
type so accidental use is a compile-time error rather than a runtime crash.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vault_tasks-0.5.0.tar.gz.
File metadata
- Download URL: vault_tasks-0.5.0.tar.gz
- Upload date:
- Size: 86.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5f2716469d8156d6e34249c0745810c24a0456a1f6e72e37fb834d8dec5739a
|
|
| MD5 |
fe033051eb4de021e648e0438b574eca
|
|
| BLAKE2b-256 |
b3ae7d7a8253a236e0c5eb0f2e5b3957291cdf50edee963c02605f2884b69b36
|
Provenance
The following attestation bundles were made for vault_tasks-0.5.0.tar.gz:
Publisher:
publish.yml on adcoh/vault-tasks
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vault_tasks-0.5.0.tar.gz -
Subject digest:
b5f2716469d8156d6e34249c0745810c24a0456a1f6e72e37fb834d8dec5739a - Sigstore transparency entry: 1663132639
- Sigstore integration time:
-
Permalink:
adcoh/vault-tasks@22dfa2315860a6046ea542eeed24353167eed6b0 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/adcoh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@22dfa2315860a6046ea542eeed24353167eed6b0 -
Trigger Event:
release
-
Statement type:
File details
Details for the file vault_tasks-0.5.0-py3-none-any.whl.
File metadata
- Download URL: vault_tasks-0.5.0-py3-none-any.whl
- Upload date:
- Size: 148.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b0a96130d2325c012ff18531e87f276157cd0ea0d27caafba8cb79e8cd5f308
|
|
| MD5 |
b6f32c76064feeac3f7f2e654ebaecd3
|
|
| BLAKE2b-256 |
cd30b926e0a8a9c4917d846b4b92e0a5eb20d756f33e79424bc57032444b4272
|
Provenance
The following attestation bundles were made for vault_tasks-0.5.0-py3-none-any.whl:
Publisher:
publish.yml on adcoh/vault-tasks
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vault_tasks-0.5.0-py3-none-any.whl -
Subject digest:
4b0a96130d2325c012ff18531e87f276157cd0ea0d27caafba8cb79e8cd5f308 - Sigstore transparency entry: 1663132764
- Sigstore integration time:
-
Permalink:
adcoh/vault-tasks@22dfa2315860a6046ea542eeed24353167eed6b0 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/adcoh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@22dfa2315860a6046ea542eeed24353167eed6b0 -
Trigger Event:
release
-
Statement type: