• v2026.7.20 0ff03ce8df

    v2026.7.20
    All checks were successful
    CI / frontend-test (push) Successful in 4m50s
    publish-main / build (backend) (push) Successful in 2m18s
    CI / backend-test (push) Successful in 8m49s
    release-and-deploy / deploy (push) Successful in 2m9s
    CI / backend-test-postgres (push) Successful in 9m34s
    CI / e2e (push) Successful in 8m47s
    publish-main / build (frontend) (push) Successful in 2m28s
    security-scan / Python SCA (pip-audit) (push) Successful in 57s
    publish-main / build (push) Successful in 0s
    security-scan / SBOM (trivy) (push) Successful in 18s
    release-and-deploy / pre-commit (push) Successful in 51s
    security-scan / Python SAST (bandit) (push) Successful in 39s
    security-scan / Filesystem scan (trivy fs) (push) Successful in 25s
    security-scan / JS SCA (npm audit) (push) Successful in 38s
    release-and-deploy / release (push) Successful in 33s
    release-and-deploy / build (backend) (push) Successful in 2m16s
    release-and-deploy / build (frontend) (push) Successful in 2m28s
    release-and-deploy / build (push) Successful in 0s
    release-and-deploy / frontend-test (push) Successful in 4m56s
    release-and-deploy / release-scripts (push) Successful in 11s
    release-and-deploy / backend-test (push) Successful in 8m53s
    CI / pre-commit (pull_request) Successful in 53s
    release-and-deploy / backend-test-postgres (push) Successful in 9m43s
    CI / frontend-test (pull_request) Successful in 5m23s
    release-and-deploy / e2e (push) Successful in 8m34s
    release-and-deploy / ci (push) Successful in 0s
    CI / release-scripts (pull_request) Successful in 11s
    security-scan / Python SCA (pip-audit) (pull_request) Successful in 58s
    security-scan / Python SAST (bandit) (pull_request) Successful in 34s
    CI / backend-test (pull_request) Successful in 9m5s
    security-scan / JS SCA (npm audit) (pull_request) Successful in 41s
    security-scan / SBOM (trivy) (pull_request) Successful in 17s
    security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 23s
    CI / backend-test-postgres (pull_request) Successful in 10m1s
    CI / e2e (pull_request) Successful in 8m38s
    test-build / build (backend) (pull_request) Successful in 1m46s
    test-build / build (frontend) (pull_request) Successful in 2m1s
    test-build / build (pull_request) Successful in 0s
    CI / pre-commit (push) Successful in 54s
    CI / release-scripts (push) Successful in 11s
    Stable

    robbertbos released this 2026-07-20 07:37:36 +00:00 | 19 commits to main since this release

    Bijlagen: previews van bestanden en grotere kaartjes

    • Niet-afbeelding-bijlagen zijn nu grotere kaartjes in een grid (met type-icoon,
      naam op leesbare grootte, bestandsgrootte en een aparte download-knop) in
      plaats van kleine chips.
    • Video's speel je direct op de pagina af in een modal-speler (met download);
      de file-proxy ondersteunt nu HTTP Range zodat je vlot kunt scrubben.
    • PDF's open je in-page in een preview-modal (met download + open-in-tabblad).
    • HTML-bijlagen (bv. rapporten) open je standaard in een veilige, afgeschermde
      sandbox-preview (scripts/grafieken werken, maar het bestand kan niet bij je
      sessie). Los te downloaden, of - met waarschuwing - buiten de sandbox in een
      nieuw tabblad te openen.

    Onboarding

    • Onboarding-hints: token-hint op het token-veld en een 8-staps
      inbox-rondleiding (menu, secties, snelle acties, kaart openen, thread,
      antwoorden, status en acties, verzenden).
    • De rondleiding komt met een voorbeeldbericht zodat er altijd iets is om
      naar te wijzen - ook met een lege "Doe nu". Het verdwijnt zodra je
      de rondleiding afrondt of overslaat.
    • Bestaande gebruikers met een gekoppelde server krijgen de rondleiding niet
      alsnog te zien (datamigratie).

    Verbeterd

    • Sectie-iconen zeggen nu wat ze bedoelen: "Doe nu" is een vlag (was een oog,
      dat in NLDD "tonen" betekent), "Voltooid" en "Gelezen" zijn een archiefdoos
      en de leeslijst een boek - overal hetzelfde icoon voor hetzelfde begrip.
    • De status- en actie-knoppen in de kaart-modal hebben dezelfde iconen als de
      secties waar ze de kaart heen sturen, en de statusrij staat nu in dezelfde
      volgorde als die secties: Doe nu, Nieuw, Backlog, Bubble up, Voltooid.
    • De toggle "Toon/verberg (concept) antwoord" is weg; de antwoord-composer
      staat altijd open. Scheelt een klik en een knop.
    • De notities-editor kreeg links (met Cmd/Ctrl+K) en emoji, plus een
      takenlijst-knop. De takenlijst is nu ook in de thread-composer beschikbaar
      (Mattermost rendert - [ ] als checklist).
    • Opmaak-werkbalk: de lijst-soorten (opsomming, genummerd, takenlijst) staan
      nu gegroepeerd, gescheiden van citaat en codeblok.
    • Het snooze-icoon (bubble-up) is nu een timer in plaats van een maan; past
      logischer bij "laat deze kaart later terugkomen".
    • Doorhalen, markeren en codeblok in de opmaak-werkbalk gebruiken nu native
      NLDD-iconen (strikethrough / highlighter / code-block) in plaats van
      eigen inline-SVG's, met uniforme icoongrootte.

    Opgelost

    • De beeld-lightbox lag onder de bovenbalk: linksboven klikken raakte de
      navigatie in plaats van de lightbox te sluiten. Hij wordt nu naar body
      geteleporteerd, net als de andere modals.
    • In een codeblok sprong het eerste teken in (inline <code>-padding); nu
      staat elke regel vlak, in zowel de composer als de notities-editor.
    • De tekst-inspringing van de notities-editor is gelijkgetrokken met de
      thread-composer.
    • Een link met een dubbele punt in de URL (bv. een LinkedIn-permalink) werd als
      platte tekst getoond; emoji-shortcodes binnen URLs worden nu met rust gelaten.
    • In de reageerders-hover staat de naam weer netjes uitgelijnd met de avatar.

    Onder de motorkap

    • De uitgaande wachtrij kan geen bericht meer versturen met het Mattermost-token
      van een andere gebruiker. outgoing_posts heeft nu composite foreign keys naar
      de kaart en het account van de eigenaar, en de runner leest de afzender van de
      rij in plaats van van de kaart. Niet exploiteerbaar, maar de garantie zat in een
      gewoonte in plaats van in het schema.
    • Uitloggen beëindigt nu ook de centrale Keycloak-sessie: de app navigeert
      top-level naar het end-session-endpoint (RP-initiated logout) i.p.v. via een
      fetch-redirect, zodat de volgende inlog niet stil via SSO doorgaat.
    • Backchannel-logout heeft nu een rate-limit (60/min in productie).
    • OIDC-inloggen blijft werken tijdens Keycloak-sleutelrotatie: de JWKS wordt
      bij een onbekende sleutel-id direct herophaald i.p.v. tot een uur te falen.
    • OIDC-tokenvalidatie gehard: asymmetrische-algoritme-allowlist, sub en exp
      verplicht, en malformed tokens worden netjes geweigerd i.p.v. een
      onafgehandelde 500.
    • Productie weigert te starten zonder WAGGLE_PUBLIC_HOST als OIDC aan staat:
      de redirect- en post-logout-URL mogen niet van de (spoofbare) Host-header
      afhangen. Op ZAD staat deze variabele al automatisch goed.
    • De dev-only endpoints (wachtwoordloze login, gebruiker wisselen, onboarding
      resetten) bestaan in productie niet meer: ze worden alleen geregistreerd als
      de dev-vlag aanstaat.
    • Alembic-migraties worden voortaan getest: upgrade, downgrade en opnieuw
      upgrade op zowel SQLite als Postgres, met een controle dat het gemigreerde
      schema overeenkomt met de modellen. De testsuite bouwde haar schema rechtstreeks
      uit de modellen, dus een kapotte of ontbrekende revisie bleef groen.
    • click naar 8.4.2: 8.3.2 had een advisory (PYSEC-2026-2132), waardoor de
      pip-audit-gate op elke PR afging. Transitief via typer.
    • Renovate biedt linkify-it 6 niet meer aan: die major laat de default-export
      vallen die markdown-it importeert, waardoor de build en alle composer-tests
      breken. Geblokkeerd tot markdown-it meegaat.
    • Renovate biedt TypeScript 7 niet meer aan: vue-tsc crasht erop
      (typescript/lib/tsc bestaat niet meer) en typescript-eslint eist <6.1.0.
      Geblokkeerd tot beide tools 7 ondersteunen.
    • De frontend-container-build faalde op npm ci (Missing: emojibase@17.0.0 from lock file): de Containerfile kopieerde frontend/.npmrc niet mee, waardoor npm
      daar zonder legacy-peer-deps draaide en de lockfile afkeurde die juist mét die
      vlag is gegenereerd.
    • De file-proxy serveert HTML-previews met een strikte CSP (sandbox allow-scripts + geen netwerk) en X-Frame-Options: SAMEORIGIN, zodat een
      rapport rendert maar niet bij je sessie kan of gegevens kan exfiltreren.
    • NLDD design-system naar 0.8.69: popovers en menu's flitsen niet meer kort op
      een default-positie voordat ze geplaatst worden, en de pagina blijft verborgen
      tot de web-components geladen zijn (geen flash of unstyled content).
    • npm >= 11 vastgelegd (engines in package.json + Renovate constraints)
      zodat de lockfile niet opnieuw scheef raakt: npm < 11 gooit emojibase uit
      package-lock.json, wat Renovate's lockfile-onderhoud liet afbreken
      (lockfile-error) en zo de dependency-PR's blokkeerde.
    • De e2e-CI-job wacht niet meer op frontend-test; hij bouwt zijn eigen
      frontend en deelt er niets mee. De jobs draaien nu parallel, wat de langste
      CI-stap eerder laat starten.
    • Renovate-config opgeschoond: forgejo-platform, Python-groep op pep621 (de
      uv-manager bestaat niet) en de dubbele regex-manager voor zad-actions weg.
    • Afhankelijkheids- en digest-bumps: TipTap 3.27.1 -> 3.28.0, linkify-it 5.0.2 +
      markdown-it 14.3.0 (npm-overrides), uv -> 0.11.29, renovate-image -> 43.259.2,
      dev-Keycloak 26.6 -> 26.7, nginx-unprivileged 1.31.2 -> 1.31.3 en verse
      digest-pins voor Postgres 17 en Python 3.14.6.

    Container images