A row of pills below the input area shows live context for each thread — git branch, an open PR, a running dev server URL, AWS session status, or anything else you want. It’s powered by a shell command (Settings → Context footer command) that the plugin runs per thread, in the background, against that thread’s working directory. Desktop only.

Scheduled activity
The composer footer also shows a built-in scheduled-activity pill whenever the active thread has a pending one-time wakeup or recurring interval loop. Unlike the custom context tags described below, this pill needs no command or configuration.
For one item, the pill summarizes its timing: Resumes in 12m for a wakeup or Every 5m for a loop. With multiple scheduled items, it shows whichever runs next plus the number of additional items, such as Resumes in 12m · +1. The timing updates in place.
Click the pill to open a popover anchored above the composer. It lists every enabled wakeup and interval loop for the thread in next-run order, with the type, timing, and human-readable reason or prompt for each item. Cancel removes only its wakeup; Stop removes only its loop. The popover stays open while other items remain and closes when the last item is removed.
The pill is keyboard-accessible: Enter or Space opens it, Escape closes it, and clicking outside dismisses it. It remains available while the thread is running so scheduled activity can still be inspected or stopped. When the thread has no scheduled activity, the pill is hidden.
Output format
The command can return either:
-
A JSON array of tags (recommended) — each pill is a
StatusTag:[ { "label": "http://localhost:3001", "url": "http://localhost:3001", "kind": "dev" }, { "label": "feat/social-nudge", "kind": "branch" }, { "label": "PR #225", "url": "https://github.com/acme/app/pull/225", "kind": "pr" }, { "label": "AWS expired", "tone": "warn", "kind": "aws" } ]Field Meaning labelRequired. Pill text. urlMakes the pill a clickable link (opens in your browser). iconLucide icon name. Defaults from kindif omitted.tonenormal(default),warn, orerror— colors the pill.kindpr,branch,dev,aws, or any custom string. Akind:"pr"tag (or anyurlending in/pull/N) becomes the thread’s PR — shown as the PR pill and surfaced to the Agent Board, MCP tools, and release automation. -
Plaintext (the Claude Code statusline convention) — segments split on 2+ spaces, with heuristic icons (URL→globe,
PR #N→pull-request,AWS …→cloud, else→branch). Existing scripts keep working unchanged.
Input. The command receives JSON on stdin: { "cwd": "…", "workspace": { "current_dir": "…" }, "provider": "claude" | "bedrock" }. Use provider to gate provider-specific pills — e.g. only emit an AWS pill when provider == "bedrock" so a logged-out AWS session doesn’t show a spurious warning on a non-Bedrock machine.
PR detection
PR detection is fully script-driven: a kind:"pr" tag with a url (e.g. from gh pr view) populates the thread’s prUrl, which is sticky — it survives after the PR merges so release tooling can still match the thread.
This replaced an earlier approach that scanned assistant message prose for a GitHub PR URL, which missed the common case of a PR opened via gh pr create inside a Bash tool call (the URL lands in tool output, not assistant prose, so the scanner never saw it). Sourcing the PR tag from the script instead means it can read the actual result of a gh pr view call for the branch, rather than guessing from text.
Always emit the pr tag, even though it’s usually hidden. While the git diff bar is on screen it already shows the branch and a PR button, so the footer hides its own pr and branch pills to avoid printing the same values twice in adjacent rows. The tag is still doing the work: it is the only source of a thread’s PR association, feeding the diff bar’s PR #N button, the Agent Board PR chip, MCP tools, and archive-on-merge. Dropping it to save a gh call silently disables all of them.
Sticky means thread-scoped, not branch-scoped. Because prUrl is never cleared, it outlives the branch it came from — and outlives the repository too, if a thread is later pointed at a different project with set_working_directory. Branch-scoped UI therefore doesn’t read it: the diff bar’s button uses the live pr tag from the current poll, which vanishes as soon as the branch has no PR, and the footer’s own sticky pill is suppressed when its PR provably belongs to a different repo than the thread’s current one. A PR whose repo can’t be determined (a non-GitHub remote, say) is always shown rather than hidden, so only a provable mismatch is filtered.
Opening links: clicking a pill with a url opens it in Obsidian’s in-app Web Viewer when that core plugin is enabled (reusing an existing tab); otherwise it opens in your system browser. Cmd-click (Ctrl-click on Windows/Linux) always opens in the system browser, even when the Web Viewer is enabled.
Reference script
A ready-to-use reference script (branch · PR · dev URL · Bedrock-gated AWS pill) ships with the plugin at docs/statusline-command.example.sh in the obsidian-claude-threads repo. It emits the JSON tag array described above: it resolves the branch and PR from git/gh for the thread’s cwd, looks up a locally running dev server, and — only when the active provider is bedrock — adds an AWS session-status pill. Point Settings → Context footer command at your own copy of it (or a script following the same stdin/stdout contract) to get typed, clickable pills instead of plaintext segments.