Things Inbox
Add todos to the Things 3 inbox.
Add a Todo
bun ${CLAUDE_PLUGIN_ROOT}/scripts/inbox.ts --session-id ${CLAUDE_SESSION_ID} title="Buy milk"
The script handles URL encoding, session attribution, and the Claude tag automatically. Extra tags can be added via the --tag flag (repeatable). For example, --tag claude-code adds the claude-code tag to all captured todos. Multiple tags: --tag foo --tag bar.
The script always prints a confirmation to stdout on success. When the x-callback-url plugin is installed, xcall returns the todo ID and the script outputs https://things.bendrucker.me/show?id=.... Present this URL to the user so they can click to open the todo. Without xcall (or when xcall succeeds but returns no ID), the script prints captured: <title>. No stdout output means the call failed; read stderr and surface the cause to the user rather than retrying.
Parameters
title(string) — todo titletitles(newline-separated) — multiple todosnotes(string, max 10,000 chars) — additional notes (session attribution appended as footer)tags(comma-separated) — extra tag names (Claudeis always included)checklist-items(newline-separated, max 100) — checklist items
Examples
# Simple inbox item
bun ${CLAUDE_PLUGIN_ROOT}/scripts/inbox.ts --session-id ${CLAUDE_SESSION_ID} title="Call dentist"
# With additional notes
bun ${CLAUDE_PLUGIN_ROOT}/scripts/inbox.ts --session-id ${CLAUDE_SESSION_ID} title="Review PR #456" tags=Work notes="Check error handling"
# Multiple items at once
bun ${CLAUDE_PLUGIN_ROOT}/scripts/inbox.ts --session-id ${CLAUDE_SESSION_ID} titles="Buy milk
Pick up dry cleaning
Walk dog"
# With checklist
bun ${CLAUDE_PLUGIN_ROOT}/scripts/inbox.ts --session-id ${CLAUDE_SESSION_ID} title="Prepare presentation" checklist-items="Create slides
Prepare talking points
Practice delivery"
Notes Formatting
Things supports Markdown in notes:
- Headings:
#,##,### - Bold:
**text** - Code: backticks for inline, triple backticks for blocks
- Links:
[title](url) - Lists:
-or1.
Gotchas
Never retry on silent output
The script always prints to stdout on success. If you see no output, the call failed. Read stderr, surface the cause to the user, and only retry once the root cause is understood. Silent retries have historically created duplicate todos.
Sandbox-blocked URL handoff
If stderr mentions procNotFound, -10810, or LSOpenURLsWithRole, the macOS sandbox blocked the URL handoff to Things. The plugin's PreToolUse hook should disable the sandbox for bun ${CLAUDE_PLUGIN_ROOT}/scripts/... invocations. If this still happens, the hook is not firing for the invocation form being used. Investigate the invocation rather than disabling the sandbox manually.