CLI for Things 3 by Cultured Code, implemented in Go.
This project ships a single Go binary with unit and integration tests.
Work in progress. The goal is full end-to-end coverage for the Things URL scheme interactions on macOS.
make install
brew install ossianhempel/tap/things3-cli
addAdd a new todoupdateUpdate an existing todo (requires auth token)deleteDelete an existing todoadd-areaAdd a new areaadd-projectAdd a new projectupdate-areaUpdate an existing areadelete-areaDelete an existing areaupdate-projectUpdate an existing project (requires auth token)delete-projectDelete an existing projectshowShow an area, project, tag, or todo from the databasesearchSearch tasks in the databaseinboxList inbox taskstodayList today tasksupcomingList upcoming tasksrepeatingList repeating tasksanytimeList anytime taskssomedayList someday taskslogbookList logbook taskslogtodayList tasks completed todaycreatedtodayList tasks created todaycompletedList completed taskscanceledList canceled taskstrashList trashed tasksdeadlinesList tasks with deadlinesallList key sections from the databasehelpCommand help and man page--versionPrint CLI + Things version info
Update operations use the Things URL scheme and require an auth token.
- Open Things 3.
- Settings -> General -> Things URLs.
- Copy the token (or enable "Allow 'things' CLI to access Things").
- Export it:
export THINGS_AUTH_TOKEN=your_token_here
Tip: add the export to your shell profile (e.g. ~/.zshrc) to persist it.
You can run things auth to check token status and print these steps.
In addition to the URL-scheme commands above, this CLI can read your local Things database to list content:
things projectsList projectsthings areasList areasthings tagsList tagsthings tasksList todos (with filters)things todayList Today tasks
By default it looks for the Things database in your user Library under the
Things app group container (the ThingsData-* folder). You can override the
path with THINGSDB or --db.
Note: The database lives inside the Things app sandbox, so you may need to grant your terminal Full Disk Access.
Use --repeat flags with add or update
to create or change repeating templates. These changes write directly to the
Things database, so Full Disk Access is required. Repeating updates require a
single explicit title (for add) or --id (for update).
Supported patterns: every N day/week/month/year, in after-completion (default)
or schedule mode. The anchor date controls weekday/month/day; multi-day weekly
patterns are not supported yet. Use --repeat-until to stop after a date.
Repeating projects are not supported.
Examples:
things add "Daily standup" --repeat=day --repeat-mode=schedule
things update --id <uuid> --repeat=week --repeat-every=2
things update --id <uuid> --repeat-clear
- macOS only (uses the Things URL scheme and
openunder the hood). - Authentication for update operations follows the Things URL scheme authorization model.
- Write commands open Things in the background by default; use
--foregroundto bring it to the front, or--dry-runto print the URL without opening. - Delete commands (todo/project/area) use AppleScript and require Things automation permission for your terminal (you may see a macOS prompt).
- Delete commands prompt for confirmation when run interactively; pass
--confirmin non-interactive scripts. Use--dry-runto preview. - Aliases:
create-project->add-project,create-area->add-area. - Scheduling: use
--when=somedayto move to Someday; useupdate --later(or--when=evening) to move to This Evening.