Changelog
New updates and improvements to OpenCode
Desktop
- Restored the legacy production desktop flows for opening projects and starting sessions.
Core
- Redesigned the diff viewer with a file tree and refreshed layout.
- Return to the previous screen when closing the diff viewer.
- Show clearer errors when a default model is invalid or unavailable.
- Surface missing PTY session errors instead of failing generically.
- Improve diff viewer empty states and context handling.
- Show clearer errors when a skill invocation fails as expected.
- Show clearer errors when an installation upgrade fails.
- Show clearer project not found errors from the HTTP API.
- Return PTY error bodies from the HTTP API.
- Enable the diff viewer by default.
- Return MCP server not found errors from the HTTP API.
- Let MCP OAuth configs set a callback port and include configured scopes in client metadata.(@sebin)
- Use working Vertex Anthropic endpoints for `us` and `eu` multi-region setups.(@JPFrancoia)
- Return session busy error bodies from the HTTP API.
- Preserve native reasoning continuation metadata across turns.
TUI
- Copy the current worktree path from the command palette.
- Refine diff viewer keyboard shortcuts.
- Restore question prompt key handling.
- Keep the spinner color aligned with the active agent.(@OpeOginni)
Desktop
- Move tab navigation into the title bar and tighten session tab shortcuts.
- Show session status in the title bar.
- Extract user codes correctly from callback URLs that contain multiple colons.(@OpeOginni)
- Debounce VCS refreshes to reduce session page churn.
Core
- Added Grok OAuth sign-in, including device-code login.(@Jaaneek)
- V2 session APIs now return safe `UnknownError` responses with log reference IDs when stored messages are corrupt.
- Generic API 500s no longer expose config details from server errors.
- Unknown API errors now include reference IDs so you can match responses to server logs.
- V2 session APIs now return `503 ServiceUnavailableError` for mutations that are not available yet.
- V2 session APIs now return `SessionNotFoundError` for missing sessions.
- Deduped concurrent Codex OAuth refreshes to avoid repeated refresh failures.(@cooper-oai)
- Restored native OpenAI OAuth requests.
- Tool schema failures now surface as friendly tool errors.
- Added PDF attachment support for Grok.
- Restored OpenAI reasoning streams.
TUI
- Collapsed thinking labels now use clearer punctuation.
- New sessions now default to the local project.
- Single-select question checkmarks no longer run into option labels.
Desktop
- Added a pinch zoom setting for the desktop app.
- Added a new desktop home view, session entry flow, and titlebar.
- Refined the new desktop UI and moved app update actions into the titlebar.
- Added desktop log export.
SDK
- V2 global event streams now include account add, remove, and switch events.
Core
- Added a diff viewer in the TUI for reviewing changes.
- Collapsed single-child directories in the diff viewer file tree.
- Added shell mode to the `run` prompt.
- Replaced subagent tabs with an on-demand picker in `run`.
- Plugin file load errors no longer break the rest of plugin loading.
- Anthropic API-key models now use the native runtime.
- The v2 HTTP API now exposes structured public error schemas.
- Zed editor context now only activates inside Zed terminals.
- The v2 HTTP API now exposes catalog errors.
- The v2 HTTP API now exposes request errors.
- The v2 OpenAPI spec now preserves endpoint error responses.
- `opencode login` now defaults to `https://console.opencode.ai`.
- Agent and command names now resolve correctly from relative config paths.
- Invalid `OPENCODE_PERMISSION` JSON no longer crashes startup.
- Plugin tools with missing `args` no longer break tool loading.
- Restored legacy `PgUp` and `PgDn` TUI keybind aliases.
- Native runtime now prefers the console provider token for OpenCode models.
TUI
- The diff viewer now focuses the first file automatically.
- Imported sessions now refresh their directory and relative path fields correctly.(@OpeOginni)
Desktop
- Added initial desktop tabs support.
- Added a native app menu on Windows.
- Added Ukrainian locale support.(@MYMDO)
- Custom providers now appear immediately after config updates.(@tianxiaoliang)
SDK
- Updated `opentui` dependencies to `0.2.15`.
Core
- Preview the native OpenAI runtime path behind an experimental flag
- Add `--replay` and `--replay-limit` to show recent history when resuming interactive runs
- Fix plugin tools using `ask` so tool calls complete correctly
- Reduce missed `/event` updates caused by a subscription race
- Sort the v2 session list by most recently updated
TUI
- Refresh the prompt layout after pasting content
- Keep file references scoped to the current workspace
- Preserve pasted prompt content when copying
- Collapse very long tool output lines to keep the layout readable
- Use a higher-contrast paste summary badge color in some themes(@kagura-agent)
Desktop
- Allow desktop notifications from the renderer
- Show free-limit and usage-exceeded dialogs in Desktop
- Speed up large session timelines
- Fix question dock overflow and message layout clipping
- Hide the prompt placeholder when the input only contains whitespace(@ShrootBuck)
- Sync the PWA status bar color with the active theme(@heimoshuiyu)
- Install the newest available desktop update instead of reusing a stale download
Core
- Fixed project-scoped bus events so file watcher and update notifications reach the right instance.
- Fixed custom LSP servers not sending refresh events after they initialize.
- Hid background subagent task instructions unless experimental background mode is enabled.
TUI
- Made Markdown H1 headings easier to distinguish.
Core
- Reduced wasted work when reading very large files after output truncation.
TUI
- Fixed async commands losing the active instance context, which could break agent generation and GitHub-driven runs.
Core
- Reduced unnecessary prompting around shell, task, and todo flows.
- Fixed sync events not reaching project-scoped subscribers in injected instances.
TUI
- Newly pinned sessions now stay at the end of the pinned list instead of jumping to the top.
- Fixed `opencode run --agent` resolving project-local agents.
Core
- Clarified how to recover when the npm package is installed without its native binary.
- Avoid duplicate consecutive entries in prompt history.
- Show full config validation errors during TUI startup instead of a generic failure.
- Fixed npm installs so the CLI can recover and fetch the right native binary on more setups.
- Fixed multiline `@` mentions in prompts.
- Preserved custom tool metadata from Zod schemas.
- Preserved custom tool argument descriptions in generated schemas.
- Fixed file watching in repos where `.git` is a symlink.(@kagura-agent)
TUI
- Added a collapsed thinking view that can be expanded inline.
- Added pinned sessions with quick-switch slots in the session picker.
- Fixed thinking mode defaults so reasoning starts collapsed consistently.
- Limited session quick-switching to pinned sessions.
- Fixed Markdown table rendering in chat output.
Core
- Added an Effect-based core event system for more complete event delivery across sessions and integrations.
- Ignored invalid exports in custom tool modules instead of failing tool loading.
- Ignored project instruction lookup errors so sessions keep loading when project instruction discovery fails.
- Fixed versioned event projector lookups so event replay uses the right handlers.
Desktop
- Auto-hide the menu bar on Linux and Windows.(@shi-gg)
- Fixed archived sessions being reprocessed when their archive state did not change.
SDK
- Restored missing event types in the JavaScript SDK, including session and message events.
Core
- Added experimental background subagents so tasks can keep running while you continue working.
- Added the required billing origin header for NVIDIA endpoints.(@nv-kasikritc)
- Fixed worktree creation requests that omitted the POST body.
- Fixed sessions getting stuck with interrupted assistant messages after cancellation.
- Fixed repeated auto-compaction in sessions after compaction reordered messages.
- Updated LiteLLM compatibility to require `v1.85.0-rc.2+` for current GPT-5 and tool-call behavior.(@Sameerlite)
- Fixed truncated shell output streams closing cleanly.
- Stopped exposing internal named defect details from the HTTP API.
- Fixed Azure `gpt-5.5` requests through the completions API.(@frederiknsgo)
- Restored automatic image resizing for oversized image attachments.
Desktop
- Added MCP connection status for client registration and authentication, with direct re-auth flows in the app.(@OpeOginni)
- Fixed Windows app detection by reading `where` output correctly.
Extensions
- Fixed DigitalOcean OAuth to request only the GenAI scopes it needs.(@Spherrrical)
Core
- Kept HTTP event streams open after the initial connect event so subscribers continue receiving instance updates.
- Returned proper busy errors when a session is already running prompt or shell work.
- Let invalid `small_model` config values fall back cleanly instead of breaking small-model selection.
- Improved missing-model errors with suggestions across CLI and typed callers.
TUI
- Restored markdown rendering for session output by default.
SDK
- Added `instance.directory` and `instance.workspace` query support to the v2 model and provider calls.
Core
- Added the v2 model and provider listing API.
- Added DigitalOcean OAuth and Inference Router support.(@Spherrrical)
- Create a global `opencode.jsonc` automatically when no config exists.
- Enable `customize-opencode` by default with a linked full schema.
- Autocomplete configured `@mentions` in prompts.
- Parse fenced Markdown code blocks in patch diffs by default.
- Fix keymap fallback priority and make TUI config errors clearer.
- Restore model suggestions for unloaded providers and missing models.
- Preserve layered permission rule order in config merges.(@asuffield)
- Preserve attachments returned by custom tools.
- Keep recent turns after compaction instead of folding them into the summary.
- Fix prompt cursor movement and mentions for wide characters.
- Prevent duplicate submits from creating empty phantom sessions.
- Keep compacted tail history when forking a session.
- Return proper busy-session errors from the HTTP API.
TUI
- Add pinned recent sessions, quick slots, and recent-session cycling.
- Restore non-interactive `run` exit behavior.
- Make the websearch provider label update reactively.(@NormallyGaussian)
- Reduce flicker when switching workspaces.
- Fix `run --json` output draining.
- Fix prompt history and line up/down commands.
Desktop
- Add Ctrl/Cmd+number shortcuts to switch projects.
- Remember whether the todo dock is collapsed.
- Restore AppStream metadata in Linux desktop builds.
- Show clearer wrapped server errors in the app.(@OpeOginni)
- Use the login shell when loading desktop environment variables.(@qwq202)
- Remember the selected model variant when switching sessions or projects.
- Open the next available project when closing the current one.
- Prevent streamed Markdown from being cut off.
Core
- Preserve original image attachments instead of resizing them before sending them to the model
Core
- Restored prompt editing keybindings in the TUI textarea, including aliases like `esc` and `enter`
- Model changes now persist reliably across session activity
- HTTP API schema validation errors now return a readable 400 response body
- Scout can now materialize configured reference repositories up front so they are ready to search
- Large image attachments are now auto-resized before sending, with configurable size limits
TUI
- File and directory paths now render relative to the session directory when possible
Core
- Added a built-in `customize-opencode` skill so opencode config edits are less likely to break startup.
- Fixed numeric HTTP API query parameters in the generated OpenAPI spec and SDK for session and file endpoints.
- Fixed boolean HTTP API query handling so SDK types and runtime validation stay aligned.
- Tolerated legacy stored numeric values in sessions, diffs, and retry events instead of failing to load old data.
- Fixed old sessions with negative token counts causing message loads and Desktop startup to fail.
- Fixed MCP tool discovery when a server publishes broken `outputSchema` references.
- Fixed workspace HTTP API query drift so workspace-routed endpoints expose the right query parameters in OpenAPI and the SDK.
- Fixed a Plan Mode security bypass where subagents could ignore parent-agent deny rules.
Core
- Provider configs and API responses now accept models marked as `active`.
- Read tool permission rules now match worktree-relative paths, so read allowlists and denylists apply correctly.
- Workspace-routed HTTP API endpoints no longer reject valid `directory` and `workspace` query params.
TUI
- Startup errors now report every failed bootstrap request instead of only the first one.
- Opening a session no longer crashes when the messages request fails.
Desktop
- Older migrated sessions with missing diff file details load again.
- Older migrated sessions with missing diff patches load again.(@OpeOginni)
SDK
- `throwOnError: true` now throws a real `Error` with the server message and preserves the response body in `cause`.
Extensions
- TUI plugins using the deprecated `api.command` API keep working while you migrate to `api.keymap`.
- Provider plugins can no longer mutate shared provider model state for the rest of the app.
Core
- Fixed upgrades failing for existing workspaces when adding the `time_used` field.
Core
- Keep provider and config API responses working when auth loaders add non-JSON options to providers.
- Include tool image attachments in ACP updates and session replays.(@SteffenDE)
Core
- Added HTTP API response compression for large non-streaming responses.
- Added the Scout agent for repo research, docs lookup, and dependency-source inspection.
- Added workspace sync so adapter-backed workspaces can be discovered and registered automatically.
- Added an interactive split-footer mode for `opencode run`.
- Simplified TUI keybinding config into a flat keybind format.
- Made duplicate worktree names fall back to the parent directory for clearer labels.
- Fixed HTTP API auth responses to match the previous wire format for empty authorize results and share errors.
- Returned structured validation errors from the HTTP API.
- Rejected invalid permission and question IDs in the HTTP API.
- Included auth challenges on typed HTTP API `401` responses.
- Fixed the HTTP API OpenAPI document route.
- Fixed detached sessions so they are claimed by the source project again.
- Forwarded `SIGINT`, `SIGTERM`, and `SIGHUP` correctly when running through the npm shim.(@chubes4)
- Allowed skills without descriptions to load correctly.
- Required auth on effect HTTP API root routes.(@RajvardhanPatil07)
- Kept tool ordering stable so tool lists stop reshuffling between runs.
- Made retry dialogs more specific to the provider and failure reason.
- Fixed Gemini reasoning controls so supported effort levels and small-mode defaults match the model.
- Fixed Anthropic Opus 4.5 reasoning effort options.
- Limited OpenAI deep research models to the reasoning level they actually support.
- Fixed GPT-5 reasoning variants so the exposed effort options match each model family.
TUI
- Show retrying sessions as active in the project sidebar.(@edemaine)
- Fixed the sidebar message shown for language server state.(@Polo123456789)
- Sorted the session picker by full last-updated time instead of day buckets.(@Sleepful)
- Kept longer cleared prompts in draft history so they can be restored.
Desktop
- Switched desktop updates to silent per-user install flow.