Repository navigation
Releases: nyactl/todoist-cli
Release list
v1.27.2
Board fits your terminal, non-Latin text lines up, and three fixes
ls -buses your real terminal width. It used to assume 120 columns unless$COLUMNSwas exported, so the board wrapped in narrower terminals and wasted space in wider ones.$COLUMNSstill works as an override.- Umlauts, CJK and emoji no longer break alignment. Widths were counted in bytes, which shifted the due-date column and board separators, and cutting a long name could split a character in half. Text is now measured in display columns, so
日本語の勉強lines up likeBuy milk. openaccepts the short IDs thatls --doneprints.tdc open 6hmR8gqused to fail; it now resolves the prefix through your cache.--doneperiods are consistent.7d,1wandweeknow cover the same days (all periods start at local midnight), and malformed periods such as1.5dor3ddare rejected instead of silently misread.
v1.27.1
Clear message for features that need a paid plan
Some Todoist features, such as deadlines, are only available on paid plans. On a free account, add --deadline and edit --deadline used to print the raw API response. They now say what happened:
todoist: Deadlines are a premium only feature — this needs a paid Todoist plan
This release also updates the bundled SQLite driver.
v1.27.0
--json on every read command
ls (every filter, including --done), search, show, projects, sections, labels, comment ls, comment show, stats and context all take --json. Every command uses the same fields for a task, so one parser handles all of them. Empty results print [], and hints go to stderr, so stdout is always valid JSON.
tdc ls --json | jq -r '.[] | select(.priority == 4) | .content' # urgent tasks
tdc stats --json | jq .overdue # for a prompt or status barv1.26.2
Subtasks show up in search and JSON, and short IDs are unambiguous
searchnow finds subtasks too.show --jsonincludes asubtasksarray with id, content, priority and due.- Short IDs in the output (
show,done,ls --done, …) are now the shortest prefix that's unique in your cache, instead of always 4 characters. Tasks created close together often shared those 4 characters, so the printed ID couldn't be used. Now you can paste it straight back:tdc done 6hmR8gvj.
v1.26.1
Due dates now follow your local timezone
ls and overdue decided what "today" means using UTC rather than your local date. Depending on your timezone, tasks due today disappeared for a few hours after midnight (east of UTC), or tomorrow's tasks showed up as due in the evening (west of UTC). The "overdue Nd" count could also be one day short. Both now use your local date.
No action needed: brew upgrade nyactl/tap/todoist-cli.
v1.26.0
Context-scoped ls no longer looks account-wide
With an active cd context, ls -l <label> quietly scoped to that project and printed a bare no tasks — indistinguishable from "nothing carries this label anywhere". A label sweep could silently process a subset and still exit 0.
Empty results now name the scope
$ td ls -l waiting
no tasks in "Work" — run 'todoist-cli cd' to clear the context (or pass --global) to search all projects
The same cue now covers every context-scoped path — label and priority filters, the plain project view, and --done (which already hinted and keeps doing so).
New -g / --global flag
Ignore the active context for a single command, without disturbing your cd state — ideal for scripts that want account-wide results:
td ls -l waiting --global # all projects, context untouched
td ls --done month --global # completed across every project--global applies to -l, -P and --done; combining it with --board or --recursive (which act on the active project) is rejected.
Closes #28.
v1.25.0
Recurrence pattern in show --json
show --json reported due.recurring: true but not how a task recurs. The due object now carries a string field with the pattern:
"due": {
"date": "2026-10-02",
"datetime": null,
"recurring": true,
"string": "every friday"
}It's present whenever due is non-null (the plain date phrase for one-off tasks, e.g. "25 Dec"), and null when the API supplies none. Tooling that archives or summarises tasks can now record every friday rather than a bare true.
Closes #23.
v1.24.0
Comment workflow follow-ups
Building on comment ls/comment rm from 1.23.0, this closes the read → migrate → delete loop for cleaning up task comments.
Read a full comment body
ls only shows the first line; show prints the whole thing:
td comment show 6WQ4gpfghhc4cvP2
td comment ls "$T" | cut -f1 | xargs td comment show # read them allDelete several at once
td comment rm <id> <id> <id>No more shell loop. Each deletion now echoes what it removed — id, timestamp and first line — so the terminal log is auditable (comments have no undo):
deleted: 6WQ4gpfghhc4cvP2 2024-10-18 09:12:03 Sparkasse
Clear a whole task
td comment rm --all <task> # prompts for confirmation
td comment rm --all -f <task> # skip the promptCloses #26.
v1.23.1
Fix: edit -D "" now clears the due date
edit <task> -D "" reported success but silently left the due date in place, despite --help promising an empty value clears it.
The Todoist API ignores an empty due_string (and rejects due: null); the only value it accepts as "remove the due date" is the natural-language string no date. The CLI was sending the empty string straight through, so the clear never happened. It now translates an empty --due into that clearing form, so the documented behaviour holds:
td edit "Pay rent" -D "" # actually clears the due date nowThis also brings --due in line with --deadline, whose empty-clears-it promise already worked.
Fixes #27.
v1.23.0
List and delete task comments
comment could only ever add. Now the full lifecycle is scriptable — comments pasted into a task over time can be reviewed and cleaned up from the CLI instead of the web app.
List a task's comments
td comment ls "Write up notes"Prints one row per comment — comment ID, local timestamp, and first line — tab-separated, so the ID feeds straight into comment rm.
Delete a comment
td comment rm 6hcgHXC38fJ7vqMXDeleting one, or clearing a whole task, is now a shell one-liner:
td comment ls "$T" | cut -f1 | xargs -n1 td comment rmCloses #25.