Skip to content

Releases: chriswritescode-dev/opencode-manager

OpenCode Manager v0.17.1

Choose a tag to compare

@chriswritescode-dev chriswritescode-dev released this 27 Aug 13:02

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

Choose a tag to compare

@chriswritescode-dev chriswritescode-dev released this 26 Aug 03:53

What's Changed

Agent sandboxing (opt-in)

  • feat(sandbox): KVM-backed agent sandboxing via microsandbox — OpenCode agent bash tool commands can now run inside an isolated microVM managed by msb instead 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 shell setting by the Manager-owned ocm-sandbox.js plugin, and the sandbox working directory is injected per bash spawn. 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 exec as a single argument, so recorded tool calls, permission rules and model context all keep the original command. Sandboxed calls carry sandbox tool 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 (ships gh, Playwright Chromium, node:24 toolchain) plus docker-compose.sandbox.yml for 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 ocm tool — 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-token file and its tmpfs mask are gone, and attestation now rejects any tmpfs other than the runtime /tmp mount.
  • 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 private mktemp staging directory instead of the predictable /tmp/opencode path; the resolved OpenCode binary is used and its installed version verified; opencode upgrades 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 — /assistant never 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. useSidebarAction is 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

Choose a tag to compare

@chriswritescode-dev chriswritescode-dev released this 11 Aug 04:59

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_async with SSE monitoring — scheduled job runs now dispatch through prompt_async and 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

Choose a tag to compare

@chriswritescode-dev chriswritescode-dev released this 31 Jul 18:09

What's Changed

Bug fix

  • fix(docker): drop startup /app re-chown — removes the recursive chown -R node:node /app that ran on every container start whenever PUID/PGID differed from the build-time uid. /app is 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 reports unhealthy during the 40s start_period.

Full Changelog: v0.16.0...v0.16.1

OpenCode Manager v0.16.0

Choose a tag to compare

@chriswritescode-dev chriswritescode-dev released this 31 Jul 17:59

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

Choose a tag to compare

@chriswritescode-dev chriswritescode-dev released this 24 Jul 03:09

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 mkdirSafe for 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

Choose a tag to compare

@chriswritescode-dev chriswritescode-dev released this 01 Jul 00:00

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

Choose a tag to compare

@chriswritescode-dev chriswritescode-dev released this 29 Jun 15:29

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

  • Simplify RenameRepoDialog styling and remove unused props
  • Extract CredentialProvider service and consolidate git-auth utilities (#283)
  • Remove assistant auto-launch and simplify redirect flow (#282)

v0.14.1

Choose a tag to compare

@chriswritescode-dev chriswritescode-dev released this 20 Jun 04:43

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: true instead of restarting the server immediately. An amber "Restart Now" banner appears when a restart is pending
  • vcs.branch.updated SSE 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, invalidateRepoGitCachesDebounced helpers replace scattered per-call-site invalidation; all 8+ git mutation sites migrated
  • Skills Service Trim — directory config management extracted from skills.ts to new dedicated service; normalizeInstallRelativePath unified into shared normalizeUploadRelativePath
  • Upload Utilities Extracted — parseUploadManifest/readUploadedManifestFiles shared between skill install and directory file upload routes
  • useCommands → useQuery — migrated from useState/useEffect to React Query with initialData
  • Touch Handling Consolidation — new useTouchTapSelect hook replaces inline touch-tap logic in CommandSuggestions and MentionSuggestions
  • useRefreshOnOpen Hook — reusable pattern for refreshing stale data when panels/sheets open
  • RestartServerDialog Simplified — isSaving prop removed
  • OpenCodeConfigManager Layout Fix — min-h-0, safe-area-inset-bottom support
  • SettingsList Empty State — improved sizing constraints (max-h-40, min-h-24)

Fixes

  • Visual Viewport Detection — added isTextInputFocused guard, additional event listeners for focusout/pageshow/visibilitychange
  • ModelQuickSelect Styling — variant selector trigger restyled as compact button with chevron
  • Docker Workflow — workflow_dispatch trigger added; v prefix 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

Choose a tag to compare

@chriswritescode-dev chriswritescode-dev released this 18 Jun 14:49

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 swPrecacheManifest Vite 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 SettingsList component with reusable loading/empty/error states (#280)
  • Unify AgentsEditor, CommandsEditor, McpServerCard, OpenCodeModelsEditor layouts (#280)
  • Extract RestartServerDialog from inline server restart logic (#280)
  • Remove RepoSkillsList in 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 githubFetch utility 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