A terminal-native project and task manager built for Omarchy/Hyprland. Keyboard-driven, SQLite-backed, with a Quickshell bar widget and panel that surface your pending tasks for today.
- Project and task management — organize work into projects, each with tasks carrying priority, due dates, and tags
- Lightweight checklists (Subtasks) — add subtasks under tasks with strict completion invariants (parent task cannot be finished while subtasks are pending; adding/marking a subtask undone automatically reopens the parent task)
- Soft delete & recovery — deleting a project or task moves it to a trash view (
:restore) where it can be brought back or permanently purged - Vim-style keybindings —
j/kto navigate,ito edit,dto delete,spaceto toggle done - Smart date parsing — use natural shortcuts (
today,tomorrow,mon), relative offsets (+3,+1w,+1m), or day-of-month (15) with instant normalization - Stats pane — live task counts with proportional bars and a per-project breakdown
- Metadata pane — description, tags, priority, due date, or parent task status details for the selected item
- Omarchy/Quickshell integration — a bar widget shows your pending task count for today, with a clickable panel listing today's tasks, inline mark-done checkboxes, and live updates
- Omarchy theme support — reads
~/.config/omarchy/current/theme/colors.tomland applies colors live
- Rust toolchain (
rustup) - Omarchy/Hyprland with Quickshell (optional — falls back to built-in defaults if theme file is absent)
# clone the repo
git clone https://github.com/yourusername/tdo ~/Projects/tdo
cd ~/Projects/tdo
# install the binary to ~/.cargo/bin/tdo
cargo install --path crates/tdo
# verify
tdoOmarchy moved from Waybar to Quickshell, so the bar integration now ships as a plugin in cipher.tdo/ rather than a standalone Waybar script.
# copy the plugin into your Omarchy plugins directory
cp -r cipher.tdo ~/.config/omarchy/plugins/cipher.tdoAdd the widget to the bar by editing ~/.config/omarchy/shell.json — insert a cipher.tdo entry into the right section of bar.layout:
"right": [
{
"id": "omarchy.tray"
},
{
"id": "cipher.tdo"
},
{
"id": "omarchy.agents"
}
]Restart Omarchy (or reload the shell) for the widget to appear.
The plugin provides:
- Bar widget (
Widget.qml) — a bar button showing the number of pending tasks for today, refreshed every 5 seconds - Panel (
TodoPanel.qml) — opens on click, lists today's tasks with clickable checkboxes to mark them done (viatdo --mark-done), and auto-refreshes - Data helper (
tdo-data.sh) — a shell wrapper aroundtdo --today(override the binary withTDO_BIN)
The plugin directory may lose execute permissions when copied, so make tdo-data.sh executable:
chmod +x ~/.config/omarchy/plugins/cipher.tdo/tdo-data.shEnable the plugin in the bar's right section — the entry points and capabilities are declared in cipher.tdo/manifest.json (bar-widget + panel kinds).
| Key | Action |
|---|---|
j / k |
Move selection down / up |
enter |
Open selected project |
esc |
Go back to home / project selection |
/ |
Fuzzy search — navigate or create |
i |
Edit selected project, task, or subtask |
d |
Delete selected task or subtask (with confirmation) — soft delete, recoverable via :restore |
space |
Toggle task or subtask done/pending |
s |
Add subtask under selected task |
: |
Open command mode (cp / mv / restore) |
q |
Quit |
| Key | Action |
|---|---|
| Type | Filter list live |
enter (match) |
Navigate into project / select task |
enter (no match) |
Start creation form with typed name |
esc |
Cancel, return to browsing |
| Key | Action |
|---|---|
j / k |
Move between fields |
i |
Enter insert mode for current field |
esc / enter (insert) |
Confirm field value, exit insert mode |
enter (normal) |
Trigger save confirmation popup |
esc (normal) |
Cancel form |
| Key | Action |
|---|---|
j/k / Down/Up |
Toggle between "Save" and "Keep editing" |
enter |
Confirm chosen option |
esc |
Close confirmation popup (equivalent to "Keep editing") |
| Key | Action |
|---|---|
cp <project> |
Copy the selected task (and its subtasks/tags) to another project |
mv <project> |
Move the selected task to another project |
restore |
Open the trash view to recover or permanently delete projects/tasks |
tab |
Autocomplete the command name or destination project |
| Key | Action |
|---|---|
j / k |
Move selection down / up |
enter |
Restore the selected project or task |
d |
Permanently delete the selected item (with confirmation) |
esc / q |
Exit back to browsing |
Restored items reappear immediately in the project/task lists — no restart needed.
When editing the due date field, you don't need to type the full YYYY-MM-DD date. You can enter:
- Relative offsets:
+3or+3d(3 days from now),+1w(1 week from now),+2m(2 months from now) - Shortcuts:
today,tomorrow,tod,tom,t,tm - Weekdays:
mon,tue,wednesdayetc. (resolves to the next occurrence of that weekday) - Partial dates:
MM-DDorMM/DD(e.g.07-04or7/4, assuming current year) - Day of month:
DD(e.g.15— assumes current month if the day is in the future, otherwise next month)
Upon exiting insert mode (esc), the shortcut is normalized instantly to YYYY-MM-DD.
Tasks and projects are stored in ~/.local/share/tdo/tdo.db (SQLite, WAL mode).
| Layer | Tech |
|---|---|
| Language | Rust |
| TUI | Ratatui + Crossterm |
| Storage | SQLite via rusqlite (bundled) |
| CLI args | clap |
| Serialization | serde + serde_json |
| Dates | chrono |