All releases

v0.4.11

Signedpublished August 19, 2026

What changed

Added

  • A house size for new workspaces, set once instead of per workspace. Settings has a Workspace defaults card holding a default CPU limit, a default memory limit and a process limit. Until now the first two did not exist: a workspace created without limits was created with none, so keeping a shared box from being swallowed by one runaway container meant remembering to pick limits every single time — including on the workspaces an agent creates over MCP, where nobody is there to remember. The defaults apply wherever a workspace is created from, and they are a default rather than a ceiling: a workspace that names its own limits keeps them.

    Changing the default never resizes a workspace that already exists. Each one records the limits it was actually given at creation, so what you see on a workspace is what it is running with, and a later change to the house default cannot quietly re-size it on its next restart or rebuild.

    The create form now labels its first CPU and memory option with the default your deployment will really apply — "Default (2)" rather than a flat "Unlimited" that would be untrue as soon as you set one. Picking "Unlimited" explicitly still does what it says.

  • The workspace process limit is adjustable. It caps how many processes one workspace may spawn, so a fork bomb or a runaway build cannot exhaust the host's process table and take every other workspace down with it. It has always been there at 4096 and stays there unless you change it; the reason to raise it is a genuinely build-heavy workspace hitting the ceiling, which previously needed a custom build. There is deliberately no "unlimited" setting — it is a guard on a shared host, not a sizing preference — and it applies to a workspace the next time it is created or recreated.

Container images

registry build 19
amd64747 MB
sha256:f72e7322bc2dd531903ca69efe785c7971f6198243ff414a451dc68c0443178b
Download
arm64621 MB
sha256:6bff127dab39ba5b2339c8aa885248252c4e1d5e10408b988d3ca642a4153804
Download
registry build 19
amd6445 MB
sha256:5136424f4a6cfa17dc93b61439bba20cad941bbdbff93aeb53a6bf8af5005ac5
Download
arm6444 MB
sha256:3df1edbf83f754881f8c680bc505f128d57e357b8a90be9715240bac6f5749f9
Download

Installer files

docker-compose.yml16 KBsha256:5b2a3db83132da5e0611dbfdb9993b03690ae4a13a27bed45f24eba1eb637e67
install.sh123 KBsha256:6122e56cdb0b9f8dc11f6ec5f81644f0c5ed5c4e0da567d72e2ad9d8ab8527aa
traefik-dynamic-http.yml5 KBsha256:e344c8efd13c7d84996e2ebfbc75dcee2d995d8538c8a245c89c0e44fad0089b
traefik-dynamic.yml6 KBsha256:d18fa561b8eb7d53b015284e0246b2d05953bf281b65269c1fae3d6883530db6
uninstall.sh31 KBsha256:d8dc586f38e0cf33eadc126d75b303c660e970e55028f60ad4e2872c40cbaa71

Signature

ecdsa-p256-sha256key f1f1eaf642454d65

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.

Verify devgrail-container (amd64)
curl -fsSL https://web-dev.trixibot.com/api/registry/releases/v0.4.11 -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 19 amd64 f72e7322bc2dd531903ca69efe785c7971f6198243ff414a451dc68c0443178b' 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.11
asset docker-compose.yml 18 5b2a3db83132da5e0611dbfdb9993b03690ae4a13a27bed45f24eba1eb637e67
asset install.sh 18 6122e56cdb0b9f8dc11f6ec5f81644f0c5ed5c4e0da567d72e2ad9d8ab8527aa
asset traefik-dynamic-http.yml 17 e344c8efd13c7d84996e2ebfbc75dcee2d995d8538c8a245c89c0e44fad0089b
asset traefik-dynamic.yml 18 d18fa561b8eb7d53b015284e0246b2d05953bf281b65269c1fae3d6883530db6
asset uninstall.sh 18 d8dc586f38e0cf33eadc126d75b303c660e970e55028f60ad4e2872c40cbaa71
image devgrail-container 19 amd64 f72e7322bc2dd531903ca69efe785c7971f6198243ff414a451dc68c0443178b
image devgrail-container 19 arm64 6bff127dab39ba5b2339c8aa885248252c4e1d5e10408b988d3ca642a4153804
image devgrail-server 19 amd64 5136424f4a6cfa17dc93b61439bba20cad941bbdbff93aeb53a6bf8af5005ac5
image devgrail-server 19 arm64 3df1edbf83f754881f8c680bc505f128d57e357b8a90be9715240bac6f5749f9