Your tasks are stored locally on your machine — no cloud sync, no remote servers, no telemetry.
| OS | Default location |
|---|---|
| Linux | ~/.local/share/todo/tasks.json |
| macOS | ~/.local/share/todo/tasks.json |
| Windows | %APPDATA%\todo\tasks.json |
On Linux and macOS the data directory is created with chmod 700 (owner-only access) and the data file with chmod 600. This means other users on the same machine cannot read your tasks even in unencrypted mode.
Enable end-to-end encryption of your task data with one command:
pip install cryptography
todo --encrypt
What it does:
- Encrypts
tasks.jsonusing AES-128-CBC (via Fernet) - Derives the key from your password using PBKDF2-HMAC-SHA256 with 480,000 iterations (NIST 2023 recommendation)
- A random 32-byte salt is stored separately in
.salt(owner-read-only on Unix) - Writes are atomic: data is written to a
.tmpfile and then renamed to prevent corruption on crash
Important:
- There is no password recovery. If you forget your password, your encrypted data cannot be recovered.
- The salt file (
.salt) must not be deleted — it is needed to derive the key. - Make backups of both
tasks.jsonand.saltif you use encryption.
- Passwords are never stored anywhere on disk.
- You can pass the password via the
TODO_PASSWORDenvironment variable to avoid repeated prompts (e.g. in scripts). This is safer than using--passwordon the command line, which may appear in shell history andpsoutput. - The
--passwordCLI flag is provided for scripting convenience; be aware of the shell-history risk.
todo is designed to protect your tasks from:
- Other users on the same OS account system (filesystem permissions)
- Accidental exposure when unencrypted files are copied or shared (encryption)
todo does not protect against:
- A compromised OS or root-level attacker
- Keyloggers capturing your password
- An attacker with physical access to your unlocked machine
Open an issue on GitHub with the security label, or email the maintainer directly. Please do not publicly disclose security issues before they are fixed.