Release history

Changelog

Every release of Agent Threads for Geode and Obsidian, tracked here in full. For the unstyled view, see the raw GitHub Releases list .

Jump to version

0.41.x

v0.41.0 September 18, 2026 View on GitHub

In-app agent browser

Claude can now drive a browser inside Geode, using the same embedded web view that powers Web Viewer tabs — instead of launching a separate Chrome.

The point isn’t new capability. It’s that the external browser CLI spawned its own Chrome plus a supervising daemon per session, and nothing counted those processes, reclaimed them, or refused to start one more when the machine was already out of headroom. While this was being tested, the same machine was running 38 Chrome processes and 42 daemons leaked across four sessions, the oldest three hours old. The in-app browser drops from 2 renderer processes to 1 the moment a session closes.

How it reads a page

An accessibility snapshot rather than screenshots or raw HTML — just the things a person could actually interact with:

- textbox "What needs doing?" [ref=e1]
- button "Submit the form" [ref=e2]
- link "Documentation" [ref=e3]

Claude reads that and hands back a ref. No coordinate guessing, no brittle selectors. Hidden and disabled elements are omitted, so every ref is something you could have clicked yourself.

Refs are scoped to a snapshot epoch, and the check runs in the same injected call as the action — so a page that navigates between the check and the click gets refused rather than acted on by accident.

Resource limits, because that was the whole problem

Sessions are capped (2 by default, 4 max), reaped after 5 minutes idle, recycled after 30 minutes, and closed when their thread is deleted or the plugin unloads. Geode already measured file-descriptor pressure but only ever reported it; a sandboxed page process needs a spare descriptor at launch or it dies as a bare “exit code 6”, so the browser now refuses to start a session when the app is running low.

Watching it work

Open Agent Browser from the command palette shows live frames, the page, session age, and a stop button. It streams only while visible, and closing it never closes Claude’s session.

Safety

Its own cookie jar, separate from your Web Viewer tabs. Page text arrives wrapped as untrusted data rather than instructions. Typing a stored secret into a page is refused. file:, javascript: and cloud metadata addresses are blocked; private network access is opt-in.

Limits

Geode desktop only — it needs process diagnostics Obsidian doesn’t expose, and mobile has no embedded web view. Top frame only; no iframes, file uploads, or multiple tabs. It can’t drive Electron desktop apps, evade bot detection, or use cloud browsers — the agent-browser CLI still covers those.

Off by default. Settings → Tools → Agent browser, then reload.


Full notes: #569

0.40.x

v0.40.0 September 17, 2026 View on GitHub

Features

Watch a document, alert the owning thread on changes (#559) — mark a note as watched and the thread that owns it gets told when it changes, so an agent working from a spec notices when the spec moves under it.

Agent Board ribbon icon (#560) — the Agent Board is now one click from the sidebar instead of a command-palette lookup.

Peer-plugin MCP API (#565) — other Obsidian plugins can register global MCP servers (stdio/http/sse/oauth) and request OS-keychain-backed secrets through Agent Threads via api.v1.mcp.register and api.v1.mcp.requestSecret, rather than reinventing MCP config UI or credential storage. Both reuse the same human-in-the-loop confirmation machinery the agent-facing tools already use — there is no silent path for a peer plugin, and requestSecret never returns the secret value to the caller.

Compass “Send to Agent” receiver (#566) — Agent Threads now listens for agent.handoff events from Compass running in Geode’s Web Viewer and seeds a local thread from the handoff context. This ships inert: Compass’s sending side isn’t built yet, so nothing emits the event in this release. It’s the receiving half landing first on purpose — a receiver with no sender is invisible, whereas a sender with no receiver is a dead button.

Fixes

  • OAuth MCP consent opens in the system browser, not the Web Viewer (#562) — several providers refuse to complete sign-in inside an embedded view.
  • MCP capability tokens stay stable across turns (#563) — they were being regenerated mid-conversation, breaking long-running sessions.
  • OAuth MCP scopes default to the resource’s advertised list (#564) — instead of a hardcoded guess that some providers rejected.

Maintenance

The screenshot suite is fully green again — 207 passed, 0 failed. Four baselines had been failing for several releases and repeatedly written off as “pre-existing.” They turned out to be stale baselines: the diffs were confined to deliberate copy changes in Settings → Pull requests, with the components actually under test rendering pixel-identical. Verified by inspecting the rendered diffs before regenerating, not by assumption.


Install: BRAT → Update all beta plugins. Assets are attached below.

0.39.x

v0.39.0 September 14, 2026 View on GitHub

Connect Slack (and other fixed-redirect-URI OAuth MCP servers)

Some OAuth MCP providers register one exact callback URI and reject anything else. Until now Agent Threads always spun up its local OAuth callback listener on a random 127.0.0.1 port, relying on RFC 8252’s “any loopback port” allowance — which those providers don’t honor. That made them impossible to connect.

mcp_register_server now accepts an optional redirectUri on oauth-type servers. It pins the local callback listener to an exact loopback URI — host, port, and path — and uses that same URI verbatim in the authorization request, the Dynamic Client Registration payload, and the token exchange.

Slack is the motivating case; it requires exactly http://localhost:3118/callback.

Connecting Slack

name: slack
type: oauth
url: https://mcp.slack.com/mcp
clientId: 1601185624273.8899143856786
redirectUri: http://localhost:3118/callback

You can also set it in Settings → MCP → Add MCP server → OAuth, where redirectUri sits alongside the existing optional clientId and authorizationServerUrl overrides.

Notes

  • localhost and 127.0.0.1 are not interchangeable. OAuth redirect URI validation is exact string matching, so use whatever the provider registered. Slack registers localhost.
  • The listener binds the hostname parsed from your URI rather than a hardcoded 127.0.0.1. That matters on macOS, where localhost resolves to ::1 first — an IPv4-only bind would leave the browser talking to a dead port after you’d already consented.
  • redirectUri is validated as a security boundary, since it decides where the authorization code is delivered and which interface is bound. Accepted: http scheme, a loopback host (127.0.0.1, localhost, or [::1]), and an explicit in-range port. Rejected: 0.0.0.0, any LAN or public host, and embedded credentials, query strings, or fragments.
  • Omitting redirectUri changes nothing. Servers without it keep today’s exact behavior: an ephemeral 127.0.0.1 port, a portless DCR redirect URI, and the /callback path.

Full field reference: docs/mcp-registration.md


Included PR: #557 — feat: pin the OAuth MCP callback via an exact redirectUri (Slack support)

0.38.x

v0.38.0 September 12, 2026 View on GitHub

New: author skills in your vault

Create reusable skill packages directly from Skills Manager with New skill, or let an agent create and update complete packages with skills_create_local and skills_update_local. Authored skills live in your vault’s configurable Skills/ folder and can include scripts, templates, and binary resources. (#554)

New Claude and Codex sessions discover authored packages as /local:<identifier>. Updates preserve omitted files and validate paths, with rollback when package writes fail. Qualified identifiers distinguish packages that share a name.

Existing installed/imported skills and GitHub sources keep their current locations; no migration is required. Start a new session to discover newly authored skills.

Skills Manager documentation

Update through Settings → BRAT → Update all beta plugins.

0.37.x

v0.37.2 September 12, 2026 View on GitHub

Patch release covering three merged PRs.

Conversation first is now the default placement (#549)

New installs now open the conversation in the main area with one reusable native companion panel beside it, instead of the classic sidebar layout. Existing installs are unaffected — any vault that has already saved settings keeps whatever placement it was using. You can switch either way at any time under Settings → General → Conversation placement.

Alongside that, the Skills Manager now opens in the right sidebar under conversation-first placement (creating the sidebar if it isn’t open yet), matching where the Agents List opens. Previously it always took a main-area tab, which collided with the conversation. Classic placement keeps the original main-area-tab behavior.

Edited-file chips respect host-attached Project folders (#552)

Clicking an edited-file chip for a file inside an attached Project folder opened it in an external application instead of the in-app read-only viewer. The plugin now gives the host first refusal before falling back to the OS, so Geode routes those files to its read-only viewer. Obsidian behavior is unchanged.

”Chat about this document” (#545)

Three new entry points — file-explorer right-click, editor right-click, and the command palette — start a new thread with the composer pre-seeded with an @[[note]] mention and the caret parked after it. It seeds rather than dispatches, so you type the actual question and the existing mention resolver inlines the note at send time.


Also regenerates three screenshot baselines that had drifted (request-secret-modal normal/force, mcp-registration); the suite is now fully green at 204 passed / 2 intentional skips.

Install/update via BRAT: Settings → BRAT → Update all beta plugins.

v0.37.0 September 12, 2026 View on GitHub

OAuth-gated MCP servers

Adds a fourth MCP transport, type: "oauth", for remote servers that require their own sign-in — Vercel, Figma, Linear and most hosted vendor MCP servers. The plugin brokers the whole OAuth 2.1 + PKCE flow itself: discovery, Dynamic Client Registration, consent via the Web Viewer, token custody, refresh and revocation, all behind a local per-server proxy. Neither Claude nor Codex needs any OAuth-specific code.

Connect one two ways, both running the same flow and validation:

  • Settings → MCP → Add MCP server → OAuth — name and URL required; scopes, an allow/deny tool filter, and client-ID / authorization-server overrides optional.
  • Ask an agent to call mcp_register_server with type: "oauth".

Access and refresh tokens live only in the OS keychain, never in data.json and never returned to the calling thread. Settings → MCP → OAuth MCP servers shows each server’s live status — connected with an expiry countdown, expiring soon, or needs re-authorization — with a Disconnect that revokes upstream, clears the keychain and stops the proxy.

Fixes found by hand-testing before release

The broker passed its full test suite while being completely non-functional in the real app. Three defects, all invisible to CI:

  • Authorization-server traffic could never leave the renderer. Discovery, DCR, token exchange and refresh used the renderer’s fetch, but the renderer runs on a file:// origin and Chromium blocks cross-origin fetch from an opaque origin regardless of the server’s CORS headers. The MCP SDK converts that failure into empty metadata, so it surfaced as “this authorization server does not support Dynamic Client Registration” — a claim about the server caused by a failure in our HTTP layer. All AS traffic now routes through Obsidian’s requestUrl.
  • Agents never picked type: "oauth". The tool description advertised only “stdio, HTTP or SSE”, so asked to connect Vercel a model reasonably chose http — saving a server that could never authenticate and never opened a consent screen.
  • The consent callback page was mojibaked. Served without a charset, so its UTF-8 body decoded as Latin-1 and the em dash rendered as —. Now correctly encoded, and redesigned with distinct success and error states.

Full changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.36.0…v0.37.0

0.36.x

v0.36.0 September 11, 2026 View on GitHub

What’s new in v0.36.0

Features

  • Enter design mode from an agent conversation. Claude and Codex can now call EnterDesignMode({ brief }) in an existing thread to create or reuse its static UI artifact, show its controls, and open the preview. The agent receives artifact paths and design instructions immediately and continues in the same turn. (#546)

Improvements

  • Composer /design and agent-initiated entry share serialized artifact preparation. Failed persistence restores thread metadata, preserves files for recovery, and supports retry.
  • Tool results distinguish an opened preview from a source-reveal fallback or unavailable preview, so the agent can accurately explain what happened.

Notes

  • Requires a desktop filesystem vault and write permission; unavailable in read-only Plan mode or while plan approval is pending.
  • Secure preview requires a compatible Geode host. Existing /design usage remains supported. Design artifacts do not introduce a persistent permission mode or an exit command.
  • Local verification: 2,589 unit/integration tests passed and the browser suite covered artifact entry/reuse and controls. Live model-driven verification was blocked by a host startup compatibility issue (SearchComponent is not a constructor) before design entry could run; no live-host smoke is claimed.
  • Update through BRAT, then use a newly initialized session to discover the new tool. Development instructions and public docs are updated in companion PRs.

0.35.x

v0.35.4 September 11, 2026 View on GitHub

Bug Fixes

  • #543 — Clicking an HTTP(S) link in a conversation or context-footer pill now opens a fresh in-app Web Viewer tab instead of replacing a page you already had open.

Improvements

  • In conversation-first placement, newly opened Web Viewer tabs remain in the contextual companion group beside the conversation.
  • Existing Web Viewer pages remain available as you open additional links.

Notes

  • Agent-invoked host_open_url behavior is unchanged: it continues to reuse a Web Viewer tab by default and supports its explicit new-tab option.
  • If the host Web Viewer is unavailable, links continue to fall back to the system browser. Cmd-click (Ctrl-click on Windows/Linux) still forces the system browser.
  • No configuration or migration steps are required.
  • The separate public documentation site may temporarily retain the previous clicked-link wording; its update was outside this release scope.

Release metadata

  • #544 — synchronized the manifest, package metadata, versions map, and README badge for v0.35.4.
v0.35.3 September 10, 2026 View on GitHub

What’s New in v0.35.3

Features

  • Host-confirmed MCP server registration — Interactive agents can propose stdio, HTTP, or SSE servers with mcp_register_server. Agent Threads always shows a host-owned confirmation dialog before saving the configuration, including when ordinary tool approvals are bypassed. Registration is create-only and idempotent, applies globally to newly initialized sessions, and never launches a command or contacts an endpoint during registration. (#532)

Security and behavior

  • Credential values stay out of conversations and plugin settings by using ${VAR_NAME} placeholders with request_secret.
  • Scheduled and other noninteractive threads cannot register servers because they cannot complete the host confirmation.
  • The calling session keeps its existing tools; the saved server becomes available when a future session initializes or reinitializes.

Notes

  • No migration is required.
  • Registration validates common credential-bearing fields, but arbitrary literal arguments must still contain only nonsecret configuration.
  • See the MCP server guide for configuration fields and examples.
v0.35.2 September 10, 2026 View on GitHub

Improvements

  • The Agents List Project selector now matches the themed context pill in Chat, with folder icons and a checkmark for the selected Project. It preserves your choice when dispatching tasks and when Projects are renamed, handles deleted Projects, and stays usable in narrow sidebars and on mobile. (#540)

Updating

Update through Settings → BRAT → Update all beta plugins, then reload Agent Threads safely after active threads finish. No migration or settings changes are required.

v0.35.1 September 10, 2026 View on GitHub

Bug fixes

  • Conversation-first navigation reuses the same companion split after plugin reloads, workspace restoration, and chat replacement on Geode hosts with durable companion support. Closing the destination tab while sibling tabs remain now opens the next contextual item in that same split. (#537)
  • Pending contextual navigation stops during plugin teardown, and Web Viewer load failures retain the external-browser fallback.

Updating

Update Agent Threads through BRAT or Geode’s plugin updater. Durable pane recovery requires Geode 0.13.4 or newer; earlier Geode versions and Obsidian retain their existing behavior. Previously created, unmarked duplicate panes may require one-time manual closure.

Documentation: https://threads.rbcodelabs.com/docs/getting-started/introduction/#conversation-first-workspace

v0.35.0 September 9, 2026 View on GitHub

Google Workspace MCP — opt-in beta

Agent Threads can now connect Google Docs, Drive, Sheets and Slides to both Claude and Codex through your existing Google Docs Sync account. Enable the services you want in Settings → MCP → Google Workspace, then start a new thread. All four services are off by default. Interactive and scheduled threads use the same selection. Google’s servers provide the complete native read/write toolsets and schemas. (#535)

Setup and upgrade

  1. Update Google Docs Sync to v0.7.1 or later, then update Agent Threads using BRAT. The integration checks for guarded refresh support and shows an update instruction for incompatible builds.
  2. Use the updated Docs Sync auth service. Self-hosted or corporate auth deployments must update to include Workspace OAuth scopes for Docs, Drive, Sheets and Slides, then deploy that update through your normal process.
  3. Disconnect and reconnect Google Docs Sync to grant the additional scopes. If changing its Auth proxy URL, disconnect before changing the host, then reconnect.
  4. Enroll the OAuth client’s Cloud project in Google’s Workspace Developer Preview Program, enable the selected product APIs and matching MCP APIs, and obtain any required Workspace administrator approval. See Google’s setup guide.

Connection behavior

  • Access tokens refresh through Google Docs Sync; Google credentials are not placed in harness MCP configuration.
  • Existing threads retain their connection identity across app restarts. Reconnecting accounts, changing auth hosts, or refresh-token rotation requires a new thread. Ordinary access-token renewal remains automatic.
  • Disabling a service revokes existing Google connections. Missing or incompatible Docs Sync omits Google services without blocking the rest of a thread.
  • Existing harness permission behavior applies to Google’s read and write operations.

Beta validation

This release is an explicitly approved opt-in beta. Live corporate validation of both harnesses across all four services, including representative authorized operations and long-running refresh/restart behavior, remains pending. Automated transport and UI checks do not establish Google preview access or corporate permissions. Use disposable content when validating write operations.

Update through Settings → BRAT → Update all beta plugins. No manual vault build installation is needed.

0.34.x

v0.34.1 September 9, 2026 View on GitHub

Bug fixes

  • Restore discoverable thread renaming in conversation-first mode: right-click the workspace tab and choose Rename thread, use the header pencil, or choose Rename thread in the thread switcher. Double-clicking the conversation title inside the pane opens the same dialog. (#534)
  • Make repeated renames reliable and support Enter to save, Escape to cancel, whitespace trimming, and blank-name rejection. Cancelling leaves automatic naming enabled. (#534)

Improvements

  • Add desktop and mobile rename regression coverage, plus visible QA results and screenshots in pull requests. Refresh release screenshots to match current Settings text.

Updating

Update through Settings → BRAT → Update all beta plugins. No migration is required. Native workspace-tab double-click remains controlled by the host; use right-click on the tab or double-click the conversation title inside the pane.

v0.34.0 September 8, 2026 View on GitHub

What’s New in v0.34.0

Features

  • Safe peer-plugin Threads API — other Obsidian plugins can now read sanitized, paginated thread execution traces and request one-turn Claude evaluations without inheriting Agent Threads’ host tools, settings, skills, plugins, files, or environment. Durable operation IDs support safe retries, cancellation, and recovery after reload. (#530)
  • Trustworthy execution evidence — trace records distinguish successful skill loading from the enclosing run’s outcome, include bounded usage and lifecycle metadata, and keep background evaluation work out of normal Agent Boards.

Notes

  • This is a backward-compatible public API addition; existing plugin IDs and installation paths are unchanged.
  • WikiSkill is a separate plugin and is not included in this release.
  • Sandbox VM support from #508 is not included.
  • The authenticated constrained-run isolation canary passed before publication.

Validation

  • 2,505 unit tests passed.
  • 187 Playwright checks passed; 2 existing checks remain skipped.
  • TypeScript, production build, version consistency, GitHub CI, and the live isolation canary passed.

0.33.x

v0.33.2 September 7, 2026 View on GitHub

Bug fixes

  • Fixed scheduled job names wrapping across multiple lines in narrow Agents List panes. Long names now truncate with an ellipsis while the run count, timestamp, and expand control remain visible. (#528)

Update through Settings → BRAT → Update all beta plugins. No configuration changes are required.

v0.33.1 September 6, 2026 View on GitHub

What’s changed

Fixes and improvements

  • Accurate agent activity colors: agent counts in the Agents List and Agent Board are green only while at least one child agent is starting, working, or waiting. Finished teams use the faint secondary color, and board counts update as agents finish. (#526)
  • Clearer selected threads: the selected Agents List row uses an accent background and trailing accent bar that remain visible in light and dark themes. (#525)
  • More room for Skills Manager: newly opened views use a main document tab. An already-open Skills Manager is focused without moving it or losing edits. (#524)
  • Prompt regression coverage: added tests ensuring Claude and Codex receive the vault root separately from the working directory. (#523)

Notes

  • Documentation and screenshots reflect the updated behavior.
  • The sandbox VM feature (#508) is not included.
  • Validation: 2,457 unit tests and 186 browser tests pass; two documented browser-harness skips. TypeScript, build, version checks and candidate CI pass.
  • Update via Settings → BRAT → Update all beta plugins. Real-device Obsidian smoke testing remains a user follow-up.
v0.33.0 September 4, 2026 View on GitHub

Features

  • Public peer-plugin API v1 (#521) — enabled desktop plugins can safely list, create, open, message, and wait for Agent Threads; subscribe to semantic lifecycle events; dispatch Portfolio or Project Orchestrators; and reuse the transport-neutral voice-orchestration tool bundle. The versioned API returns immutable snapshots and cleanly invalidates stale references after reload.
  • Goal-aligned Project Orchestrators (#519) — orchestrators now establish explicit outcome and completion contracts, ask one focused question only when direction is genuinely ambiguous, and avoid repeated review when no new evidence exists. Targeted completion wakeups use exact update cursors, with hourly reconciliation for missed activity.
  • Agent Threads identity (#520) — the user-facing product is now Agent Threads across the plugin UI, onboarding, diagnostics, documentation, and screenshots.

Bug Fixes

  • No standalone bug-fix PRs are included in this release. Compatibility fixes required by the Agent Threads rebrand are included in #520.

Improvements

  • Existing installations keep the historical claude-threads plugin ID, install folder, command IDs, workspace view types, relay endpoints, MCP namespace, and saved schemas, so the new product identity does not break layouts, hotkeys, data, or integrations.
  • The README now documents API v1 capabilities, lifecycle signals, structured errors, and intentional security boundaries for peer-plugin developers.

Notes

  • This release upgrades Agent Threads from v0.32.4 to v0.33.0 and requires Obsidian 1.0.0 or a compatible Geode host.
  • The sandbox VM manager in #508 is intentionally not included; it remains pending refreshed live VM verification.
  • Update through BRAT: Settings → BRAT → Update all beta plugins.

0.32.x

v0.32.4 September 4, 2026 View on GitHub

Features

  • Native conversation headers in document panes (#517) — Conversations opened in the main document area now use Obsidian or Geode’s native title and header actions, eliminating the duplicated custom title bar.

Improvements

  • Sidebars retain the compact conversation controls that fit narrow panes, and the header adapts automatically when a conversation is dragged between the main area and a sidebar.
  • Thread switching, notes, rename, and close actions remain available from the native header, with improved accessible state labels.
  • Mobile behavior is unchanged and continues to use the compact custom conversation header.
  • Header placement updates and switcher cleanup are hardened for pane moves and view closure.

Notes

  • Release metadata and the README badge were updated for v0.32.4 in #518.
  • No migration or configuration change is required.
  • Classic sidebar remains the default placement; the native document header appears when Chat is in the main document area, including the opt-in Conversation first workspace.
v0.32.3 September 4, 2026 View on GitHub

What’s New in v0.32.3

Features

  • Native Agents List search and grouping — use the host Search action to filter threads and a checked Group menu to persist Project + Status, Project-only, or Status-only layouts. Counts, scheduled-job stacking, responsive rows, and narrow-pane behavior stay accurate across layouts. (#513)
  • Declared GitHub skill sources materialize automatically — GitHub sources committed in plugin settings now get deterministic local identities and clone paths, and missing clones are restored after layout-ready without blocking startup. Existing clones are never auto-pulled, local sources remain untouched, and failures are isolated per source. (#514)

Improvements

  • Kanban is now Agent Board — the view, commands, settings, diagnostics, and documentation use the clearer Agent Board name and distinct kanban icon while preserving existing internal IDs and compatibility. (#510)
  • Scheduled Work is easier to scan — every non-system schedule appears once in a compact accordion row, sorted by next occurrence with paused work last. Expand a row for its prompt, working directory, active hours, gate, execution details, run history, and actions. (#515)

Notes

  • No migration or manual configuration change is required.
  • Updating existing GitHub skill-source clones remains an explicit action; this release only materializes missing declared sources.
  • Geode users need a host release that includes the native-compatible SearchComponent API used by the Agents List.
v0.32.2 September 4, 2026 View on GitHub

What’s New in v0.32.2

Bug Fixes

  • HTML reports stay inside Claude Threads — clicking an edited-file pill for an .html or .htm file now opens it in the host’s enabled Web Viewer even when the file was generated outside the vault, such as under /tmp. Vault HTML behavior remains unchanged. (#511)

Notes

  • No migration or configuration changes are required.
  • When the Web Viewer core plugin is unavailable or disabled, files continue to use the existing vault or operating-system fallback.
v0.32.1 September 4, 2026 View on GitHub

Archive threads without opening them

Closing a thread used to mean opening it first and clicking the × on its tab. Fine for one thread, hostile for fourteen — an hourly cron job can bury the threads you actually need to triage, and clearing its runs meant fourteen round trips through the chat view.

Right-click any thread row or Kanban cardArchive thread.

Right-click a Scheduled Jobs rollup row (or a Kanban stack card’s header) → Archive these N runs, plus Archive all M runs of this job when the job has runs that rollup isn’t showing. One job’s runs split across status groups (New/Reviewed/Ready) and Projects, so a single job can render as several rollups — the second item saves you hunting them down.

You’re asked to confirm only when there’s something to lose, and never more than once per action. The three hazards — a still-running session, a Portfolio/Project Orchestrator, and a bulk set — fold into one dialog listing every reason. Archiving a single idle thread is immediate. Pending ScheduleWakeups are cancelled so an archived thread can’t come back to life, and the last remaining thread can’t be archived.

A run with no messages is dropped without leaving an empty vault note behind.

Desktop only — Obsidian Mobile doesn’t fire contextmenu on touch. Mobile is a deliberate follow-up.

Fixes

  • Confirmation dialogs could hang. ConfirmModal never resolved when dismissed, so the orchestrator warning on thread close would wait forever if you pressed Escape.
  • Archiving the open thread left the chat view pointing at it. Any archive path other than the tab’s × — the new menu, the MCP archiveThread handler, the idle sweep — left a stale selection, and the next message you sent threw Thread not found with the dead conversation still on screen.

Full changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.32.0…v0.32.1

v0.32.0 September 3, 2026 View on GitHub

Highlights

Project-scoped secrets (#504)

Keychain-backed secrets can now be restricted to specific Projects, so an API key for one project stops being injected into every unrelated session.

Each secret defaults to Global — exactly the previous behavior, so existing setups are unaffected and no migration is needed. To scope one, open Settings → Secret environment variables and use the checkboxes under a secret’s row to pick which Projects may see it. Scoping applies everywhere a secret value is used: session environment, ${VAR} placeholders in MCP server configs, and scheduled-item gate commands.

A thread or scheduled item with no Project only ever receives global secrets — it never receives a Project-scoped one. Deleting a Project automatically prunes it from every secret’s scope list.

Note that MCP server and skill registration remains global; only whether a scoped secret’s value resolves is gated by Project.

Inline proposed-reply card (#505)

Proposed replies staged by the thread orchestrator (threads_set_proposed_reply) used to render in a small strip docked inside the floating panel above the compose box — a panel that collapses to a sliver whenever you aren’t hovering it, making anything longer than a one-liner unreadable.

They now render as a full-width inline card in the conversation flow, matching the existing plan-approval and question cards, with a scrollable body for long replies.

Unified composer context controls (#500)

The composer footer had accumulated duplicate context surfaces and too many standalone buttons. This consolidates them into a single context pill naming where the thread is working (Project · folder), with per-thread Model and Permissions controls folded into the composer menu.

The pill shrinks and ellipsizes on a narrow pane instead of disappearing, so the working context stays visible where the old separate chips did not. Click it for the full Project name, the full path, and Change project….

Install

Via BRAT, or download main.js, styles.css, and manifest.json into <vault>/.obsidian/plugins/claude-threads/.

Full changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.31.3…v0.32.0

0.31.x

v0.31.3 September 3, 2026 View on GitHub

Bug Fixes

  • External links now open in the conversation-first Web Viewer — an ordinary http(s):// link inside a chat message previously fell through to default anchor behavior instead of routing through the host’s Web Viewer. It now opens the same way status-line pill links and vault-note links already did: reusing the conversation-first companion tab when that placement is active, otherwise the shared Web Viewer tab or system browser. (#502)
  • Question cards are now clickable across the full option row — previously only the radio button or checkbox control itself was clickable, forcing a precise click target. The entire option row (label, description, and control) is now clickable, making it easier to answer AskUserQuestion / request_user_input prompts on both desktop and mobile. (#501)

Notes

  • Patch release — no breaking changes, no migration required.
v0.31.2 September 3, 2026 View on GitHub

What’s New in v0.31.2

Features

  • Configurable Create PR messages — the Create PR and Create draft PR actions no longer hard-code the plugin’s PR workflow. Two new settings under Settings → General → Pull requests let you set exactly what gets sent to the agent, defaulting to /create-pr and /create-pr --draft. Point them at your own agent skill or prompt instead. Leaving either blank restores its default. The git diff bar buttons and the typed /create-pr command both route through the configured text. (#497)

  • Move an existing thread into a Project — a new Move to Project… item in the chat view’s ⋯ menu, with a picker listing every Project plus (No project). Moving switches the thread to that Project’s working directory, which starts a fresh session on the next message; detaching leaves the cwd alone. Hidden for the Portfolio Orchestrator and for any thread that owns a Project. (#496)

Bug Fixes

  • A thread created outside a Project was stranded there permanently — nothing could move it in. threads_set_project denied every real Project as a destination for an unassigned caller, elevatedProjectId was portfolio-only, and routing through the Portfolio Orchestrator failed because an unassigned caller can’t message a Project-owning thread. The only workaround was to abandon the thread and start over from the Project group. A thread may now assign itself into a Project, both from the agent side and by hand. The carve-out is deliberately narrow: it does not let a thread that already belongs to a Project hop to another one. (#496)

  • Assistant message lists lost their indentation under some themes — desktop assistant-message ol/ul elements didn’t own their own geometry, so a host or theme CSS reset could force list-style-position: inside with zero padding and snap wrapped continuation lines back to the left margin. List geometry is now scoped to the assistant message content, with nested lists and mobile behavior unchanged. (#493)

  • README screenshots were showing placeholder circles instead of real icons — the screenshot harness hard-coded a 7-entry icon table and fell back to a generic circle for everything else, while the plugin renders roughly 130 distinct icons. Because the screenshot update step copies those baselines straight into docs/, the wrong glyphs were shipping in the README: the main screenshot rendered eight identical grey circles where the app draws eight distinct icons. The harness now resolves real Lucide glyphs, applies Obsidian’s svg-icon class, and matches its base icon sizing and stroke width. (#498)

Improvements

  • Design mode is calmer and takes less space — the loading state no longer echoes your raw brief back as hero copy, showing a neutral “Preparing your design scaffold” instead. The oversized artifact action card is now a compact responsive toolbar that keeps Preview as the primary action and exposes Capture and Reveal as accessible icon buttons, freeing up composer space. The Design mode kickoff contract also asks the agent for more realistic content, clearer hierarchy, and accessible, responsive layouts. (#495)

  • Compact dashboard project selector — the visible “Project” label is gone from the Agent Dashboard dispatch controls and the default option reads No Project rather than “Unassigned”, reclaiming horizontal space in narrow panes. The accessible name is preserved, and Kanban behavior is unchanged. Verified against 280px–390px widths. (#494)

Documentation

  • Corrected the design artifact card actions in the README, which still described the pre-#495 Open preview / Capture / Reveal source buttons.
  • Documented vault_get_file_history and vault_restore_file_version, which were registered as MCP tools but missing from the Vault tools table.

Notes

  • No migration steps and no breaking changes. The two new PR-message settings apply their defaults automatically, so existing Create PR behavior is unchanged unless you edit them.
v0.31.1 September 2, 2026 View on GitHub

Bug Fixes

  • Fixed narrow docked sidebars so the Agents List and conversation footer respond to pane width instead of the whole application window. Dashboard rows, Project controls, agent/schedule metadata, and footer actions now stay contained and reachable at compact widths. (#491)
  • Restored compact 28px agent controls on narrow desktop panes while preserving explicit 44px touch targets on true mobile layouts. (#491)

Improvements

  • Updated the dashboard agent count to the lightweight green users-icon treatment used by the conversation composer, with clear hover and keyboard-focus feedback. (#491)
  • Added responsive regression coverage for 280px, 320px, and 380px desktop panes plus 375×667 and 390×844 mobile layouts. (#491)

Notes

  • No settings, migration, public API, or persisted-data changes are required.
  • Update through BRAT: Settings → BRAT → Update all beta plugins.
v0.31.0 September 2, 2026 View on GitHub

What’s New in v0.31.0

Features

  • Responsive Agents List — the former Agent Dashboard list now adapts from narrow sidebars to wide panes with clearer two-line rows, stable saved-layout compatibility, and no horizontal overflow. (#484)
  • Scoped Project updates for agents — the new threads_update_project tool lets authorized agents safely update a Project’s name, description, or working-directory override without direct settings-file edits. (#485)
  • Direct thread navigation — the new threads_open tool lets an authorized agent bring a specific thread into the host UI while preserving the normal reviewed-state and active-selection behavior. (#488)

Bug Fixes

  • Claude refusal and queued-turn reliability — Claude’s current refusal fallback/no-fallback events now render correctly, queued turns no longer create a false idle window, message correlation survives rate-limit replay, and nested PDF read results are handled correctly. (#480)
  • Archived Project Orchestrators stay archived — archiving now persists the disabled state and cancels queued or in-flight completion work so a delayed wakeup cannot recreate or message the orchestrator. (#483)
  • Message links open again — ordinary Markdown links now work in classic, conversation-first, and mobile views; agent-generated absolute paths inside the vault resolve correctly, including encoded spaces, headings, and block anchors. (#487)

Improvements

  • More readable wide conversations — wide panes center the complete timeline and composer in a shared readable-width column while narrow panes retain their full-width layout. (#486)
  • Release documentation — the README now explicitly documents the responsive conversation-width behavior and narrow-pane fallback. (#489)

Notes

  • No migration or configuration change is required.
  • Existing compatibility aliases remain available for the new Project-update and thread-navigation tools.
  • Claude Threads still requires Obsidian 1.0.0 or later.

0.30.x

v0.30.3 August 31, 2026 View on GitHub

Features

  • Groups Agent Dashboard conversations by resolved Project, with compact rows ordered into Working, Waiting, New, Reviewed, Failed, and Ready sections.
  • Preserves expanded permission, question, plan, waiting, and AWS reauthentication states so action-required work stays visible.
  • Replaces repeated child-agent buttons with one accessible agent-count control that opens the team picker without discarding the current selection.
  • Routes wikilinks, ordinary Markdown vault links, relative links, headings, and block references into the companion document leaf while preserving external and protocol links.
  • Uses Geode’s optional 30/70 conversation/document split while retaining the standard Obsidian fallback.

Improvements

  • Keeps dashboard project grouping current after cwd and pending-plan changes.
  • Preserves scheduled single-run rollups and project/status-scoped expansion state.
  • Stabilizes the screenshot harness across fresh Chromium processes by awaiting thread focus and pinning a deterministic bundled monospace font.

Notes

  • Includes #481.
  • No migration steps or breaking changes are required.
  • Follow-up: verify unresolved relative-link new-note creation against a real host and normalize source-relative paths if needed.
  • Follow-up: extract the duplicated Dashboard/Kanban project resolver into shared logic to prevent future divergence.
v0.30.2 August 31, 2026 View on GitHub

What’s New in v0.30.2

Bug Fixes

  • Kanban Project grouping now reconciles matching repositories correctly. Unassigned threads whose origin repository or effective working-directory root matches a configured Project now join that Project’s folder swimlane and Project column, preventing duplicate same-project groups. Explicit Project assignments remain authoritative, and legacy worktree, unknown-directory, and same-name repository fallbacks remain distinct and deterministic. (#478)

Documentation

Notes

  • No configuration changes or migrations are required.
  • Release artifacts include main.js, styles.css, manifest.json, and versions.json.
v0.30.1 August 31, 2026 View on GitHub

What’s New in v0.30.1

Reliability & Security

  • Scheduler gates can now distinguish a confirmed skip (exit 1) from an indeterminate check (exit 75). Indeterminate results honor each schedule’s fail-open or fail-closed setting, so transient network, authentication, or parsing failures do not silently masquerade as an empty queue.
  • Gate subprocesses receive configured keychain-backed secrets only in their ephemeral environment. Secret names and values are not persisted in schedules and are redacted from diagnostics.
  • Gate failures are sanitized, stripped of terminal control sequences, and safely bounded in run history, preserving useful troubleshooting context without leaking sensitive data.

Compatibility

  • No migration or configuration changes are required.
  • Existing gate commands continue to work unchanged. Remote or otherwise fallible gates can adopt exit 75 to signal an indeterminate result.

Documentation

  • The scheduled-task documentation now covers gate exit semantics, fail-open behavior, secret handling, and diagnostic safety.

Implementation: #476
Documentation: claude-threads-site#57

v0.30.0 August 31, 2026 View on GitHub

What’s New in v0.30.0

Features

  • Project-scoped orchestration — each Project can now have its own durable Project Orchestrator for focused coordination, while the Portfolio Orchestrator continues to oversee unassigned work and can explicitly elevate into a Project when cross-project visibility is needed. Project Orchestrators are created automatically after the first completed Project thread or directly from Settings. (#474)
  • Independent coordination routing — wakeups, schedules, notes, and proposed replies stay with their owning Project or Portfolio coordination bucket, reducing unrelated context and preventing cross-project coordination mistakes. (#474)
  • Clear Project and Portfolio identity — Settings, Agent Dashboard, Kanban, and thread badges now distinguish Project Orchestrators from the Portfolio Orchestrator. (#474)

Improvements

  • Project deletion now preserves ordinary threads, pins affected schedules to the former effective working directory, and safely removes Project-owned coordination state.
  • Orchestrator retirement and archive persistence are rollback-safe, and startup repair cleans stale references and orphaned heartbeats.
  • Coordination tools enforce Project ownership and provenance for manager notes and proposed replies.
  • The public guide now documents creation, coordination boundaries, schedules, deletion behavior, and updated agent tools. (docs #55)

Notes

  • Projects are an operational coordination boundary, not a vault, filesystem, tool, MCP-server, skill, or secret security boundary.
  • Existing unassigned threads continue to be coordinated by the Portfolio Orchestrator.
  • No migration steps or breaking configuration changes are required.
  • Minimum supported Obsidian version remains 1.0.0.

0.29.x

v0.29.6 August 31, 2026 View on GitHub

What’s New in v0.29.6

Bug Fixes

  • Codex Default model remains stable across turns — resetting a Codex thread to Default now retains the effective model selected by Codex instead of caching and later sending an empty model value. This keeps subsequent turns and Plan-mode entry/exit working correctly. (#472)

Release Maintenance

  • Updated plugin metadata, compatibility mapping, lockfile metadata, and the README version badge for v0.29.6. (#473)

Notes

  • No settings changes, migrations, or manual upgrade steps are required.
  • Update through BRAT or install the attached release artifacts manually.
v0.29.5 August 30, 2026 View on GitHub

What’s New in v0.29.5

Features

  • Native Codex question cards — Codex can now pause a turn and collect choices, an Other/free-text response, or a masked secret through the same durable inline cards used by Claude. Pending questions survive thread switches and reloads on desktop and mobile. (#469)
  • Default-mode Codex questions — compatible Codex app servers can request native cards outside Plan mode when they advertise support. Older Codex versions continue safely without enabling the unsupported capability. (#469)
  • Codex Ultra effort — Codex reasoning effort is configured separately from Claude, including Ultra for proactive native-agent fan-out on models that advertise support. Unsupported model/effort combinations fail clearly before the turn starts. (#469)

Improvements

  • Secret question responses remain masked and are never reconstructed into persisted chat after a reload.
  • Claude and Codex settings stay independent when switching the selected harness.
  • Public documentation now covers every previously shipped feature that still had an outstanding docs PR, including scheduled active hours and gate commands, Skills Manager tools, tool-call grouping, telemetry diagnostics, live quota usage, MCP storage, and background-task completion behavior.

Notes

  • Update the Codex CLI for native Default-mode question cards. Plan-mode cards continue to work with the existing compatible protocol.
  • Ultra can increase latency and compute use and does not guarantee child agents for every task.
  • No migration or configuration change is required.
v0.29.4 August 30, 2026 View on GitHub

What’s New in v0.29.4

Bug Fixes

  • Inline visualizations render again for current Codex output — Claude Threads now recognizes Codex’s canonical wrapped visualize references instead of showing the marker as raw text. Existing conversations that use the legacy bare marker remain compatible. (#467)

Improvements

  • More reliable visual regression coverage — screenshot scenes now settle at their intended bottom-anchored state, eliminating timing-dependent clipping across bridge, footer, and usage views. This changes test infrastructure only. (#468)
  • Synchronized release metadata — manifest, package metadata, lockfile, versions map, and README badge now identify v0.29.4. (#470)

Notes

  • No migration or configuration changes are required.
  • Public documentation now describes the canonical wrapped marker and legacy compatibility. (docs #53)
v0.29.3 August 30, 2026 View on GitHub

What’s New in v0.29.3

Features

  • Project Foundations — Projects now provide predictable initial working context across Dashboard and Kanban dispatch, reassignment, scheduled work, and agent tools. Configure an explicit cwd override or derive it from <vault root>/<vaultFolder>; Project selection is preserved alongside model, goal, loop, attachment, image, and harness options. Scheduled jobs resolve cwd consistently at fire time, and narrow mobile layouts retain accessible Project controls. (#465)

Improvements

  • Codex plan checklists — Codex update_plan progress now renders in the same live task checklist used above the composer and on Kanban cards, including normalized statuses, completed/in-progress counts, and safe handling of child-thread or malformed plan updates. (#464)
  • Safer Project lifecycle behavior — Reassignment changes association only unless cwd alignment is explicitly requested; detaching never relocates a thread. Project selectors and active-thread context refresh across create, rename, delete, reassignment, and cwd changes. (#465)
  • Reliable failed-dispatch recovery — If dispatch fails, the original payload is restored without overwriting prompt, attachment, image, or command-chip edits made while dispatch was pending. (#465)

Notes

  • Projects focus a thread’s working context; they are not filesystem, tool, secret, MCP, skill, or coordination access-control boundaries.
  • No migration steps or breaking changes are required.
v0.29.2 August 30, 2026 View on GitHub

What’s New in v0.29.2

Bug Fixes

  • Native design dispatch from Dashboard and Kanban/design <brief> now creates a design-artifact thread, opens it in Chat, launches the ArtifactView preview, and starts the agent with the generated design kickoff instead of sending the literal slash command to Codex. (#462)
  • Retry-safe setup failures — rejected attachments or failed navigation preserve the complete draft for retry, remove provisional artifacts and threads, and restore a valid prior thread selection without starting a hidden agent turn. (#462)

Documentation

  • Dashboard, Kanban, command, and design-artifact guidance now explains the native dispatch flow and its current attachment limitation. (docs #51)

Release

  • Version metadata and compatibility history are synchronized for v0.29.2. (#463)

Notes

  • No migration or configuration changes are required.
  • Update through BRAT with Settings → BRAT → Update all beta plugins.
v0.29.1 August 30, 2026 View on GitHub

What’s New in v0.29.1

Features

  • Codex-controlled Plan Mode — Codex can now invoke EnterPlanMode when a task needs investigation before implementation. Claude Threads completes the current turn at a safe boundary, starts one fresh native read-only Plan turn, and presents the resulting structured plan in the existing Approve / Edit / Reject card. (#460)

Improvements

  • Approval restores Default mode only after the live settings transition succeeds, then starts exactly one fresh implementation turn. Failed approvals remain retryable without losing the plan.
  • Rejected plans preserve queued feedback for revision, including feedback that arrives around the approval boundary.
  • Stale root events, child-agent tool calls, session teardown, persistence failures, and resumed Codex threads are handled without corrupting the Plan lifecycle.
  • The README and public documentation now explain both manually selected and autonomous Codex Plan mode, including the read-only handoff and review flow. (release metadata #461, docs #50)

Notes

  • There is no separate host ExitPlanMode tool for Codex. Its native structured plan is the protocol-aligned approval boundary.
  • Update through BRAT with Settings → BRAT → Update all beta plugins.
v0.29.0 August 30, 2026 View on GitHub

What’s New in v0.29.0

Features

  • Conversation-first workspace — opt in under Settings → General → Conversation placement to keep one Claude Threads conversation in the main workspace while notes, links, edited files, previews, artifacts, and agent navigation reuse a native companion pane beside it. Closing the companion gives the conversation the full width again. Classic sidebar remains the default, and mobile behavior is unchanged. (#457)

Bug Fixes

  • Image attachments now persist correctly in Geode — pasted images and tool-result images are externalized to disk instead of silently remaining as large base64 payloads in data.json. The fallback path also prevents image blocks from flooding Codex context and recognizes both Anthropic and MCP image-result shapes. (#458)

Improvements

  • Conversation placement migrations are failure-safe and preserve the selected thread through reloads.
  • Conversation-first edited-file focus no longer closes unrelated notes.
  • Contextual content reuses one owned companion and safely recreates it after closing or a safe plugin reload.
  • Public documentation now explains Conversation first, Classic behavior, and the companion workflow. (docs #49)

Notes

  • Conversation first is an opt-in desktop prototype.
  • At small desktop window sizes, collapse a host sidebar when using the companion if the center workspace feels cramped.
  • Update through BRAT with Settings → BRAT → Update all beta plugins.

0.28.x

v0.28.3 August 30, 2026 View on GitHub

What’s New in v0.28.3

Features

  • Promote a sent message to a goal — right-click the latest sent, non-empty message and choose Set as goal when you realize a request should become durable goal context. The goal is saved before kickoff and works with both Claude and Codex while preserving conversation continuity. (#455)

Reliability

  • Goal replacement and clearing now refresh authoritative session context only after active turns and permission, tool, or background-work callbacks settle. Rapid replacements are last-write-wins, and failed persistence restores the last durable goal without stranding queued messages. (#455)

Documentation

  • Updated the README and public Goals guide with the retroactive workflow, eligibility rules, and session-refresh behavior. (docs #47)
  • Updated plugin metadata, versions.json, and the README badge for v0.28.3. (#456)

Notes

  • No migration or configuration changes are required.
  • Update through BRAT to install the patch.
v0.28.2 August 30, 2026 View on GitHub

What’s New in v0.28.2

Bug Fixes

  • MCP servers with an unregistered secret failed authentication silently. A server whose ${VAR_NAME} placeholder couldn’t be resolved was previously started anyway with the placeholder expanded to an empty string — for example, shipping an empty x-api-key header on every single session. The server is now excluded instead, with a session-start notice and a per-row warning in Settings → MCP so the problem is visible instead of silent. (#452)

Improvements

  • MCP server list now lives in the plugin’s own data.json, not ~/.claude/settings.json. That file was never a valid storage location — Claude Code owns it, its schema has no mcpServers property, and neither the CLI nor the SDK ever read what the plugin wrote there. Storing servers there also meant plugin edits could show up as surprise diffs in a dotfiles repo if that file was symlinked. (#452)
  • Invalid MCP server entries are now shown as a removable row in Settings → MCP rather than silently dropped. (#452)
  • Removed a stale README paragraph describing sdk-type MCP entries as read-only and instructing manual edits to ~/.claude/settings.json — that concept no longer exists in the code. (#453)

Notes

  • No automatic migration. If you had MCP servers configured under the old ~/.claude/settings.json-based storage, that block is now inert and safe to delete — re-add those servers via Settings → MCP. This was a deliberate choice: adding a migration importer would mean keeping a read path to the exact file this release stops reading.
  • Both harnesses (Claude and Codex) are unaffected in terms of behavior — servers still reach sessions through the same injection path as before; only the storage location and the failure behavior for unresolved secrets changed.
v0.28.1 August 29, 2026 View on GitHub

What’s New in v0.28.1

Bug Fixes

  • Codex tool activity now renders with the right meaning at a glance. Native Codex commands such as commandExecution appear as Bash with a terminal icon under Exploring instead of falling back to a generic wrench and Working group. File edits, web searches, image views, and image generation likewise use their matching labels, icons, and activity groups across desktop and mobile. (#450)
  • Namespaced MCP tools keep their own identity. A third-party MCP tool whose bare name resembles a native Codex record is no longer mislabeled as a built-in Bash or Edit action. (#450)

Improvements

  • Historical and live Codex records share the same display normalization without changing persisted conversation data.
  • Screenshot coverage now exercises Codex-native tool rendering on desktop, iPhone 14, and iPhone SE layouts, with deterministic strict visual gates.

Notes

  • No migration or configuration changes are required.
  • Update through BRAT with Settings → BRAT → Update all beta plugins.
v0.28.0 August 29, 2026 View on GitHub

What’s New in v0.28.0

Features

  • Scheduled Work dashboard — Settings now has a dedicated Scheduled tab with a durable Next up view, relative countdowns and exact timestamps, recurring versus thread-specific grouping, active-hours and gate details, recent run history, pause/resume/delete controls, Open last run, and Create with Claude. Gated jobs correctly show Next check, while overdue work is labeled Overdue — catching up. (#447)

Bug Fixes

  • Long schedules no longer overflow native timers — intervals such as 30 days now use bounded heartbeat timers instead of overflowing JavaScript’s signed 32-bit timeout ceiling and firing in a tight loop. (#447)
  • Scheduled occurrences are claimed safely — overlapping plugin generations serialize claims, re-authorize immediately before dispatch, and finalize against fresh persisted state. This prevents duplicate dispatches and prevents an in-flight run from resurrecting a schedule that was disabled. (#447)
  • Calendar schedules retain durable behavior — daily and weekly wake signals use pinned node-cron calendar handling while persisted nextRun remains authoritative for restart catch-up, gates, active hours, loops, and one-shot wakeups. (#447)

Improvements

  • Stable release screenshot gates — npm and pnpm now resolve the same Playwright renderer version, and timing-sensitive footer/design-artifact tests wait for deterministic final UI state. (#448)
  • Release metadata — plugin, package, README badge, and Obsidian compatibility map are synchronized at 0.28.0. (#449)
  • Public Scheduled Work documentation is live at threads.rbcodelabs.com. (docs #45)

Notes

  • Existing scheduled items remain compatible and acquire internal durability metadata lazily; no manual migration is required.
  • Manual schedule editing, Run now, and future calendar projection are not part of this release. Create or revise scheduled work conversationally through Claude.

Verification

  • 1,917 unit and integration tests passed.
  • TypeScript check passed.
  • Playwright: 137 passed, 2 documented skips, 0 failures.
  • Production build passed; main.js, manifest.json, and styles.css were verified before publication.

0.27.x

v0.27.14 August 29, 2026 View on GitHub

Fixes

Summarizer no longer spawns on every message (#445) The in-process summarizer was subscribing to a per-message trigger instead of turn-completion, firing a full query() call on nearly every incoming message. Replaying a real 92-turn transcript through the actual summarizer code drops spawns from 4,640 to 95 — a 48.8x reduction that now tracks turn completions 1:1. Also fixes a latent data-loss bug where lastSummarizedAt was stamped after the async call resolved, so a message arriving mid-call landed behind the cursor and was skipped permanently.

Worktrees are no longer created in disappearing storage (#437) enter_worktree created worktrees under os.tmpdir(), which macOS clears on reboot — every worktree was one restart away from silent deletion, taking uncommitted work with it. Worktrees now go to a durable root at ~/.geode/worktrees/<repo>/<branch>.

Changes

Skills install to the vault; ~/.claude/ is now read-only (#442) Skills installed through the plugin write into the vault’s own plugin skills root instead of ~/.claude/skills/. ~/.claude/ becomes a read-only source that the Skills Manager surfaces but never edits, deletes, or symlinks into. The Installed tree now splits into Vault (editable) and Claude Code (read-only) groups, and legacy ~/.claude/skills/* symlinks left over from the old Link button are flagged rather than silently double-loaded.


Install: Settings → BRAT → Update all beta plugins

v0.27.13 August 29, 2026 View on GitHub

Features

  • Replaced the persistent wakeup and recurring-loop banners with one compact scheduled-activity pill in the thread composer. The pill shows the next activity and an additional-item count when more than one schedule is active.
  • Added an accessible popover that lists wakeups and recurring loops separately in next-run order, including the wakeup reason or loop prompt and exact timing.

Improvements

  • Cancel and Stop now operate on the selected scheduled item only, so stopping a loop cannot accidentally cancel a pending wakeup.
  • The live countdown updates without stealing keyboard focus, and the popover reconciles cleanly when an activity fires or disappears.
  • Scheduled-activity controls now behave consistently across keyboard navigation, thread switching, narrow desktop layouts, and mobile-sized viewports.
  • Wakeup state changes stay targeted to the correct thread even when persistence is slow or fails.

Bug Fixes

  • Fixed the scheduling-state collision that could display incorrect loop information such as Looping every 0s when wakeups and loops coexisted.
  • Removed obsolete scheduling banners and their stale styles and tests.

Notes

v0.27.11 August 28, 2026 View on GitHub

Highlights

The git diff bar is now the single surface for branch and PR info — and it no longer shows stale PRs. (#432)

The thread panel used to print the same git information twice: the context footer rendered PR #121 and a branch pill directly above a diff bar that already showed the same branch, its diff stat, and a View PR button.

Worse, the PR it named could be wrong. prUrl is deliberately sticky so the archive-on-merge workflow can match a thread to its PR after the branch is deleted — but the bar used that thread-scoped history to label a button sitting beside the current branch. In practice, threads moved between projects with set_working_directory kept advertising a PR from a completely different repository.

  • The bar’s button now carries the PR number (PR #121) with the URL as a tooltip.
  • It reads the live pr status tag, which your context footer command derives per-branch (gh pr view "$branch") on every poll — so it disappears the moment the branch has no PR. Transient script failures can’t blank it: the status-line service keeps the previous tags on exec error.
  • While the bar is visible, the footer hides its own pr/branch pills. When the bar hides (PR merged and back on the base branch, non-git cwd, detached HEAD), the footer pill returns as the only remaining surface.
  • The footer’s sticky pill is suppressed on a provable repo mismatch only, so the legitimate after-merge case still works.

Also fixes the split button’s seam: the dropdown segment never zeroed its border-radius, so it inherited the theme’s global button radius and showed a notch where it met View PR.

Note if you use a custom Context footer command: keep emitting the pr tag. It isn’t just a pill — it’s the only source of a thread’s PR association, and it drives the diff bar’s button, the Kanban PR chip, and archive-on-merge.

Internal

  • #431 — screenshot tests now wait for scroll position and content height to settle before capture, removing a long-standing source of flaky visual diffs.

Full Changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.27.10…v0.27.11

v0.27.10 August 26, 2026 View on GitHub

Agent status, without the panel

The always-expanded Agent Team tree is gone. While a thread has sub-agents running, a compact N agents working pill sits in the composer footer instead — the conversation stays the conversation.

  • Click the pill to open a popover with the full agent tree (parent/child nesting, role, status, latest activity).
  • Pick an agent and the message pane becomes that agent’s activity timeline, behind a breadcrumb — Main conversation › reviewer › test engineer — where every crumb is clickable.
  • The composer stays live throughout; its placeholder flags where a send will actually land.
  • With no agents running, the pill disappears and the footer collapses back to hover-only.

Verified at desktop, iPhone 14, and iPhone SE widths: no clipping, no horizontal overflow, 44px touch targets on mobile.

Filled buttons actually render again

Send, Submit on the question card, Create PR and its dropdown, permission Always allow, plan/elicitation approve, and mod-cta buttons were rendering as border + text with no background fill.

The view-wide button reset is (0,1,1) so it can strip Obsidian’s default button chrome — but each filled button re-applied its background with a single class at (0,1,0), so the reset won and the fill never landed. Fills are now scoped with .ct-root to (0,2,0) so they out-rank the reset, while icon buttons stay transparent.

Also adds a var(--color-red, #e05252) fallback so the stop button fills on hosts that don’t define --color-red (this is why it stayed transparent in Geode even on hosts where the specificity was fine).


Included PRs: #425, #428

Install: BRAT → Update all beta plugins.

v0.27.9 August 25, 2026 View on GitHub

Bug Fixes

  • Fixed harness brand icon rendering — Corrected viewBox scale factors for Claude and OpenAI brand SVGs in harness picker. Icons were blank due to incorrect assumptions about Obsidian’s icon scaling (100×100 viewBox). Fixes #426.
v0.27.8 August 25, 2026 View on GitHub

What’s New in v0.27.8

Improvements

  • Recognizable Claude and Codex kickoff icons — the Agent Dashboard and Kanban dispatch controls now use the Anthropic Claude Spark and OpenAI Blossom instead of generic text marks. Both icons remain monochrome and automatically follow the active Obsidian theme. (#423)

Notes

  • Dispatch behavior is unchanged: click or press Enter to start with the displayed harness; right-click, press and hold, or use Shift+F10 to change it without dispatching.
  • Existing threads retain their original harness, and selecting a kickoff harness does not change the global Settings default.
  • No migration steps are required.
v0.27.6 August 24, 2026 View on GitHub

Fixed

  • Pause spinner animations for wedged (stale) running threads — resolves the sustained CPU peg caused by animating spinners on threads that appear “Working” but are actually stuck/stale. (#419)

Note: this fix was ready before v0.27.5 shipped but landed on main just after that tag was cut, so it went out in this follow-up patch.

v0.27.5 August 24, 2026 View on GitHub

What’s New in v0.27.5

This is a Codex-reliability patch release. No UI changes since v0.27.4.

Bug Fixes

  • Resumed Codex threads no longer wedge on “Working.” A resumed Codex thread could spin up a phantom root sub-agent run that never settled, leaving the thread stuck in the Working state. Resumed threads now reach their terminal state correctly. (#415)

Improvements

  • Installed agent profiles are now available to Codex. Agent profiles supplied by installed GitHub plugin sources were previously loaded only into the Claude SDK, so Codex sessions ran without the same specialized roles and Playbook routing was harness-dependent. Those profiles are now rendered into Codex developer instructions for both new and resumed threads, giving Codex the same role definitions for delegation. Claude’s native options.agents behavior is unchanged. Profile paths that are absolute, use traversal, or escape via symlink are rejected. (#417)

Notes

  • No migration steps or breaking changes. Committed UI screenshots are unchanged and still current (both changes are backend-only).
  • Quality gates on main at release: tsc --noEmit clean, 1550/1550 unit tests passing, production build clean.
v0.27.4 August 21, 2026 View on GitHub

Geode Design — Phase 1

Claude Threads can now create, revise, reopen, and capture secure static UI artifacts in Geode.

Highlights

  • New /design <brief> workflow
  • Zero-install HTML/CSS/JavaScript scaffold under .geode/artifacts/
  • Durable artifact metadata tied to the originating thread
  • Persistent artifact card with Open preview, Capture, and Reveal source
  • /design without a brief reopens the existing artifact
  • Responsive and accessibility-aware design instructions
  • Secure fallback outside Geode reveals source instead of executing unsandboxed HTML

Requires Geode v0.7.6 for the secure ArtifactView preview and capture experience.

Full changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.27.3…v0.27.4

v0.27.1 August 19, 2026 View on GitHub

What’s New in v0.27.1

Bug Fixes

  • Codex subagents now leave Working state when their turns finish — completed, failed, and interrupted child turns settle the matching subagent without incorrectly settling the parent conversation. (#407)
  • Newer child follow-up turns are protected from stale completion events — an older terminal event can no longer overwrite the active state of a newer turn.

Reliability

  • Child-turn tracking is cleared when a Codex session closes, preventing stale lifecycle state from leaking across sessions.
  • Added focused regression coverage for completion, failure, interruption, event ordering, and session cleanup.

Notes

  • No migration or configuration changes are required.
  • Existing persisted non-terminal agent runs are restored as unavailable after the plugin reloads; new runs will settle normally with this patch.
v0.27.0 August 19, 2026 View on GitHub

What’s New in v0.27.0

Features

  • Choose Claude or Codex when launching a conversation — Agent Dashboard and Kanban kickoff buttons now show the active harness and let you select the other one before dispatching. Click or press Enter to launch immediately; right-click, press and hold, Shift+F10, the Context Menu key, or Alt+Down opens the selector without sending. The choice stays local to the mounted view and does not rewrite your global setting. Existing threads retain the harness that created them. (#405)

Improvements

  • Added keyboard-accessible menu behavior and 44px touch targets for harness selection.
  • Added unit and visual regression coverage for selector behavior, Kanban grouping modes, and unchanged conversation composers.
  • Updated the plugin README, agent-workspace guide, and public documentation for the new kickoff flow.

Notes

  • Settings → Agent harness remains the initial default for new views; selecting a harness from Dashboard or Kanban does not change that setting.
  • No migration or manual configuration is required.

0.26.x

v0.26.5 August 18, 2026 View on GitHub

What’s New in v0.26.5

Bug Fixes

  • Reliable thread restoration after restart — Claude Threads no longer reconstructs live conversations from rendered Markdown archives, preventing stale messages and presentation artifacts such as Tools Used callouts from appearing in restored threads.
  • Versioned recovery snapshots — vault-saved conversations now include a machine-readable .recovery.json sidecar that preserves canonical thread state, runner identity, session metadata, messages, and tool-call data for both Claude and Codex threads.
  • Safer Codex resume fallback — if Codex cannot resume its native thread, the replacement session receives the canonical conversation history once instead of silently continuing with an empty context.
  • Reload write protection — overlapping plugin generations can no longer overwrite newer persisted thread state with stale shutdown data.

Notes

  • Existing Markdown-only archives remain readable, but are not parsed back into live conversations. Active threads stored in data.json will gain versioned recovery snapshots as they are saved.
  • This patch contains only the thread restart and recovery integrity fix from #402.
v0.26.4 August 18, 2026 View on GitHub

What’s New in v0.26.4

Improvements

  • Native wake lock in Geode — while Claude is actively working, Claude Threads now prefers Geode’s native Electron power-save blocker. This avoids launching a separate operating-system process when the plugin is hosted by Geode. (#399)
  • Safe provider fallback — if the Geode bridge is unavailable or native acquisition fails, standard Obsidian on macOS continues to use caffeinate -i; other supported environments continue to use the Web Wake Lock API when available.
  • Race-safe cleanup — native tokens that arrive after a session ends, the setting is disabled, or the service is destroyed are immediately released to prevent leaked blockers.

Notes

  • Requires Geode v0.5.18 or later to use the native provider.
  • Existing settings, reference counting, callbacks, and the ☕ status-bar indicator are unchanged.
  • No migration or configuration changes are required.

Full changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.26.3…v0.26.4

v0.26.3 August 18, 2026 View on GitHub

What’s New in v0.26.3

Features

  • Agent-created persistent threads — agents can now use threads_create to create an independent thread, immediately queue its initial prompt, and inherit or override the caller’s working directory and project context. The tool returns the new thread identity without waiting for its work to finish. (#395)

Improvements

  • The agent tool contract rejects empty prompts and supports explicitly clearing project assignment with projectId: null.
  • Public documentation now separates agent thread creation from the existing human Fork command and /fork workflow.

Notes

  • The human Fork workflow, modal, conversation summarization, and /fork command remain unchanged.
  • No migration or configuration changes are required.
v0.26.2 August 18, 2026 View on GitHub

What’s New in v0.26.2

Bug Fixes

  • Codex Stop works reliably — Stop now waits for the active Codex turn to be accepted and interrupts that exact turn, including when Stop is pressed immediately after sending. (#396)
  • Codex edited files appear in the thread file list — multi-file Codex changes now populate the same persistent edited-file chips and focus workflow already used by Claude threads. (#396)

Documentation

  • Updated README descriptions for Stop, tool visibility, and edited-file focus to accurately cover both Claude and Codex. (#397)

Notes

  • No settings changes or migrations are required.
  • Open feature PR #395 is not included in this patch release.
v0.26.1 August 18, 2026 View on GitHub

Claude Threads v0.26.1

Claude Threads 0.26.1 adds a provider-aware usage view so Claude and Codex users can understand session consumption and available quota information without conflating the two providers’ capabilities.

Highlights

Cross-provider /usage view

  • Run /usage to see thread or session token totals, last-turn usage when reported, and available quota windows with utilization and reset timing.
  • Claude usage includes full agent-tree token aggregation when modelUsage is available, plus explicitly labeled estimated cost, overage, and credit hints.
  • Codex usage normalizes multiple quota windows, reset credits, cumulative account metrics, and recent daily token activity when supported by the current authentication method.
  • Unavailable provider fields are shown honestly instead of estimating or manufacturing parity.

Compatibility and responsive design

  • /context and /cost retain their existing behavior.
  • The usage card is verified at desktop, iPhone 14, and compact iPhone layouts with no horizontal overflow.
  • Stale account activity is cleared after provider errors, while valid reset-credit data is preserved.

Documentation and quality

  • Added public documentation explaining /usage, /context, /cost, and Claude/Codex capability differences.
  • Added unit coverage for usage normalization, session message handling, full-tree Claude totals, Codex account activity, and slash-command registration.
  • Added deterministic visual regression coverage for desktop and mobile usage states.

Included changes

  • #389 — Cross-provider usage and quota view.
  • Public docs #27 — Usage command and provider capability documentation.

Notes

  • Claude account activity is not exposed by the SDK, and Claude quota data appears only after a rate-limit event is emitted during the session.
  • Codex account activity depends on supported Codex-service authentication; API-key-only and Bedrock configurations may not expose it.
  • Live payloads from individual provider accounts were not part of automated verification.

Requirements

  • Obsidian 1.0.0 or later, or a compatible Geode desktop host
  • An installed and authenticated Claude Code CLI or OpenAI Codex CLI
v0.26.0 August 17, 2026 View on GitHub

Claude Threads v0.26.0

Claude Threads 0.26.0 makes harness-native Claude and Codex child agents durable, navigable participants in the workspace instead of transient activity that disappears into a parent thread.

Highlights

Native Agent Workspace

  • See spawned Claude and Codex agents in a nested Agent Team tree inside the parent conversation.
  • Select any agent to inspect the exact lifecycle, current activity, result, error, and parent/child relationships reported by its native harness.
  • Navigate the same child agents from the Agent Dashboard, including expandable descendants and search across agent roles, tasks, and activity.
  • See compact native-agent counts on Kanban cards, making multi-agent work visible without opening each thread.
  • Keep agent history across reloads through persisted, harness-neutral agent records and stable native-ID mapping.
  • Recover safely from interrupted sessions: active agents that cannot reconnect after reload are marked unavailable instead of being incorrectly shown as completed.
  • Handle late and replayed events reliably, including children observed before their parent and duplicate lifecycle events.

Honest capability handling

Direct child-agent messaging and single-agent interruption remain disabled where the Claude or Codex harness does not expose a verified host-callable control path. Claude Threads explains that limitation in the UI and never silently redirects an action to the parent conversation.

Documentation and quality

  • Added the Agent Workspace capability and recovery guide.
  • Added desktop, iPhone 14, and compact iPhone screenshot coverage for the new workspace.
  • Added unit and integration coverage for persistence, hierarchy resolution, replay safety, rendering, accessibility, and harness event normalization.

Included changes

  • #391 — Native Agent Workspace (24eaad39bc53b976517b0eb5c6f66b1d4935e88e)

This is the only plugin change since v0.25.11. The Codex permission-request UI fix was already shipped in v0.25.11 and is not repeated in this release.

Requirements

  • Obsidian 1.0.0 or later, or a compatible Geode desktop host
  • An installed and authenticated Claude Code CLI or OpenAI Codex CLI

0.25.x

v0.25.11 August 17, 2026 View on GitHub

What’s New in v0.25.11

Bug Fixes

  • Codex permission prompts now use Claude Threads’ permission UI — MCP approval requests with no input fields appear as the familiar styled permission card with Deny, Allow, and Always Allow actions instead of an unstyled Cancel/Submit form. The request also remains available when switching conversations and correctly places the thread in Kanban’s Awaiting state. (#390)

Improvements

  • Genuine MCP input forms now use a fully styled inline card while preserving their schema-backed fields and submit behavior.

Notes

  • No migration or configuration changes are required.
v0.25.10 August 17, 2026 View on GitHub

What’s New in v0.25.10

Features

  • Host-neutral agent tools — Claude Threads now exposes the canonical claude_threads MCP server with host-neutral tool names across supported hosts. Existing obsidian and obsidian_* integrations remain compatible through the next major release. (#387)
  • Host-aware agent guidance — session prompts, permissions, tool display names, bundled skills, settings copy, and runtime messages now describe the active host accurately while retaining genuinely Obsidian-specific language where appropriate. (#387)

Bug Fixes

  • Correct composer identity for Codex threads — the message composer now follows the active thread harness and displays the correct Codex label instead of a stale Claude label. (#386)

Compatibility

  • Existing MCP clients can keep using the legacy obsidian server and obsidian_* tools. Canonical and legacy entries share the same handlers and schemas.
  • Command-palette IDs are unchanged.
  • Codex/native integrations receive canonical tools only, avoiding duplicate tool schemas.

Documentation

  • Updated the public MCP, agent-tools, vault integration, settings, and orchestrator documentation. (docs #26)

Installation

Update through BRAT: Settings → BRAT → Update all beta plugins.

v0.25.9 August 15, 2026 View on GitHub

What’s New in v0.25.9

This release aligns Claude Threads with Claude Agent SDK 0.3.233 (up from 0.3.207) and closes two silent-breakage points that a version bump alone would have triggered on newer models.

Bug Fixes

  • Task tracking restored on Opus 4.8 / Sonnet 5 / Fable 5 and newer models — SDK 0.3.233 drops the task tools (TaskCreate/TaskGet/TaskUpdate/TaskList/TodoWrite) from the default tool surface on these models. The Agent Dashboard task list depends on them, so the plugin now sets CLAUDE_CODE_ENABLE_TODO_TOOLS=1 for every session to keep task tracking working. Without this fix, task tracking would have silently broken with no error. (#381)

  • Auto-denied tool calls are now visible — when a tool call is denied without an interactive prompt (in auto/dontAsk mode, by a deny rule, or via headless auto-deny), the conversation now shows a distinct “Auto-denied <tool>” annotation with the deciding reason, instead of the event being silently dropped. (#381)

  • auth_status and conversation_reset events handled explicitly — these SDK message types previously fell through unhandled; they’re now handled cleanly. (#381)

  • Fixed a flaky raw-log-writer test — replaced a timing-based setTimeout race in raw-log-writer.test.ts with a real flushAll() completion barrier. The barrier also ensures a final log event isn’t lost to a pending write on plugin unload. (#381)

Notes

  • Two runtime behaviors are verified at the code/compile/test/build level and flagged for manual smoke testing after install: task tools actually firing on Opus 4.8 / Sonnet 5, and a real auto-deny rendering the annotation in Obsidian.
  • No breaking changes. Update via BRAT as usual.
v0.25.8 August 15, 2026 View on GitHub

v0.25.8

Local-only telemetry + diagnostics report (#383)

Adds an opt-in, local-only diagnostics facility to help track down performance and background-CPU issues (notably child-process spawn overhead on managed endpoints running CrowdStrike/EDR):

  • Spawn counters — integer counters for child-process spawns keyed by source (statusline / gitdiff / other), so background process churn is now measurable.
  • Renderer perf sampler — a lightweight, view-gated ring of CPU / memory / loadavg samples plus a longtask summary.
  • Diagnostics report command — writes a redacted Markdown + JSON report into your vault. Machine paths and note content are stripped; nothing leaves your machine.

All telemetry stays on-device — there is no network transmission.

Quality gate: tsc --noEmit clean · 1445 unit tests pass · 107 screenshot tests pass · clean build.

v0.25.7 August 15, 2026 View on GitHub

What’s Changed

perf(kanban): incremental card patching + dedupe poll emits (#380)

  • Kanban view no longer rebuilds the entire board on every thread update. Each card’s column placement is recorded and, on a state-change event, only the changed card is patched in place when its column membership is unchanged. Full rebuilds happen only when a card actually moves columns, is created, or is deleted — the running-status spinner is left untouched so it no longer restarts on every tick.
  • Deduped status_tags/git_diff emits so the 20–30s background poll no longer forces a full board rebuild when nothing changed.
  • Per-thread activity debounce so concurrent running threads each update their own activity line.

Full Changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.25.6…v0.25.7

v0.25.6 August 14, 2026 View on GitHub

Bug Fixes

  • Fixed data.json corruption risk and shrunk vault storage ~90% — message images were previously stored inline as base64 inside data.json, bloating the file and risking corruption on write. Images are now externalized to separate files with an atomic write path for data.json itself. (#376)
  • Fixed a thread-persistence race condition — concurrent writes to the same thread’s saved state could interleave and corrupt data. VaultPersistence.saveThread() writes are now serialized per thread id, so writes to the same thread never race each other. (#375)

Improvements

  • Idle threads now auto-archive, with images preserved — threads that go idle are automatically archived, and any images embedded in their messages are carried into the archived note instead of being lost. (#377)
  • Background-task notifications moved in-transcript — background task completion used to interrupt with a toast popup; it now appears as a notice inline in the conversation transcript, so it doesn’t yank focus away from what you’re doing. (#378)

Notes

  • Patch release — no breaking changes or migration steps required.
v0.25.5 August 13, 2026 View on GitHub

Bug Fixes

  • Mobile copy button no longer appears on empty tool-only messages. The mobile copy-to-clipboard button (”⎘”) was rendering as a standalone icon on assistant messages that had no text content — for example, messages consisting only of tool calls. Button creation wasn’t guarded on the message having non-empty content, so it appeared floating with nothing to copy. Fixed in both MobileView.ts and ThreadsView.ts by guarding button creation on non-empty content. (#373)

Notes

  • Patch release — no breaking changes, no new configuration options.
v0.25.4 August 12, 2026 View on GitHub

v0.25.4

Features

  • Smoother tool-call groups, with a live-updating outer wrap for long agent turns (#368) — Long tool-call sequences no longer render as a flat wall of small groups. Short off-kind interruptions (e.g. a single status update between two runs of file reads) are folded back into their surrounding group instead of breaking it into extra short entries. When a list is still long after that smoothing, it collapses one level further into a single “N tool calls, M steps” wrapper. While a turn is still running, that collapsed header shows the actively-executing tool (icon, name, and summary) and updates live as new calls stream in, reverting to a static summary once the turn finishes. A group containing a failed call — buried at either level — auto-expands and stays flagged so errors are never hidden. Available on both desktop and mobile (mobile gets the smoothing pass only; the two-tier outer wrap and live header are desktop-only).

Bug Fixes

  • Fixed skill installs failing with “failed to resolve module fs/promises” (#370) — Installing any skill from the in-plugin Skills Manager browser was completely broken. The bundler (esbuild) correctly rewrote static imports of the Node fs/promises builtin to require(...), but left a dynamic import('fs/promises') in copySkillFiles as a literal ESM import() that Obsidian’s plugin runtime couldn’t resolve at install time. Switched to the already-imported module-level helper, restoring the marketplace-install path.

Notes

  • No breaking changes or migration steps.
  • This release bundles two PRs that had already been reviewed and CI-green (#370, #368) into a single version bump, following this project’s standard release process.
v0.25.3 August 11, 2026 View on GitHub

Scheduled-task run history

Scheduled/cron items now keep a bounded run history of recent cycle outcomes, visible in Settings → Scheduled tasks. Each item shows a collapsible “Run history — N fired · M skipped · K errors (last L)” summary that expands to the recent cycles, newest-first, each tagged Fired / Skipped (gate) / Skipped (off-hours) / Error with a timestamp and the gate exit code or error note.

This closes the observability gap from the gate feature: a gate skip is now durably recorded over time, not just reflected in the single most-recent lastSkipReason / lastGateExitCode fields. It also surfaces automatically in CronList.

Under the hood: Scheduler.fire() appends one event per completed cycle to a ring buffer capped at 50 entries, persisted through the existing item-save path (survives restarts). A gate that can’t be evaluated but fires open is recorded as Fired with an explanatory note.

Full changes in #369. Bump in #371.

v0.25.2 August 11, 2026 View on GitHub

v0.25.2 — Mobile load-crash fix

A patch release that restores the plugin on Obsidian Mobile.

Bug Fixes

  • Plugin failed to load on Obsidian Mobile (#359) — SettingsTab.ts is loaded on every platform, but it value-imported the desktop-only KanbanView / AgentDashboard modules just to reference two view-type strings. That pulled their entire dependency chain (the Claude Agent SDK and Node’s fs/path/os) into the plugin’s eager bundle-init, bypassing the Platform.isMobile guard and crashing the plugin at load time on mobile (where require() returns null for Node built-ins) — before onload() ever ran. The imports are now import type only, with the two view-type strings mirrored as local literal constants (the same pattern main.ts already uses).

Internal / Hardening

  • Regression guard for the mobile-crash class — extended bundle-safety.test.ts with an “always-loaded module source safety” check that holds every module main.ts value-imports (starting with SettingsTab.ts) to the import type-only rule for desktop-only modules. This closes the gap that let the crash regress; the previous guard only inspected main.ts and only caught direct top-level Node requires, not this transitive vector.

Notes

  • No user-facing behavior changes on desktop. No settings or migration steps.
  • Update via BRAT (Settings → BRAT → Update all beta plugins).
v0.25.1 August 8, 2026 View on GitHub

Gate commands for scheduled tasks

Scheduled cron items can now carry a deterministic gate — a shell command that runs before each cycle spawns a thread, so cycles with “nothing to do” are skipped without burning an agent turn.

  • Contract: exit 0 fires the agent; any clean non-zero exit skips the cycle entirely (no thread, no message, no LLM call) while the schedule still advances.
  • Output piping: on a fire, the gate’s stdout replaces a {{gateOutput}} placeholder in the prompt (or is appended as a Gate output: block, truncated to ~8 KB).
  • Config: gateCommand (+ optional gateTimeoutSeconds, default 30 / cap 120, and gateFailOpen, default true) on CronCreate; set/clear later via CronUpdate (gateCommand/gateTimeoutSeconds/gateFailOpen/clearGate).
  • Fail-open: if the gate can’t be evaluated (timeout or spawn error) it fires anyway by default, so a broken check never blackholes a real cron. Set gateFailOpen: false to fail closed.
  • Env: gate runs in the item’s cwd with CRON_LAST_RUN_MS, CRON_ITEM_ID, CRON_ITEM_NAME.
  • Observability: skip reasons surface via lastSkipReason in CronList; Settings → Scheduled tasks flags gated items inline (e.g. “Every 5 minute(s) · gated”).
  • Desktop only (inert on mobile, where a configured gate simply fires).

Shipped in #362.

Full Changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.25.0…v0.25.1

v0.25.0 August 8, 2026 View on GitHub

What’s new in v0.25.0

🗂️ Kanban board — group by project columns (#363)

The Kanban board’s group-by toggle now cycles through three layouts instead of two: status columns → folder swimlanes → project columns.

Project columns is the new mode: one vertical column per app/project (same project resolution as folder swimlanes — assigned Project, falling back to the git repo / working-directory label, with an Unassigned catch-all sorted last). Inside each column, cards are grouped under status section headers — Working / Waiting / New / Reviewed / Failed / Ready — mirroring the Agent Dashboard sidebar’s grouping: awaiting-permission threads fold into Working, sections sort by recency, and empty sections are omitted. Each column reads top-to-bottom like a compact per-project dashboard, keeping a busy single-project board scannable without horizontal scrolling.

Scheduled-job stacking applies in project mode too.


Update via Settings → BRAT → Update all beta plugins.

0.24.x

v0.24.2 August 8, 2026 View on GitHub

Fixed

  • Background-task status misclassification — a thread’s outer turn finishing (and isRunning() flipping false) while a run_in_background: true Agent call or Workflow-tool task was still running server-side no longer causes the thread to be prematurely treated as done/reviewable. Threads now stay under Working until the background task actually finishes, across:
    • the Agent Dashboard
    • the Kanban board
    • the thread-switcher panel
    • MCP computeUiStatus (obsidian_list_threads / obsidian_get_current_thread)

See #360 for details.

v0.24.1 August 6, 2026 View on GitHub

Fixed

  • Configured GitHub and local skill sources are now registered with Codex sessions, restoring automatic skill discovery and triggering parity with Claude Code.
  • The bundled thread-orchestrator skill is also exposed to Codex without requiring global copies or symlinks.
  • Older Codex app-server versions continue gracefully with their normally discovered skills.

Full change: #357

0.23.x

v0.23.6 August 5, 2026 View on GitHub

Fixed

  • Restored reliable auto-compaction for long-lived Claude Agent SDK sessions.
  • Claude Threads now checks the SDK’s live context telemetry before each user turn and proactively compacts when the projected turn approaches the SDK threshold.
  • The user’s message waits until compaction finishes, avoiding terminal input-too-long failures while preserving background-task delivery and session continuity.

Verification

  • TypeScript typecheck
  • 1,230 unit/integration tests
  • Production build
  • Regression coverage for compact-before-send ordering and hidden maintenance-turn completion
v0.23.3 August 4, 2026 View on GitHub

Codex startup fix

  • Opt in to the Codex app-server experimental API before sending runtimeWorkspaceRoots and dynamic tools.
  • Fixes Codex threads failing to start with thread/start.runtimeWorkspaceRoots requires experimentalApi capability.
v0.23.2 August 4, 2026 View on GitHub

Codex harness support

  • Add Codex as a first-class agent harness alongside Claude.
  • Share the session contract, model catalog, and Obsidian tool definitions across harnesses.
  • Route Codex mutations through the existing permission dialog; read-only Obsidian tools remain seamless.
  • Fix the browser screenshot harness mock for Codex process support.
v0.23.1 August 4, 2026 View on GitHub

Performance\n- Reduces sustained CPU and WindowServer load during long streaming responses by throttling full Markdown redraws.\n- Coalesces incoming token updates and prevents overlapping or stale streaming renders.\n- Keeps buffered live tool-call UI intact across transient thread-switch state changes.\n\n## Maintenance\n- Restores the browser test harness’s child-process spawn mock for Codex sessions.

0.22.x

v0.22.1 August 3, 2026 View on GitHub

v0.22.1

Bug Fixes

  • Tool calls no longer render as a wall of full-height rows. An earlier fix (7b7d4fb) closed a real data-loss bug by persisting every tool-only step (Read, Edit, Bash, etc.) as its own message instead of silently dropping it — but as a side effect, a typical agentic chain (Read → Edit → Bash → …) started rendering as a long, ungrouped scroll of individual tool pills instead of the compact, collapsible activity groups you’re used to. This release re-collapses adjacent tool-only messages back into grouped, expandable rows at render time — both for messages loaded from history and for live, in-progress turns — without touching how thread data is persisted. A group you expand mid-run also now stays expanded as more calls stream in, instead of snapping shut. (#343)

Notes

  • No configuration changes, no breaking changes, no migration steps.
v0.22.0 August 2, 2026 View on GitHub

v0.22.0

Fixes

  • EnterWorktree / set_working_directory no longer hang the agent (#341). A cwd change used to eagerly restart the live session mid-tool-call, tearing down the transport before the tool result could be delivered — the turn hung forever. The rebuild is now deferred to the next turn (the documented “takes effect next turn” behavior), with a guard so a mid-turn cwd change can’t resurrect a stale-directory session id.
  • Tool-only assistant messages are no longer silently dropped from thread history (#340). Turn segments containing only tool calls (no accompanying text) rendered live but were never persisted, so they vanished on tab-switch/reload. They’re now committed as they stream, with a defensive flush if a generation ends early.

Features

  • Active-hours window for scheduled cron items (#338). Scope a scheduled job to a local-time window (e.g. business hours) with activeHoursStart/activeHoursEnd; cycles outside the window are skipped entirely — no thread spawned — instead of firing a thread just to check the clock and bail. Supports overnight windows.
  • Skills Manager exposed as skills_* MCP tools (#339). Agents can now discover and manage skills programmatically via MCP.
  • Richer orchestrator wake-up ping (#336). The orchestrator wake-up now includes each thread’s id, title, and status.

Full changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.21.1…v0.22.0

0.21.x

v0.21.1 August 1, 2026 View on GitHub

What’s New in v0.21.1

Features

  • /escalate is now a first-class, discoverable command (#333) — the escalate-this-turn shortcut now appears in the / autocomplete popup alongside /model, /goal, and /loop, both in-thread and in the Agent Dashboard / Kanban dispatch box. Use /escalate <prompt> from the dispatch box to spin up a new thread whose very first turn runs on your configured escalation model. The popup entry updates live when you rename the keyword or toggle escalation in Settings, and a bare /escalate with no prompt now shows a usage hint instead of silently dispatching.
  • Automatic recovery from rate-limit / overload errors (#334) — when the API rejects a turn outright with a rate-limit or overload error (429, 529, “overloaded”, “temporarily limiting requests”) before the model ever processed your prompt, the plugin now silently replays the exact same turn after an exponential backoff (up to 5 attempts, ~3s to 90s), showing a transient amber “reconnecting” notice instead of a hard red error card. No duplicate message is added to your transcript.

Improvements

  • Cleaner error cards (#334) — terminal errors now lead with a one-line headline and tuck the full stack trace behind a “Show technical details” disclosure, on both desktop and mobile, instead of dumping a wall of raw text into the conversation.

Bug Fixes

  • Kanban project grouping survives worktree cleanup (#335) — threads whose working directory was a temporary enter_worktree worktree used to fall back to showing a raw worktree hash in the Kanban board once that worktree directory was deleted (by exit_worktree, a manual git worktree remove, or the cleanup skill). The plugin now remembers the origin repo at worktree-creation time, so those threads keep grouping correctly under their real repo name, and stale-cwd repair reroutes straight back to the origin repo. Threads orphaned before this fix recover a display name from their PR URL.

Updating

Update via Settings → BRAT → Update all beta plugins.

0.20.x

0.19.x

v0.19.16 July 31, 2026 View on GitHub

Live tool-call grouping

Consecutive tool calls of the same kind — a run of file reads, a string of edits — now collapse into a single expandable group while the turn is still running, instead of growing an unbounded wall of individual pills. Previously this grouping only applied after a turn settled; now it happens live, on both desktop and mobile.

  • Live grouping — a long agentic run shows “Exploring (12)” and keeps counting up, rather than one pill per call.
  • Still-running pulse — the in-progress group shows a subtle pulse while a call in it is active.
  • Sticky expansion — a group you expand mid-turn stays expanded as more same-kind calls arrive.
  • Errors stay visible — a group containing a failed call auto-expands and stays flagged, so failures are never hidden inside a collapsed pill.
  • Mobile parity — mobile gains tool-call grouping for the first time (live and finalized).

Shipped in #326.


Install: BRAT → Update all beta plugins, or download main.js + manifest.json + styles.css below into <vault>/.obsidian/plugins/claude-threads/.

v0.19.15 July 30, 2026 View on GitHub

Fixes

  • ScheduleWakeup is now durable across restarts/reloads. Previously it armed a bare window.setTimeout tracked only in memory — any plugin reload, Obsidian restart, or app quit silently and permanently dropped the timer. It’s now implemented as a one-shot ScheduledItem backed by the same durable Scheduler that already powers Cron items, so it survives reloads and catches up on missed fires. (#321)
  • Plan/question cards no longer render above message history when switching threads. (#320)
  • Self-heal missing streamingEl on tool_use events. (#318)

Improvements

  • Threads created by the scheduler now track their originating scheduled item (scheduledItemId / scheduledItemName), surfaced as a footer pill. (#317)

Docs

  • Added ADR-0002 (long-lived thread session) and a PR-guidelines docs-site gate. (#322)
v0.19.14 July 21, 2026 View on GitHub

What’s new

  • Thread orchestrator support — a bundled skill that lets one thread supervise several peers: per-thread notes, proposed replies for human review, and event-driven wake-up (#310)
  • Fix: scheduled wake-up indicator no longer stays hidden until an unrelated re-render forces it (#312)
  • Fix: git-diff-bar button now correctly shows “View PR” when the thread already has an open PR (#315)
  • Test infra: pinned the harness clock in bridge-aware/mobile screenshot specs, fixing baselines that silently drifted a day at a time (#301)
v0.19.13 July 21, 2026 View on GitHub

Fixed

  • Cron mutations are now durable. Disabling, updating, or deleting a scheduled task (/loop, Settings → Scheduled Tasks) now waits for the change to be persisted to disk before returning. Previously the in-memory state updated immediately but the save to disk was fire-and-forget — if Obsidian reloaded (or crashed) in that window, the item reverted to its last-saved state on disk, silently resurrecting a task you’d just disabled or deleted. (#314)
  • Missed/overdue scheduled items now catch up with a staggered delay (5s, plus up to 30s more per additional overdue item) instead of all firing simultaneously on startup, and logs a warning when catching up more than one overdue item.

Also included

  • Consecutive tool calls in a thread now group into a collapsible pill instead of rendering as a long flat list. (#313)
v0.19.12 July 19, 2026 View on GitHub

What’s New

  • Mobile: answer AskUserQuestion prompts from your phone. Claude Threads mobile now renders AskUserQuestion tool prompts as an interactive card — single-select, multi-select, and free-text “Other” support, matching desktop. Answers relay back to the desktop session in real time. (#308)

Fixes

  • Fixed a flaky screenshot test baseline (bridge-aware) that silently drifted a day at a time because its relative-timestamp text was computed against the real system clock instead of the fixture epoch. Test infra only — no product change.

Full Changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.19.11…v0.19.12

v0.19.11 July 19, 2026 View on GitHub

Bug Fixes

  • Fixed a bug where scheduled cron items (e.g. recurring monthly automations) could fire twice simultaneously and spawn runaway duplicate threads. This happened when a plugin reload occurred while the previous session was still shutting down: a brief window let the old scheduler’s timers stay alive alongside a freshly constructed one, so both instances independently fired the same due item and kept re-arming themselves. The scheduler is now torn down synchronously as the very first step of shutdown, with two additional safety checks (a fencing check against on-disk state, and an in-process reentrancy guard) to prevent any recurrence even under unusual timing. (#306)

Full diff: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.19.10…v0.19.11

v0.19.10 July 17, 2026 View on GitHub

Skills Manager cleanup

  • Fixed the Installed list not scrolling independently of its header (the search/count/action rows now stay fixed while the tree scrolls)
  • Styled the previously-unstyled Import/Check-for-updates action buttons
  • Replaced the “Check for updates” inline status text (which wrapped onto its own line and had a grammar bug) with a compact indicator dot + hover tooltip showing full status and last-checked time
  • Added a draggable divider between the list and detail panels — drag to resize, double-click to reset, width persists across sessions
  • Combined “Import Folder…” / “Import File (.skill)…” into a single Import menu
  • Fixed “Check for updates” silently doing nothing on failure — the icon now spins while checking and a toast always reports the result, including why it failed
  • Moved Import / Check for updates from full-width list rows into compact icon buttons in the tab bar, freeing up vertical space in the list panel

Full diff: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.19.9…v0.19.10

v0.19.9 July 16, 2026 View on GitHub

Fixes

  • Plan Mode leak into subagents — approving a plan (via ExitPlanMode) now clears the SDK’s real internal plan-mode flag, not just the UI state. Previously, subagents spawned after plan approval would keep getting a phantom “plan mode is active” restriction regenerated on every turn, since they read the same underlying session flag the parent never actually cleared.
  • Worktree paths not canonicalizedenter_worktree now resolves the created worktree path with fs.realpathSync(). On macOS, os.tmpdir()-based paths resolve through a /var/private/var symlink; Bash tolerated the symlinked form but Edit/Write’s sandbox check needed the canonical path, causing “Bash works, Edit/Write don’t” failures in fresh worktree sessions.
  • Regenerated 3 screenshot baselines whose relative-time text had drifted against the real clock (text-only, no product change).

Full diff: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.19.8…v0.19.9

v0.19.8 July 14, 2026 View on GitHub

What’s New in v0.19.8

Bug Fixes

  • Stopped “Stream closed” errors on pending ExitPlanMode / AskUserQuestion / permission prompts — a follow-up to v0.19.7’s #296 fix, addressing a different gap in the same release-gate logic. The gate that decides when it’s safe to close the input stream had no awareness of a pending human-approval wait (ExitPlanMode, AskUserQuestion, or a regular tool permission prompt). If a background task’s own result landed while you hadn’t yet responded to one of these prompts, the stream could close prematurely — so your eventual response (e.g. approving a plan) failed with a “Stream closed” error, even though the session was still alive. Fixed with the same timer-free, event-driven approach as #296: the gate now also waits for any in-flight interactive callback to resolve before releasing the stream. (#298)

Notes

  • No breaking changes or migration steps.
  • If you’re still seeing “Stream closed” errors after updating, please report it — the remaining architectural fix for this whole bug class (a long-lived query per thread, replacing the current per-turn heuristics) is tracked as a larger follow-up project, not yet started.
v0.19.7 July 14, 2026 View on GitHub

What’s New in v0.19.7

Features

  • Persistent model-button indicator for escalated turns — the model switcher now stays accent-highlighted (with a gentle pulse, honoring prefers-reduced-motion) for the whole duration of a turn routed via /escalate, so you always have a visible confirmation the escalation took effect instead of just a 3-second popover tip that’s easy to miss. (#295)
  • Git diff bar + Create PR button — when a thread’s working directory is a git repo on a feature branch, a bar now sits above the compose box showing the branch name and a live +X -Y diff stat (branch vs. base, including uncommitted changes, computed via local git only — no network). A split “Create PR” button offers Create PR, Create draft PR (both via the new /create-pr slash command), or Manually create PR (opens GitHub’s compare page directly). Desktop only. (#294)

Bug Fixes

  • Threads no longer wedge on “Working” after a background task notification — since v0.19.5, a thread could finish its final assistant message (cost shown, todos complete) but the Working indicator would never clear, requiring a 10-minute timeout or a full Obsidian reload to recover. Root cause: an internal flag meant to keep the input channel open while a task-notification’s reaction was still streaming wasn’t cleared once that reaction actually arrived. The fix clears the flag as soon as assistant activity streams in after a notification, so the turn’s final result can release normally. (#296)

Notes

  • No breaking changes or migration steps.
v0.19.6 July 13, 2026 View on GitHub

Fixes

  • /loop now fires immediately instead of waiting a full interval for the first send (matches /goal).
  • /loop replaces, not stacks — starting a new loop on a thread stops any loop already running there instead of piling up multiple.
  • Fixed duplicate-tick pileup — if a loop tick arrives before the thread’s previous turn has finished, it’s retried shortly after rather than queuing a duplicate message.
  • Added a loop status banner and Stop button, plus a matching footer pill, so an active loop is now visible and can be cancelled from the UI (previously only via /loop stop).

Full diff: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.19.5…v0.19.6

v0.19.5 July 12, 2026 View on GitHub

Fixed

  • Permission channel could die mid-conversation with “Stream closed” (#290): passing a plain string prompt to the Agent SDK set an internal flag that force-closed the CLI’s stdin — the only channel for permission approvals, AskUserQuestion, and ExitPlanMode — at the very first response. Background tasks (now routine) kept the CLI running past that point, so every later permission request on such a turn failed instantly with “Stream closed,” even though the session was still alive. Sessions now hold the input channel open until the CLI genuinely has no more pending work, verified against a live reproduction with the real CLI.
  • Fixed a related bug where an ExitPlanMode approval card could render into a detached part of the page and never become visible, appearing to hang forever.

Internal

  • Thread sessions that outlive their first response (background task still running) are now tracked so a new message won’t start a second process against the same session, and Stop still works while one is running.
v0.19.4 July 11, 2026 View on GitHub

Features

  • Inline question cards for AskUserQuestion (#285) - Claude’s clarifying questions now render as an inline card in the conversation, the same style as the existing permission-request and plan-approval cards, instead of popping up in a blocking modal. You can see the surrounding conversation while answering, and a pending question now survives thread switches, reloads, or a crash - it restores automatically right where you left it.

Bug Fixes

  • Kanban board no longer resets your scroll position or flickers (#282) - Fixed a long-standing bug (a prior fix attempt in #234 never actually worked) where the kanban board’s scroll position was lost on every re-render. Task-list updates from Claude agents (which can fire multiple times per second) now patch just the affected card in place instead of rebuilding the whole board, eliminating visible flicker during active threads. No visual or behavioral changes - purely a rendering-correctness fix.

Improvements

  • Claude Agent SDK bumped to 0.3.207 (#288, from 0.3.190) - picks up upstream fixes for canUseTool allow/deny misclassification, dead-turn terminal_reason corrections, a tool-use-ID dedup fix, and a workflow-progress-drop fix. No breaking changes found against this plugin’s SDK integration points (system subtypes, tool names, task result format, message types, rate-limit shape all verified compatible).

Notes

  • No migration steps required for this release.
  • Screenshots regenerated for this version to reflect the current UI baseline.
v0.19.3 July 3, 2026 View on GitHub

What’s New in v0.19.3

Features

  • Dynamic model dropdowns — the Default model and Escalation model settings now populate with the full list of models your installed Claude CLI actually supports (pulled from the SDK’s capabilities_discovered event the first time a thread starts), instead of a hardcoded alias-only list. You can now pin a specific version like claude-sonnet-5 directly from Settings without typing /model. Family aliases (Fable / Opus / Sonnet / Haiku “latest”) still sit at the top for one-click “always latest” behavior. (closes #280)
  • Scheduled sessions inherit external MCP servers — threads spawned by the built-in scheduler (cron jobs, /loop, ScheduleWakeup wakeups) now pick up any external MCP servers defined in ~/.claude/settings.json (Compass, Helio, or any other user-configured server), not just the plugin’s built-in Obsidian tools. ${VAR_NAME} placeholders are resolved from environment variables and keychain secrets. Fixes scheduled agents silently failing with “tool not found” when calling external MCP tools. (closes #279)
  • Kanban auto-collapse side panels — new Settings → Features → Kanban board → Auto-collapse side panel option (None / Left / Right / Both) automatically collapses Obsidian’s sidebar(s) when the Kanban tab opens, giving the board more room, and restores them when you close it. Off by default. (closes #278)

Bug Fixes

  • Fixed broken npm install on a clean checkoutzod and @modelcontextprotocol/sdk were imported directly in source/test code but never declared as explicit dependencies, only ever resolving as hoisted transitive deps. A clean install could leave npm test failing with “Cannot find package ‘zod’”. Both are now explicit dependencies pinned to the versions already in use, with no behavior change. (#281)

Notes

  • No breaking changes or migration steps in this release.
  • Docs: README updated to describe the current model-dropdown behavior, the new Kanban setting, and MCP inheritance for scheduled sessions. Four stale screenshot snapshots were regenerated (three were pre-existing relative-timestamp drift unrelated to this release, one reflects the new model dropdown copy). (#281)
v0.19.2 June 26, 2026 View on GitHub

What’s New in v0.19.2

Features

  • Skills Manager: “Check for updates” button — A new button in the Installed tab re-fetches staleness for all GitHub plugin sources concurrently. Shows a spinner while running, then reports “All up to date” or “N plugin(s) have updates.” (#274)
  • Public roadmap — Vote on what comes next at compass.rbcodelabs.com/portal/rbcodelabs/claude-threads/roadmap. (#276)

Bug Fixes

  • Skills Manager: block scalar YAML descriptions now render correctly — Skills using >- (folded) or |- (literal) multi-line frontmatter descriptions no longer show the raw indicator character. Fixes display of Agentic PM Playbook skills and any other SKILL.md files using block scalar syntax. (#274)
  • Task list icons replaced with Lucide — Status indicators (completed ✔, in-progress ■, pending ○) and expand/collapse arrows in task list cards now use proper Lucide SVG icons, consistent with the rest of the plugin. Color-coded: green for completed, amber for in-progress, muted for pending. (#275)

Improvements

  • SDK bump: @anthropic-ai/claude-agent-sdk → 0.3.190 — Picks up 25 SDK versions including Claude Fable 5 support, ReadMcpResourceDir tool (now icon-registered), tool call display-name metadata, and typed permission-denial reasons. No breaking changes. (#273)
v0.19.1 June 26, 2026 View on GitHub

What’s New in v0.19.1

Bug Fix

request_secret now supports token rotation via force: true (#271)

When an agent called request_secret for a secret that was already registered in secretEnvKeys, the tool returned alreadyExisted: true and skipped prompting — even if the actual keychain value had been deleted or rotated. Agents had no way to ask the user for an updated token without manually clearing stale entries from data.json.

A new force?: boolean parameter bypasses this early-return. When force: true:

  • The user is always prompted, regardless of whether the secret already exists
  • The modal heading changes to “Agent is replacing a secret” and shows a note that the existing value will be replaced
  • The keychain entry is updated on save

Usage:

request_secret({ secretName: "MY_API_KEY", reason: "token was rotated", force: true })

Tests

  • 10 new unit tests covering the force bypass logic, cancellation behaviour, and argument normalisation
  • 2 new screenshot tests for the normal and force modal variants
v0.19.0 June 23, 2026 View on GitHub

What’s New in v0.19.0

Features

  • Task list on kanban cards — When a thread has an active TodoWrite / TaskCreate checklist, its kanban card now shows a compact task list: up to 5 items with status icons (✔ completed, ■ in-progress, ○ pending), a “X / Y done” progress line, and “+N more” for overflow. The list updates live as the agent ticks items off. (closes #265)

  • Safe plugin reload — New command “Claude Threads: Reload plugin (safe)” in the command palette. When no threads are running it reloads immediately. When threads are active it opens a modal with three choices: Cancel, Interrupt & Reload (30 s graceful wait), or Force Reload. Reloading via any other path (Settings toggle, manifest hot-reload) now triggers a 10-second graceful interrupt wait automatically before teardown. (closes #262, #263)

  • Mobile phase 2 & 3 — major parity push — 14 desktop features now available on mobile remote access: (closes #266, #267)

    • Per-message copy button (⎘) that confirms with a ✓ for 1.5 s
    • Status rail above the input showing spinner cards for active tool calls and error cards from relay status frames
    • Thread search — full-width search input with 150 ms debounce, filters by title + summary
    • Model indicator in the conversation header
    • Message timestamps on every user and assistant message
    • cwd chip below the conversation header (shortened with ~ and last-2-segments truncation)
    • Tool pill icons (matching the desktop renderToolCalls view)
    • Compact divider token count — “Context compacted · 48k tokens” on compact markers
    • Error card with dismiss button when thread.lastError is set
    • Always Allow button on permission cards (persists to alwaysAllowedTools)
    • Queue rows — stacked removable rows with tap-to-edit and × cancel, replacing the old flat banner
    • Code block overflow fixed; tap-outside-modal dismiss; keyboard show/hide indicator

Bug Fixes

  • Fix missing icons for Task tools, Skill, Workflow, and Monitor tool pills (closes #261)
  • Thread list now scrollable — fixed min-height: 0 so the thread list scrolls properly in constrained layouts (closes #264)

Notes

  • The old safe-reload command ID (from a short-lived earlier build) is replaced by reload-plugin-safely. If you had the old command bound to a hotkey, re-bind it to “Reload plugin (safe)”.

0.18.x

v0.18.6 June 18, 2026 View on GitHub

What’s New in v0.18.6

Features

  • Agents in Skills Manager — The Installed tab now shows your ~/.claude/agents/ files alongside skills. Agents appear under the Local node with an agent badge; click one to view, edit, save, reload, reveal in Finder, or delete it. (#258)

  • Source tree layout — The Installed tab is now a collapsible tree rooted in sources rather than a flat list. GitHub plugin sources appear as top-level nodes; expand one to see the skills it provides. A Local node at the bottom groups standalone skills and agents. Filter bar and count line move to the very top of the panel. (#259)

  • Reload and Reinstall for plugin sources — The plugin detail panel (click a source header) now has two new actions alongside Update: Reload re-scans the local clone from disk without a network call (useful after manual edits); Reinstall deletes the clone and re-clones fresh from GitHub (for broken or corrupted installs, with a confirmation dialog). (#259)

  • Update button always visible — The Update button on plugin detail panels is now always present, not just when updates are detected. It highlights in blue when the staleness check finds you behind. (#259)

Bug Fixes

  • Detail panel now scrollable — The right-side detail panel in the Skills Manager was clipped when a plugin had many skills. It now scrolls. (#259)
v0.18.4 June 18, 2026 View on GitHub

What’s new

GitHub skill sources (vault-local, per-session)

Paste a GitHub repo URL in Settings → Skills → Add Source and the plugin:

  • Clones the repo with --depth 1 into your vault’s plugin folder (not a global path — each vault manages its own sources independently)
  • Injects each skill directory as a per-session SDK plugin so Claude sees them without any global ~/.claude/skills/ symlinks
  • Loads agents defined in the repo’s .claude-plugin/plugin.json via the SDK agents option
  • Shows all GitHub-source skills in the /command autocomplete immediately on open
  • Refreshes the Skills Manager view automatically when you add or remove a source from Settings

Repo format: include a .claude-plugin/plugin.json manifest with skills (directory path or ".") and optionally agents (array of .md file paths with frontmatter name: + description: and a system-prompt body).

v0.18.0 June 17, 2026 View on GitHub

What’s New in v0.18.0

Plan Mode

  • Per-thread permission mode picker — a shield (🛡) button in the thread footer lets you set the permission mode for a single thread without touching the global setting. Useful for running one task in plan mode while keeping other threads in their normal mode.
  • Plan card survives thread switching — when Claude presents a plan and you switch to another thread, the plan card is faithfully restored when you switch back. The Approve / Edit / Reject buttons still wire directly to the live session (Claude doesn’t time out while you browse other threads).
  • Plan card survives reload / crash — the pending plan is serialized to data.json the moment it arrives. If Obsidian is force-quit or the plugin crashes before you act on the card, the card reappears the next time you open the thread.
  • Planning visual state — a “Planning…” status card appears while Claude is gathering context in plan mode, so you know it’s thinking rather than done.

MCP Elicitation

  • Inline auth flows — when an MCP server needs OAuth or credential input mid-session, an elicitation card appears directly in the conversation. Two modes: URL-based (opens the browser, waits for the redirect) and form-based (text fields for API keys, usernames, etc.). No need to leave Obsidian or dig through terminal output.

Context & Model Discovery

  • /context slash command — shows a per-category token usage breakdown for the active session: tools, system prompt, skills, MCP tools, conversation history, etc. Helps you understand what’s consuming context before you hit the limit.
  • Dynamic model list — the model dropdown in Settings is now populated at startup by calling supportedModels() on the installed Claude CLI. No plugin update needed when Anthropic ships a new model.

Session Controls

  • Thinking mode — set extended thinking with a configurable token budget (in Settings → Claude). Lets Claude reason longer on harder problems.
  • Effort level — choose low, medium, high, or CLI default to control how much work Claude invests per turn.
  • 1M context beta — opt-in flag in Settings to enable the 1M-token context window beta on supported models.
  • Ephemeral threads — new thread option to skip saving conversation history, for throwaway sessions.

Tool & Message Rendering

  • REPL tool summary — JavaScript REPL calls now show a compact summary pill with the return value rather than raw JSON.
  • Git operation pillsgit commands render as structured pills showing the operation type and affected repo, not raw command strings.
  • “Modified by user” badge — files Claude edited that you subsequently changed in your editor show a badge in the edited-files card, so you know the state has diverged.
  • Memory recall indicator — when Claude reads from its memory, the source paths are shown in the message so you can see which memory files influenced the response.

Bug Fixes

  • Fixed plan rejection causing error_during_execution — rejection now uses deny + no-interrupt so Claude reads the rejection message and stops cleanly rather than crashing the session.
  • Fixed silent response after plan rejection — a follow-up turn is automatically injected so Claude acknowledges the rejection and offers next steps.
  • Fixed harness esbuild failure where fs/promises was unresolvable in the test environment.

Tests

  • 6 new unit test files, 760 total tests (was 480).
  • 6 new Playwright screenshot tests covering plan mode restore, including approve/edit/reject flows.
  • 18 new integration tests covering the full pendingPlan lifecycle and per-thread permissionMode override.

0.17.x

v0.17.3 June 17, 2026 View on GitHub

Bug Fixes

  • Skill install: symlinks in skill repos no longer break after installation — When a skill GitHub repo contains internal symlinks (e.g. data/ or scripts/ pointing elsewhere in the repo), the CT Skills Manager was silently copying those symlinks rather than dereferencing them to real files. The temp clone dir was deleted after install, leaving the symlinks dangling. Fixed by passing dereference: true to fs.promises.cp(). (closes #243)

Notes

No migration needed. If a previously installed skill has broken data/ or scripts/ directories, reinstall it via the Skills Manager to get real files in place.

v0.17.2 June 17, 2026 View on GitHub

What’s New in v0.17.2

Features

  • Collapsible input panels — All three message-input panels (Threads view, Agent Dashboard sidebar, and Kanban dispatch) now collapse to a minimal bar at rest: just the textarea and send button. Hover over the panel or click into the textarea to expand secondary controls (attach, mic, model picker, more menu, CWD chip) with a smooth CSS animation. The panel border softens when collapsed so it reads as a quiet background element. No configuration needed. (closes #237)

  • EnterWorktree / ExitWorktree alias — The SDK’s toolAliases option now silently routes Claude’s built-in EnterWorktree and ExitWorktree tool calls to the plugin’s MCP versions (mcp__obsidian__enter_worktree / mcp__obsidian__exit_worktree), which correctly track the in-session effectiveCwd after set_working_directory. Skills, workflow docs, and training data can now use the canonical tool names without any special instructions. (closes #238)

Improvements

  • Removed the “Use this instead of the built-in EnterWorktree tool” language from both MCP tool descriptions and the system prompt — no longer needed now that the alias handles routing transparently.
  • Updated all README screenshots to reflect the new collapsible panel UI.
v0.17.0 June 14, 2026 View on GitHub

What’s new in v0.17.0

Status rail + message queue (visual redesign)

The status area above the composer is completely redesigned. The old flat italic text is replaced with a typed card system that handles multiple simultaneous states without visual collisions:

  • Active-work card — a compact card with a pulsing spinner appears while Claude is doing background work (context compaction, API retry). It disappears the moment the operation completes, so it never clutters idle threads.
  • Rate-limit card — a persistent warning or error card appears when the API returns a rate limit response. Warning style = request was allowed through with a delay; error style = request was rejected.
  • Model escalation tooltip — when a turn is routed to the escalation model (e.g. via /escalate), a brief popover fades in from the model button and self-dismisses rather than reshuffling the layout. Zero layout shift.

Message queue: sending a message while Claude is already processing now queues it instead of blocking. Queued messages appear as stacked removable rows above the composer, each with:

  • A text preview
  • An × delete button
  • Click-to-pull-back: click the row to restore it into the input box (with an inline “Replace current draft?” confirm)

The queue drains automatically turn by turn and survives thread switches and plugin reloads.

Inline workflow progress block

When an agent uses the Workflow tool (multi-agent orchestration), a live progress block appears inline in the conversation — pinned just above the streaming output — showing the workflow name, current phase, and a row per spawned sub-agent. Each row has a live status dot (pulsing while running, filled when done, ✗ on failure) and the agent’s task description.

The block updates in real time from the SDK event stream with no extra API calls. When the workflow completes or fails, it locks into a final “Done” or “Failed” state so you can see the full run history at a glance. Non-workflow threads are completely unaffected.

Project MCP tools (obsidian_create_project, obsidian_set_thread_project)

Two new MCP tools let agents create and manage projects without leaving the conversation:

  • obsidian_create_project — creates a new project (name, vault folder, optional description and cwd override), persists it immediately, and returns the project snapshot including its id. Capture the id to use it in subsequent calls.
  • obsidian_set_thread_project — assigns any thread to a project. Pass projectId: null to detach. Useful for release agents that need to group threads by the codebase they’re working on.

Both tools work alongside the existing obsidian_list_projects and thread coordination APIs. Typical pattern: obsidian_list_projects → pick or obsidian_create_projectobsidian_set_thread_project on each relevant thread.

Fix: kanban scroll position preserved across updates

The Kanban board no longer jumps to the top when thread status changes cause a re-render. The scroll position is saved before each DOM update and restored afterward — the board stays put while cards update in place.


Upgrade notes

  • No breaking changes. All existing threads, settings, and projects work as before.
  • The ct-status-bar CSS class is removed; the new classes are ct-status-rail, ct-status-card, ct-status-card-active, ct-status-card-warning, ct-status-card-error. If you have custom CSS targeting the old class, update it.
  • BRAT users will auto-update within a few minutes of this release publishing.

0.16.x

0.15.x

v0.15.4 June 11, 2026 View on GitHub

What’s new

  • request_secret MCP tool — agents can now prompt the user to enter a secret (e.g. LINEAR_API_KEY) at runtime via a secure OS keychain modal, instead of asking them to paste values into the conversation. Stored via Obsidian secretStorage; auto-registered in secretEnvKeys on save. Escape/backdrop dismissal resolves cleanly with no hang. (#221)

  • Scheduled wake-up indicator — threads waiting on a ScheduleWakeup now show a visual countdown indicator in the thread list so you can see at a glance when they’ll fire. (#223)

  • Bridge-aware edits: auto-pull and vault-relative links — when Claude edits a file that belongs to a Vault Bridge repo, the plugin now detects the change, auto-pulls it into the vault, and inserts vault-relative wikilinks in the response so you can navigate directly to the changed file. (#219)

v0.15.3 June 11, 2026 View on GitHub

What’s New

Model switcher button

A CPU-icon button in the conversation footer (left of the ⋮ menu) shows the thread’s active model on hover and opens a Default / Opus / Sonnet / Haiku / Fable picker on click. The icon turns accent-colored when a per-thread override is active, and it stays in sync with the /model command. (#217)

Test infrastructure

  • Screenshot diff tolerance tightened 200 → 25 px — the old tolerance could silently swallow icon-sized UI changes; with the timezone + clock pins from v0.15.2, renders are fully deterministic (#217)

Full changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.15.2…v0.15.3

v0.15.2 June 11, 2026 View on GitHub

What’s New

Dispatch box slash commands

  • /model works at dispatch/model opus fix the bug in the dashboard/kanban dispatch boxes now sets the new thread’s model instead of sending the command to Claude verbatim (#208)
  • /goal and /loop are dispatchable/goal ship v1 creates a thread with a pinned goal and starts working immediately; /loop 10m check CI creates a thread that re-runs the prompt on an interval (#213)
  • Dispatch autocomplete now only advertises commands that actually work at dispatch (#211)

Other improvements

  • Raw JSONL conversation logs — opt-in per-thread logs at <vaultFolder>/logs/<thread_id>.jsonl, readable via the obsidian_get_thread_log MCP tool (#212)
  • enter_worktree/exit_worktree MCP tools fire a worktree-changed workspace event (#209)

Docs & test infrastructure

  • New README sections: Goals and loops, Dispatching with commands (#215)
  • Screenshot suite is now fully deterministic — timezone and clock pinned to the fixture epoch, so baselines no longer drift with the machine’s timezone or the calendar date (#214, #216)

Full changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.15.1…v0.15.2

v0.15.1 June 10, 2026 View on GitHub

Settings panel redesign (#206)

The settings panel is now organized behind tabbed navigation instead of one long scroll:

General · Claude · Tools · Vault · Features · Remote

  • Settings regrouped logically (keychain secrets and model escalation under Claude, permission/tool controls under Tools, etc.)
  • Escalation and summarization sub-settings hide when the feature is disabled
  • Cleaner interactions: pre-filled project rename, no more DOM-id hacks, native Obsidian headings, tightened descriptions
  • Mobile keeps its minimal pairing-focused view
  • New screenshot test coverage for the settings panel

Full Changelog: https://github.com/rbcodelabs/obsidian-claude-threads/compare/v0.15.0…v0.15.1

v0.15.0 June 10, 2026 View on GitHub

What’s New

Models & Providers

  • Fable 5 support/model fable per thread, plus a new Default model settings dropdown (Fable 5/Opus/Sonnet/Haiku) for threads without an override
  • Claude account or Amazon Bedrock — new Account / provider setting; Bedrock mode sets CLAUDE_CODE_USE_BEDROCK=1 on every session (pair with AWS_PROFILE/AWS_REGION in extra env vars)
  • /escalate — the one-turn escalation keyword (formerly /opus) now targets a configurable Escalation model; existing settings migrate automatically

New Commands

  • /goal — pin a persistent goal on a thread; it’s injected into every turn until /goal clear
  • /loop — re-run a prompt in the same thread on an interval (/loop 10m check CI); /loop stop cancels

Input Box

  • Command pills — completed built-in commands render as a deletable chip; one Backspace at the start removes the whole command
  • Argument autocomplete/model offers fable|opus|sonnet|haiku|default; /goal//loop suggest their subcommands
  • Built-in command lists unified across thread view, dashboard, and kanban

Task List Card

  • Claude Code’s task checklist (TodoWrite / TaskCreate) now renders live above the input box — done/in-progress/open counts, strikethrough on completed tasks, collapsible

Fixes

  • Skills Manager installs skills correctly from repos with nested .claude/skills/ layouts (#203)

PRs: #203, #204

0.14.x

v0.14.3 June 9, 2026 View on GitHub

What’s new in v0.14.3

Fixes

  • AWS SSO reauthentication now works on Macs with Homebrew-installed aws CLI. The one-click “Re-authenticate AWS SSO” button on expired-token error cards in the Agent Dashboard and Kanban view was failing silently with aws: command not found because Obsidian launches subprocesses with a minimal PATH. The plugin now resolves the absolute path to the aws binary (Apple Silicon Homebrew, Intel Homebrew, or ~/.local/bin) and passes an augmented PATH to the subprocess. (#201)

Features

  • Skill descriptions are now visible inline in the browse detail panel. When inspecting a skill in the Skills Manager browse tab, its SKILL.md description is fetched and rendered directly in the detail panel — no more clicking through to the marketplace just to see what a skill does. (#200)

Install

  • BRAT users: Settings → BRAT → Update all beta plugins
  • Manual: download main.js, manifest.json, styles.css from the assets below and drop them into .obsidian/plugins/claude-threads/
v0.14.0 June 8, 2026 View on GitHub

What’s new

Skills Manager sidebar

Browse, install, and edit Claude Code skills directly inside Obsidian — no terminal needed.

Installed tab — lists every skill in ~/.claude/skills/. Click a skill to view and edit its SKILL.md in the panel. Save changes, reload from disk, reveal in Finder, or uninstall (with confirmation).

Browse tab — search the skills.sh registry. Install skills directly from GitHub with one click.

Commits

  • feat: Skills Manager sidebar (#185)

0.13.x

v0.13.5 June 7, 2026 View on GitHub

New Features

  • feat: open vault HTML files in Web Viewer when plugin is enabled (#191) — Clicking a .html file in your vault now opens it in the Obsidian Web Viewer panel instead of the default handler, when the Web Viewer core plugin is enabled.
v0.13.4 June 7, 2026 View on GitHub

Bug Fixes

  • fix: flush vault notes on unload to prevent last-message loss (#190) — The per-event vault saves on done were fire-and-forget and could be orphaned before completing. Added an explicit vault flush in onunload() so vault notes are always consistent with data.json at clean shutdown. Prevents the last agent response from being missing after a plugin update clears data.json and crash recovery falls back to stale vault notes.

  • fix: prevent closed threads from resurrecting on reload (#189) — Two related races: closeThread was not awaiting the vault save (so a quick restart could resurrect a closed thread), and the orphan-archive scan ran after crash recovery instead of before (so stale status: waiting vault notes got loaded as active threads before they could be cleaned up). Both are now fixed.

v0.13.2 June 7, 2026 View on GitHub

What’s changed

  • Tool result images rendered inline — when Claude reads a PNG/JPG, the image now appears directly in the thread view below the tool pill and persists across thread switches and re-opens (#181)
  • Sub-agent progress visible in UI — task pills and progress labels now show while a sub-agent is working, so you can see what it’s doing in real time (#180)
  • Thread rename uses vault.rename() — avoids a delete+recreate race that could lose note content when thread titles change (#179)
v0.13.0 June 6, 2026 View on GitHub

What’s New in v0.13.0

[[wikilinks]] in Claude’s responses now render as native Obsidian internal links — click to navigate directly to the target note.

🕰️ Obsidian Sync Version History

Two new MCP tools let Claude browse and restore file versions from Obsidian Sync:

  • obsidian_get_file_history — lists saved versions with UIDs, timestamps, and sizes
  • obsidian_restore_file_version — restores a specific version by UID

Requires an active Obsidian Sync subscription.

🌐 Web Viewer Tool

obsidian_open_url opens any URL in Obsidian’s built-in Web Viewer. A Settings toggle lets you enable/disable it; auto-grays out if the Web Viewer core plugin is off.

⏰ Built-in Scheduler

Claude can create and manage recurring tasks via four new MCP tools: CronCreate, CronList, CronUpdate, CronDelete.

🧪 Per-Branch Test Vaults

npm run vault / npm run vault:update / npm run vault:open spin up an isolated Obsidian vault scoped to the current branch for plugin testing.


Bug Fixes (caught during live testing before release)

  • Panel layout — tool calls and permission cards no longer slide behind the input box. Replaced the position: absolute + ResizeObserver padding hack with a proper in-flow flexbox layout.
  • Wikilink clicks — links rendered correctly but clicking did nothing. Added click handlers that call app.workspace.openLinkText().
  • Obsidian Sync APIgetHistory() returns a wrapped object, not a raw array; restoreVersion(uid) is the correct restore signature. Both tools now probe the undocumented API defensively.
  • esbuild hardcoded paths — build no longer auto-deploys to personal vault paths; use npm run vault:update for test deployments.

Upgrading

Via BRAT: Settings → BRAT → Update all beta plugins

Manual: drop main.js, manifest.json, and styles.css from the assets below into .obsidian/plugins/obsidian-claude-threads/.


No breaking changes. All existing threads, settings, and scheduled tasks carry over.

0.12.x

v0.12.5 June 4, 2026 View on GitHub

What’s new

  • prUrl in thread snapshotsobsidian_list_threads and obsidian_get_current_thread now include prUrl: the URL of the most recent GitHub PR opened during that thread. Release agents can match threads to PRs in a single list call without reading message history.

Commits

  • feat: include prUrl in thread list and current-thread MCP responses (#159)
v0.12.4 June 4, 2026 View on GitHub

What’s new

  • obsidian_archive_thread MCP tool — agents can now close out completed threads at the end of a session. Saves the vault note first (so history is preserved) then removes the thread from the active list. A thread cannot archive itself.
  • Agent Dashboard footer layout — attach and mic buttons now appear in the bottom footer row, matching the conversation panel layout.
  • Cleaner placeholders — removed ellipsis and keyboard hints from all message input boxes (Message Claude, Dispatch a task, Dispatch a new task).

Commits

  • feat: add obsidian_archive_thread MCP tool (#156)
  • fix: match Agent Dashboard dispatch footer layout to conversation panel (#155)
  • fix: remove keyboard hint from dispatch textarea placeholder (#157)
v0.12.3 June 4, 2026 View on GitHub

What’s changed

  • fix: embed dispatch textarea inside floating panel — removes the double-border visual bug in the Agent Dashboard’s input area (#152)
  • fix: tool call pills no longer render underneath the floating input panel — re-syncs scroll clearance from offsetHeight directly inside the requestAnimationFrame callback, eliminating the timing race with ResizeObserver (#153)
  • test: adds the first screenshot regression test for the streaming/tool-pill state so this class of visual bug is caught automatically in CI going forward

Update

Settings → BRAT → Update all beta plugins

v0.12.2 June 4, 2026 View on GitHub

What’s Changed

Features

  • feat: bring smart folder label to Agent Dashboard and Kanban (#149)
  • feat: move header controls into floating panel (Agent Dashboard + Kanban) (#147)

Bug Fixes

  • fix: stop PTT recording when modifier key released before primary key (#148)
  • fix: auto-title now applies to dispatch-created threads (#150)
  • fix: guard release workflow against tag/manifest version mismatch (#145)
v0.12.1 June 3, 2026 View on GitHub

b87f3a8 chore: bump version to v0.12.1 (#146) 2fd4cde Add secret environment variables (OS keychain backed) (#144) 0115491 perf: skip vault file reads on startup using metadata cache (#143) a51816c fix: auto-repair stale project-dir worktree cwds (prevents false “binary not found” error) (#137)

0.11.x

v0.11.1 June 1, 2026 View on GitHub

What’s fixed

  • Auto-summarize now works for all threads — previously only fired when the completing thread was the active one in ThreadsView. Background threads (dispatched from Kanban, or switched away from) were silently skipped.
  • Kanban and Agent Dashboard update live after auto-summarize — both views now listen for a summary_updated event and schedule a re-render when the async summarize finishes, rather than staying stale until the next interaction.

Commits

17234dd release: v0.11.1 (#134) f530db0 fix: auto-summarize all completing threads, not just the active one (#133)

0.10.x

v0.10.0 May 31, 2026 View on GitHub

What’s new

  • Kanban board as independent panel — open the kanban view in its own pane, not just inside a thread (#114)
  • Wake-lock indicator — status bar shrunk to icon-only (#115)
  • Panel polish — solid hover background on the floating panel; cwd chip moved to footer (#116)
  • Tool-call scroll fix — tool pills now stay visible above the floating chat panel as they accumulate during a run (#117)
  • Input placeholder — simplified to a clean one-liner: “Message Claude…” (#117)

Commits since v0.9.0

  • chore: bump version to v0.10.0 (#118)
  • fix: scroll tool pills into view + simplify input placeholder (#117)
  • feat: kanban board as independent panel (#114)
  • chore: add PostToolUse quality-gate hook for git push (#111)
  • chore: shrink wake-lock status bar indicator to icon only (#115)
  • fix: solid panel hover background + move cwd chip to footer (#116)

0.9.x

0.8.x

v0.8.0 May 30, 2026 View on GitHub

What’s new

  • Push-to-talk speech-to-text — mic button in both chat and agent dispatch. Hold to record, Whisper transcribes and injects into the input. Requires an OpenAI API key (new setting under Speech to Text).
  • Unified floating input panel — textarea, action buttons, status bar, edited-files chips, and context footer are now one cohesive floating panel with rounded corners and a drop shadow. Panel border highlights on focus.
  • Kanban board view — agent dashboard now has a kanban toggle. Threads are grouped into status swimlanes. Preference is persisted across reloads.
  • @this mention — type @this in any message to reference the currently open Obsidian file.
  • fix: thread switcher rows now respond on mousedown and stale outside-click handlers are cleaned up.

Commits

  • a4eaa4a chore: bump version to v0.8.0 (#108)
  • b822336 feat: push-to-talk STT + unified floating input panel (#104)
  • 33d6835 feat: kanban board view for agent dashboard (#107)
  • f2ee8c7 feat: add @this mention to reference the currently open file (#105)
  • 28935ae fix: thread switcher rows fire on mousedown and clean up stale outside handler (#106)

0.7.x

v0.7.9 May 28, 2026 View on GitHub

dcb7848 chore: bump version to v0.7.9 (#101) 1225f5d fix: import formatToolName internally instead of only re-exporting it (#100)

v0.7.8 May 28, 2026 View on GitHub

Bug fix

Plugin failed to load on Obsidian Mobile

Root cause: MobileView.ts imported formatToolName from ClaudeSession.ts. ClaudeSession.ts imports from @anthropic-ai/claude-agent-sdk (sdk.mjs), which has top-level ES module imports of Node.js built-ins:

import { execFile } from “child_process”;

esbuild bundles this and leaves require(‘child_process’) calls in the output. On mobile, Obsidian’s require() returns null for Node built-ins — accessing .execFile on null throws TypeError at module load time, before onload() even runs.

Fix: Extracted formatToolName and getToolIcon into a new src/toolNameUtils.ts (zero imports — pure string logic). MobileView.ts now imports from there instead of ClaudeSession.ts, breaking the SDK dependency in the mobile module graph. Desktop callers are unaffected.

Also added try/catch around onloadMobile() so any future initialization errors surface as a visible Notice rather than silent failure.

v0.7.7 May 28, 2026 View on GitHub

Bug fix

Closed threads reappearing on plugin reload

When a thread was closed it was removed from data.json and its vault note was marked status: archived. On the next reload, the crash-recovery scan found these vault notes, saw the IDs were absent from data.json, and loaded them back into memory — resurrecting threads the user had already dismissed. This produced a flood of old threads every time the plugin reloaded.

What changed: The crash-recovery filter now skips any vault note that carries status: archived. Deliberately closed threads stay gone, even across restarts.

Also: recovered threads that were status: active (i.e. Claude was running when the plugin last crashed) are now reset to waiting — the SDK session is dead after any reload, so showing them as running was incorrect.

v0.7.6 May 28, 2026 View on GitHub

Fixes

Timestamp alignment — the timestamp footer now uses padding: 0 10px to match the content padding of assistant message blocks, so the time is left-aligned with the text above it instead of being 8px too far left.

Multi-step suppression — timestamps no longer appear on every intermediate assistant message in a multi-step response. The footer is now only shown on:

  • User messages (always — marks when you sent)
  • The terminal assistant message of a turn (the one that carries a cost value)

Intermediate tool-call steps and partial responses stay clean.

v0.7.5 May 28, 2026 View on GitHub

What’s new

Timestamps on messages and tool calls

Messages — every message now shows a wall-clock timestamp below the bubble:

  • Assistant messages: timestamp on the left, cost (when applicable) on the right — same line
  • User bubbles: timestamp right-aligned below the bubble
  • Same-day: 3:45 PM · Cross-day: May 27, 3:45 PM

Tool call pills — each card shows the time the tool fired on the right edge, giving you a mini-timeline of what ran and when within a turn.

Old threads display gracefully — existing tool call records without a timestamp simply show nothing.

v0.7.4 May 28, 2026 View on GitHub

What’s new

Agent Dashboard search bar polish

  • Toolbar styling — the search row now renders as a proper strip (top/bottom border, secondary background) rather than floating bare text
  • Inline clear button — an × appears inside the input when there is text; clicking it clears the field, resets the list, and returns focus to the input
  • Icon toggles open ↔ close — the magnifier icon in the header swaps to × while the bar is open, making it obvious that clicking it again will dismiss the search; Esc also still works
v0.7.3 May 28, 2026 View on GitHub

Bug fix

  • fix: per-thread draft isolation on stop — When stopping a thread, the interrupted handler now restores the correct thread’s last-sent text. Previously, lastSentText was a single shared string; switching threads and hitting stop would write the wrong thread’s text into the input box.

Commits

3f9f40d chore: bump version to v0.7.3 (#88) 73a8da5 fix: scope lastSentText per thread to prevent draft crossover on stop (#87)

v0.7.2 May 27, 2026 View on GitHub

Bug Fixes

  • fix: show user bubble immediately for external sendMessage() callers — User messages sent via manager.sendMessage() (e.g. from the voice plugin) now appear in the UI instantly, before the assistant response begins streaming. Previously they only appeared after the full response was generated.

  • fix: mark thread as reviewed when setActiveThread is called — Threads are now correctly marked as reviewed when opened via any navigation path.

v0.7.1 May 27, 2026 View on GitHub

5c17743 chore: bump version to v0.7.1 (#84) 559a663 feat: close button + rich thread switcher panel in title bar (#83) c13fe7a fix: drop obsidian_ prefix from enter_worktree and exit_worktree tool names (#82)

v0.7.0 May 27, 2026 View on GitHub

What’s New

Title Bar UI (#79)

  • Replaced the tab bar with a compact title bar showing the current thread name
  • Auto-titling now updates the title bar in real-time as conversations are summarized

Fork Improvements (#80)

  • Fixed UX bug: Fork modal no longer hangs on “Opening…” — closes immediately and the new thread appears active with your first message already submitted
  • /fork slash command: Type /fork or /fork <focus area> in any message input to open the fork dialog with the focus pre-filled
  • fork_conversation MCP tool: The agent can now fork the conversation itself by calling fork_conversation(focus_area?: string) — creates the new thread silently and reports back the thread title

0.6.x

v0.6.1 May 25, 2026 View on GitHub

618e420 chore: bump version to v0.6.1 (#76) 29c46b7 feat: pretty tool names and icons in processing loop displays (#74) eaf7936 fix: add versions.json and auto-update it on every release (#75)

v0.6.0 May 21, 2026 View on GitHub

What’s new in v0.6.0

Features

  • Thread status tracking + Bases Kanban — threads now carry a status field (waiting / active / error / archived). Close a tab to archive it. A new Claude/Claude Threads.base file provides three Obsidian Bases views including a Kanban board grouped by status. Orphaned vault notes from previous sessions are auto-archived on startup.
  • obsidian_list_commands + obsidian_execute_command MCP tools — Claude can now enumerate and execute any Obsidian command directly from a thread.
  • Settings cleanup + Interrupt and Summarize commands — plugin settings reorganized; new Interrupt current thread and Summarize current thread commands in the palette.
  • Debug logging mode — reduces console noise in long sessions.

0.5.x

v0.5.3 May 20, 2026 View on GitHub

Bug Fixes

  • Vault crash recovery — threads that disappeared from the sidebar (after a plugin update or crash that cleared data.json) are now automatically restored from their vault markdown files on next reload. Recovery now runs after Obsidian’s vault cache is fully ready so all thread notes are found reliably.
  • Mobile: wide content overflow — tables and other wide content in Claude responses no longer clip the surrounding paragraph text on narrow screens.
  • Edited-files chip ordering — vault notes appear first in the edited-files chip list, followed by non-vault files, making it easier to spot which Obsidian notes were touched in a session.
v0.5.2 May 19, 2026 View on GitHub

v0.5.2 — Hotfix

🐛 Fix

  • Plugin load crash on BRAT install — SDK 0.2.141 introduced a createRequire(import.meta.url) call at module init time that resolves to undefined in Obsidian’s plugin loader, crashing the plugin before it opens. Pinned back to 0.2.132 (the version used in v0.5.0) and locked package-lock.json to prevent future drift.

If you were on v0.5.1 and BRAT disabled your plugin, install v0.5.2 and it should load normally again.

v0.5.1 May 19, 2026 View on GitHub

v0.5.1 — Patch

🐛 Fix

  • Stop no longer shows a red error banner — when you stop a running session (Stop button, Escape, or mobile stop), Claude Code internally reports error_during_execution. This was being surfaced as a scary red “Claude session ended: error_during_execution” message. It’s now correctly treated as a clean cancellation with no error shown.
v0.5.0 May 19, 2026 View on GitHub

What’s New in v0.5.0

✨ Features

  • Worktree MCP toolsobsidian_enter_worktree and obsidian_exit_worktree tools for isolated git worktree workflows (#54)
  • Thread status + Bases Kanban — track thread status (active/paused/done) with a Bases-compatible Kanban view (#60)
  • Term-based search scoringobsidian_search_vault now uses multi-term scoring instead of exact-phrase matching for better recall (#61)
  • Restore message on stop — sent message is restored to the input field when you hit Stop or Escape (#56)
  • Mobile stop button — stop button and queued-message indicator now available on mobile (#52)
  • New-thread shortcut — new-thread keyboard shortcut now focuses the agent dashboard dispatch input (#53)

🐛 Fixes

  • Manual summarize always updates the thread title (#57)

🧪 Tests

  • Extracted and unit-tested parseJsonResult and isDefaultThreadTitle (#58)

📝 Docs

  • Fixed version badge and clarified manual summarize title behavior (#59)

0.4.x

v0.4.32 May 19, 2026 View on GitHub
  • CI Robustness: Fix release workflow failure when release already exists
v0.4.31 May 19, 2026 View on GitHub
  • Dashboard Search: Live filtering for threads\n- Environment Context: Better prompt injection for agent sessions
v0.4.30 May 18, 2026 View on GitHub

What’s changed

  • fix: explicitly close query after run() to release SDK subprocess leak (#45) — Fixes a memory leak where every completed Claude query left its subprocess wrapper and associated closures (env copy, callbacks, MCP config) in memory permanently. Root cause of the OOM / machine freeze reported during all-day desktop use. One-line fix: calling q.close() in the finally block tells the Agent SDK to remove the wrapper from its internal tracking set and detach exit/error listeners, making all of that memory collectable by GC.
  • fix: restore streaming state when switching back to a running thread (#30)
v0.4.29 May 18, 2026 View on GitHub

What’s changed

  • Streaming buffer: tokens and tool-call events emitted while viewing a different thread are no longer dropped. Switching back to a running thread now shows the accumulated response text and tool pills correctly.
  • set_working_directory tool: renamed from obsidian_set_working_directory — the MCP namespace already identifies the server, the obsidian_ prefix was redundant.

Install

Download main.js, manifest.json, and styles.css from the assets below and copy them into your vault’s .obsidian/plugins/claude-threads/ folder.

v0.4.28 May 18, 2026 View on GitHub

What’s changed

  • Send button: now shows with a rounded-square shape (matching the desktop), replacing the “Send” text circle
  • Assistant message font: mobile now uses the same serif stack (ui-serif, Georgia, Cambria…) and text size as the desktop, with line-height: 1.65

Install

Download main.js, manifest.json, and styles.css from the assets below and copy them into your vault’s .obsidian/plugins/claude-threads/ folder.

v0.4.27 May 18, 2026 View on GitHub

What’s changed

  • Suppress theme gradient: Obsidian themes inject a ::before/::after fade-to-background gradient onto .view-content for scrollable areas. Since our mobile root sits on that element, the overlay bled through above the messages area. This release explicitly suppresses those pseudo-elements.

Install

Download main.js, manifest.json, and styles.css from the assets below and copy them into your vault’s .obsidian/plugins/claude-threads/ folder.

v0.4.26 May 18, 2026 View on GitHub

What’s changed

  • Remove debug bar: Removes the temporary red diagnostic bar that appeared at the bottom of the messages area in mobile view
  • Fix input alignment: The textarea and add/send buttons are now vertically centred (align-items: center) instead of bottom-aligned

Install

Download main.js, manifest.json, and styles.css from the assets below and copy them into your vault’s .obsidian/plugins/claude-threads/ folder.

v0.4.25 May 18, 2026 View on GitHub

0f0fd6e chore: bump version to v0.4.25 (#41) 77928d5 fix: keyboard avoidance via focus/blur — root shrinks when keyboard opens (#40)

v0.4.24 May 18, 2026 View on GitHub

16adcb0 chore: bump version to v0.4.24 (#39) 7647135 fix: revert JS keyboard/viewport handling — restore native iOS behaviour (#38)

v0.4.23 May 18, 2026 View on GitHub

84a0388 chore: bump version to v0.4.23 (#37) 3092070 fix: user messages missing from mobile chat + keyboard covers input (#36)

v0.4.22 May 18, 2026 View on GitHub

What’s Changed

  • feat: native ScheduleWakeup support — Claude can now call ScheduleWakeup inside Claude Threads conversations. When the timer fires, the scheduled prompt is injected back into the thread as a user message, resuming the conversation exactly as it would in the Claude Code CLI harness. Use it for polling CI, waiting for deploys, or self-pacing loop work. Pending timers are cancelled cleanly on plugin unload.

Full Changelog

6ee6893 feat: ScheduleWakeup MCP tool for deferred thread wakeups

v0.4.21 May 18, 2026 View on GitHub

What’s Changed

  • fix: permission card overlaps tool pills during streaming — the orange permission card is now anchored inside the active streaming message bubble instead of floating as a sibling element, eliminating the visual overlap with tool pills
  • fix: mobile permission cards not rendering — permission requests arriving via relay were silently dropped on mobile because the render guard only checked message count, not pending permission count; now fixed
  • test: fix stale test assertions — updated bundle-safety and relay-client tests to match current esbuild output and sendMessage signature

Full Changelog

873c4e8 chore: bump version to v0.4.21 3af0fca fix: anchor permission card inside streaming element to prevent tool-pill overlap f73ed27 test: fix stale assertions in bundle-safety and relay-client tests

v0.4.20 May 18, 2026 View on GitHub

v0.4.20

New features

  • @file mention in Agent Dashboard — type @ in the dispatch box to get an autocomplete dropdown of vault files. Select one and it’s injected as a fenced code block when the task is dispatched — matching the same behavior as the main chat input.

Improvements

  • CWD chip in edited-files row — the current working directory is now shown as a compact chip inline with the edited-files list, removing the separate badge from the thread info bar.
  • Compressed edited-files section — the section header and pencil icon have been removed; chips are displayed directly, saving vertical space.
  • Consistent dispatch button styling — the ▶ dispatch button and attach button now match the chat input’s button design for a unified look.

Full changelog

https://github.com/richardbowman/obsidian-claude-threads/compare/v0.4.19…v0.4.20

v0.4.19 May 18, 2026 View on GitHub

v0.4.19

New features

  • Focus edited files — a button in the edited-files card closes all other Obsidian tabs and opens only the files Claude touched in this thread, snapping your workspace to the current work
  • OpenNewTab tool — Claude can now create new threads programmatically mid-session; useful for agents that need to spawn parallel work

Bug fixes

  • Stop button no longer wipes conversation context — stopping a running session now correctly preserves the conversation history; only the streaming bubble is removed
  • Agent Dashboard dispatch now selects the new thread — dispatching a task from the dashboard correctly switches the chat view to the new thread
  • Text selection in user message bubbles — you can now select and copy text from your own messages (was being blocked by the interaction handler)
  • Dashboard stays in sync on thread create/delete — the Agent Dashboard now re-renders immediately when threads are added or removed without requiring a manual refresh

Full changelog

https://github.com/richardbowman/obsidian-claude-threads/compare/v0.4.18…v0.4.19

v0.4.18 May 18, 2026 View on GitHub

v0.4.18

New: Remote access — use Claude Threads on mobile

Your iPhone becomes a thin client for your desktop Claude sessions. Read conversations as they stream, send messages, approve permission requests, and switch threads — all over a secure WebSocket relay. The desktop does all the Claude work; mobile just shows the state.

Setup: Settings > Claude Threads > Remote Access > Enable > Show pairing QR code > scan on mobile.

New: Status line bar

A context footer below the input area shows live output from a configurable shell command — git branch, AWS session status, dev server URL, or anything else your script emits. Configure via Settings > Status Line Command.

New: Obsidian MCP tools per thread

Each thread gets its own set_working_directory MCP tool so Claude can change a thread’s working directory mid-session. The tool is scoped per-thread to avoid cross-session interference.

Bug fixes

  • Image-only messages rejected — sending a message with only an image attachment (no text) no longer triggers an API error about empty text blocks
  • Mobile new thread button did nothing — tapping + in the mobile header now creates the thread and navigates into it
  • iOS keyboard left a gap — the layout now uses the visualViewport API to track actual keyboard height and shrink the view accordingly
  • Mobile view had unwanted margins — the view now fills edge-to-edge like a native app

Mobile rendering improvements

  • Tool call pills shown inline (same style as desktop)
  • Assistant message bubbles no longer wrapped in a box — clean left-aligned text matching desktop
  • Smooth blinking cursor (was hard-blink)
  • Blockquote and table CSS added
  • “Claude is thinking…” suppressed while tools are actively running

Full changelog

https://github.com/richardbowman/obsidian-claude-threads/compare/v0.4.17…v0.4.18

v0.4.17 May 17, 2026 View on GitHub

What’s new

  • Sent images now appear as thumbnails in the mobile conversation history
  • Images are stored on messages, serialized through the relay, and rendered above message text in mobile bubbles
v0.4.16 May 17, 2026 View on GitHub

What’s new

Mobile users can now attach images when sending messages via the relay.

  • Tap the attach button (⊕) next to the message input to pick one or more images from your device
  • Images are resized to a max of 1024px on the longest side and compressed to JPEG before transmission, keeping payload sizes manageable
  • A thumbnail strip appears above the input showing pending images; tap × on any thumbnail to remove it before sending
  • Sending with images (and no text) is supported
  • Images flow through the relay protocol and are passed directly to ThreadManager.sendMessage, where they are already handled by the existing Claude API integration
v0.4.15 May 17, 2026 View on GitHub

Thread list now groups by status (Running / Failed / Active / Ready), sorted by recency. Each row shows a status icon, title, summary or last message preview, and relative timestamp.

v0.4.14 May 17, 2026 View on GitHub

Three UI fixes:

  • No more flickering: streaming tokens now update only the streaming element, leaving stable messages untouched
  • No more horizontal scroll: messages container clips overflow; code blocks scroll within their bubble
  • No more textarea clipping: border-radius:0 on textarea so text isn’t cut off at corners
v0.4.13 May 17, 2026 View on GitHub

Root cause found and fixed: marked v18 changed marked.parse() to return a string synchronously instead of a Promise. The code called .then() on the string, which threw TypeError and stopped the message rendering loop after the first assistant message. All 230+ messages now render correctly.

v0.4.12 May 17, 2026 View on GitHub

Adds a red debug bar above the keyboard showing how many messages the store has for the active thread. This will tell us whether the bug is data (wrong count) or rendering (right count but not displaying).

v0.4.11 May 17, 2026 View on GitHub

Root cause: the mobile view used height:100% which only works when the parent has an explicit height. On Obsidian Mobile the parent is height:auto, so the entire flex chain collapsed to near-zero and clipped most messages via overflow:hidden — leaving only the first message visible.

Fix: switched to position:absolute with inset:0, which fills the screen regardless of parent sizing. Also changed overflow-y:auto to overflow-y:scroll on the messages container (iOS WebView sometimes fails to scroll with auto inside flex).

v0.4.10 May 17, 2026 View on GitHub
  • Conversation header now shows message count (e.g. ‘72 msgs’) so you can immediately see whether all messages are arriving from desktop
  • Desktop logs snapshot payload details (thread count, message count, KB) to console before sending — check Obsidian DevTools on desktop to verify
  • scrollToBottom now uses MutationObserver instead of fixed 150ms timeout, reliably scrolls after async markdown rendering completes
v0.4.9 May 17, 2026 View on GitHub

Fix scroll-to-bottom timing so the full conversation is visible when tapping a thread on mobile. Previously, scrollToBottom fired before flex layout was computed and before async markdown rendering completed, leaving the view stuck at message 1 (the oldest). Now uses requestAnimationFrame + 150ms delay to scroll after DOM is fully painted.

v0.4.8 May 17, 2026 View on GitHub

The conversation panel was collapsing to fit only a single message because height:100% doesn’t work on flex children inside a flex-direction:column container. Fixed by using flex:1 + min-height:0 on all nested panels, which gives the messages list the correct fill height and makes it properly scrollable.

v0.4.7 May 17, 2026 View on GitHub

Thread items now respond to taps. Panel switching changed from CSS class cascades to direct JS style.display manipulation, which is reliable regardless of CSS specificity on mobile.

v0.4.6 May 17, 2026 View on GitHub

Mobile UI overhaul — proper two-panel navigation

Before: unstyled plain text list with no layout
After: native-feeling mobile chat interface

What’s new

  • Two-panel navigation: thread list → tap a thread → full-screen conversation, with a back button (‹) and thread title in the nav header
  • Thread list: single-line titles with a preview snippet, streaming dot animation for active sessions, chevron indicator
  • Chat bubbles: user messages right-aligned with accent color, Claude responses left-aligned with markdown rendering (code blocks, lists, headings)
  • Input bar: rounded pill with auto-growing textarea (caps at 120px), Send button
  • Permission cards: orange-accented cards with Allow / Deny buttons that relay approval back to desktop
  • + New Thread button in the list header
  • Disconnected banner shown when relay drops
v0.4.5 May 17, 2026 View on GitHub

Fix: QR pairing flow + mobile settings panel

QR code deep link fix: The QR code now generates an obsidian://pair?roomId=... URL. Your phone’s native camera app will show “Open in Obsidian” when you scan it, which triggers the pairing handler automatically. (Previously used claude-threads:// which nothing handled.)

Mobile settings panel: Settings > Claude Threads on mobile now shows:

  • Connection status (connected / not connected)
  • Clear instructions: enable Remote Access on desktop, show QR code, scan with phone camera
  • Manual pairing fallback: paste the XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX code from desktop and tap Connect
  • Paired room display (masked) with a Disconnect button
v0.4.4 May 17, 2026 View on GitHub

Fix: Mobile plugin load crash

The plugin now loads successfully on Obsidian Mobile.

Root cause: Static imports of desktop-only modules (ThreadsView, ThreadManager, Claude Agent SDK) caused their module-level require('fs'), require('child_process'), etc. to run at plugin load time on mobile. Obsidian Mobile returns null for these Node.js built-ins, and the first call to null.realpathSync() crashed the plugin before onload() could complete.

Fix: All desktop-only imports converted to import type (runtime-erased). The actual modules are loaded via lazy require() inside onloadDesktop(), which is only called on desktop. On mobile, onloadMobile() runs instead — no Node.js built-ins ever touched.

Also removed the mobileNodeStubBanner (it patched globalThis.require but Obsidian passes require as a closure parameter, making it ineffective), the temporary diagnostic Notice wrapper, and added a mobile-safe settings screen.

v0.4.3 May 17, 2026 View on GitHub

Diagnostic build: shows a notice on load to determine where the crash is happening.

v0.4.2 May 17, 2026 View on GitHub

Fixes ‘failed to load’ on Obsidian Mobile by stubbing Node.js built-in modules (child_process, fs, os, path, etc.) before bundle initialization. The SDK and ThreadsView import these at module level, which crashed before any Platform.isMobile check could run. Stubs only activate on mobile — desktop is unaffected.

v0.4.1 May 17, 2026 View on GitHub

Fixes ‘failed to load’ on Obsidian Mobile by removing top-level Node.js imports from main.ts (fs, process.env, AbortSignal polyfill) that crashed before the platform check could run.

v0.4.0 May 17, 2026 View on GitHub

Adds Obsidian Mobile support via Cloudflare WebSocket relay. Fixes mobile plugin load crash (top-level Node.js imports removed from main.ts).

0.3.x

v0.3.0 May 16, 2026 View on GitHub

What’s Changed

Full Changelog: https://github.com/richardbowman/obsidian-claude-threads/compare/v0.2.0…v0.3.0

0.2.x

v0.2.0 May 15, 2026 View on GitHub

What’s new

  • Image & file attachments — drag, paste, or click the paperclip to attach images or text files when dispatching tasks from the Agent Dashboard
  • Workspace tab syncing — the Obsidian workspace tab title automatically updates to reflect the active thread title
  • Focus edited files — hover the files-edited card and click the focus icon to close all other tabs and snap your workspace to only the files Claude touched
  • Fork thread command — new command palette entry to fork the current thread
  • MCP server init logging — improved debug visibility into MCP server startup; TS errors in ObsidianTools resolved

Commits

1736052 debug: add MCP server init logging + fix ObsidianTools TS errors (#20) df67894 feat: rename Obsidian workspace tab to reflect active thread title (#18) de29327 feat: add focus button to edited-files card to snap workspace to thread files (#17) ca0cb49 feat: image & file attachments for Agent Dashboard dispatch box (#19) 96d8eb0 feat: fork thread command, InProcessSummarizer, harness improvements 3b8540e docs: regenerate screenshots and update harness for 0.2.0 features

0.1.x

v0.1.35 May 14, 2026 View on GitHub

What’s new in 0.1.35

Bug fixes

  • Files edited card: File paths are now tracked directly on the thread object in real time, so the card correctly survives switching between tabs. Previously the card was rebuilt by scanning message history on each tab switch, which missed files edited during the current session. Older threads fall back to the message-scan approach automatically.

  • Duplicate “Claude is thinking”: Removed the redundant status bar label — the chat bubble already shows it. The status bar now only appears when a message is queued while Claude is already running.

v0.1.34 May 14, 2026 View on GitHub

What’s new in 0.1.34

Agent Dashboard: New vs Reviewed sections

  • The Completed section is now split into two:
    • New — completed threads you haven’t looked at yet, shown with an accent count badge so you can see at a glance how many need attention
    • Reviewed — threads you’ve already opened
  • Unreviewed rows have a 2px accent left-border to distinguish them visually
  • Clicking any row in New opens it in the chat view and automatically moves it to Reviewed
  • Finishing a new Claude run on any thread resets it back to New so fresh results always surface at the top

Jump to latest unreviewed command

  • New command: Jump to latest unreviewed completed agent (searchable in the Obsidian command palette)
  • Bind it to a hotkey of your choice in Settings → Hotkeys
  • Opens the most recently completed unreviewed thread in the chat view and marks it reviewed
  • Press repeatedly to triage through the full queue, newest first
  • Shows a notice if there are no unreviewed agents remaining
v0.1.33 May 14, 2026 View on GitHub

What’s new in 0.1.33

Files edited card

  • A compact card now appears above the input area listing every vault or disk file that Claude Writed or Edited during the session
  • Each file shows as a clickable chip — vault files open as an Obsidian leaf, non-vault files open via the OS default app
  • The card is hidden when empty and automatically rebuilt when switching threads, so history is preserved across reloads

”Claude is thinking” in the chat bubble

  • Before the first token arrives, the streaming message bubble now shows “Claude is thinking” in muted italic alongside the blinking cursor
  • The label disappears the moment real content starts streaming in, with no extra state or timers needed

Bug fix

  • Messages arriving on background (non-active) threads are now correctly persisted to disk on reload
v0.1.32 May 14, 2026 View on GitHub

What’s new in 0.1.32

Tab overflow & consolidated nav button

  • When more than 4 threads are open, extra tabs are hidden and the + button changes to +N (accented) indicating hidden threads
  • Clicking the button opens a combined menu: switch to any hidden thread, create a New chat, or start a New chat in a project
  • Visible tabs stay in creation order for stable positions; hidden threads are sorted by most-recently-used

Tab rendering polish

  • The close × button no longer takes up horizontal space on inactive tabs — it collapses to zero width and only appears on hover with a smooth transition
  • Active tabs now seamlessly blend into the content area (no more visible bottom border) using clip-path to mask the shadow on the bottom edge
  • Active tab background colour now correctly matches the main panel using --tab-background-active

Hamburger “more actions” menu

  • Fixed: the dot menu previously did nothing on threads with no messages — it now always shows available actions
  • Icon updated from ••• to a proper hamburger (menu) icon
  • Moved below the send button to reduce horizontal crowding in the input area

Stop-button context preservation (PR #15)

  • Stopping a running Claude session no longer destroys the conversation context
  • Follow-up messages after stopping a session correctly continue from the previous conversation state
v0.1.31 May 14, 2026 View on GitHub

What’s new

Obsidian MCP tools

Claude can now read and interact with your Obsidian vault directly — active file, open tabs, note metadata, backlinks, outgoing links, search, and inserting content at the cursor.

··· More menu in the input bar

The summarize button has been replaced with a ··· menu next to send. Clicking it shows contextual actions (currently: Summarize thread). This makes room for future actions without cluttering the UI.

Flat assistant messages

Assistant responses no longer render in a bubble — they display as clean document-style text, which works much better for longer responses. User messages keep their accent-color bubbles.

Serif typography for assistant content

Assistant responses now use a serif font stack (ui-serif, Georgia, Cambria) to match the feel of Claude.ai. Line-height, paragraph spacing, and font size scale per density mode (compact / comfortable / spacious).

Project description in system prompt

Claude now receives your project’s description as part of its system prompt, giving it context about the current working folder automatically.

v0.1.30 May 13, 2026 View on GitHub

What’s new

Agent Dashboard view

A new Agent Dashboard panel modeled after Claude Code CLI’s claude agents screen.

  • Lists all threads grouped by state: Working · Completed · Failed · Ready
  • Animated status icons (✽ spinning while running, ✓ done, ✗ error, ○ idle)
  • Live activity text — shows the current tool name or task description while Claude works
  • Relative timestamps, cwd badge per row
  • Dispatch input — type a task and press Enter to start a new thread in the background; it appears as a Working row immediately
  • Click any row to jump to that thread in the chat view
  • Open via the grid ribbon icon or command palette → Open Agent Dashboard

Bug fix

  • Closing a tab in the chat view now removes it from the dashboard immediately
  • New tabs created from the chat view appear in the dashboard right away
v0.1.29 May 11, 2026 View on GitHub

What’s new

File paste attachments

Large text pastes (≥500 chars) are captured as a removable chip above the input instead of flooding the textarea. The content is injected as a fenced code block when you send.

Image uploads

Paste a screenshot from your clipboard or drag-and-drop an image file onto the input area. Images appear as thumbnail chips, show as thumbnails in the sent message bubble, and are sent to Claude as base64 content blocks.

Subagent task visibility

When Claude spawns a subagent, a dashed yellow pill appears alongside tool pills. It updates in-place as the task progresses (showing the last tool used) and resolves to a solid green ✓ or red ✗ with the final summary on completion.

System event rendering

  • Context compacting shows in the status bar
  • API retries display attempt count
  • Rate limit rejections pop a persistent notice with the reset time
  • Agent-initiated notifications surface as Obsidian toasts
v0.1.28 May 10, 2026 View on GitHub

What’s new

  • Stop button no longer shows a red error: Interrupting Claude now cleanly cancels the in-progress response. The UI returns to idle, partial streaming content is discarded, and your conversation context is fully preserved — the next message resumes from where you left off before the interrupted turn.
  • Message queue reliability fix: Queued messages would sometimes silently fail or fire on the wrong turn if you switched tabs while Claude was responding. The queue is now managed inside ThreadManager so it works correctly regardless of which tab is active, and gets cleaned up properly when a thread is deleted.
v0.1.27 May 9, 2026 View on GitHub

What’s new

  • Message queueing: Type your next message while Claude is still responding — it queues automatically and fires when the current response finishes. Status bar shows what’s queued.
  • Always Allow permissions: Permission modal now has an “Always Allow” option that persists the tool name to settings. Manage (and remove) always-allowed tools in the plugin settings tab.
  • Tab bar scroll: Mouse wheel now scrolls tabs horizontally. Active tab always scrolls into view when switching via keyboard shortcut.
  • + button fixed: New thread button is now pinned outside the scrollable tab area so it’s always visible.
  • Streaming message styling: Streaming messages now render with identical styling to finalized messages — no more mismatched spacing or rogue scrollbar.
  • Summarization on by default: New installs now have summarization (tab naming + summary panel) enabled out of the box.
  • Test suite: 35 Vitest unit + integration tests covering thread lifecycle, event flow, opus escalation, permissions, and tool use.
v0.1.26 May 8, 2026 View on GitHub

What’s new

  • Interactive question prompts: When Claude needs your input mid-session, a proper modal now appears with radio buttons (single-select) or checkboxes (multi-select) and option descriptions — instead of a raw JSON alert box.
  • Bugfix: Keyboard selection in slash-command autocomplete now correctly inserts the skill name.
v0.1.25 May 8, 2026 View on GitHub

What’s new

v0.1.24 — Permission fix

  • Fixed canUseTool allow response to include updatedInput — resolves the ZodError that caused Allow to silently fail inside the Claude binary

v0.1.25 — Tab UX, slash commands, markdown tables

Tab improvements

  • Active tab now has an accent-coloured top border and is clearly distinguished from inactive tabs (previously both looked selected)
  • Tab scrollbar is now hidden (trackpad scroll still works)
  • Switching tabs no longer triggers a slow animated scroll — jumps to bottom instantly
  • New threads are created without a name prompt (the summarizer auto-renames them)

Slash command autocomplete

  • Type / in the input to browse all your installed ~/.claude/skills/ with descriptions
  • Arrow keys, Tab, or Enter to select; Escape to dismiss
  • Skills are read directly from ~/.claude/skills/ at startup

Keyboard shortcuts (via Obsidian commands)

  • Cmd+1 through Cmd+9 — switch to tab by index
  • Cmd+[ / Cmd+] — previous / next tab
  • All configurable in Obsidian Settings → Hotkeys

Markdown rendering

  • Tables now render correctly (switched from Obsidian’s internal renderer to marked + sanitizeHTMLToDom)
  • MarkdownRenderer.render calls are now properly awaited

Auto-rename from summarizer

  • Both summarizers now return { title, summary } JSON
  • Tab title is automatically set from the summarizer if it still has a default “Thread N” name

Developer

  • Playwright screenshot test harness with Obsidian API mocks (no Obsidian install needed)
  • npm run build:harness / npm run test:screenshots
v0.1.23 May 7, 2026 View on GitHub

Passes the vault root and thread’s working directory as additionalDirectories to every session, so Claude can read/write within those trees without hitting permission prompts or the internal ZodError that was occurring when a granted permission path wasn’t in Claude’s allowed-directory list.

v0.1.22 May 7, 2026 View on GitHub

When allowing access to a path outside the working directory, the SDK’s permission suggestions must be passed back as updatedPermissions so the Claude process adds the path to its allowed directories. Without this, Claude re-validates internally and throws a ZodError even though the allow response was structurally correct.

v0.1.21 May 7, 2026 View on GitHub

The Allow button was always resolving as a deny because modal.close() fired onClose → done(false) before done(true) ran. Fixed by calling done() before modal.close().

v0.1.20 May 7, 2026 View on GitHub

Two fixes for the permission dialog:\n- Pressing Escape or clicking outside the modal now correctly denies the request (previously the promise hung forever, eventually causing a ZodError in the SDK)\n- canUseTool callback is now wrapped in try/catch so any error results in a clean deny instead of an unhandled rejection

v0.1.19 May 7, 2026 View on GitHub

Clicking Allow in the permission dialog was causing a ZodError because the SDK requires toolUseID in the response to correlate the decision. Also improved the modal text to use the SDK’s pre-formatted description.

v0.1.18 May 7, 2026 View on GitHub

When Claude requests permission to access a path outside the working directory, a modal now appears with Allow / Deny buttons instead of silently hanging. Also adds Bypass all permissions to the settings dropdown for fully-trusted workflows.

v0.1.17 May 7, 2026 View on GitHub

Switching to a new tab while another thread is processing no longer shows the stop button and ‘Claude is thinking’ on the new idle tab.

v0.1.16 May 7, 2026 View on GitHub

The thread info bar is now scrollable instead of truncating with ellipsis. Full summary always accessible, no tooltip needed.

v0.1.13 May 7, 2026 View on GitHub

Replaces the WebLLM/WebGPU approach (which was broken in Obsidian’s app:// URL scheme) with a much simpler approach: spawns claude --print --model haiku using your existing Claude auth.

What changed

  • No model download, no WebGPU, no extra setup — uses the same Bedrock/SSO auth as your conversations
  • Bundle size: 17 MB → 2.6 MB
  • Model is configurable in Settings: haiku (default, fast/cheap), sonnet, or opus
  • Mode dropdown renamed to “Claude (via CLI)”
v0.1.12 May 7, 2026 View on GitHub

Removes leftover mentions of Transformers.js and Llama from the Settings UI. Mode dropdown and description now correctly say WebGPU / WebLLM.

v0.1.11 May 7, 2026 View on GitHub

Bug fixes for the summarization feature:

  • Auto-summarize was hardcoded to the endpoint path — it now correctly uses in-process (WebLLM) or endpoint based on your Mode setting
  • Manual summarize was passing the wrong argument to WebLLM (plugin resource URL instead of model ID), causing silent failures in in-process mode
  • Both paths now share the same routing logic
v0.1.10 May 7, 2026 View on GitHub

Changes the default in-process summarization model to gemma-2-2b-it-q4f16_1-MLC (Gemma 2 2B). Better instruction-following than Llama 3.2 1B at a similar download size (~1.5 GB).

Existing installs: update the In-process model field in Settings to gemma-2-2b-it-q4f16_1-MLC to pick up the new default, or enter any other model ID from webllm.mlc.ai.

v0.1.9 May 7, 2026 View on GitHub

Switches the in-process summarizer from Transformers.js to @mlc-ai/web-llm, which runs real LLMs (Llama, Phi, Gemma, etc.) via WebGPU directly in Obsidian’s renderer — zero native dependencies, zero install beyond the plugin.

Changes

  • Replaced @xenova/transformers with @mlc-ai/web-llm
  • Default in-process model: Llama-3.2-1B-Instruct-q4f16_1-MLC (~900 MB, downloaded and cached on first use)
  • Removed ONNX WASM file bundling and native module stubs from build
  • Model can be changed in Settings to any model from webllm.mlc.ai

First use

Enable Summarization → Mode: In-process in settings. Click Summarize on any thread — the model downloads once and is then cached locally by the browser.

v0.1.8 May 7, 2026 View on GitHub

Thread summarization now runs entirely inside Obsidian via Transformers.js — no Ollama, no local server.

First use: ~300 MB model download from HuggingFace (cached in Electron IndexedDB after that). Progress shown in the status bar.

Setup: Settings → Claude Threads → Thread summarization → Mode: “In-process”. Default model: Xenova/distilbart-cnn-12-6 (configurable).

Note for manual install: all 4 .wasm files must be placed in the plugin folder alongside main.js.

v0.1.7 May 7, 2026 View on GitHub

Adds thread summarization via any local OpenAI-compatible model (Ollama, LM Studio, etc.).

Setup: Settings → Claude Threads → Thread summarization — enable it, set endpoint and model name.

  • Click the 🧠 button in the thread info bar to summarize on demand
  • Enable auto-summarize to regenerate after every assistant response
  • Summary shows in the info bar below the tabs, persists across reloads
v0.1.6 May 7, 2026 View on GitHub

The active thread’s working directory and latest recap summary now appear in a visible bar between the tabs and the messages. Updates live as Claude works.

v0.1.5 May 7, 2026 View on GitHub
  • Text in messages is now selectable
  • Hover any assistant message to reveal a copy button (copies raw markdown)
  • Blockquotes render with an accent left border and subtle background
v0.1.4 May 7, 2026 View on GitHub

Each tab now shows a small subtitle with the latest tool-use summary Claude generates during a session, giving at-a-glance context for what each thread was working on.

v0.1.3 May 7, 2026 View on GitHub
  • Bash command pills no longer squish/overlap — each pill is full-width with proper ellipsis truncation
  • Working directory now correctly defaults to vault root (fixes “home directory” label on new threads)
v0.1.2 May 7, 2026 View on GitHub

New threads now start with the vault root as their working directory instead of Electron’s app directory. Override per-thread in Settings → Claude Threads → Default working directory.

v0.1.1 May 7, 2026 View on GitHub

Adds an Extra environment variables field in plugin settings (KEY=VALUE lines). Use it to pass AWS_PROFILE and AWS_REGION so Claude Code can authenticate via AWS SSO when Obsidian doesn’t inherit your shell environment.

v0.1.0 May 7, 2026 View on GitHub

Claude Threads for Obsidian

Multi-threaded Claude Code chat UI in the Obsidian sidebar.

Manual installation

  1. Download main.js, manifest.json, and styles.css from this release
  2. Create a folder .obsidian/plugins/claude-threads/ in your vault
  3. Copy the three files into it
  4. Reload Obsidian → Settings → Community Plugins → enable Claude Threads

Requirements

  • Claude Code CLI installed (default: /opt/homebrew/bin/claude)
  • Obsidian desktop (macOS/Windows/Linux)

BRAT installation

Install BRAT and add richardbowman/obsidian-claude-threads as a beta plugin.