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