Two numbers explain OpenCode's week. One is 214,000 GitHub stars. The other is five minutes, the hard ceiling that used to cut long-running agent sessions off mid-run. Version 2.1.0, shipped on October 20, 2026, removes that ceiling and finally hands Windows developers the persistent terminal workflow macOS and Linux users have enjoyed for months.
There is no theatrical demo video attached to this release. The highlights list is three items long: persistent PTYs on Windows, todo lists in the TUI, and long-running commands that no longer die at the five-minute mark. Each one kills a failure that people hit during normal work, which is exactly the kind of shipping that turns a promising agent into a tool you leave running all afternoon.
Persistent terminals land on Windows in build #56245, covering both x64 and ARM64. Windows users now get real persistent PTYs through the same terminal workflow as macOS and Linux, so shell state survives between commands: working directory, environment variables, and background jobs included. That closes the single biggest platform gap left in the project.
Why the Five-Minute Ceiling Mattered More Than Any Feature
The second change is the quiet giant of 2.1.0. Plugin commands, shell calls, and other TUI requests could trip Bun's default fetch deadline at the five-minute mark and lose their connection (fix #55149). Long test suites, heavy builds, and multi-minute refactors simply stopped, often right before finishing.
Version 2.1 lets them run straight through. Long-running TUI, run, and mini requests now outlive the deadline without dropping, and the TUI keeps a long-running command connected instead of tearing down the composer when a shell command in an existing session fails.
The timing is not accidental. OpenCode 2.0 rebuilt the project around a background service that owns sessions, plugins, permissions, and tool execution, and it added background subagents plus background shell commands. A background-first runtime with a foreground timeout is a contradiction, and 2.1 settles it.
The reliability work goes wider than the deadline fix. Transport-level failures that used to end a run are now retried rather than surfaced as fatal, and the stream layer got stricter about what it accepts:
- Broken-pipe transport failures are retried automatically (#56307).
- Transient failures from buffered model generations are retried instead of failing immediately (#56497).
- Provider keep-alives and unknown stream events are ignored, while malformed known events are still rejected (#56286, #56669).
- Compaction now preserves more complete context and stabilizes image trimming and instruction baselines for better prompt-cache reuse (#56983, #54410).
- The OpenAI-compatible store field is limited to OpenAI, Azure, and providers that explicitly opt in (#57239).
Task visibility comes back too. Enable the experimental todo flag, {"experimental": {"todo": true}}, and models regain the todowrite tool, which accepts a complete list shaped as todos: [{ content, status }]. The TUI then renders that list in session output, in compact cards, and in the sidebar (#56947). Session archiving returned alongside it, including archive-state filtering and restoring archived sessions (#53759), and saved permission actions and resource patterns are now editable (#56659).
Two smaller wins are worth naming. On the desktop, free OpenCode models now appear next to their paid counterparts by default instead of disappearing when they share a model family and release date (#55712). On the SDK side, the experimental server voice API, client.voice.session(...), gained Gemini Live support for gemini-3.8-live* models over WebSocket, using a stored Google key or GEMINI_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY, or GOOGLE_API_KEY (#56888).
Plugin authors got one more present. Both the Effect and Promise plugin APIs now expose a paginated ctx.session.list(...) (#56264), which matters a lot once a background service is juggling dozens of concurrent sessions instead of one terminal tab.
Version 2.1.0 also makes intentional breaking changes to the public SDK, HTTP message and event contracts, and plugin contracts (#57260), so integrations need a pass before upgrading. The good news is that no database migration is required and existing stored sessions, credentials, and older session imports stay readable through compatibility decoders.
Here is the upgrade checklist for anyone running OpenCode inside a larger pipeline:
- Adopt the new native fields. Text and reasoning parts move from state to native, assistant and compaction messages move from providerState to native, and tool success and failure events move from resultState to native.
- Move credential setup answers out of Credential.Key.configuration and into the existing metadata field. Stored credentials and opencode auth import still read the old shape.
- Read compaction references from metadata.keepID instead of the removed recent field, and let forks remap the reference to their copied messages.
- Replace subscriptions to the transitional session.compacted event with session.compaction.started and session.compaction.ended.
- Expect a single native blob on tool parts instead of separate providerState and providerResultState values, and use distinct keys when call and result values differ.
It is worth being straight about the context this release lands in. The same week, OpenCode disclosed that an intruder reached a legacy OpenCode Console system that was being decommissioned, and researchers publicly flagged a critical remote code execution flaw that had been patched quietly. Shipping product improvements fast is the part of the story the project fully controls, and 2.1.0 shows it is still doing that.
The bigger point is that reliability is now the headline feature for terminal agents. Everyone in this category can call a model and edit a file. Far fewer can keep a session alive for forty minutes of test runs on a Windows laptop while the developer does something else entirely. Persistence, retries, and honest long-running behaviour are what separate a demo from a daily driver.
So the practical read for this week is simple. If you bounced off OpenCode on Windows, update to 2.1.0 and try the same workflow again. If you run it in automation, budget an afternoon for the native field migration, then enjoy commands that no longer expire after five minutes. The stars keep climbing for a reason, and releases like this are the reason.
Comments