-
v2026.7.20
StableAll checks were successfulCI / frontend-test (push) Successful in 4m50spublish-main / build (backend) (push) Successful in 2m18sCI / backend-test (push) Successful in 8m49srelease-and-deploy / deploy (push) Successful in 2m9sCI / backend-test-postgres (push) Successful in 9m34sCI / e2e (push) Successful in 8m47spublish-main / build (frontend) (push) Successful in 2m28ssecurity-scan / Python SCA (pip-audit) (push) Successful in 57spublish-main / build (push) Successful in 0ssecurity-scan / SBOM (trivy) (push) Successful in 18srelease-and-deploy / pre-commit (push) Successful in 51ssecurity-scan / Python SAST (bandit) (push) Successful in 39ssecurity-scan / Filesystem scan (trivy fs) (push) Successful in 25ssecurity-scan / JS SCA (npm audit) (push) Successful in 38srelease-and-deploy / release (push) Successful in 33srelease-and-deploy / build (backend) (push) Successful in 2m16srelease-and-deploy / build (frontend) (push) Successful in 2m28srelease-and-deploy / build (push) Successful in 0srelease-and-deploy / frontend-test (push) Successful in 4m56srelease-and-deploy / release-scripts (push) Successful in 11srelease-and-deploy / backend-test (push) Successful in 8m53sCI / pre-commit (pull_request) Successful in 53srelease-and-deploy / backend-test-postgres (push) Successful in 9m43sCI / frontend-test (pull_request) Successful in 5m23srelease-and-deploy / e2e (push) Successful in 8m34srelease-and-deploy / ci (push) Successful in 0sCI / release-scripts (pull_request) Successful in 11ssecurity-scan / Python SCA (pip-audit) (pull_request) Successful in 58ssecurity-scan / Python SAST (bandit) (pull_request) Successful in 34sCI / backend-test (pull_request) Successful in 9m5ssecurity-scan / JS SCA (npm audit) (pull_request) Successful in 41ssecurity-scan / SBOM (trivy) (pull_request) Successful in 17ssecurity-scan / Filesystem scan (trivy fs) (pull_request) Successful in 23sCI / backend-test-postgres (pull_request) Successful in 10m1sCI / e2e (pull_request) Successful in 8m38stest-build / build (backend) (pull_request) Successful in 1m46stest-build / build (frontend) (pull_request) Successful in 2m1stest-build / build (pull_request) Successful in 0sCI / pre-commit (push) Successful in 54sCI / release-scripts (push) Successful in 11sreleased this
2026-07-20 07:37:36 +00:00 | 19 commits to main since this releaseBijlagen: 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 naarbody
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_postsheeft 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,
subenexp
verplicht, en malformed tokens worden netjes geweigerd i.p.v. een
onafgehandelde 500. - Productie weigert te starten zonder
WAGGLE_PUBLIC_HOSTals 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,downgradeen opnieuw
upgradeop 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. clicknaar 8.4.2: 8.3.2 had een advisory (PYSEC-2026-2132), waardoor de
pip-audit-gate op elke PR afging. Transitief viatyper.- Renovate biedt linkify-it 6 niet meer aan: die major laat de default-export
vallen diemarkdown-itimporteert, waardoor de build en alle composer-tests
breken. Geblokkeerd tot markdown-it meegaat. - Renovate biedt TypeScript 7 niet meer aan:
vue-tsccrasht erop
(typescript/lib/tscbestaat niet meer) entypescript-eslinteist<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 kopieerdefrontend/.npmrcniet mee, waardoor npm
daar zonderlegacy-peer-depsdraaide 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) enX-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 (
enginesinpackage.json+ Renovateconstraints)
zodat de lockfile niet opnieuw scheef raakt: npm < 11 gooitemojibaseuit
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 opfrontend-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 oppep621(de
uv-manager bestaat niet) en de dubbele regex-manager voorzad-actionsweg. - 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
- Niet-afbeelding-bijlagen zijn nu grotere kaartjes in een grid (met type-icoon,