Repository navigation
Releases: chriswritescode-dev/opencode-manager
Release list
OpenCode Manager v0.17.1
What's Changed
Bug fixes
- fix(sandbox): guard enable path and harden UI rendering performance (#341) — enabling sandboxing is now rejected server-side when process identity attestation is unavailable, with status reporting aligned to the same check so the UI can no longer show sandboxing as available when attestation cannot run. Backend validation failures now surface their actual error messages in the sandbox settings toast instead of a generic failure string, and the sandbox git credential path resolves per-repo overrides without redundant settings reads. The SSE health context was narrowed to only the fields consumers need, preventing redundant re-renders from changed object identities.
CI
- ci(sandbox-image): build only on manual dispatch — sandbox guest image builds no longer run automatically on pushes to main.
Full Changelog: v0.17.0...v0.17.1
OpenCode Manager v0.17.0
What's Changed
Agent sandboxing (opt-in)
- feat(sandbox): KVM-backed agent sandboxing via microsandbox — OpenCode agent
bashtool commands can now run inside an isolated microVM managed bymsbinstead of directly in the Manager container. OpenCode itself keeps running in the Manager with its normal config, providers, plugins, MCP servers, formatters, LSP servers and hooks; repositories are bind-mounted into the microVM at the same paths, so agent commands touch the same files under a separate kernel without access to Manager config, provider credentials, or SSH keys. - Enforcement that fails closed — a generated POSIX shell shim is pinned as OpenCode's
shellsetting by the Manager-ownedocm-sandbox.jsplugin, and the sandbox working directory is injected perbashspawn. Both are locked and verified so a later plugin cannot silently restore host execution; if the sandbox cannot be prepared, the tool call fails instead of running on the host. - Commands are never rewritten — the agent's command reaches
msb execas a single argument, so recorded tool calls, permission rules and model context all keep the original command. Sandboxed calls carrysandboxtool metadata, shown as a badge in the message UI (metadata is not sent to the model). - Sandbox settings panel — new Settings section to toggle sandboxing and optional git credential forwarding into the microVM.
- Sandbox guest image and overlay —
Dockerfile.sandbox/docker.io/cstechdev/ocm-sandbox(shipsgh, Playwright Chromium, node:24 toolchain) plusdocker-compose.sandbox.ymlfor KVM access and persistent sandbox state. New env vars:SANDBOX_IMAGE,SANDBOX_MEMORY,SANDBOX_CPUS,SANDBOX_EXEC_USER,SANDBOX_NET,SANDBOX_START_TIMEOUT_MS,SANDBOX_EXEC_TIMEOUT_MS. - Assistant capabilities routed through the
ocmtool — settings, assistant reload, repos, git-info, workspaces, schedules and notifications now go through an allow-listed manager-side tool instead of curling the internal API with a bearer token (impossible under sandboxing). The.opencode/internal-tokenfile and its tmpfs mask are gone, and attestation now rejects any tmpfs other than the runtime/tmpmount. - Hardening — bounded OpenCode supervisor lifecycle queue (one running plus one pending,
stop()exempt) so repeated restarts cannot stack unbounded HTTP requests; enforcement backups with no recoverable removed sections are rejected fail-closed; OpenCode installs through a privatemktempstaging directory instead of the predictable/tmp/opencodepath; the resolved OpenCode binary is used and its installed version verified;opencodeupgrades persist across rebuilds. - Docs: new Agent Sandboxing page plus Docker, environment, assistant-mode and troubleshooting updates.
Navigation
- feat(navigation): add Home to nav drawer and move sidebar collapse toggle to top — Home is reachable from the mobile nav drawer, and the desktop sidebar collapse control moved to the top of the sidebar.
- fix(sidebar): wire new-session and new-schedule actions to every page —
/assistantnever registered a listener for the sidebar's new-session event, so the desktop CTA was a no-op there; the Schedules pages had the same gap for new-schedule.useSidebarActionis now the single source of truth for action keys and dispatch, and warns when an action fires with no mounted handler instead of failing silently.
Bug fixes
- fix(files): root file browser at repo directory instead of display name — the file browser now roots at the actual repository directory rather than its display name, so browsing works for repos whose display name differs from the folder on disk.
Full Changelog: v0.16.2...v0.17.0
OpenCode Manager v0.16.2
What's Changed
Bug fix
- fix(repos): parse and preserve custom-user SSH remotes — handles SSH remotes with a custom user (e.g.
user@host:owner/repo) instead of normalizing or dropping the user, so fetch/pull against such remotes keeps working. - fix(schedules): submit scheduled runs via
prompt_asyncwith SSE monitoring — scheduled job runs now dispatch throughprompt_asyncand monitor execution over the SSE stream, so they start and report reliably. - fix(session): keep cached session agent/model stable during message refetch — the cached session agent/model no longer flips while messages refetch, keeping the active-session UI consistent.
- fix(frontend): show feedback and restrict types for prompt file uploads — the prompt input now surfaces upload errors/feedback and only accepts supported file types.
Full Changelog: v0.16.1...v0.16.2
OpenCode Manager v0.16.1
What's Changed
Bug fix
- fix(docker): drop startup
/appre-chown — removes the recursivechown -R node:node /appthat ran on every container start wheneverPUID/PGIDdiffered from the build-time uid./appis read-only at runtime (all writes go to/workspace,/app/data, and/home/node/.cache, which are still chowned unconditionally), so the extra walk was unnecessary. Cold starts return to seconds and the health check no longer reportsunhealthyduring the 40sstart_period.
Full Changelog: v0.16.0...v0.16.1
OpenCode Manager v0.16.0
What's Changed
Features
- ocm-cli: Add file and keychain credential backends with auth commands (#327)
- Frontend: Mobile-friendly config editor with find bar and unsaved-changes guard (#326)
- Docker: Run container as host user with bind-mounted workspace (#328)
- Repos: Graphical folder picker for adding local repositories (#324)
Fixes & Improvements
- Simplify OpenCode upgrade to always restart and refresh version
- Refactor health checks to use OpenCode liveness endpoint
- Fix question prompt not rendering for active session (#325)
- Forward upstream OAuth error contract and persist recovered config (#331)
- Invalidate branches cache after fetch and pull in source control
- Make the frontend typecheck script actually check types (#329)
Full Changelog: v0.15.0...v0.16.0
v0.15.0
Features
- ocm-cli: Session Warp — Warp into sessions with progress reporting. (#314)
- ocm-cli: Remote Indicator — TUI shows a remote indicator when attached to Manager. (#313)
- ocm-cli: Session Move — Move sessions with local history export and TUI plugin. (#304)
Fixes
- fs: EACCES-tolerant mkdir — Workspace dir creation tolerates existing targets with wrong ownership; permission errors surface on first write instead of startup. (#319)
- fs: mkdirSafe recursive — Unified on
mkdirSafefor SSH keys/config dirs, dropping the try/access/mkdir pattern. - frontend: crypto.randomUUID fallback — Added fallback for non-secure contexts. (#318)
- frontend: ScheduleJobDialog render loop — Stabilized render loop and improved accessibility. (#315)
- session: 404 fallbacks + SSE-gated polling — 404 handled with not-found fallbacks; message polling gated on SSE. (#316)
- session: unified prompt sends — Prompt sends unified on
prompt_async; stale network banners suppressed. - schedules: permission ruleset format — Array-based permission ruleset format for OpenCode v1.16+. (#309)
- mirror: empty commit uploads — Reject empty commit uploads. (#303)
- cors: WebView origin reflection — Reflect origin for WebView routes using Bearer auth.
- ocm-cli: plugin installer / peer deps — Bundled TUI with solid plugin, declared peer deps, included plugin installer in package.
Chores
- Style polish: removed REMOTE label, host shown in accent color with repo name.
- Documentation screenshots recaptured at 2x legibility.
v0.14.6
Features
- Session Pinning — Pin important sessions to a dedicated section at the top of the session list. Unpin anytime. (#301)
- Server Restart & Health — Graceful restart coordination with automatic session resume, live health status indicator in Settings. (#300)
- Schedule Permissions & Workspace Tracking — Configure allowed file access and blocked bash commands per schedule. Workspace ID tracking on runs. (#297)
Fixes
- Migration runner version-name mismatch detection — The runner now warns when a recorded migration's name differs from the code migration at the same version, preventing silent skips.
Chores
- Test suite cleanup: removed 229 lines of dead/redundant tests, rewrote SessionDetail polling test to exercise real gating. (#299)
- Full documentation and screenshots for session pinning, server health, schedule permissions, skills, and worktree isolation features.
v0.14.5
v0.14.5 (2026-06-29)
Features
- Add schedule worktree isolation for running jobs in isolated worktrees (#295)
- Add repo rename capability with custom name field (#294)
- Add bundle-based OCM mirror sync (#289)
Fixes
- Reconcile confirmed prompt on message fetch to clear stale send errors (#296)
- Add mobile bottom padding to prompts tab and show edit/delete buttons on touch (#293)
- Filter source control commits by branch (#286)
- Follow up prompt preservation changes (#292)
- Allow saving edited PAT credential when reusing existing token
Refactors
v0.14.1
What's Changed
Features
- Directory Files Upload — upload markdown files from local folders as OpenCode commands and agents via the Settings UI (file or folder picker)
- Deferred Restart Model — config saves, skill CRUD, and directory file operations return
restartRequired: trueinstead of restarting the server immediately. An amber "Restart Now" banner appears when a restart is pending vcs.branch.updatedSSE Handling — the frontend now reacts to branch-change events from the OpenCode server, keeping git status caches in sync
Refactors
- Cache Invalidation Consolidation —
invalidateRepoGitCaches,setRepoGitStatusCaches,invalidateRepoGitCachesDebouncedhelpers replace scattered per-call-site invalidation; all 8+ git mutation sites migrated - Skills Service Trim — directory config management extracted from
skills.tsto new dedicated service;normalizeInstallRelativePathunified into sharednormalizeUploadRelativePath - Upload Utilities Extracted —
parseUploadManifest/readUploadedManifestFilesshared between skill install and directory file upload routes useCommands→useQuery— migrated fromuseState/useEffectto React Query withinitialData- Touch Handling Consolidation — new
useTouchTapSelecthook replaces inline touch-tap logic inCommandSuggestionsandMentionSuggestions useRefreshOnOpenHook — reusable pattern for refreshing stale data when panels/sheets openRestartServerDialogSimplified —isSavingprop removedOpenCodeConfigManagerLayout Fix —min-h-0,safe-area-inset-bottomsupportSettingsListEmpty State — improved sizing constraints (max-h-40,min-h-24)
Fixes
- Visual Viewport Detection — added
isTextInputFocusedguard, additional event listeners forfocusout/pageshow/visibilitychange - ModelQuickSelect Styling — variant selector trigger restyled as compact button with chevron
- Docker Workflow —
workflow_dispatchtrigger added;vprefix stripped from OpenCode version
Commits
- feat: directory files upload system, deferred restart model, cache invalidation consolidation, and misc improvements (#281)
- chore: add workflow_dispatch to Docker build workflow
- fix: strip v prefix from opencode version in Docker workflow
Full Changelog: v0.14.0...v0.14.1
v0.14.0
Highlights
Skill Installer
You can now install skills directly from GitHub repos or upload custom skills, all from the Settings UI. Supports installing from GitHub tree URLs (e.g., github.com/user/repo/tree/main/skills/teach), overwrite conflict detection, search/filter by scope (all/project/global), and a unified skill library list. Includes a new backend GitHub utility (githubFetch) and shared schemas for install requests/responses. (#279)
Unified Settings Editor Layouts
Extracted a reusable <SettingsList> / <SettingsListRow> UI component and applied it across AgentsEditor, CommandsEditor, McpServerCard, OpenCodeModelsEditor, and the skills list. Every settings panel now shares consistent loading, empty, error, and scroll states. Cards/DropdownMenus replaced with a unified pattern. Plus a new <RestartServerDialog> for explicit server restart prompts. (#280)
Offline Resilience
Major rework of the app's failure handling:
- Prompt text is now preserved across network errors and stored in the error state for recovery
- Removed optimistic message insertion (no more ghost messages in the chat on network failure)
- Gateway timeout (HTTP 524) is silently swallowed instead of showing error toasts
- SSE connection timeout (10s) recovers from connections that never open
- Service worker fully rewritten with build-hash-based precaching, app shell (network-first), runtime asset cache (cache-first), and smart cache invalidation on SW activation
- New
swPrecacheManifestVite plugin auto-generates the precache manifest at build time - Service worker update checks run on visibility change, window focus, and a 1-minute interval (was 1 hour)
- New
<RouteErrorBoundary>with "You're offline" state and retry/auth actions (#276)
Config Dropdown Improvements
The config selector no longer auto-applies on dropdown selection. Instead, an explicit "Apply" button appears for non-active configs. The active config shows "(Active)" labeling, and a new confirmation dialog prompts before restarting the server when a default config is updated. (#275)
Docker Build Rework
The Dockerfile now downloads the OpenCode binary directly from GitHub releases instead of running the install script (avoids GitHub API rate limits). Proper architecture detection for arm64 vs x64. (#274)
Full Changelog
Features
- Skill installer with GitHub tree and upload support (#279)
- Unified
<SettingsList>component for all settings editors (#280) - Explicit "Apply" button for config selection (#275)
Fixes
- Preserve prompt text on network errors and allow offline typing (#276)
- Remove optimistic ghost messages in chat on failure (#276)
- Swallow gateway timeout (524) without error toasts (#276)
- SSE connect timeout to recover from stalled connections (#276)
- Avoid GitHub API lookup during Docker opencode install (#274)
- Avoid auto-applying OpenCode config on dropdown selection (#275)
Refactors
- Extract
SettingsListcomponent with reusable loading/empty/error states (#280) - Unify
AgentsEditor,CommandsEditor,McpServerCard,OpenCodeModelsEditorlayouts (#280) - Extract
RestartServerDialogfrom inline server restart logic (#280) - Remove
RepoSkillsListin favor of unified skill library (#279)
Service Worker & Offline
- Build-hash-based precaching with Vite plugin (#276)
- App shell (network-first) and runtime asset cache (cache-first) strategies (#276)
- Smart cache invalidation on SW activation (#276)
- Faster SW update detection (1min interval + visibility/focus events) (#276)
Infrastructure
- Docker: direct binary download with arch detection (#274)
- New
githubFetchutility for GitHub API calls (#279) - New shared schemas:
InstallSkillFromGithubRequest,InstallSkillUploadRequest,InstallSkillResponse(#279)
Tests
- 7 new test files:
settings-list.test.tsx,AgentsEditor.test.tsx,CommandsEditor.test.tsx,McpServerCard.test.tsx,OpenCodeConfigManager.test.tsx,RestartServerDialog.test.tsx,opencode-errors.test.ts - Updated tests for
SkillsEditor,RepoSkillsDialog,useSendPrompt,openCodeEventStream,SessionDetail - 371-line test for skill install routes, 429-line test for skills service
New files: 18 | Modified files: 39 | Deleted files: 1 | +4,102 / -1,087