v0.4.14
Signedpublished August 24, 2026What changed
Added
-
A dashboard, and it tells you how much room the box has left. The home page is now an overview rather than the workspace list: free memory, free disk, what your running workspaces have been promised, and which of them are actually using it. Disk filling up during a migration is the worst state this product can get into, and until now nothing in the interface would have warned you.
The workspace list has moved to /containers — update any bookmark that pointed at the old home page. Everything on it is unchanged, plus live CPU and memory bars on each running workspace.
-
Live resource usage per workspace. CPU, memory, processes and network for every running workspace, on the dashboard, on each card in the list, and on the workspace's own page. Finding the workspace eating the host no longer means SSHing in and running
docker stats. Readings are taken on demand and briefly cached; nothing is stored. -
Creating a workspace that will not fit is now refused, not discovered later. Ask for more memory than the host has available and the create stops with both numbers, instead of the workspace being killed under pressure some time afterwards. The create form warns before you submit and offers to go ahead anyway — memory limits are ceilings, not reservations, so overcommitting is a legitimate choice, just one worth making deliberately. Agents get the same refusal through
create_container, withconfirm_overcommitto proceed.On a host that cannot report its own memory the check simply does not apply.
-
Agents can publish and withdraw workspace subdomains themselves. Two new MCP tools, Add container subdomain and Remove container subdomain, give an agent the same control the workspace detail page has: expose a port at
<label>.<base-domain>, or stop publishing one and free the label. Grant them to a key on the API keys screen like any other tool.An agent that starts a dev server no longer has to stop and ask you to open the URL for it — it can publish the port, hand you the link, and take it down when the work is finished. Nothing restarts: the workspace, its processes and its terminal sessions carry on untouched. Both tools need a write grant on the workspace, both return the workspace's full subdomain list so the agent can see the resulting URLs, and where a deployment has several base domains the agent can name one (or leave it to the default).
Changed
-
Upgrades no longer re-download a workspace image that has not changed. The workspace image is ~750 MiB and most releases do not touch it, but every upgrade fetched it again anyway — a download of some minutes for bytes already on the disk. A release that leaves the image alone now ships the copy you already have, and the installer says so (
devgrail-container is unchanged in v0.4.14 — keeping v0.4.13) instead of downloading it.Nothing about verification is relaxed: an image is skipped only when the release names the exact build already installed and that build is still what the workspace tag points at, so a host that has rolled back is never told it is up to date. Only the images that genuinely changed are fetched, and the server image — which is stamped with the release it ships in — always is.
-
The installer no longer stops on a prompt when there is nobody to answer it. Run from a container or any other environment with no terminal attached, it could fail with
/dev/tty: No such device or addressinstead of taking the default it already had — it checked that the terminal device existed rather than that it could be opened, and in a container the first is true while the second is not. Unattended installs that supply their answers through the environment are unaffected either way; this only fixes the case that used to stop. -
The workspace image is now built from pinned versions, and it can tell you which ones. Until now the image tracked whatever was newest on build day: the base OS, Node, opencode, Claude Code and Codex all floated, so two builds of the same DevGrail release could ship different tools. A release tag now names one exact set. Every workspace also carries
/etc/devgrail-workspace.jsonlisting what it contains — base image, Node, Python, gh, and the three AI CLIs — so "which version of the agent is in here?" is a question you can answer from inside the terminal, and the same facts are on the image's labels for anyone looking from the host.
Container images
Installer files
Signature
One signature covers every artifact above. It is made off this host, and neither this site nor the registry behind it can check it — that is the point, and it is why verifying it catches things a checksum from the same server cannot. How to verify it.
curl -fsSL https://web-dev.trixibot.com/api/registry/releases/v0.4.14 -o release.json
# -j, not -r: -r appends a newline the signer never saw, and the check fails.
jq -j '.signature.payload' release.json > payload
jq -r '.signature.signature' release.json | base64 -d > payload.sig
openssl dgst -sha256 -verify devgrail-release.pem -signature payload.sig payload
# -> Verified OK
# The payload must name this release, so an older signed one cannot be replayed.
head -2 payload
# ...and it must name this exact file. -qxF: whole line, literal.
grep -qxF 'image devgrail-container 24 amd64 4657a309f66b799f8da65119896ed7953bbb700f0a9f8ef974cf0d45740ed0cf' payload && echo "digest is covered by the signature"The signed payload — shown for reading, not for verifying
Copy this from the manifest with jq -j, never from this page: the signature covers exact bytes, and rendering here drops the trailing newline the signer included.
devgrail-release-signature-v1
release v0.4.14
asset docker-compose.yml 21 25d99bfe1eb947d9f3277067aa9fa776fb3da3b8896e5fcb8737a73e2582dc31
asset install.sh 21 57a946382d304d2a1deb30cc7cf9ceb760f96bf78e190d7e7e13119518d397ac
asset traefik-dynamic-http.yml 20 e344c8efd13c7d84996e2ebfbc75dcee2d995d8538c8a245c89c0e44fad0089b
asset traefik-dynamic.yml 21 d18fa561b8eb7d53b015284e0246b2d05953bf281b65269c1fae3d6883530db6
asset uninstall.sh 21 d8dc586f38e0cf33eadc126d75b303c660e970e55028f60ad4e2872c40cbaa71
image devgrail-container 24 amd64 4657a309f66b799f8da65119896ed7953bbb700f0a9f8ef974cf0d45740ed0cf
image devgrail-container 24 arm64 016f34061e0dabe08d72b8017ca02322e2b1f4e51f6d50ad04ff3b56d33ac283
image devgrail-server 24 amd64 459f6997ebe6e67d5845ba511bf113861d564ae4169b3a43421fb7ad5dede057
image devgrail-server 24 arm64 d8c71ff92985b2ffafd50dd355a7acca1ee5438ee2a2e663d1f2a6a68920c538