Local-first · plain text · terminal
Tasks that outlive the tracker.
Farora is a task manager for the terminal whose storage format is a folder of markdown files. Nest as deep as you like, keep FAR-42 meaningful forever, and read the whole thing with cat long after Farora is gone.
The whole application. Forest left, detail right, the keymap along the bottom edge.
Storage
The file is the task.
There is no database and no export step. tasks/FAR-42.md is what helix edits, what the detail pane renders, what git diffs. Frontmatter holds the metadata; everything under it is yours.
Hand-edit a file and Farora journals what changed. Break the YAML and it offers to rebuild the frontmatter from the log without touching a word of your prose. Every write is atomic and lands in exactly one small file, which is what keeps a sync conflict small enough to merge.
--- schema: 1 uid: 01a082ae-ee57-74cc-9aa4-a67f18bebc7e id: FAR-4 title: Journal & tombstones status: ACTIVE doby: 2026-09-11 parent: FAR-2 rank: "a0" created_at: 2026-09-08T09:41:52.318Z updated_at: 2026-09-08T10:02:11.007Z --- Every operation on a task appends one line to `journal/FAR-4.jsonl`. > **note 2026-09-08T10:02Z** — retention defaults to 30d
~/.farora/
├── farora.toml
└── projects/
└── FAR/
├── project.toml
├── counter
├── tasks/
│ ├── FAR-2.md
│ └── FAR-4.md
└── journal/
├── _project.jsonl
├── FAR-2.jsonl
└── FAR-4.jsonl
Interaction
One keystroke, no forms.
Vim keys, every one dual-bound to its arrow. Creating, renaming, re-statusing and re-ranking are a single press each, applied instantly — there is no save step anywhere in Farora. Everything else is one line at the foot of the pane, or one small dialog over a tree you can still read.
Press a key, or pick one: / b m ,
Filter live over ids, titles and bodies at once. ^n ^t ^b switch each source off while you type, and the bar stays up afterwards — a filter you cannot see is a bug.
A deadline — a doby — is a typed date and a month grid over the same value. The tree grows a days-remaining column; x inside the dialog clears the date again.
Reparent through a fuzzy picker that excludes the task's own descendants. Subtrees move intact, one file is rewritten, and the id never changes.
Git tracking, configured in place: a remote, a push cadence, and the last hundred operations with what each one actually did.
01
Ids that still mean something next year
FAR-42 is allocated once and never reused — not even after the task is deleted. y yanks it to the clipboard, which is where a commit message wants it.
02
Nothing changes quietly
Every operation appends one line to the task's own journal. u undoes the last one. A delete leaves a full snapshot behind — which is what undo restores from, and what stays readable in the folder until gc collects it.
03
Sync is a folder problem
Point the built-in git tracking at a remote, or let Dropbox, iCloud or Syncthing carry the directory. Writes are atomic and confined to one small file, and farora doctor reconciles whatever is left over.
04
No daemon, no background anything
Expired tombstones are swept during ordinary runs — nothing is scheduled and nothing runs while you are not. farora gc --older-than 7d if you would rather not wait.
The whole surface
Forty keys, and that is the product.
Capitals trend toward the bigger or more destructive variant. d is deliberately left unbound, so done and delete can never be confused. ? shows this map inside the app.
Navigate
Create
Edit & view
Status
Delete
Move
Filter
Misc
Getting it
Two commands, one of them optional.
Farora 0.5 is developed and tested on macOS with Python 3.14 or newer; a recent uv provisions the interpreter for you. Linux and Windows are not supported in this release.
uvx farora # run it without installing uv tool install farora # keep it
Optional, each unlocking one thing
Commands