A terminal user interface for Remember The Milk.
Browse, search, add, and complete tasks without leaving the terminal.
- Task list grouped by date bucket: Overdue, Today, Tomorrow, day-of-week, No Due Date
- Within each bucket, tasks sorted by priority then due time
- Color-coded priority bar on each task (red = high, yellow = medium, blue = low)
- RTM filter search with vim-style navigation
- Smart task input with syntax highlighting for due dates, priorities, lists, tags, and recurrence
- Completes tasks in-place and refreshes the list
- Go 1.22+
- A Remember The Milk account
- An RTM API key and shared secret — request one at https://www.rememberthemilk.com/services/api/
- Clone and build:
git clone <repo>
cd rttui
go build -o rttui .
- Set your credentials as environment variables:
export RTM_API_KEY=<your api key>
export RTM_SHARED_SECRET=<your shared secret>
See .envrc.example for a 1Password reference pattern if you use direnv + 1Password CLI.
- Run:
./rttui
On first run, rttui will print an authorization URL. Open it in your browser, grant access, then press Enter. The token is saved to $XDG_CONFIG_HOME/rttui/token (typically ~/.config/rttui/token) and reused on subsequent runs.
rttui reads an optional config file at $XDG_CONFIG_HOME/rttui/config.json (typically ~/.config/rttui/config.json). All fields are optional.
{
"default_filter": "list:Inbox",
"add_preset": "list:Chores",
"refresh_interval_secs": 120
}| Field | Description |
|---|---|
default_filter |
RTM filter applied on startup when no CLI argument is given |
add_preset |
Text pre-filled in the add bar when pressing n; cursor is placed after it so you can type the task name immediately. Backspace to remove it. |
refresh_interval_secs |
How often (in seconds) tasks are automatically refreshed from the server. Defaults to 60. Set to a negative value to disable auto-refresh. |
./rttui [filter]
Pass an optional RTM filter string as an argument to pre-filter the task list on startup. This overrides default_filter from the config file. Uses the same syntax as RTM's advanced search (e.g. "list:Work AND priority:1").
| Key | Action |
|---|---|
j / k or arrow keys |
Move up/down |
/ |
Open search bar |
n |
Add a new task |
c |
Complete selected task |
r |
Refresh tasks from server |
q / ctrl+c |
Quit |
The search bar accepts any RTM filter expression. It supports vim-style editing:
| Key | Action |
|---|---|
Enter |
Submit search |
Esc (insert mode) |
Switch to normal mode |
Esc (normal mode) |
Close search bar |
i / a / A / I |
Enter insert mode |
h / l |
Move cursor left/right |
w / b |
Jump word forward/backward |
0 / $ |
Jump to start/end of line |
x |
Delete character under cursor |
Press n to open the add bar. The input supports a Smart Add syntax with live syntax highlighting:
| Prefix | Meaning | Example |
|---|---|---|
!1 !2 !3 |
Priority (high/medium/low) | !1 |
^ |
Due date | ^tomorrow, ^friday |
# |
List | #Work |
% |
Tag | %errand |
* |
Recurrence | *weekly |
Press Enter to submit, Esc to cancel.
The
%tagsyntax is a local convenience — rttui converts it to#tagwhen sending to RTM, since RTM uses#for both lists and tags.