If you use NA, you’re going to love this: the Rust rewrite is noticeably faster than the original Ruby gem — especially in prompt hooks, where a quick cd into a project shouldn’t mean waiting on a script before you get your shell back. Same commands, same TaskPaper files, less lag.
What is NA?
na (“next action”) is a command-line tool for managing todos in plain-text TaskPaper files. The idea is simple: keep a *.taskpaper file in your project (or a global file for everything), tag the items you’re ready to work on with @na, and run na whenever you need to see what’s next. You can add actions from the shell, search across files, move items between projects, mark things done, archive finished work, run saved searches, and even pipe results through custom plugins — all without opening an editor. Because the data is plain text, it plays nicely with git, diff, sync, and whatever editor you already use. It’s the kind of tool that stays out of your way until you need it, and then it’s exactly what you need.
Ruby to Rust
The original na was a Ruby gem. It worked well, but Ruby startup time adds up — especially when a prompt hook fires on every directory change. The new version is a complete rewrite in Rust (inspired by the doing rust version by Aaron Mallen), aimed at behavioral parity with the Ruby tool while being faster and more reliable for daily use.
For practical purposes, think of it as high nineties compatibility. Every command from the Ruby version is implemented: next, find, add, update, archive, saved, plugin, scan, and the rest. @search(...) expressions, saved searches, time tracking with @started / @done, theme formatting, plugins, and legacy flags like -a / -r all carry over. Differential test harnesses run the Ruby and Rust binaries side by side on shared fixtures to keep output aligned.
A few small differences remain:
- Interactive menus use
inquire instead of fzf / gum — same idea, different UI
initconfig doesn’t yet persist every global (--pager, --color, --include_ext) to na.rc
- Prompt hooks detect your current shell automatically; the Ruby version also let you pass
bash, zsh, or fish explicitly to show / install
- Nested output polish — a handful of theme edge cases around timed nested lines
If something doesn’t match the Ruby behavior you expect, open an issue — that’s the fastest way to get it fixed.
Install
brew tap ttscoff/thelab
brew install ttscoff/thelab/na
Or, if you prefer Cargo:
Source and docs: github.com/ttscoff/na_rust
Prompt hooks
This is where the speed difference really shows. na can automatically display your next actions whenever you cd into a project directory — no remembering to run a command, no pause while a Ruby interpreter boots.
Install the hook for your shell:
Or preview what it will add:
Works with Zsh, Bash, and Fish. If you use a global todo file, set --cwd_as project or --cwd_as tag so the hook knows how to filter actions for the current directory:
na --global-file ~/todo.taskpaper --cwd_as project prompt install
After installing, open a new terminal session and cd into a project with a .taskpaper file — your next actions should appear right in the prompt area. Add -r on the na next call inside the hook (or set depth in config) to recurse into subdirectories.
More detail in the README Prompt hooks section.
Bug reports and feature requests
The project lives at github.com/ttscoff/na_rust. Please file bugs and feature requests on the issues page — especially if you’re migrating from the Ruby gem and hit a compatibility gap.
The project page at /projects/na is updated to point to the Rust version as well.