Git-backed markdown authorative todos with a local sqlite for indexes and queries.
- Go 99.6%
- Just 0.4%
| internal | ||
| go.mod | ||
| go.sum | ||
| justfile | ||
| main.go | ||
| README.md | ||
todo
Minimal sqlite-backed task manager with local markdown notes.
Usage
todo add "follow up with payroll"
todo edit 1
todo list
todo search "payroll"
todo done 1
todo show 1
todo import
todo import git@github.com:you/plan.git
todo export
todo sync /path/to/todo-notes
Storage
- Database:
~/.local/share/todo/todo.db - Notes repo:
~/.local/share/todo/notes(sparse checkout oftasks/) - Tasks path:
~/.local/share/todo/notes/tasks/<uid>-<slug>.md
Notes are the source of truth. Each note includes metadata lines:
Status: open|doneCreated: <RFC3339>Updated: <RFC3339>Completed: <RFC3339>(only when done)
Import expects notes named like <uid>-<slug>.md (slug = lowercase, 20 chars max).
Each task has a stable uid used for filenames and cross-machine sync. Local numeric IDs are per-machine shortcuts.
Override paths with --db and --notes (repo root).
Commands
add [--edit] TITLE...add a task and optionally open the noteedit ID|UIDopen the task note in$EDITORlist [--all] [--limit N]list taskssearch [--all] QUERY...search task titlesshow ID|UIDshow detailsdone ID|UIDmark a task doneimport [GIT_URL]import notes into sqlite, optionally cloning into the notes repo firstexport [--all]export sqlite tasks to notessync [DIR] [--all]export to DIR, git pull/push, import back
sync stores DIR in sqlite and reuses it when omitted. Tasks live under tasks in the repo. The repo is kept in sparse mode with tasks/ checked out.