v0.4.47
Signedpublished September 24, 2026What changed
- The file explorer can move files and folders by drag and drop: drop onto a
folder, the
..row, or any folder in the path at the top. A move never overwrites, so a name already taken at the destination is reported instead. - The file explorer can select several entries at once, with the checkbox on each row, Ctrl/Cmd+click, Shift+click for a range, or Ctrl/Cmd+A. The toolbar then downloads or deletes the selection, and dragging a selected entry moves all of them.
- The Git client shows full file paths. File lists in Changes and in a commit's details put the file name on its own line with its folder beneath it, and wrap long paths instead of cutting them off. Each file has a colored status letter (added, modified, deleted, renamed), and in a commit its lines added and removed. Diff file headers wrap too.
- The Log tab puts commits beside their details on more screens, and the commit list scrolls on its own so the selected commit stays in view. The list shows up to two lines of each commit's subject and the details show all of it. Branch and tag names get a badge each. Clicking a file in a commit jumps to its diff every time, including the same file twice, and does so immediately even in large commits.
- The Git client's Changes tab can show the whole file: "Whole file" in the diff toolbar shows every line with the changes marked, instead of just a few lines around each change. The setting is remembered. Untracked files now show their contents too, instead of "No changes to preview".
- Deleting a workspace removes its repositories from the Git client's Recent list. Entries left behind by workspaces deleted earlier are cleared on upgrade.
- The Git client's diff view is easier to read. Syntax-highlighted lines no longer appear as dark boxes on the light theme, and code colours follow the light or dark theme. Added and removed lines are tinted green and red, with stronger line-number gutters and +/- markers. Each hunk header shows the enclosing function, and each file header shows a change bar plus a New file, Deleted or Renamed label. Words are highlighted within a line only when the old and new lines still resemble each other. The diff no longer shows an extra empty line after the last line of a file.
- The Git client's side-by-side panes can be resized. Drag the divider between the changes list and the diff, between the commit list and a commit's details, or between a commit's files and its diff. Widths are remembered in your browser. Double-click a divider to reset it, or focus it and use the arrow keys.
Container images
Installer files
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.47 -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.47
asset docker-compose.yml 55 f9e9dc571a02a77b699ef5f920aeb3e9e52afd1c6a32ed03310e271a7b5fa966
asset install.sh 55 a9281d39a317586bddd3246db8f20578dc3f3c01064b9606da2b1cc937eb43b1
asset traefik-dynamic-http.yml 54 09d88c6184e1b46b8036d79a075df5c058c8a010bce486537398b5d4b6c2936e
asset traefik-dynamic.yml 55 54c85ea3c4bc1e73de71dac019e4242cdfe7320dcd1f1aa17a5d639e4dd325ac
asset uninstall.sh 55 287ed1ff0ece38bd7da9d9b88d67923b48e75b934500900a0905477169a33151
image devgrail-container 35 amd64 9020aa8337f6b63afd7a8e54b07267cdc51a0ca901453f6b13a09b020042b230
image devgrail-container 35 arm64 e6cc907ce93f056f8fc8b2f7b23cbbe3b50bad19da53f4a790ff8ef8cbfec239
image devgrail-desktop 1 amd64 68bf04883024d21245a452d69128bcc6604894a49b963c50cdf2df034e4cf409
image devgrail-server 71 amd64 0facfeb0e343c2ede632413b6ffc8007dd1fc875130eb893fa9e0687f3dea91a
image devgrail-server 71 arm64 f76ea5aee204d22b2fa06f6f66110014e270bc9c7f4c7136ad718f7d9f4e8f5f