-
v2026.8.17
StableAll checks were successfulCI / release-scripts (pull_request) Successful in 8ssecurity-scan / SBOM (trivy) (pull_request) Successful in 9ssecurity-scan / Filesystem scan (trivy fs) (pull_request) Successful in 16ssecurity-scan / JS SCA (npm audit) (pull_request) Successful in 17ssecurity-scan / Python SAST (bandit) (pull_request) Successful in 17ssecurity-scan / Python SCA (pip-audit) (pull_request) Successful in 40stest-build / build (frontend) (pull_request) Successful in 58sCI / pre-commit (pull_request) Successful in 59stest-build / build (backend) (pull_request) Successful in 1m5sCI / frontend-test (pull_request) Successful in 1m6stest-build / build (pull_request) Successful in 0sCI / backend-test (pull_request) Successful in 2m34sCI / e2e (pull_request) Successful in 3m46sCI / release-scripts (push) Successful in 6ssecurity-scan / SBOM (trivy) (push) Successful in 11ssecurity-scan / Filesystem scan (trivy fs) (push) Successful in 14ssecurity-scan / JS SCA (npm audit) (push) Successful in 17ssecurity-scan / Python SAST (bandit) (push) Successful in 19ssecurity-scan / Python SCA (pip-audit) (push) Successful in 39sCI / pre-commit (push) Successful in 1m1spublish-main / build (frontend) (push) Successful in 1m0sCI / frontend-test (push) Successful in 1m5spublish-main / build (backend) (push) Successful in 1m14spublish-main / build (push) Successful in 0sCI / backend-test (push) Successful in 2m34sCI / e2e (push) Successful in 3m49srelease-and-deploy / release-scripts (push) Successful in 5srelease-and-deploy / release (push) Successful in 20srelease-and-deploy / pre-commit (push) Successful in 57srelease-and-deploy / build (frontend) (push) Successful in 1m0srelease-and-deploy / frontend-test (push) Successful in 1m0srelease-and-deploy / build (backend) (push) Successful in 1m10srelease-and-deploy / build (push) Successful in 0srelease-and-deploy / backend-test (push) Successful in 2m31srelease-and-deploy / e2e (push) Successful in 3m42srelease-and-deploy / ci (push) Successful in 0srelease-and-deploy / deploy (push) Successful in 1m56sreleased this
2026-08-17 19:38:04 +00:00 | 1 commits to main since this releaseReplying in the thread or in the channel
- The chevron next to "Verzend" opens one panel: the destination (thread or
channel) above the scheduling options. The button then reads "Verzend in
kanaal", and the choice returns to the thread every time. - "Markeer kaart als voltooid na verzenden" now applies to "Verzend" too, not
only to a scheduled send. The card completes once the send has gone out, so a
failure or an undo leaves it open. - A scheduled message keeps its destination, and Uitgaande post names it.
- A channel is named in words rather than with a sigil: "In kanaal Town
Square", "Aan @noor". The card breadcrumb drops its "#" too, so a
screenreader hears "kanaal X" instead of "#x". - Fixed: Escape in the scheduling popover closed the whole card.
Preview for text attachments
- A markdown attachment opens in a preview instead of downloading, with a
"Weergave"/"Broncode" switch. - Other text files (.txt, .csv, .json, code, logs) open straight in the source
view, syntax-highlighted where a grammar exists. Classified on the extension
too, because Mattermost reports many of them as octet-stream. - Above 1 MB the preview asks first and names the size; past 5 MB it fetches
only the beginning, so a big file is never transferred whole. - HTML, PDF and text previews now share one window instead of three
hand-rolled ones.
Cards load faster, and show a skeleton
- A loading card shows placeholder bars instead of a half-filled card, and its
quick actions and status tags wait for the message. - Takes it longer than a second, an activity indicator covers and dims the
list. Both follow NLDD's loading guidelines, which rule out a shimmer. - A message that fails to load says "Bericht kan niet worden geladen" instead
of waiting on skeleton bars forever; the card's actions stay usable. - Channel and team labels come from two collection endpoints instead of one
call per channel: four round trips per linked server, whatever the number of
cards. A few hundred cards took over ten seconds to paint before. - Those labels are now cached for an hour across requests; the old per-client
cache never hit, because the client is built fresh per request. - Fixed: a Mattermost token expiring during team lookup read as a server error
rather than a token problem.
Reading the messages around a card
- Opening the panel no longer hides the message you were reading.
- One centred "Berichten laden..." indicator instead of a spinner and a label
scattered across the width, and the panel settles once instead of twice. - A load-more button names its direction while it loads instead of shrinking to
"Laden...".
Under the hood
- An unreachable Mattermost no longer costs one hanging avatar request per
author: the first failure is remembered for a minute, the timeout drops from
15 to 3 seconds, and an upstream failure reads as 502 rather than 500. - An avatar reply that is not an image is refused rather than replaced by a
transparent pixel, which showed as an empty circle where initials belong. - The dev Mattermost mock is installed at startup instead of being reached for
per request:waggleno longer namesdevtoolsin the request path. - The mock can fake a per-call latency (
WAGGLE_DEV_MM_MOCK_LATENCY_MS),
answersposts/idsfor ids it never created, serves/users/me/channelsand
honoursRange. - The dev seed writes refs-only cards like production, instead of a snapshot
nothing reads that showed as one repeated message on every card. - Renovate 44.31.0; fresh nginx-unprivileged digest for the frontend image.
Container images
- The chevron next to "Verzend" opens one panel: the destination (thread or