Skip to content

Releases: mtsfoni/construct

v1.0.2

22 Mar 21:33

Choose a tag to compare

Fixed

  • Downloaded binaries now work without a Go toolchainconstruct binaries downloaded from a GitHub release no longer require a Go toolchain on the host. constructd is now embedded directly inside the construct binary at release build time and extracted into the Docker build context at runtime. Dev/local builds (via install.sh) continue to compile constructd from source as before.

v1.0.1

22 Mar 21:22

Choose a tag to compare

This is the first release of a complete ground-up rewrite. v1.0.x shares no code with the v0.x series. The architecture, wire protocol, session model, file layout, and container design are all new — see the README for an overview.

Fixed

  • dood: agent can now access Docker socket — the agent user (running as host UID:GID) was not a member of the docker group inside the container, so docker commands failed with permission denied. The daemon now reads the GID of /var/run/docker.sock and adds it to the session container via GroupAdd.

Changed

  • Linux only — macOS and Windows are not currently supported.

Chore

  • Remove accidentally committed build binaries and add .gitignore.
  • Add release pipeline — triggers on GitHub release publish, builds linux/amd64 and linux/arm64 binaries, uploads them as assets, copies [Unreleased] changelog content as release notes, and commits the changelog update back to main.

v0.9.0

12 Mar 07:20
0dae8af

Choose a tag to compare

Added

  • Auto-port fallback for serve mode — when --serve-port is not specified and the default port (4096) is already in use on the host, construct now automatically picks the next free higher port instead of failing. A yellow diagnostic is printed to stderr: construct: port 4096 is already in use; using port 4097 instead. If --serve-port is specified explicitly, no fallback occurs.

v0.8.0

07 Mar 21:45

Choose a tag to compare

Fixed

  • Session history now scoped per project — previously, opencode's session database (opencode.db) was stored inside a global Docker volume (construct-auth-opencode) that was shared across all repos. This meant the session list showed sessions from every project regardless of which repo construct was launched for. The fix replaces the directory volume mount with a file bind-mount of only auth.json (from ~/.construct/opencode/auth.json on the host). The session database now lives in the per-repo home volume and is isolated to the current project. OAuth tokens in auth.json remain global (shared across repos, survive --reset) so users still only need to authenticate once. Note: opencode.db is now wiped by --reset along with the rest of the home volume.
  • opencode health check timeout after auth.json bind-mount — when Docker bind-mounts a file into a container, it auto-creates any missing parent directories as root. After switching to the auth.json file bind-mount, /home/agent/.local/, .local/share/, and .local/share/opencode/ were created root-owned, so opencode could not write its bin/ directory or .local/state/ siblings and crashed immediately. The fix pre-creates the parent directory (/home/agent/.local/share/opencode/) in the tool image Dockerfile as the agent user — Docker's bind-mount then finds the directory already present and does not recreate it. Requires a one-time --rebuild to pick up the updated image.
  • Health-check timeout now shows container logs and recovery hints — previously, when the opencode server failed to start in serve mode, the only output was server did not become ready: timed out after 15s waiting for …, with no indication of why it failed or what to do. On timeout, construct now retrieves and prints the container's stderr/stdout (which almost always names the root cause directly, e.g. an EACCES error or a missing API key), followed by actionable recovery hints: try --rebuild if opencode just updated, --reset if the home volume is corrupt or stale, or --debug to inspect the container interactively.

v0.7.2

07 Mar 01:04

Choose a tag to compare

Fix Windows build: split dockerSocketGID into platform-specific files

syscall.Stat_t is not defined on Windows. Move dockerSocketGID into
socket_gid_unix.go (!windows build tag) and provide a no-op stub in
socket_gid_windows.go. syscall is still imported in runner.go for SIGTERM.

Generated by construct

v0.6.3

05 Mar 23:57

Choose a tag to compare

Added

  • Richer agent context in AGENTS.md — the generated ~/.config/opencode/AGENTS.md now includes a Workspace section (explaining that /workspace is the user's repo, bind-mounted and immediately visible) and an Isolation section (explaining that the rest of the container is isolated, and that /home/agent persists across sessions via a named volume).

v0.6.0

05 Mar 23:44

Choose a tag to compare

Added

  • ruby stackconstruct-base + Ruby (system package), Bundler, and Jekyll. Use --stack ruby for Jekyll sites and Ruby projects.
  • ruby-ui stackconstruct-ruby + @playwright/mcp + Chromium. Use --stack ruby-ui --mcp for Jekyll/Ruby projects that also need browser automation.
  • Global opencode slash commands — when ~/.config/opencode/commands/ exists on the host, it is automatically bind-mounted read-only into the opencode agent container. Custom slash commands defined globally on the host are now available inside the container without any extra flags.
  • --version flag — prints the construct version (e.g. construct v0.6.0) and exits. Reports construct dev when built without ldflags.
  • ARM64 support for the go stack — the go stack Dockerfile now uses TARGETARCH to select the correct Go tarball, so construct-go builds correctly on both linux/amd64 and linux/arm64 hosts.
  • Automatic image rebuild on version mismatch — stack and tool images are now stamped with an io.construct.version label at build time. On startup, construct compares the label against the running binary version and automatically rebuilds any stale image (one built by a different version, or one that predates this feature and carries no label). Dev builds (no ldflags version) skip the check entirely so local iteration is unaffected.

Fixed

  • --stack default corrected to base — the default was incorrectly left as node (a stack removed in v0.3.0), which would cause an error for users who omitted --stack. It now correctly defaults to base.

v0.5.0

05 Mar 19:37

Choose a tag to compare

Added

  • Changelog-driven release notes — the release pipeline now extracts the
    ## [Unreleased] block from CHANGELOG.md and uses it as the GitHub
    release body. After tagging, the changelog is automatically updated:
    [Unreleased] is renamed to the tag version with today's date, and a fresh
    empty [Unreleased] block is inserted above it. The commit is pushed back
    to main by github-actions[bot].

Changed

  • Agent commits now carry the host user's real git identity instead of the
    synthetic construct agent identity. Author and committer are resolved
    independently using git's own precedence: GIT_AUTHOR_* / GIT_COMMITTER_*
    host env vars take priority, then git config user.name / user.email, then
    the committer falls back to the author (matching git's default behaviour). The
    synthetic fallback (construct user <user@construct.local>) is only used when
    no author identity at all is available on the host, and triggers a warning.
  • A commit-msg hook is injected into the container at startup via
    core.hooksPath. It appends a Generated by construct git trailer to every
    commit message (idempotent — safe with amend and rebase).

v0.4.0

03 Mar 22:07

Choose a tag to compare

[v0.4.0] — 2026-03-03

Added

  • --docker flag — selects Docker access mode for the agent container. --docker none (default) starts no sidecar and sets no DOCKER_HOST, following the principle of least privilege. --docker dood bind-mounts the host socket (/var/run/docker.sock) for Docker-outside-of-Docker access. --docker dind starts an isolated privileged docker:dind sidecar (previous default behaviour). The mode is saved in ~/.construct/last-used.json and replayed by qs. The injected AGENTS.md networking section is tailored to the active mode.
  • dotnet-big stack — new construct-dotnet-big image extending construct-base with the .NET 8, 9, and 10 SDKs installed side-by-side. Use when a project targets multiple .NET generations or must verify cross-version compatibility.
  • dotnet-big-ui stack — new construct-dotnet-big-ui image extending construct-dotnet-big with @playwright/mcp and Chromium. Use with --mcp for projects that need multi-version .NET support and browser automation in the same session.

Full Changelog: v0.3.2...v0.4.0

v0.3.2

01 Mar 21:38

Choose a tag to compare

[v0.3.2] — 2026-03-01
Added

Static dind network alias — the dind sidecar now registers the alias dind on its session-scoped bridge network. DOCKER_HOST is always tcp://dind:2375, matching the hostname already documented in the injected AGENTS.md. This makes the alias real rather than implied and keeps it stable across sessions.

Fixed

dotnet/dotnet-ui stack — libicu70 is now installed in the image, resolving a runtime crash when .NET applications use globalization (ICU mode). Previously .NET would abort on startup with Couldn't find a valid ICU package.

Full Changelog: v0.3.0...v0.3.2