All releases

v0.4.45

Signedpublished September 23, 2026

What changed

  • The browser desktop now has a compact noVNC control tab for full screen, Ctrl+Alt+Delete, scaling, remote resizing, and view-only mode.
  • Esc works inside the browser desktop in full screen. In Chrome and Edge, full screen now captures the keyboard, so Esc and shortcuts like Ctrl+W go to the desktop; hold Esc to leave full screen. Firefox and Safari always leave full screen on Esc, so the control tab adds a Send Esc button, and a Fill window mode that covers the browser tab without full screen. Combine Fill window with the browser's own full screen (F11) and Esc reaches the desktop there too.
  • Pasting into the browser desktop works. Ctrl+V (also Ctrl+Shift+V and Shift+Insert) now hands your local clipboard's text to the desktop before the keystroke arrives, so the desktop pastes what you just copied rather than whatever its own clipboard held. On a Mac, Cmd+V hands the clipboard over, and Ctrl+V then pastes it inside the desktop.
  • Copying out of the browser desktop works too. When you copy text inside the desktop, a notice shows a preview of it with a Copy to this computer button, and the control tab keeps the last copy. Text only lands on your own clipboard when you click: the workspace is not trusted, so it never gets to replace your clipboard silently. Highlighting text in the desktop no longer counts as copying it (desktop image change).
  • Workspace owners can now set or generate a new SSH password from the container detail page. A running workspace uses it immediately; a stopped workspace uses it when next started. Desktop workspaces use the same password for RDP login. A chosen password needs at least 16 characters, with at least 8 different ones, because it guards an SSH port that is reachable from the internet.
  • Workspace SSH now drops unauthenticated connections after 30 seconds and limits how many can be open at once, which slows password guessing. It applies to workspaces created after the upgrade.
  • One workspace can no longer delay other workspaces from starting. A workspace that stalled while its SSH credentials were being applied used to hold up credential updates, and so starts, for every account. Each workspace now waits only on itself, and a stalled update gives up after 30 seconds.
  • The terminal and desktop routes now always authorize the request Traefik is actually routing. They no longer accept forwarded-request headers a client could supply.
  • Optional desktop workspaces. Install the signed desktop image with --desktop-image=yes, then select it when creating a workspace. XFCE with Yaru opens in the workspace's Desktop tab; native RDP reaches the same session through an SSH tunnel. Firefox is included in the amd64 image. The regular workspace image remains the default.
  • Admins can now keep users off desktop workspaces. The desktop image is an ordinary entry on the Container images page, and it is there after upgrading, so nothing changes until you remove it. Once it is removed, new desktop workspaces cannot be created. Existing ones keep running.
  • Restoring a snapshot as a new workspace in exact mode now needs the image the snapshot was built on to be permitted by the allow-list, the same rule as creating a workspace. Before, an exact restore skipped the allow-list.
  • The desktop image now checks Mozilla's apt signing key against its published fingerprint and installs a pinned Firefox version, like every other download in the workspace images. Its display server is also explicitly kept off the network.
  • The Desktop tab now warns that anything in the workspace, including an AI agent, can see and control the desktop. It also warns that the browser's cookies and saved logins are stored in the workspace and its snapshots.
  • Fixed the Desktop tab on installs that serve plain HTTP (TLS off). Its route was missing its authorization gate there, so Traefik refused it and the desktop could not connect.
  • Fixed terminals opened on the desktop not finding claude, codex, agy or other tools installed in ~/.local/bin. Desktop apps now also use the workspace's UTF-8 locale and time zone. This applies to desktop workspaces created after the upgrade, or to existing ones restored from a snapshot onto the new image.
  • Fixed the Desktop tab's noVNC connection, which was trying to open its WebSocket outside the workspace's desktop route and failing to connect.
  • The Desktop tab now loads its noVNC client from the dashboard instead of the workspace. Desktop WebSocket connections require a short-lived token bound to that workspace, and the desktop route no longer serves workspace HTML.

Container images

registry build 35
amd64812 MB
sha256:9020aa8337f6b63afd7a8e54b07267cdc51a0ca901453f6b13a09b020042b230
Download
arm64678 MB
sha256:e6cc907ce93f056f8fc8b2f7b23cbbe3b50bad19da53f4a790ff8ef8cbfec239
Download
registry build 1
amd641.0 GB
sha256:68bf04883024d21245a452d69128bcc6604894a49b963c50cdf2df034e4cf409
Download
registry build 67
amd6446 MB
sha256:7b16b5e73aa62575ee0c389a9444ef8ca5f74fbc03f3f35a7b4b63600120f7eb
Download
arm6445 MB
sha256:2f7dd6b4c1190a0ffaf2efee225e6977821a80c1d26ce5a3aaa0d0d1380336d8
Download

Installer files

docker-compose.yml21 KBsha256:3d2782acc8a2d405964feb3ef7ea3d71ac85285445e20ead88368dea1420c1ba
install.sh179 KBsha256:29a67392fb01c3a016f982c8156bdf60cd5d5300ffa61abd591f8ffed499cfb5
traefik-dynamic-http.yml6 KBsha256:09d88c6184e1b46b8036d79a075df5c058c8a010bce486537398b5d4b6c2936e
traefik-dynamic.yml6 KBsha256:54c85ea3c4bc1e73de71dac019e4242cdfe7320dcd1f1aa17a5d639e4dd325ac
uninstall.sh60 KBsha256:49b845a4613e7b8b37cdfaf7c7541f6d2c531c9af6b8803edbedf7c05f5f6111

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.45 -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 35 amd64 9020aa8337f6b63afd7a8e54b07267cdc51a0ca901453f6b13a09b020042b230' 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.45
asset docker-compose.yml 53 3d2782acc8a2d405964feb3ef7ea3d71ac85285445e20ead88368dea1420c1ba
asset install.sh 53 29a67392fb01c3a016f982c8156bdf60cd5d5300ffa61abd591f8ffed499cfb5
asset traefik-dynamic-http.yml 52 09d88c6184e1b46b8036d79a075df5c058c8a010bce486537398b5d4b6c2936e
asset traefik-dynamic.yml 53 54c85ea3c4bc1e73de71dac019e4242cdfe7320dcd1f1aa17a5d639e4dd325ac
asset uninstall.sh 53 49b845a4613e7b8b37cdfaf7c7541f6d2c531c9af6b8803edbedf7c05f5f6111
image devgrail-container 35 amd64 9020aa8337f6b63afd7a8e54b07267cdc51a0ca901453f6b13a09b020042b230
image devgrail-container 35 arm64 e6cc907ce93f056f8fc8b2f7b23cbbe3b50bad19da53f4a790ff8ef8cbfec239
image devgrail-desktop 1 amd64 68bf04883024d21245a452d69128bcc6604894a49b963c50cdf2df034e4cf409
image devgrail-server 67 amd64 7b16b5e73aa62575ee0c389a9444ef8ca5f74fbc03f3f35a7b4b63600120f7eb
image devgrail-server 67 arm64 2f7dd6b4c1190a0ffaf2efee225e6977821a80c1d26ce5a3aaa0d0d1380336d8