• v2026.8.17 78347065d9

    v2026.8.17
    All checks were successful
    CI / release-scripts (pull_request) Successful in 8s
    security-scan / SBOM (trivy) (pull_request) Successful in 9s
    security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 16s
    security-scan / JS SCA (npm audit) (pull_request) Successful in 17s
    security-scan / Python SAST (bandit) (pull_request) Successful in 17s
    security-scan / Python SCA (pip-audit) (pull_request) Successful in 40s
    test-build / build (frontend) (pull_request) Successful in 58s
    CI / pre-commit (pull_request) Successful in 59s
    test-build / build (backend) (pull_request) Successful in 1m5s
    CI / frontend-test (pull_request) Successful in 1m6s
    test-build / build (pull_request) Successful in 0s
    CI / backend-test (pull_request) Successful in 2m34s
    CI / e2e (pull_request) Successful in 3m46s
    CI / release-scripts (push) Successful in 6s
    security-scan / SBOM (trivy) (push) Successful in 11s
    security-scan / Filesystem scan (trivy fs) (push) Successful in 14s
    security-scan / JS SCA (npm audit) (push) Successful in 17s
    security-scan / Python SAST (bandit) (push) Successful in 19s
    security-scan / Python SCA (pip-audit) (push) Successful in 39s
    CI / pre-commit (push) Successful in 1m1s
    publish-main / build (frontend) (push) Successful in 1m0s
    CI / frontend-test (push) Successful in 1m5s
    publish-main / build (backend) (push) Successful in 1m14s
    publish-main / build (push) Successful in 0s
    CI / backend-test (push) Successful in 2m34s
    CI / e2e (push) Successful in 3m49s
    release-and-deploy / release-scripts (push) Successful in 5s
    release-and-deploy / release (push) Successful in 20s
    release-and-deploy / pre-commit (push) Successful in 57s
    release-and-deploy / build (frontend) (push) Successful in 1m0s
    release-and-deploy / frontend-test (push) Successful in 1m0s
    release-and-deploy / build (backend) (push) Successful in 1m10s
    release-and-deploy / build (push) Successful in 0s
    release-and-deploy / backend-test (push) Successful in 2m31s
    release-and-deploy / e2e (push) Successful in 3m42s
    release-and-deploy / ci (push) Successful in 0s
    release-and-deploy / deploy (push) Successful in 1m56s
    Stable

    robbertbos released this 2026-08-17 19:38:04 +00:00 | 1 commits to main since this release

    Replying 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: waggle no longer names devtools in the request path.
    • The mock can fake a per-call latency (WAGGLE_DEV_MM_MOCK_LATENCY_MS),
      answers posts/ids for ids it never created, serves /users/me/channels and
      honours Range.
    • 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