- README: rewrite config/skills sections for named volume and auto-deploy, add Context7 MCP docs, update all opencode.json→opencode.jsonc refs, add SKILLSET_CONTAINER_PATH to env var table - CHANGELOG: add v1.14.32b entry documenting breaking changes and features - AGENTS.md: update file roles, add skillset and config volume conventions - DOCKER_HUB.md: regenerated (drop Context7 and Shell defaults sections to stay within 25KB Docker Hub limit) - generate-dockerhub-md.py: add Context7 (drop) and Shell defaults (drop) to SECTION_RULES
26 KiB
Changelog
All notable changes to the opencode-devbox container image.
Tags follow v{opencode_version}[letter] — bare tag for the first build on a new opencode release, letter suffix (b, c, …) for container-level rebuilds on the same version. See AGENTS.md for details.
v1.14.32b — 2026-05-02
Named volume for opencode config, skillset auto-deploy.
- Breaking:
~/.config/opencode/now uses a named volume (devbox-opencode-config) instead of a host bind mount. The container's config, skills, and instructions are independent from the host. Users who relied on the bind mount should either re-add it explicitly in their compose file (overriding the volume) or migrate hand-edits into the container. - Breaking:
~/.agents/skills/is no longer bind-mounted from the host. The container manages its own skills directory — the entrypoint deploys skills from the skillset repo on each start. - Feature: Skillset auto-deploy on container start. The entrypoint runs
deploy-skills.sh --bootstrap --prune-stalefrom the first skillset repo found at:$SKILLSET_CONTAINER_PATH→~/skillset→/workspace/skillset. Creates relative symlinks that resolve inside the container regardless of host path layout. Idempotent. - Env: New
SKILLSET_CONTAINER_PATHenv var for specifying skillset repo location inside the container when it's not at/workspace/skillset. - Docs: README updated for named volume config, skillset auto-deploy, Context7 MCP server,
opencode.jsoncreferences.
v1.14.32 — 2026-05-02
Bump opencode to 1.14.32.
Upstream release notes (core): shell-mode input in the prompt is editable again (backspace, cursor keys); HTTP API workspace adapters no longer lose instance context, restoring workspace create/sync/routing; experimental workspace creation requests that omit extra are fixed; OpenAPI parameter schemas now match the public API so generated clients stop drifting; unsupported image formats fall back to text reads instead of being sent as image attachments; agents can use the global temp directory without extra permission prompts; Bedrock sessions that include reasoning content no longer break when switching models; session archive timestamps reject non-finite values to avoid invalid JSON.
Upstream TUI notes: reduced startup theme flashing under the system theme, and the animated logo avoids subpixel rendering on terminals without truecolor support.
No image-level changes beyond the opencode bump.
v1.14.31d — 2026-05-01
CI: collapse per-arch matrix back into single multi-arch push jobs.
- Fix:
v1.14.31c's per-arch matrix build jobs failed onUpload digestwithGHESNotSupportedError: @actions/artifact v2.0.0+, upload-artifact@v4+ and download-artifact@v4+ are not currently supported on GHES. Gitea Actions only implements the v3-compatible artifact API;@v4uses a GitHub-Enterprise-specific backend. Separately,build-omos linux/arm64hung silently for 12 minutes in "Set-up job" and then failed with no log output — likely catthehacker image-pull contention between concurrent matrix children on the same runner host.- Rather than downgrade to
actions/{upload,download}-artifact@v3, collapsed the per-arch matrix entirely.docker/build-push-action@v7withplatforms: linux/amd64,linux/arm64publishes a proper multi-arch manifest in a single job, so the whole artifact-passing andimagetools createmerge dance existed only to support a matrix split we no longer need. - The original matrix split was designed around
load: truedisk exhaustion (v1.14.30b). Withpush-by-digest/push: truestreaming straight to the registry — no local unpack — the peak disk story is fundamentally different. Validated in v1.14.31b that the reclaim step gives sufficient headroom for a single-job amd64 build; oracle-reviewed call that this should extend to the combined amd64+arm64 push case. - Workflow goes from 7 jobs to 5 (smoke-base, smoke-omos, build-base, build-omos, update-description). 263 → ~110 lines of YAML in
docker-publish.yml.
- Rather than downgrade to
- Add:
timeout-minutes: 90on both build jobs so a hung arm64 build produces an explicit failure with logs rather than runner-default silent truncation. - Add:
BUILDKIT_PROGRESS=plainat workflow level so arm64-under-QEMU build output is line-by-line (the default collapsed progress UI was obscuring earlier stalls). - Add:
AGENTS.md §CI quirksdocuments the Gitea-specific traps encountered this week:upload-artifact@v3-only on Gitea,/bin/shis dash,build-push-action@v7does multi-arch natively with comma-separated platforms, reclaim step is mandatory onload: truejobs. - No image changes. Rebuild of v1.14.31 content only.
v1.14.31c — 2026-05-01
CI: fix bash-specific parameter expansion and bump omos size threshold.
- Fix:
Derive platform slugstep in the per-arch matrix build jobs (build-base,build-omos) used${PLATFORM_PAIR//\//-}which is a bash parameter-expansion. The runner container executes step scripts via/bin/sh(dash), which errored withBad substitution. Rewrote usingtr / -which is POSIX and behaves identically. Bothbuild-baseandbuild-omosmatrix jobs were blocked on this onv1.14.31b. - Fix: smoke-test image-size threshold for the
omosvariant bumped from 3000 MB to 3200 MB. The mempalace-toolkit bake-in added ~100 MB to omos; measured 3107 MB onv1.14.31b. All functional smoke checks (opencode, node, mempalace CLIs, toolkit wrappers, oh-my-opencode-slim) pass — this is a guardrail recalibration, not a performance concession. The underlying image genuinely grew. - The runner-disk reclaim step from v1.14.31b did its job:
smoke-baseandvalidate-basenow pass cleanly. Onlysmoke-omoswas blocked this iteration, and only on the threshold. - No image changes beyond what shipped in v1.14.31. Rebuild of v1.14.31 content only.
v1.14.31b — 2026-05-01
CI: reclaim runner disk before load: true smoke builds.
- Fix: v1.14.31's publish workflow and the
validateworkflow both hitNo space left on deviceon the single-arch amd64 smoke/validate builds (/opt/uv-tools/mempalace/lib/python3.13/site-packages/hf_xet/hf_xet.abi3.so,/usr/local/bin/git-lfs). Root cause is not the build itself but theload: truestep: peak disk during export equals tarball + unpacked image + buildx cache, and the image has crossed the ~3 GB threshold where this no longer fits in the ~12 GB of free space the runner container starts with. The v1.14.30c refactor split multi-arch into per-arch push-by-digest jobs (which don'tload), but the smoke gates still do and still hit the wall.- Added a
Reclaim runner diskstep to all fourload: truejobs (validate-base,validate-omos,smoke-base,smoke-omos). The step stripscatthehacker/ubuntu:act-latest-resident toolchains we never use (hosted-tool-cache, dotnet, android, powershell, swift, ghc, jvm, microsoft, chromium, boost) and runsdocker system prune -af --volumes+docker builder prune -afagainst the runner's dockerd beforesetup-buildx-action. Expected reclaim is 6–12 GB depending on what's resident. - Added workflow-level
concurrency: { group: ..., cancel-in-progress: false }ondocker-publish.ymlso concurrent tag pushes can't racedocker system prunein one job against an in-flight buildx cache in another. - Pruning is deliberately kept out of the per-arch matrix push-by-digest jobs (
build-base/build-omos) — those don't need it (noload: true), and pruning in parallel jobs risks one job nuking another's cache.
- Added a
- Follow-up (not in this release): image-size reduction via a dedicated
uv tool install mempalacebuild stage (strips uv's cache from the final image), pinningmempalace-toolkitto a commit SHA with--depth=1 --filter=blob:none, and auditing whetherhf_xetis actually required by mempalace at runtime. These will ship in the next release that rebases on a new opencode version. - No image changes. Rebuild of v1.14.31 content only.
v1.14.31 — 2026-05-01
Bump opencode to 1.14.31.
CI infrastructure: split multi-arch publish across separate runners.
- Fix: The
publishworkflow exhausted runner disk space onv1.14.30band would have hit the same wall on any subsequent release. Both variants built both architectures on a singlecatthehacker/ubuntu:act-latestcontainer with ~40 GB of shared overlay space, and the peak disk footprint during the nodejs dpkg unpack / git-lfs layer export pushed it over the edge (No space left on device). The mempalace-toolkit bake-in from v1.14.30b added the final straw; the underlying issue is that QEMU-emulated arm64 layers were stored alongside the amd64 build on the same runner.docker-publish.ymlrefactored to the canonicalpush-by-digest+ manifest-merge pattern: smoke test (amd64) runs on its own runner, each(variant × arch)push target runs on its own fresh runner withoutputs: type=image,...,push-by-digest=true,push=true(no local image store), then a tiny merge job assembles the multi-arch manifest withdocker buildx imagetools createfrom digest artifacts.- Per-runner disk peak is now roughly one-quarter of the old single-job peak. The four Docker Hub tags produced per release (
vX.Y.Z[n],latest,vX.Y.Z[n]-omos,latest-omos) are unchanged. - Also parallelizes the amd64 and arm64 builds, so wall-clock time for a release should drop noticeably despite the added merge hop.
v1.14.30b — 2026-04-30
Bake mempalace-toolkit wrappers into the image.
- Fix: The scheduler templates in mempalace-toolkit's
contrib/assumemempalace-sessionis available inside the container, but the image never actually installed it. Users following the*-devboxscheduler docs would silently lose the wrappers on everydocker compose up --force-recreate, because the only way to get them was a post-hoc./install.sh --yesinside the container — which lives in the ephemeral layer. The host-side systemd timer would then fire,docker execin, and hitmempalace-session: command not found. Caught during runtime validation on 2026-04-30.- New Dockerfile block clones
mempalace-toolkitat build time (depth-1) to/opt/mempalace-toolkit/, symlinksbin/mempalace-sessionandbin/mempalace-docsinto/usr/local/bin/, and asserts both respond to--helpbefore the layer succeeds. - Gated by
ARG INSTALL_MEMPALACE_TOOLKIT=true(defaults on, depends onINSTALL_MEMPALACE=true). - Floated ref via
ARG MEMPALACE_TOOLKIT_REF=main— override for reproducible builds once the toolkit starts tagging releases.
- New Dockerfile block clones
- Tests: Smoke test gains three toolkit assertions (
mempalace-session --help,mempalace-docs --help, symlink target check). The resolved-versions preamble now logs the toolkit git short-SHA alongside the other floated components. - Docs: README's MemPalace section gains a
Scheduled mining (mempalace-toolkit)subsection covering the new wrappers and pointing atcontrib/for scheduling. New build-args table entry forINSTALL_MEMPALACE_TOOLKIT.
v1.14.30 — 2026-04-30
Bump opencode to 1.14.30.
v1.14.29c — 2026-04-29
Drop redundant mempalace-mcp-server wrapper, use the entry point mempalace ships.
- Fix: MCP integration with mempalace was still broken for users with custom
opencode.jsonfiles because they typically had["python3", "-m", "mempalace.mcp_server"]from v1.14.28b and earlier. With the uv-tool install path, system python3 can't import mempalace and the MCP server subprocess exits immediately — opencode surfaced this asMCP error -32000: connection closed. Users should migrate to["mempalace-mcp"]. The auto-generated config in new containers already emits the new form. - Cleanup: Remove the hand-rolled
/usr/local/bin/mempalace-mcp-serverwrapper. The mempalace Python package ships amempalace-mcpconsole entry point;uv tool installplaces it on PATH as a shim whose shebang points at the isolated venv's Python. The wrapper was duplicating what uv installs for free. Removedrootfs/usr/local/bin/and its COPY + chmod lines from the Dockerfile. - Docs: README's MemPalace section now shows
["mempalace-mcp"]and explicitly warns against["python3", "-m", "mempalace.mcp_server"]with the observed failure mode. - Tests: Smoke test asserts
/usr/local/bin/mempalace-mcpis executable and prints its symlink target, replacing the previous wrapper-present check.
v1.14.29b — 2026-04-29
Fix OMOS bunx detection + CI build reliability.
- Fix:
entrypoint-user.shcheckedcommand -v bunxto gate the OMOS auto-install, but the OMOS image only ships thebunbinary — upstream's bun installer never creates abunxsymlink and neither did our Dockerfile. The check always failed on a fresh OMOS image, sobun x oh-my-opencode-slim@latest installnever ran and first-start OMOS setup would have printedENABLE_OMOS=true but bun is not installed.even though bun was right there. Latent until now because the only exercised path had a persistedoh-my-opencode-slim.jsonfrom a prior install.- Changed the gate to
command -v bun. - Changed both install invocations from
bunx oh-my-opencode-slim@latest install ...tobun x oh-my-opencode-slim@latest install .... - Added
ln -sf bun /usr/local/bin/bunxto the Dockerfile's OMOS block so interactive users can still typebunxby habit, and verified the symlink at build time (test -L /usr/local/bin/bunx). - Smoke test now asserts the
bunxsymlink is present on the OMOS variant.
- Changed the gate to
- Fix: CI build robustness against transient GitHub/Gitea CDN failures. The first attempt at building v1.14.29b tripped on a single HTTP 502 from GitHub's release CDN mid-download (
zoxide-0.9.9-x86_64-unknown-linux-musl.tar.gz), failing the entire OMOS build with no retry. Fix applied to every tool-download curl in the Dockerfile:curl --retry 5 --retry-delay 5 --retry-all-errorson both the-fsSLGET requests and the-sIHEAD requests used for/releases/latestredirect resolution. 5 attempts with 5 s back-off eats most transient CDN hiccups without failing the build.- Added
[ -n "$V" ]assertion after each version-resolution step. If the HEAD redirect ever fails to produce a tag name, the build fails fast with an empty-version message rather than trying to download.../v//...and producing a confusing 404. - Same hardening applied to the optional Go install block (go.dev JSON feed + tarball download) and the nodesource apt-repo setup script.
- Security: Added
apt-get upgrade -yto the core-packages RUN step. Picks up any security/CVE fixes published betweendebian:trixie-slimbase-image rebuilds. Paired with the existingupdateandinstallin the same layer so image history isn't bloated. Today this produced0 upgraded(base image is current), but it future-proofs against the next CVE drop.
v1.14.29 — 2026-04-28
Opencode 1.14.29 + infrastructure and maintainability pass.
- Bump opencode to 1.14.29.
- Cleanup: Remove dead
INSTALL_PYTHONbuild arg. Python 3 + pip + venv have been unconditionally installed in the base layer since mempalace was added; the flag was a no-op. Users should useuv(pre-installed) oruvxfor Python tooling. - Fix:
mempalace initinentrypoint-user.shnow uses--yesfor non-interactive operation. Previously the command prompted the user (Your choice [enter/edit/add]:) on first container start, which either hung or printed prompts into the user's terminal. The init is still gated by[ ! -d "$PALACE_DIR/palace" ]so existing palace data from prior versions is preserved untouched on upgrade. - Feature: MemPalace is now installed via
uv tool installinto an isolated venv at/opt/uv-tools/mempalace/, reached through a new/usr/local/bin/mempalace-mcp-serverwrapper. Replaces the previouspip install --break-system-packagesapproach — removes the PEP 668 workaround and keeps mempalace deps out of system Python site-packages. The wrapper is whatgenerate-config.pynow references in the auto-generatedopencode.json. Users with customopencode.jsonfiles should update their mempalace MCP command from["python3", "-m", "mempalace.mcp_server"]to["mempalace-mcp-server"]. - Feature: New
INSTALL_MEMPALACEbuild arg (defaulttrue). Rebuild with--build-arg INSTALL_MEMPALACE=falseto shave ~300 MB off the image when local AI memory isn't needed. - Refactor:
opencode.jsongeneration extracted fromentrypoint-user.shinto a standalone Python script at/usr/local/lib/opencode-devbox/generate-config.py. Easier to read, test, and extend with new providers. Default models are declared at the top of the script rather than hard-coded in bash heredocs. Reducesentrypoint-user.shfrom 176 to 97 lines. Behavior is unchanged — the script preserves the critical guarantee of never overwriting an existingopencode.json. - Perf: Container startup avoids the recursive
chown -Ron named volumes that already have correct ownership. A.devbox-ownersentinel file written after a successful chown lets subsequent starts short-circuit via a singlecat. On volumes with thousands of files (nvim plugins, palace data) this cuts multi-second startup costs to milliseconds. IfUSER_UIDchanges between runs, the sentinel mismatches and the full chown still runs. - CI: New
validateworkflow runs on every push to main and PR — single-arch amd64 build, smoke test, and DOCKER_HUB.md sync check. Catches broken Dockerfile changes without waiting for a tag push. - CI:
docker-publish.ymlnow smoke-tests each variant on amd64 before the full multi-arch push. A failing smoke test blocks the release. - CI: Image size is tracked and fails the build if it exceeds thresholds (base: 2500 MB uncompressed, OMOS: 3000 MB). Makes bloat visible rather than silent.
- Docs:
DOCKER_HUB.mdis now auto-generated fromREADME.mdviascripts/generate-dockerhub-md.py. Editing it directly is a mistake — the--checkstep in CI fails if the committed file is out of sync. Section inclusion is controlled by explicit rules (SECTION_RULES,TRIM_SUBSECTIONS); adding a new section to README forces an explicit keep/drop/replace decision. Keeps the 25 kB Docker Hub limit in sight and eliminates manual sync burden. - Tests: New
scripts/smoke-test.shasserts: (a) all core binaries are runnable and print a version, (b) opencode starts, (c) entrypoint correctly drops to the developer user, (d)generate-config.pyproduces valid JSON with the expected shape, (e)generate-config.pynever overwrites an existing config, (f) bun is present only in the OMOS variant, (g) image size is under threshold. The smoke test also logs resolved versions of every component as its first step so CI output always records what got baked in. - Versioning: All GitHub/Gitea-hosted binaries (gosu, fzf, git-lfs, neovim, bat, eza, zoxide, uv, gitea-mcp) and the go.dev-hosted Go toolchain now default to
latestat build time. Each*_VERSIONARG resolves the newest upstream release by reading the/releases/latestLocation redirect (or the go.dev JSON feed). Previously these were hand-pinned to a specific version, which meant rebuilds didn't pick up upstream CVE fixes until someone remembered to bump the pin. Pinning is still supported — pass--build-arg NVIM_VERSION=0.12.1etc. to lock a specific version. Intentionally still pinned:OPENCODE_VERSION(drives the image tag),NODE_VERSION=22(major only),DEBIAN_VERSION=trixie-slim(OS base).
v1.14.28b — 2026-04-27
- Feature: Add MemPalace local-first AI memory system to base image. Provides 29 MCP tools for semantic search over conversation history, knowledge graph queries, and agent diaries. Palace data persists via optional
devbox-palacenamed volume, ChromaDB embedding model cache viadevbox-chroma-cache. No API keys required. - Feature: Auto-register mempalace MCP server in generated opencode.json (when mempalace is installed and config is auto-generated from OPENCODE_PROVIDER).
- Feature: Add official Gitea MCP server (
gitea-mcp) to base image. Provides 50+ MCP tools for Gitea API (repos, issues, PRs, releases, Actions). Disabled by default — requiresGITEA_ACCESS_TOKENandGITEA_HOSTenv vars.
v1.14.28 — 2026-04-26
Bump opencode to 1.14.28.
v1.14.25 — 2026-04-25
Bump opencode to 1.14.25. Also includes container-level changes since v1.14.22b:
- Add
python3-pipandpython3-venvto base image (fixes Mason LSP installs). - Add
devbox-nvim-datanamed volume for neovim plugin/Mason persistence. - Add
devbox-zoxidenamed volume for zoxide directory history persistence. - Bake devbox-shell bridge line into
/etc/skel-devbox/.bash_aliases. - Add CHANGELOG.md with full release history.
v1.14.22b — 2026-04-23
Fix Mason LSP installs, persist nvim data, devbox-shell bridge.
- Fix: Add
python3-pipandpython3-venvto base image. Mason creates a Python venv per LSP package and pip-installs into it; Debian trixie ships python3 without ensurepip, so venv creation failed and every Mason Python package (ruff, ansible-lint) errored on every nvim start. - Feature: Add
devbox-nvim-datanamed volume at~/.local/share/nvim— Lazy plugin cache and Mason LSP installs now persist across--force-recreate. - Feature: Add
devbox-zoxidenamed volume at~/.local/share/zoxide— zoxide directory history persists across recreates. - Feature: Bake the devbox-shell bridge line into
/etc/skel-devbox/.bash_aliases— hosts using the~/.config/devbox-shell/directory-mount pattern get automatic sourcing without manual setup after recreate.
v1.14.22 — 2026-04-23
Bump opencode to 1.14.22.
v1.14.21 — 2026-04-23
Opencode 1.14.21 + zoxide persistence + multi-user fixes.
- Bump opencode to 1.14.21.
- Fix single-file bind-mount caveat: document the kernel-level inode issue (affects all platforms, not just Docker Desktop).
- Pin project name in default
docker-compose.yml— directory renames no longer orphan named volumes. - Fix volume collision in shared-machine compose: scope project name by
SIGNUM. - Auto-detect OS username (
$USER) for volume isolation in own-account mode. - Document the upgrade ritual for reconciling VM compose files.
- Add multi-user setup pointer in DOCKER_HUB.md.
v1.14.20b — 2026-04-21
Fix [devbox] prompt marker lost on exec bash.
- The PS1 prefix guard used an exported env var that survived
exec bash, but PS1 itself doesn't — so the new shell skipped adding the prefix. Replaced with a substring check on PS1 itself. - Clarify tag-letter convention in AGENTS.md: suffix is the build ordinal,
ais never used.
v1.14.20 — 2026-04-21
Opencode 1.14.20 + PROMPT_COMMAND/zoxide fix.
- Bump opencode to 1.14.20.
- Fix
PROMPT_COMMANDcollision with zoxide:history -a;followed by zoxide's;__zoxide_hookproduced;;which bash rejected on every prompt. Moved history-flush after zoxide init, using newline separator. - Includes all v1.14.19c shell-defaults work (baked
.bash_aliases/.inputrcvia/etc/skel-devbox/, skel-copy on first run,devbox-shell-historynamed volume).
v1.14.19d — 2026-04-21
Superseded by v1.14.20 before building. Tagged but never built.
v1.14.19c — 2026-04-21
Bash history persistence, shell defaults, GID auto-detect.
- Feature: Bash history persists across
--force-recreateviadevbox-shell-historynamed volume at~/.cache/bash. - Feature: Quality-of-life shell defaults shipped in
/etc/skel-devbox/and copied to~/only if absent: prefix history search on Up/Down, 100k-entry timestamped dedup history, coloured case-insensitive tab completion, eza/bat aliases, zoxide/fzf integrations,[devbox]prompt marker. - Feature: Skel-copy pattern — host bind-mounts and in-container customizations are never overwritten on upgrade.
- Fix: Entrypoint now detects workspace UID and GID independently. Hosts with UID 1000 but non-1000 GID (e.g. Debian's
useradddefault GID 1001) get correct group remapping. - Docs: SSH banner-timeout troubleshooting (CGNAT), shell defaults section, skel restore/diff commands.
v1.14.19b — 2026-04-20
Ownership fixes and config/docs refresh.
- Fix: Root-owned parent dirs left behind by nested named-volume mounts. Entrypoint now chowns
.local,.local/share,.local/state,.configbefore leaf mount points. - Fix:
deploy/sync-to-vm.shno longer preserves host GIDs (rsync -a→-rlptDz). - Default model IDs refreshed (claude-sonnet-4-6, gpt-5.4, global Bedrock inference profile).
- Documentation gates oh-my-opencode-slim references to the OMOS variant.
v1.14.19 — 2026-04-20
Bump opencode to 1.14.19.
v1.14.18 — 2026-04-19
Fix Bun download URL: remove non-existent LATEST file fetch.
v1.4.17 — 2026-04-19
Bump opencode to v1.4.17, add file utility to base image.
v1.4.12 — 2026-04-18
Bump opencode to v1.4.12.
v1.4.11 — 2026-04-18
Bump opencode to v1.4.11.
v1.4.7 — 2026-04-17
Bump opencode to v1.4.7.
v1.4.6 — 2026-04-15
Bump opencode to v1.4.6.
v1.4.3k — 2026-04-13
Fix Bedrock config: add AWS_PROFILE to generated config, add .agents/skills to volume ownership fix.
v1.4.3j — 2026-04-13
Upgrade base image from Debian bookworm to trixie (current stable). Bookworm EOL June 2026; trixie supported until 2028/LTS 2030.
v1.4.3i — 2026-04-12
Add rustup for on-demand Rust support, document JS/TS development.
v1.4.3h — 2026-04-12
Add uv package manager to base image for on-demand Python support.
v1.4.3g — 2026-04-12
Fix IPv6 connectivity failures: force IPv4 preference in CI builds.
v1.4.3f — 2026-04-11
Add error handling to Docker Hub description update step.
v1.4.3e — 2026-04-10
Fix CVEs: install git-lfs from GitHub (Go 1.25), document Go versions for gosu/fzf.
v1.4.3d — 2026-04-10
Fix CVEs: install gosu 1.19 and fzf 0.71.0 from GitHub releases instead of Debian packages.
v1.4.3c — 2026-04-10
Fix CVEs: install gosu from GitHub release instead of Debian package (Go 1.19.8 → current).
v1.4.3b — 2026-04-10
Fix entrypoint crash on read-only SSH mount.
v1.4.3 — 2026-04-10
Bump opencode to 1.4.3.
v1.4.2 — 2026-04-10
Initial release. Fix CI: use vars for username, secrets for token.