Highlights
- Create, install and share Desktop plugins (experimental) (#55246, #59469, #59489)
- Refreshed the desktop app experience (#56898, #58865, #55838, #57962)
- Add experimental image and decision generation APIs to plugins and sdk, allowing image generation or decision model (think typesafe, clef, etc) workflows. (#59190, #59380, #58758)
- Plugins can now attach and update keyed session instructions with ctx.session.instructions.entry.put/list/remove. Instead of editing the system prompt and busting the prompt cache, each change is added as a small update at the next step. The entries also survive compaction and reverts, and they don't start an extra model turn. (#56550)
- Restored the Todo tool in desktop via opt-in (#59092)
- Add configurable prompt cache TTLs per provider/model (#59157)
Breaking changes
@opencode/ai root is now the Promise API
@opencode/ai now works like @opencode/sdk and @opencode/client: the package root exports the Promise API, and the Effect API moved to @opencode/ai/effect. @opencode/ai/promise is removed, and the wildcard subpath export is replaced with an explicit list of provider and protocol entry points. (#58847, #59183)
-import { AI } from "@opencode/ai/promise"
-import { LLM } from "@opencode/ai"
+import { AI } from "@opencode/ai"
+import { LLM } from "@opencode/ai/effect"The OpenCode GitHub Action is removed
The OpenCode GitHub Action is no longer published. Remove it from your workflows. (#59032)
TUI plugins require OpenTUI 0.7
@opencode/plugin now requires @opentui/core and @opentui/solid 0.7.0, up from 0.6.8 or later. Plugins that depend on OpenTUI 0.6 fail to install until they upgrade. In OpenTUI 0.7, custom renderables read their hooks from their class at construction: assign renderBefore, renderAfter, and onLifecyclePass in the constructor instead of as class fields, call refreshHooks() after adding a hook by reflection, and replace defineNativeIntegration() with a static nativeIntegration declaration. See the OpenTUI 0.7.0 release notes. (#59295)
Core
Improvements
- Add experimental image and decision generation API endpoints. (#59190)
- Add image and decision entrypoints for catalog providers. (#59380)
- Improve integration rebuild performance. (#59402)
- Let custom model configuration set a model type. (#59388)
- Let model-list API requests filter by type. (#59355)
- Make external-directory permission checks use the project's filesystem. (#59089)
- Reduce memory use when code search finds very large lines. (#59205)
- Let plugins filter event subscriptions by type. (#58864)
- Add configurable prompt-cache TTLs. (#59157)
- Move image resizing off the main process and release idle image memory. (#58820)
- Reduce repeated session-history loading during a step. (#59091)
- Add an experimental API for session media and opt-in media URI support. (#59103)
- Add the machine hostname to
/api/info. (#59090) - Add experimental content-addressed blob storage for session media behind
experimental.media_blob. (#58656, #58741) - Start session history from the latest completed compaction. (#59020)
- Reduce work encoding durable event payloads that are not persisted. (#58923)
- Expose MCP server titles from
serverInfo. (#58950) - Apply OpenCode Console workspace configuration as a configuration layer. (#57703)
- Replace experimental evaluations with Decision APIs in the AI pkg, including OpenAI Decisions, System One, and Cloudflare Run models. (#58758, #58382, #58379, #58381)
- Convert tool schemas once to speed up tool execution. (#58798, #58848)
- Make Git project discovery faster while recognizing repository changes. (#58616)
- Show OpenCode Console budget limits and Go usage where they block you. (#58694, #58714)
- Record provider-reported session costs. (#58562)
- Find Git more reliably on macOS. (#58602)
- Resolve model details once per prompt step. (#58601)
- Let plugins manage session instruction entries for subsequent model requests. (#56550)
- Add GPT-6.1 Terra and GPT-6.1 Terra Fast to Sign in with ChatGPT. (#59359)
Bug fixes
- Wait for plugins to finish reloading before each session step and tool call. Thanks @kernel-oops and @Tarquinen. (#51133)
- Size session compaction from the provider's reported token count to preserve usable context. (#59441)
- Skip unavailable models.dev API entrypoints instead of failing model catalog updates. (#59475)
- Return a server error with a reference ID when the server cannot encode a response. (#59459)
- Avoid warming a session while its model request is running. (#59325)
- Preserve legacy MCP
codemodesettings during migration. Thanks @tneemo. (#59126) - Use the correct Vertex AI endpoints for the
euandusmulti-regions. (#59335) - Accept Databricks hosts that include
http://orhttps://. (#59334) - Keep files intact when patch edits move a file onto itself. (#59197)
- Preserve literal
$0and$ARGUMENTStext in custom command input. (#59198) - Close project locations concurrently during shutdown. (#59326)
- Treat equivalent directory paths, including trailing slashes, as one location. (#59327)
- Send valid tool schemas to Kimi for tuple, default, and keyword-like arguments. (#59207)
- Expose Code Mode MCP tools directly when the
executepermission is denied. (#59315) - Coordinate OAuth credential refreshes across locations and processes. (#54023)
- List and search remote Git branches correctly without bare remote names. (#58597)
- Detect AVIF, HEIC/HEIF, QuickTime, and M4A attachments correctly. (#58480, #58886, #58887)
- Reduce memory retained by long-running tool calls and unchanged hooked model requests. (#58448, #58449)
- Load session diffs without reading every message, improving performance for large sessions. (#57686)
- Keep active locations alive when session events use an equivalent directory path. (#56259)
- Reload compatibility skills only when their own sources change. (#59086)
- Avoid publishing redundant catalog updates when configuration is unchanged. (#56267)
- Avoid booting idle or deleted project locations while polling session forms. (#59083)
- Wait for plugins before returning agent and provider lists, preventing incomplete catalogs. (#59082)
- Manage sessions and instruction entries after their project directory is deleted. (#58997)
- Start fuzzy file search only on first use, reducing project startup work. (#58959)
- Exit after 10 seconds when shutdown hangs and report pending work. (#58817)
- Keep the models catalog fresh without redownloading it when unchanged. (#58813)
- Send xAI Responses
top_ksettings and stop sending unsupported penalties. (#58868) - Honor shared parallel tool-call and service-tier settings for Groq. (#58871)
- Retry throttled requests instead of misreporting them as context overflows. (#58866)
- Preserve streamed text and reasoning that arrive after an OpenAI Chat finish reason. (#58851)
- Classify AWS REST JSON errors consistently regardless of where the error type appears. (#58770)
- Validate large base64 attachments without slowdowns or hangs. (#58811)
- Retry Bedrock throttling errors as rate limits instead of context overflows. Thanks @Irish-Joseph. (#58759)
- Keep working MCP tools available when a server returns malformed ones. (#58350)
- Match absolute instruction-file globs across directories. Thanks @heimoshuiyu. (#58749)
- Use configured provider regions in Bedrock endpoint URLs. (#58538)
- Handle unknown OpenAI Chat finish reasons without failing the response. (#58608)
- Avoid unnecessary Azure model updates when endpoint transforms make no change. (#58600)
- Prefer JPEG for opaque browser screenshots, reducing attachment size. (#56990)
- Detect generated image types from their bytes when compatible hosts omit the format. (#58475)
- Keep project services alive while sessions run long tools or wait for input, with a 24-hour inactivity cap. (#57274)
- Prevent unrelated configuration changes and compatibility-skill update bursts from repeatedly reloading skills. (#56260)
TUI
Improvements
- Reduce CPU use while animated session-tab pulses are visible. (#59235)
- List OpenCode Console before OpenCode Go in the integration picker. (#59107)
- Add
/usage, model-picker, prompt, sidebar, warning, and error details for OpenCode Console usage limits. (#58731) - Make CLI service registration more reliable when concurrent processes update its files. (#59105)
Bug fixes
- Return
opencode run --format jsonserver connection errors as JSON. Thanks @andreivince. (#59366) - Preserve pasted prompt text when copying it back out. (#59209)
- Reliably update the background service on Windows when its files are briefly locked. (#59105)
- Keep the background service state directory out of tool shells and identify processes blocking its port. (#58815)
- Refresh Git branch details after switching branches. (#58982)
- Keep the TUI running when a plugin slot or route renders bare text. Thanks @anmol0b and @Tarquinen. (#58144)
- Accept
--serverand--standaloneanywhere in supported CLI commands. (#58505) - Release closed and background session transcripts to prevent memory growth. (#58434, #57025)
- Connect remote access tunnels through HTTP proxies. (#58464)
- Keep development builds on a separate server, database, and port from released builds. (#58331)
Desktop
Improvements
- Manage desktop plugins from Settings › Extensions › Plugins. (#59489)
- Add a persistent desktop zoom setting. (#59277)
- Capture heap snapshots in desktop debug builds on
SIGUSR2when explicitly enabled. (#58317) - Show the open session title in the browser tab. (#59131)
- Show todowrite tasks above the composer. (#59092)
- Load session history once when returning to a session tab. (#59166)
- Answer questions with number keys and show multi-select choices as checkboxes. (#58595)
- Add an always-available Add project action to the location picker. (#57962)
- Let you rewind or fork from any message. (#58865)
- Let you edit line comments and copy shell output. (#58970, #58974)
- Render Mermaid diagrams in messages much faster, sized to fit the column. (#57483, #57004)
- Add opt-in memory logging and remote debugging for desktop debug builds. (#58315)
- Show web sources for a turn behind the experimental Sources setting. (#58307)
- Jump from a completed shell notification to its shell output. (#58663)
- Keep the composer usable while the voice-call panel floats. (#58587)
- Use the Soft Radar activity spinner by default and provide experimental variations. (#58010, #57903)
- Add an experimental new model picker. (#58413)
- Add experimental Console voice calls in Desktop beta. (#58249)
- Add a timeline width setting. (#58308)
- Improve command, session, and model search lists with sticky sections. (#58222)
- Add search to recently closed sessions. (#55721)
- Open extension configuration and skills in side tabs. (#58023)
- Open session extension lists on hover and follow keyboard navigation. (#58021)
- Add video previews with zoom controls. (#57924)
- Add generated project avatars and an experimental avatar-style switcher. (#57871, #57930)
- Add recently closed side tabs to the new-tab view. (#57863)
- Add a searchable prompt history picker. (#57716)
- Find settings from the command palette. (#57651)
- Group queued and steered messages, and group consecutive user messages under one metadata line. (#57561, #57552)
- Improve file-tree and folder-picker performance. (#57573, #57557)
- Keep branch search results visible while new results load. (#57531)
- Add a session-details menu to the session header. (#57528)
- Show a subagent's model, status, and elapsed time in its composer area. (#57473)
- Let you delete sessions from tab menus and rename the current session with Ctrl+R. (#57453, #57423)
- Restore session summary and project menu actions. (#57781)
- Let you place the background-activity capsule at the left, center, right, or hide it. (#57962)
- Show project and worktree details in the session header and location menu. (#57962)
- Add text-rendering controls to the debug bar. (#57326)
- Show elapsed time for background work. (#57218)
- Improve streamed Markdown rendering reliability and performance. (#57016)
- Split the side pane and add a draggable bottom pane with tabs. (#56960)
- Add consistent MCP sign-in and error-status links across connection, session, and Settings views. (#57962)
- Open multiple file tabs at once and open side-panel content in tabs. (#57182, #57094)
- Move running work to the background when you steer a session. (#57142)
- Let the timeline scroll beneath the composer while keeping its content visible. (#57141)
- Simplify Settings into a flat list with a per-server switcher. (#57962)
- Quote selected timeline or terminal text into the composer. (#55664, #58420)
- Search sessions across online servers from the title bar. (#57962)
- Add a Reduce motion appearance setting. (#57103)
- Show projects from all servers in the new-session location picker. (#57962)
- Pick models from a searchable dialog with favorites and recent models. (#55838)
- Attach the new-session location picker below the composer. (#56952)
- Open image previews directly from message and composer thumbnails. (#56896)
- Start new worktrees from the current branch in the simplified location picker. (#57962)
- Manage running subagents and shells from the composer activity capsule. (#57962)
- Sync projects from each server and prioritize projects you use on Home. (#57962)
- Choose between Focus and Pro interface layouts in Settings. (#56898)
- Open terminals as side-panel tabs. (#57962)
- Choose a project and worktree from one new-session location dialog. (#57962)
- Show subagents as separate timeline rows by default. (#57962)
- Add a sidebar toggle for vertical tabs. (#55646)
- Add ⌘1–9 and ⇧⌘[ / ⇧⌘] shortcuts for side-panel tabs. (#57301)
- Let you choose a new directory or worktree when a session location is unavailable. (#56087)
- Refresh the Manage models, MCP, and fork dialogs with compact searchable lists. (#56029, #56028)
- Install future Windows desktop updates in about a second. (#55933)
- Show individual Code Mode tool calls in Execute rows. (#55649)
- Add a Commentary timeline category and display setting. (#55248)
- Support
@links to other sessions in messages. (#57480) - Polish spacing, alignment, borders, and typography across the session header, titlebar, composer, file tree, browser pane, timeline, and Settings. (#58195, #57776, #57570, #57782, #57336, #57363, #58100, #58979)
Bug fixes
- Prevent duplicate tab shortcuts and remove uninstalled plugin commands from Shortcuts. (#59499)
- Keep todo items from shrinking in the todo panel. (#59430)
- Keep question-dock answers and controls positioned correctly when changing questions. (#59383)
- Keep the @ menu open while it searches. (#59425)
- Finish quitting after Cmd+Q on macOS. Thanks @anmol0b. (#59144)
- Toggle MCP servers for the current session location from Settings. (#59132)
- Deliver steering messages when an earlier move was missed. (#58984)
- Keep session and command-palette search results stable while searching. (#58908, #57479)
- Restrict Search projects to the project list. (#58978)
- Let custom Close tab shortcuts close terminal and browser tabs. (#58945)
- Prevent live status rows from jumping or leaving gaps above the composer. (#58691, #58697)
- Keep browser tabs still behind open dialogs. (#58958)
- Keep side-panel content and browser pages visible while the sidebar or panel moves. (#58202, #58185)
- Render session diffs reliably.
- Keep keyboard focus in terminals, side panels, dialogs, and the composer when appropriate. (#57980, #57297, #56273)
- Preserve empty browser and side-panel tabs instead of closing them automatically. (#58440)
- Reduce desktop memory use by releasing closed transcripts, discarded tool-result images, retained UI batches, and aborted timeline work. (#57025, #58434, #58427, #58560, #58447, #58439, #58432)
- Restore horizontal scrolling and sticky change badges in the file tree. (#58117)
- Show live Thinking for reasoning-only turns. (#58299)
- Stop loading older history after completing the initially visible turn and prioritize the first transcript page. (#57700, #57741)
- Keep Home project and session lists reliable during refreshes.
- Keep deleted sessions from reappearing on Home. (#55349)
- Find sessions immediately in @ mentions, including multi-word titles. (#57683)
- Keep queued messages editable while changes sync with the server. (#57569)
- Open image and video URLs in the browser pane. (#57562)
- Mark submitted generated forms as complete and send each response only once. (#57537)
- Improve file-view performance with reused views, virtualized medium files, and cached diffs. (#57551)
- Group untracked folders into one expandable review row. (#57527)
- Let you paste into the composer from the session view. (#57545)
- Recover failed beta background servers and preserve their required CLI versions. (#57321)
- Restore branch selection when starting a new worktree session. (#57962)
- Keep the running server available while beta updates install. (#57309)
- Make links in user messages, shell output, and Code Mode output clickable. (#57211, #57303)
- Make Check for Updates always report its result. (#57296)
- Reopen the last closed side-panel tab with ⇧⌘T and open a browser tab with ⌘T. (#57269, #57156)
- Keep OpenCode keyboard shortcuts working in the browser pane. (#56697, #55240)
- Preview image attachments supplied by file path. (#57249)
- Apply configured code and UI fonts consistently. (#57242)
- Keep activity and busy indicators steady while switching sessions. (#57196)
- Reserve ⇧⌘W for closing the window so ⌘W does not. (#57150)
- Make image preview transitions resize smoothly without clipping or blocking clicks. (#56997, #57324)
- Keep in-session search reliable alongside titlebar session search. (#57962)
- Return focus to the prompt after keyboard model selection.
- Open searchable pickers at the top with search focused. (#57962)
- Keep tables visible beneath sticky headers. (#57050)
- Fit provider connection steps without shifting a dialog's top edge. (#57006)
- Give unavailable-server panels clear error styling. (#57003)
- Make mouse-wheel and keyboard scrolling respond immediately on Linux. (#57962)
- Keep long Execute tool code contained and show successful Code Mode output. (#56915)
- Focus the most useful control when dialogs open, including Cancel in delete confirmations. (#57453)
- Install Windows beta, stable, and nightly builds into separate directories. (#56904)
- Keep session tabs recoverable when their server becomes unreachable. (#56248)
- Keep the composer model's provider and session-model resolution consistent with the TUI. (#56225)
- Reread open files without resetting their scroll position. (#55899)
- Hide agent names when agents are disabled. (#57525)
- Polish sidebar, panel, composer, activity, question-dock, loading, and motion behavior across light and dark themes. (#57449, #58013, #58577, #57944, #58052, #58494, #58073, #58114)
- Polish hover states, cursors, tooltips, focus rings, scrollbars, and transitions across desktop controls. (#57653, #57787, #57304, #58971, #57221, #57192, #58575, #58580)
SDK
Improvements
- Add GUI plugin APIs for toasts, dialogs, notifications, tabs, composer controls, and custom UI. (#59469)
Bug fixes
- Fix generated Promise client input types for TypeScript consumers. (#58875)
- Let SDK clients discard inline tool-result file payloads to reduce memory use. (#59101)
- Avoid unnecessary catalog refreshes for locations an SDK client has not loaded. (#55237, #59099)
- Restore running sessions created while an SDK client was disconnected. (#53012)
- Release omitted tool-image payloads from memory instead of retaining their base64 data. (#58560)