Yatto CLI
yatto is a terminal-based to-do application built with Bubble Tea. It stores each task as a separate JSON file on your filesystem and manages the task directory as a Git repository for versioning, synchronization and collaboration.

Features
- TUI-based interface powered by the Bubble Tea framework
- Local file storage: Each task is stored as an individual JSON file for easy inspection and portability
- Git integration: Initializes a Git repository in your task directory for:
- Full version history of all tasks
- Safe collaboration and backup
- Sync across machines
- Every change is immediately committed and - if a remote is configured - pushed.
- Tasks are organized in projects
- Task attributes include due dates and searchable labels.
- Tasks can be:
- written in markdown
- sorted by due date or priority
- marked as in progress
- Non-interactive output: Print all open tasks from any project
- Supports simple theme customization
Roadmap
- Sub-tasks: Create tasks associated with a parent task.
Requirements
- Git
Installation
Go
go install github.com/handlebargh/yatto@latest
Homebrew
brew tap handlebargh/yatto
brew install yatto
Eget
eget handlebargh/yatto
Binary
Take a look at the releases.
Configuration
A configuration file is automatically created at ${HOME}/.config/yatto/config.toml
By default, the following settings are written to the file and may be edited.
[colors]
badge_text_dark = '#000000'
badge_text_light = '#000000'
blue_dark = '#1e90ff'
blue_light = '#1e90ff'
green_dark = '#02BF87'
green_light = '#02BA84'
indigo_dark = '#7571F9'
indigo_light = '#5A56E0'
orange_dark = '#FFA336'
orange_light = '#FFB733'
red_dark = '#FE5F86'
red_light = '#FE5F86'
vividred_dark = '#FE134D'
vividred_light = '#FE134D'
yellow_dark = '#CCCC00'
yellow_light = '#CCCC00'
[colors.form]
theme = 'Base16'
[git]
default_branch = 'main'
[git.remote]
enable = false
name = 'origin'
[storage]
# replace with your actual home directory
# or any other path you'd like to use
path = '/home/foo/.yatto'
A config file may also be supplied by adding the -config
flag:
yatto -config $PATH_TO_CONFIG_FILE
Colors and themes
Don’t like the default colors? Just change them. Any color value supported by lipgloss will be accepted.
Every color accepts a light and a dark value for either light or dark terminal themes.
If you feel like sharing your theme, just post it in an issue, and I’ll be happy to add it to the repository.
You can also choose from one of the predefined form themes. The following config values are supported:
- Charm
- Dracula
- Catppuccin
- Base16
- Base
Set a theme like this:
[colors.form]
theme = 'Catppuccin'
Task Storage
Tasks are saved in a directory like:
${HOME}/.yatto
Each task is a simple JSON file, while projects are directories holding their associated tasks.
You can change the task storage directory in the config file.
Git remotes
To set up a remote
-
Create a new repository on the Git host of your choice. The repository must be empty, meaning that nothing must be committed at creation (uncheck README, .gitignore and license files).
-
Run yatto at least once to create the task storage directory.
-
Add the remote and push the local repository.
cd ${HOME}/.yatto git remote add origin $GIT_REMOTE_URL git push -u origin main
-
Enable
git.remote
in the config.[git.remote] enable = true
Non-interactive mode
You can print a static list of your tasks to standard output:
yatto -print
# Limit to any project you want
# Get the IDs from the directory names in your storage directory
# Run this command to print all project's metadata files:
# find ${HOME}/.yatto -type f -name "project.json" -exec cat {} +
yatto -print -projects "2023255a-1749-4f6c-9877-0c73ab42e5ab b5811d17-dbc7-4556-886b-92047a27e0f6"
# Filter labels with regular expression
# The next command will only show tasks that have a label "frontend"
yatto -print -regex frontend
If you want to print this list whenever you run an interactive shell,
open your ~/.bashrc
(or ~/.zshrc
) and add the following snippet:
# Print yatto task list only in interactive shells
case $- in
*i*)
if command -v yatto >/dev/null 2>&1; then
yatto -print
fi
;;
esac
[!TIP] Add the -pull flag to pull from a configured remote before printing.
License
MIT - see LICENSE
Contributing
Contributions, feedback, and ideas are welcome! See how to contribute to this repository.
Acknowledgements
Huge thanks to the Charm team for their incredible open-source libraries, which power much of this project.