Skip to main content
Generalbendrucker

things:inbox

Quick captures to the Things 3 inbox. Not for reads (things:jxa), scheduled tasks, updates, or projects (things:url).

Stars
13
Source
bendrucker/claude
Updated
2026-05-31
Slug
bendrucker--claude--inbox
View on GitHubRaw SKILL.md

// install — copy + paste into any project

mkdir -p .claude/skills && curl -fsSL https://raw.githubusercontent.com/bendrucker/claude/HEAD/plugins/things/skills/inbox/SKILL.md -o .claude/skills/inbox.md

Drops the SKILL.md into .claude/skills/inbox.md. Works with Claude Code, Cursor, and any agent that loads SKILL.md files from .claude/skills/.

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 title
  • titles (newline-separated) — multiple todos
  • notes (string, max 10,000 chars) — additional notes (session attribution appended as footer)
  • tags (comma-separated) — extra tag names (Claude is 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: - or 1.

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.