Tusk is a simple daily todo manager for your terminal. It stores all your daily tasks in a JSON file and make its easy to add, list, mark, edit and export (soon). I took heavy inspiration from Git and wanted a command > action style terminal interaction.
Due to Tusk being under development installation is a bit manual at the moment, however, I try to keep the main branch in a somewhat "releasable" state.
brew tap john-crossley/tap
brew install john-crossley/tap/tusk
tusk --versionFor zsh:
printf "\nalias t='tusk'" >> ~/.zprofileFor bash:
printf "\nalias t='tusk'" >> ~/.bash_profileI'm going to assume you've aliased tusk to t if not sorry, just imagine tusk wherever t is 😅.
t [OPTIONS] <COMMAND>--data-dir <DIR>: Override the base data directory.-o,--output: Outputs options"md"|"json"|"terminal", defaults to"terminal".--no-colour: Disable coloured output.--verbose: Enable verbose logging.
List tasks for the day
t ls
t ls --tag work shopping
t ls -s day-d,--date <YYYY-MM-DD>: The from date, can useyesterday,today,tomorrow. Defaults to current date.--tag <TAG>: Filter tasks by one or more tags.-s, --scope <SCOPE>: The scope of the tasks to be shown, can beday,focusorall. Defaults today.
Add a new task
t add "Drink more water #tag1 #tag2"
t add "Eat more fruit and nuts" -p high -n-d,--date <YYYY-MM-DD>: The from date, can useyesterday,today,tomorrow. Defaults to current date.-p, --priority <LEVEL>: Set priority (low, med, or high), defaults to low.-n,--notes: Attach notes (opens in your editor).
Mark a task as done by its index.
t done 3Mark a task as undone by its index.
t undone 3Remove a task by its index
t rm 3Edit a task’s text and or notes.
t edit 4 "Count 🐑 before sleeping"
t edit 4 -n
t edit 4 -p high|med|low-d,--date <YYYY-MM-DD>: The from date, can useyesterday,today,tomorrow. Defaults to current date.-n,--notes: Attach or edit notes.
Show details of a single task.
t show 5Displays the task, priority, tags, notes, and metadata in a nice formatted view.
-d,--date <YYYY-MM-DD>: The from date, can useyesterday,today,tomorrow. Defaults to current date.
Migrate tasks from one day to another, only migrates incomplete tasks.
t migrate --from yesterday
t migrate --from 2025-10-02 --to tomorrow-f,--from <YYYY-MM-DD>: The from date, can useyesterday,today,tomorrow-t,--to <YYYY-MM-DD>: The to date, can useyesterday,today,tomorrow--dry-run: Output what will be migrated without actually performing the migration.
Review tasks from the last n days.
t review --days 10--days n: The number of days to review (excludes current day).
focus: For managing persistent focus tasks.
For times when you need a long running task, you have the focus subcommand. focus tasks will exist separately from daily tasks, so will always be present, until deleted. It's also worth noting that focus only supports a subset of top level tusk commands. For now.
List your long running focus tasks.
t focus lsAdd a long running focus task.
t focus add "Finish the PR to support focus tasks for Tusk 🦣"Mark a long running task as done by its index.
t focus done 3Mark a long running task as undone by its index.
t focus undone 3Remove a long running task by its index
t focus rm 3Show details of a single long running task.
t focus show 5# Add a task with tags and priority
t add "Prepare slides for meeting #work !high"
# Mark it as done
t done 1
# Show details
t show 1
# List only work-related tasks
t ls --tag work
# End of the day and you still have incomplete actions.
t migrate --to tomorrow
# Review your items from the past 10 days
t review --days 10Tusk stores your todos as a single JSON file in a date based directory structure. Bt default, this lives under your systems app data dir, eg:
~/.local/share/tusk/vaults/default/2025/09/20.json
You will soon be able to organise todos into a different "vault" using the --vault <name> command.
- Persistent tasks. For those long running tasks that span multiple days.
- Rich metadata parsing, at the moment it's not very exciting but.. It'll better support
!priority,@time,#tagsand>due.
You’ll need Rust.
Clone the repository and build:
git clone https://github.com/john-crossley/tusk.git
cd tusk
cargo build --releaseYour freshly baked 🍞 binary will be in:
target/release/tusk
You can move it somewhere on your $PATH for easier use, for example:
cp target/release/tusk ~/.local/bin/
I'm not a Rust expert, you might find bugs, or the code might not be perfect. That's because it was all hand cranked. If you have any issues you'd like to report, please feel free.

