Create, update, and manage Things 3 tasks and projects. Not for reads — use things:jxa to query data. For simple inbox captures, use things:inbox.
Write operations for Things 3 via the things:/// URL scheme.
Use url.ts for most operations — it handles auth tokens and URL encoding:
bun ${CLAUDE_PLUGIN_ROOT}/scripts/url.ts <command> [key=value ...]
# Bulk update: pass multiple id= params to batch via JSON command
bun ${CLAUDE_PLUGIN_ROOT}/scripts/url.ts update id=X id=Y id=Z when=tomorrow
For raw URL scheme access: open -g "things:///add?title=Buy%20milk&when=today"
Use -g for data commands (add, update, json) to run in background. Omit -g for show/search to foreground Things.
| Command | Description | Auth required |
|---|---|---|
add |
Create a todo | No |
add-project |
Create a project with optional todos | No |
update |
Modify a todo's properties | Yes |
update-project |
Modify a project's properties | Yes |
show |
Navigate to a list, todo, or project | No |
search |
Open search with optional query | No |
json |
Batch create/update via JSON payload | Yes (for updates) |
See examples.md for detailed usage of each command.
bun ${CLAUDE_PLUGIN_ROOT}/scripts/reorder.ts [--list today|anytime|someday] <id1> <id2> <id3> ...
Items appear at the top of the list in the order specified. Default list is today. Also works for items within a project — use the --list value matching the items' current scheduling state.
When the x-callback-url plugin is installed, url.ts automatically uses xcall to get a response from Things on stdout. Present the result to the user as clickable https://things.bendrucker.me/show?id=<id> links:
add, update): returns x-things-id=<id> — present one linkjson): returns x-things-ids=["id1","id2"] — present a bulleted list with each todo's title and linkCallback is enabled by default. Disable with --callback=false to fall back to fire-and-forget via open -g. If xcall is unavailable, the script falls back silently.
For show command: inbox, today, anytime, upcoming, someday, logbook, tomorrow, deadlines, repeating, all-projects, logged-projects
The list parameter only works with project names. For areas, use list-id with the area UUID (query area IDs via the things:jxa skill).
today, tomorrow, eveninganytime, somedayyyyy-mm-dd (specific date)Things supports Markdown in notes:
#, ##, ###**text**::text::[title](url)- or 1.when=anytime to move a todo out of inbox without assigning an arealist-id with the area UUID (not area-id)id=X id=Y id=Z) to batch into a single JSON command instead of individual calls.when or deadline on repeating to-dos