• v2026.6.16 d209132fee

    v2026.6.16
    All checks were successful
    security-scan / Python SCA (pip-audit) (push) Successful in 54s
    security-scan / JS SCA (npm audit) (push) Successful in 32s
    security-scan / SBOM (trivy) (push) Successful in 14s
    CI / release-scripts (push) Successful in 8s
    security-scan / Python SAST (bandit) (push) Successful in 31s
    security-scan / Filesystem scan (trivy fs) (push) Successful in 19s
    CI / backend-test (push) Successful in 4m5s
    CI / frontend-test (push) Successful in 2m29s
    build-containers / build (backend) (push) Successful in 1m45s
    build-containers / build (frontend) (push) Successful in 1m48s
    release / release (push) Successful in 24s
    CI / e2e (push) Successful in 4m7s
    CI / backend-test-postgres (push) Successful in 7m14s
    CI / pre-commit (pull_request) Successful in 41s
    build-containers / build (backend) (pull_request) Successful in 1m38s
    build-containers / build (frontend) (pull_request) Successful in 1m51s
    CI / release-scripts (pull_request) Successful in 9s
    security-scan / Python SCA (pip-audit) (pull_request) Successful in 51s
    security-scan / Python SAST (bandit) (pull_request) Successful in 30s
    CI / frontend-test (pull_request) Successful in 2m53s
    CI / e2e (pull_request) Successful in 3m28s
    security-scan / JS SCA (npm audit) (pull_request) Successful in 36s
    security-scan / SBOM (trivy) (pull_request) Successful in 15s
    CI / backend-test (pull_request) Successful in 4m39s
    CI / backend-test-postgres (pull_request) Successful in 6m47s
    security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 16s
    CI / pre-commit (push) Successful in 42s
    Stable

    robbertbos released this 2026-06-16 21:37:45 +00:00 | 407 commits to main since this release

    Meerdere Mattermost-servers koppelen

    • Veel overheidsorganisaties draaien hun eigen Mattermost-instantie; je kunt
      nu meerdere servers tegelijk koppelen, zodat berichten uit verschillende
      organisaties samen in één Waggle-overzicht komen. Een community-server
      ernaast werkt ook prima. Elke server heeft een eigen token, basis-URL en
      status; de instellingen tonen ze als een lijst met per server token
      vervangen, synchroniseren en loskoppelen.
    • Geef een server een eigen label; laat je het leeg, dan toont Waggle de host
      van de basis-URL als naam.
    • Bij twee of meer gekoppelde servers krijgt de breadcrumb op een kaart de
      server-naam voorop, zodat je ziet uit welke omgeving een bewaard bericht komt.
    • Synchronisatie is per server gescheiden: een verlopen token op de ene server
      houdt het synchroniseren van een gezonde server niet langer tegen, en de
      waarschuwingsbalk benoemt welke server opnieuw gekoppeld moet worden.

    @-vermeldingen

    • Een @naam in een bewaard bericht of thread-reactie toont nu de echte
      weergavenaam. Klik (of Enter) opent een kaartje met foto, functie en
      een knop om de persoon in Mattermost te openen. Werkt met muis,
      toetsenbord en schermlezer. Een onbekende of verwijderde gebruiker
      blijft gewoon als @naam staan.
    • Herkenning blijft binnen het kanaal van de kaart; namen worden alleen
      kort lokaal onthouden en bij uitloggen gewist.

    Onder de motorkap

    Security & CI-hardening:

    • De image-build-gate (trivy image op het gebouwde artefact) draait nu op
      elke PR i.p.v. pas na merge: build + scan zonder push, zodat OS-package-CVE's
      al vóór merge geblokkeerd worden. De frontend-runtime draait daarbij
      apk upgrade (net als de backend al apt-get upgrade deed), zodat
      gefixte base-OS-CVE's bij build-time meekomen i.p.v. te wachten op een
      upstream-rebuild.
    • trivy fs scant nu ook misconfiguraties (Containerfile/compose) naast vuln
      en secret, en de SBOM-generatie is van syft naar trivy verhuisd - één
      CI-dependency minder.
    • CI authentiseert tegen ghcr.io (geen anonymous-pull rate-limit-flakes meer
      op trivy/uv-pulls). Renovate draait via een nachtelijke Forgejo-runner met
      OSV-alerts en een eigen snelle image-digest-lane, zodat base-image-CVE's
      binnen een dag als PR verschijnen. Geen automerge.
    • nginx-base bijgewerkt naar de gepatchte digest met openssl 3.5.7-r0
      (CVE-2026-45447, heap use-after-free in PKCS7_verify, HIGH); de trivy
      image-scan-gate is daarmee weer groen.

    Releases & CI-infra:

    • Releases worden nu automatisch aangemaakt bij een CalVer-tag: de
      release-notes komen uit de bijbehorende CHANGELOG-sectie, en de build faalt
      bewust als die sectie ontbreekt of leeg is.
    • CI-actions grote versie-bumps: actions/checkout v4 -> v6.0.3,
      actions/cache v3 -> v5, actions/setup-node v4 -> v6.4.0 en de frontend
      build-image van node:20 naar node:24.16.0-alpine.
    • CI hergebruikt uv-, npm-, pre-commit- en Playwright-caches tussen runs;
      ~1-2 min sneller per build en minder netwerk-afhankelijk.

    Afhankelijkheden:

    • Backend Python 3.13 -> 3.14 (container, CI-tests en lockfile); dev-Postgres
      16 -> 17, gelijk aan de engine op ZAD en op digest vastgezet.
    • Security-bumps tegen gepubliceerde CVE's: cryptography 46.0.7 -> 49.0.0
      (GHSA-537c-gmf6-5ccf), python-multipart 0.0.28 -> 0.0.32
      (CVE-2026-53537/53538/53539/53540), starlette 1.0.0 -> 1.3.1
      (PYSEC-2026-161, CVE-2026-48817/48818, incl. de bijbehorende
      deprecation-fix), idna 3.11 -> 3.15 (CVE-2026-45409) en cachetools 5.x ->
      7.1.4. pip (dev-tooling) 26.1.1 -> 26.1.2 tegen PYSEC-2026-196, zodat de
      fail-closed pip-audit-stap groen blijft.
    • Frontend: NLDD design-system 0.8.44 -> 0.8.56 - import-, export- en
      account-verwijderen-knoppen tonen tijdens uitvoering een laad-indicator en
      negeren een tweede klik (geen dubbele actie meer). eslint 9 -> 10
      (no-useless-assignment ruimde drie overbodige initialisaties op), TipTap
      3.22.5 -> 3.26.0 plus kleinere bumps. @types/dompurify verwijderd -
      DOMPurify levert sinds 3.0 eigen TypeScript-types.
    • Dev-tooling- en CI-bumps: uv 0.11.14 -> 0.11.19 (incl. UV_SHA256), trivy
      0.70 -> 0.71, @axe-core/cli 4.11.2 -> 4.11.3 en Keycloak (dev) 26.0 ->
      26.6; resterende CI-images vastgepind op digest.
    • Frontend-coverage zichtbaar via @vitest/coverage-v8 (just coverage +
      CI-artefact; baseline 51%, geen drempel).
  • v2026.5.18 2721ddd925

    v2026.5.18
    All checks were successful
    build-containers / build (backend) (push) Successful in 2m8s
    build-containers / build (frontend) (push) Successful in 2m3s
    Stable

    robbertbos released this 2026-05-18 05:03:24 +00:00 | 431 commits to main since this release

    Overig

    • Bewaarde berichten die zijn opgehaald voordat de avatar-versiefunctie
      bestond, tonen weer de echte profielfoto in plaats van de
      initialen-fallback.
    • De sectiekop "Wacht op verzending" heeft nu dezelfde tekstgrootte als de
      andere sectiekoppen, in zowel de inbox als de leeslijst.

    Onder de motorkap

    • Toeleveringsketen-hardening: GitHub Actions, container-basisimages en
      de security-tools (trivy, syft, uv) in CI verankeren nu altijd op een
      onveranderlijke hash - nooit meer een kaal versienummer. Trivy en uv
      draaien waar mogelijk als digest-gepinde container; syft wordt
      geverifieerd tegen een vooraf in de repo vastgelegde sha256. Wijkt een
      hash af, dan stopt de build met een fout. Renovate houdt de digests
      bij. Geen zichtbare wijziging.
    • De gedeelde Mattermost-clientfabriek valideert nu, net als het
      avatar-pad, de opgeslagen server-URL tegen interne adressen
      (verdediging-in-de-diepte; bestaande accounts waren al niet
      kwetsbaar). Geen zichtbare wijziging.
  • v2026.5.17 f99a200c73

    v2026.5.17
    All checks were successful
    build-containers / build (backend) (push) Successful in 1m51s
    build-containers / build (frontend) (push) Successful in 1m59s
    Stable

    robbertbos released this 2026-05-17 19:54:00 +00:00 | 435 commits to main since this release

    @-vermeldingen in antwoorden

    • Je kunt in een antwoord collega's met @ vermelden. Typ @ voor een
      lijst van mensen uit het kanaal van de kaart - personen die je recent
      hebt genoemd staan bovenaan - of typ door om gericht te zoeken. Je
      mag ook een volledige naam met spatie typen, zodat je collega's met
      dezelfde voornaam uit elkaar houdt. Alleen kanaalleden worden getoond;
      staat er meer dan er past, dan meldt de lijst dat je verder kunt
      typen.
    • Heeft iemand geen avatar, dan toont de lijst diens initialen. De lijst
      is volledig met het toetsenbord te bedienen en voor schermlezers
      toegankelijk (gepind kopje, aangekondigde status, zichtbare selectie).

    Weergave van threads en kaarten

    • Lange threads blijven leesbaar: het oorspronkelijke bericht plakt niet
      meer bovenaan, maar scrollt mee met de reacties - een lang bericht duwt
      de reacties niet langer weg.
    • De kaartdetail-weergave benut de schermhoogte beter en houdt op grote
      schermen een vaste, kleine rand aan in plaats van veel loze ruimte.
    • Een duidelijke scheidingslijn tussen het oorspronkelijke bericht en de
      reacties.
    • Kaarten in de leeslijst hebben meer ademruimte op desktop en een
      prettiger regellengte; de lijst en de detailweergave hebben nu een
      consistente, leesbare breedte.
    • De leeslijst heeft nu exact dezelfde breedte als de inbox en het
      zoekveld erboven.
    • Het bericht in de kaartdetail-modal breekt nu ongeveer op hetzelfde
      punt af als in de lijst.

    Mobiel scrollen en slepen

    • Op iOS Safari springt de leeslijst niet meer naar boven tijdens
      scrollen, bij een snelle actie (gelezen of voltooien) of bij het
      herordenen van kaarten.
    • Kaarten herordenen met slepen selecteert niet langer per ongeluk de
      tekst eronder.
    • De pagina verspringt niet meer wanneer de Safari-adresbalk in- of
      uitschuift.

    Overig

    • Emoji-reacties tonen Mattermost-shortcodes nu correct; de reactie-knop
      is compacter.
    • De bubble-up-status wordt server-side bepaald, wat 'm betrouwbaarder
      maakt rond tijdzone- en middernachtgrenzen.
    • De avatar-fallback in de leeslijst is robuuster: geen verspringende
      layout meer en geen losse DOM-manipulatie.
    • Vet en doorhalen werken nu ook met de Mattermost-schrijfwijze, met een
      spatie net binnen de markeertekens (**woord **, ~~woord ~~); eerder
      bleven de tekens dan letterlijk staan.
    • Vetgedrukte tekst is zwaarder gezet, zodat het duidelijker opvalt.
    • Het "Wacht op verzending"-icoon wijst nu vooruit in plaats van terug, en
      de knop om de herstelcode te kopiëren heeft een icoon gekregen.
    • Het Waggle-menu en optioneel het zoekveld blijven nu bovenaan in
      beeld tijdens het scrollen op Focus en de leeslijst.

    Onder de motorkap

    • De instellingenpagina gebruikt nu hetzelfde scroll- en
      sticky-mechanisme als de overige pagina's.
    • De volledige-hoogte-paginaopmaak staat nu in één gedeelde class in
      plaats van per pagina herhaald. Idem voor de iOS-Safari-veilige
      full-height-stijl.
    • Het NLDD-design-system is bijgewerkt naar 0.8.44; codeblokken gebruiken
      nu het JetBrains Mono-lettertype en enkele iconen zijn hertekend.
    • De scheidingslijn in de verzendknop blijft subtiel zichtbaar in
      uitgeschakelde staat, en de lettertype-fallbacks in de tokens verwijzen
      weer naar de juiste namen (RijksSans, JetBrains Mono).
    • Wijzigt iemand zijn Mattermost-profielfoto, dan tonen we voortaan de
      nieuwe foto in plaats van een verouderde uit de browsercache: de
      avatar-URL bevat nu een versiemarkering die met de foto meeverandert.
    • Ongebruikte board-/Kanban-sleepcode (useBoardDnd) verwijderd en de
      resterende Kanban-verwijzingen (verouderde comments, een onjuiste
      release-notitie) opgeschoond: de Kanban-weergave staat niet meer op de
      roadmap en de code was nergens gekoppeld. Geen zichtbare wijziging.
    • Ontwikkelaarsmodus: een dev-login-knop (alleen zichtbaar als
      synthetic-auth aanstaat) en een dev-seed voor realistische lokale
      testdata, met harde beveiliging tegen draaien tegen productie. Deze
      dev-hulpmiddelen zitten niet in de productie-build. De norm voor
      testdata staat nu in de projectdocumentatie.
    • Inbox en leeslijst delen nu een kaart- en lijst-implementatie in
      plaats van twee bijna-identieke kopieen; weergave en gedrag zijn
      ongewijzigd.
  • v2026.5.12 38142ab18d

    v2026.5.12 Stable

    robbertbos released this 2026-05-16 22:23:26 +00:00 | 455 commits to main since this release

    Eerste publieke release. Een persoonlijk command-centrum voor je gevlaggede
    Mattermost-berichten. Iedereen die via Keycloak inlogt krijgt een eigen,
    afgeschermde werkruimte; er zijn geen rollen of beheerderstooling.

    Je berichten ordenen

    • Een focus-overzicht met zes secties - Doe nu, Wacht op verzending, Nieuw,
      Backlog, Later oppakken en Voltooid - plus een aparte leeslijst voor
      referentiemateriaal.
    • Kaarten tussen secties slepen; je volgorde blijft bewaard.
    • Een "Nieuw"-markering op berichten die je nog niet hebt bekeken.
    • Een detailweergave per kaart met de threadcontext, bijlagen, je notities
      en een antwoordveld.
    • Snelacties per kaart: nu oppakken, afronden, uitstellen naar later, een notitie
      maken of antwoorden.

    Mattermost-koppeling

    • Tweerichtingssynchronisatie van je gevlaggede berichten: ze worden
      opgehaald, en als je een kaart afrondt wordt het bericht in Mattermost
      automatisch ge-unsaved (met automatische herhaalpogingen). Andersom
      geldt ook: haal je de vlag weg in Mattermost zelf, dan wordt de kaart
      hier voltooid.
    • Koppelen kan met een persoonlijk toegangstoken (voorkeur) of met je
      browser-sessiecookie, voor omgevingen waar tokens uitstaan (o.a.
      Digilab).
    • Tokens worden versleuteld opgeslagen.
    • Automatisch synchroniseren op een instelbaar interval (1 tot 60 minuten,
      standaard elke 5 minuten).
    • Avatars en bestanden lopen via de server, zodat je Mattermost-
      inloggegevens nooit in de browser belanden.
    • Per kaart de volledige thread inzien, met een verwijzing naar het
      oorspronkelijke kanaal.

    Antwoorden en plannen

    • Een tekstverwerker met emoji- en kaomoji-suggesties.
    • Emoji-reacties toevoegen en verwijderen.
    • Bijlagen meesturen bij een antwoord.
    • Een concept-antwoord per kaart bewaren voor later.
    • Berichten inplannen voor latere verzending, met een aparte wachtrij.

    Account en instellingen

    • Een instellingenpagina voor je account, synchronisatie, Mattermost-
      koppeling, export en voorkeuren.
    • Je eigen gegevens exporteren en weer importeren als versleuteld bestand,
      beveiligd met een herstelsleutel.
    • Je account verwijderen, met een duidelijke bevestigingsstap.
    • Een donker en licht thema, en volledige bediening met het toetsenbord.

    Inloggen en sessie

    • Inloggen via Keycloak (single sign-on).
    • Je sessie blijft tot zeven dagen geldig en wordt bij gebruik vanzelf
      verlengd. Daarna log je opnieuw in zonder wachtwoordprompt zolang je
      Keycloak-sessie nog loopt.
    • Centrale uitlog-afhandeling, zodat een sessie ook van buitenaf kan
      worden beëindigd.

    Onder de motorkap

    • Beveiliging: snelheidsbegrenzing tegen brute force, CSRF-bescherming en
      beveiligingsheaders.
    • Een auditlogboek van beveiligingsrelevante gebeurtenissen, standaard 90
      dagen bewaard.
    • Een statusbanner in de interface wanneer de server of Mattermost
      onbereikbaar is.
    • Postgres in productie, SQLite voor lokale ontwikkeling.
    • Te installeren als progressive web app (PWA).