October 27, 2026

Justflows 0.3.7: Helpdesk, offertes en gedeelde bestanden, een echte blokbibliotheek en netwerkbrede plugins

Klantaccounts waar plugins op voortbouwen, een Helpdesk die mail over sites heen verdeelt, een volledige blokbibliotheek, netwerkbrede pluginhooks, core-updates die terugdraaien bij een fout en eigen domeinen die gewoon werken.

Justflows 0.3.7: Helpdesk, offertes en gedeelde bestanden, een echte blokbibliotheek en netwerkbrede plugins
Justflows 0.3.7 is uit, en het is een grote release: twee weken werk dat van de accountpagina een plek maakt waar plugins op kunnen bouwen, Helpdesk van een eerste versie laat uitgroeien tot een desk waar we onze eigen support op draaien, een echte blokbibliotheek aan de pagebuilder toevoegt en plugins een manier geeft om in één keer op elke site in een installatie te werken. Onder de motorkap herstellen core-updates zich nu na een fout, en gedragen eigen domeinen zich eindelijk zoals je verwacht. Dit bericht loopt het allemaal door, inclusief de onderdelen waar je vóór het upgraden op moet letten. De volledige changelog staat op GitHub.

Voordat je upgradet: Analytics is naar de eigen plugin verhuisd

Eén wijziging in 0.3.7 is niet achterwaarts compatibel, dus die komt eerst. Tot nu toe registreerde de core paginaweergaven, serveerde hij /justflows-analytics/collect en /api/analytics, rendde hij de Analytics-adminpagina en de Google-tag, en leverde hij de MCP-tool analytics_summary met een recht analytics:read. Dat is allemaal uit de core verdwenen. De Analytics-plugin, versie 0.2.0, doet het nu zelf, via dezelfde openbare SDK die elke andere plugin gebruikt.
  • Gebruikt je site Analytics, update de plugin dan samen met de core naar 0.2.0. Met de oude plugin op de nieuwe core worden paginaweergaven niet meer geregistreerd.
  • analytics:read is geen core-recht meer, en analytics is geen gereserveerde API-namespace meer.
  • De filter analytics.head begint nu met een lege string. Een tagplugin voegt zijn snippet toe met een prioriteit onder 100, en een consentplugin houdt het resultaat tegen met de standaardprioriteit, zodat toestemming altijd het laatste woord heeft.
  • De plugin voegt een netwerktag voor de hoofdsite toe: één meettag op de openbare pagina's en de admin van elke site, één keer ingesteld op de hoofdsite. Die is gebouwd op de nieuwe netwerkhooks die verderop worden beschreven.
Waarom het überhaupt verhuizen? De core hoort niets te weten van een specifieke plugin. Analytics was de laatste functie die half in de core en half in een plugin zat, waardoor de core tabellen, routes en een recht meedroeg die alleen zin hadden met één bepaalde plugin. Door het eruit te halen, moesten we de SDK-functies toevoegen die het nodig had, en die zijn nu voor iedereen beschikbaar.

Klantaccounts worden een plek voor plugins

Ingelogde klanten hadden al een core-pagina /account, en Shop voegde daar al klantgegevens, bestellingen en abonnementen aan toe. In 0.3.7 gebruiken twee nieuwe first-party plugins dezelfde accountsecties, en laten ze zien wat een plugin ermee kan.

Offertes

justflows.quotes hoort bij de shop. Het voegt een tabblad Offertes toe in Shop en een sectie Offertes in het account van de klant. De flow is zoals je die van een B2B-verkoop verwacht, en niets meer:
  • Medewerkers openen Offerte maken, kiezen de klant op naam of e-mailadres en voegen regels toe: een gepubliceerd product uit de shop van deze site, of een eigen regel met een eigen titel en prijs. Een offerte kan ook eigen tekst bevatten, die de klant op de offerte en op het offertedocument ziet.
  • De e-mail aan de klant linkt naar de offerte op deze site. Bij het openen wordt het factuurontwerp van Shop gebruikt, dus logo, kleur, lettertype en papierformaat komen overeen met je facturen. De notitie en footer op een offerte bewerk je los van facturen en pakbonnen.
  • De klant accepteert of weigert. Bij een weigering kan een notitie worden meegegeven, ook bij een offerte die eerder al is geweigerd. Medewerkers zien die notitie en kunnen een vervolg starten, dat een nieuwe bewerkbare offerte op basis van de oude opent.
  • Accepteren maakt een echte Shop-bestelling aan op deze site en slaat het id daarvan op bij de offerte. De klant krijgt een betaallink die een Mollie-betaling start. Wordt een poging niet afgerond, dan start dezelfde link een nieuwe, en toont de bestelling in het account Betalen zolang die op betaling wacht of na een mislukte poging.
  • In de admin kopieert Offertes die betaallink in plaats van de checkout te openen, zodat medewerkers nooit per ongeluk zelf de bestelling van de klant betalen.
Offertes is afhankelijk van Shop: het kan niet worden geïnstalleerd voordat Shop op de site is geïnstalleerd, en het kan niet worden aangezet voordat Shop actief is. Elke offerte hoort bij één klant op één site, en de records blijven op de site die ze heeft aangemaakt, ook op een multisite-installatie.

Gedeelde bestanden

justflows.shared-files voegt een sectie Bestanden toe aan de accountpagina. Medewerkers delen een privémap met één gebruiker op de site, of vragen die gebruiker iets te uploaden: een contract om te tekenen, een logo voor een drukopdracht, een set foto's voor een advertentie. Gedeelde bestanden heeft een eigen item in de zijbalk van de admin en werkt zonder Shop. Uploads gaan naar de opslag die de site gebruikt onder Instellingen → Opslag, dus een site met een eigen S3-verbinding bewaart deze bestanden in de eigen bucket. Betaallinks blijven in Shop; Gedeelde bestanden gaat alleen over bestanden.
Het bouwen van deze twee plugins loste ook een klein core-probleem op: ctx.plugins.call accepteert nu een koppelteken in het plugin-id, zodat andere plugins justflows.shared-files kunnen bereiken. De regels voor die aanroep zijn niet veranderd. Een andere site noemen vereist nog steeds platform:tenancy, en de aangeroepen plugin controleert de sessie nog steeds zelf.

Helpdesk groeit uit tot een volwaardige supportdesk

Vorige week introduceerden we Helpdesk in Helpdesk: supporttickets in je eigen Justflows-site, en de plugin komt met deze release mee. Sinds dat bericht kreeg Helpdesk de onderdelen die een ticketformulier onderscheiden van een desk waar je een bedrijf op kunt draaien. Dit is er nieuw, en waarom het zo werkt.

Inkomende mail, naar de juiste site

Instellingen → Algemeen kan nu een IMAP-mailbox uitlezen. De hoofdsite heeft er een, en dat geldt ook voor elke website waarvan het abonnement eigen mailinstellingen toestaat. Een website zonder dat recht wordt uitgelezen via de mailbox van de hoofdsite, en zolang die mailbox aan staat, gaan de antwoorden daar ook naartoe. Een bericht wordt opgeslagen op de site die het claimt, en anders op de ene site naar wiens adres het is verstuurd, en hetzelfde bericht wordt nooit twee keer opgeslagen. POST /api/mail/inbound accepteert nog steeds gepushte mail als je liever een webhook van een provider gebruikt.
Het interessante deel is een antwoord aan het juiste ticket koppelen. Op een multisite-installatie kunnen twee sites allebei een ticket nummer 9 hebben. Daarom bevat antwoordmail nu een token in het onderwerp, zoals [SUP-9-replytoken], en wordt een antwoord alleen toegevoegd aan een ticket op de ene site waarvan het ticket precies dat token heeft. Het ticketnummer alleen is nooit genoeg. Een antwoord zonder passend token kan in plaats daarvan een nieuw ticket openen, in plaats van in het gesprek van iemand anders te belanden.

Gevoelige antwoorden, en sleutels die niemand met de hand hoeft te maken

Medewerkers kunnen een antwoord of bestand als gevoelig markeren. De tekst wordt versleuteld opgeslagen, de e-mail aan de klant laat hem weg, en alleen medewerkers die dat mogen, kunnen op Tonen drukken. Elke keer dat iets wordt getoond, wordt vastgelegd, en verlopen gevoelige data worden volgens schema vernietigd.
Versleuteling heeft een sleutel nodig, en elke self-hoster vragen er een te genereren en in .env te plakken, is precies hoe functies ongemerkt kapotgaan. Daarom voegt 0.3.7 er een algemene hostfunctie voor toe: via de hook operatorKey.ensure vraagt een plugin de host om een sleutel van 32 bytes aan te maken in de .env van de installatie als die ontbreekt. De sleutelnaam moet bij de aanroepende plugin horen, een bestaande geldige sleutel wordt nooit vervangen, de waarde wordt nooit aan de plugin teruggegeven en nooit in de database opgeslagen. Helpdesk gebruikt dit voor JUSTFLOWS_HELPDESK_KEK, zodat gevoelige antwoorden op een nieuwe installatie werken zonder dat iemand een bestand hoeft te bewerken.

Een eigen database, als je dat wilt

Als Helpdesk is geïnstalleerd, kiest de hoofdsite waar de records staan: in de huidige Justflows-database, of in een aparte PostgreSQL-, MySQL- of MariaDB-database. Je kunt later van gedachten veranderen. Het verhuizen gaat bewust voorzichtig:
  • Helpdesk maakt een back-up van de records en maakt de tabellen aan in de nieuwe database.
  • Het zet de data terug en controleert elke tabel tegen de bron.
  • Het schakelt pas over als alles overeenkomt. De oude kopie blijft staan waar die stond.
  • Een bestemming die al andere Helpdesk-records bevat, blijft onaangeroerd, dus als je naar de verkeerde database wijst, kan er niets worden overschreven.

Bestellingen uit elke shop in de workspace

Support zit vaak op een andere site dan de shop, soms op een andere hostnaam. Op een ticket zien medewerkers nu de Shop-bestellingen van die klant van elke actieve site in dezelfde workspace, met nummer, status, totaal, artikelen en, als Shop die meestuurt, tracking. De bestelling blijft op de site die hem heeft aangenomen; het ordernummer opent hem in Shop op die site. De knoppen Terugbetalen en Retour zijn met opzet uit deze lijst gehaald: geld verplaats je in Shop, niet in de helpdesk.

De desk draaien

  • Eerst rapporten. Als je Helpdesk opent, zie je het aantal tickets, open en niet-toegewezen tickets, tickets over hun streeftijd, eerste reactietijd, tevredenheid, de afgelopen twee weken en hoe vaak shopklanten contact met je opnemen. De Inbox is het volgende tabblad.
  • SLA's binnen kantooruren die pauzeren terwijl een ticket op de klant wacht. Toewijzen om de beurt, op werklast of op taal.
  • Bulkacties en opgeslagen weergaven. Stel prioriteit, behandelaar of tag in, of sluit meerdere tickets tegelijk. Een standaardantwoord kan die velden ook instellen.
  • Herinneringen. Klanten die stil blijven, krijgen een herinnering (die ze kunnen uitzetten), en nieuwe tickets waar niemand aan heeft gezeten, worden opgehoogd. Medewerkers kiezen welke meldingen ze ontvangen.
  • Tools voor de draad. Splits een bericht af naar een eigen ticket, koppel tickets, sleep bestanden op een antwoord en sla een openbare draad op als helpartikel. Medewerkers kunnen tekst afschermen voordat een ticket wordt gepubliceerd, en openbare tickets accepteren een +1.
  • Escalatie. Elke site kan een ticket escaleren naar de platformdesk, en de hoofdsite kan een interne notitie terugschrijven. Het tabblad Netwerk toont tickets op de andere sites in de installatie.
  • Shop-events. Order-events worden opgeslagen zodat gasten hun bestelling kunnen opzoeken, een mislukte betaling kan een ticket openen, en accountpagina's en blokken kunnen een ticket starten over een specifieke bestelling of een specifiek product.
  • Helpdesk heeft nu een eigen item in de zijbalk van de admin, in plaats van in de bovenbalk Extensies.

Een blokbibliotheek waarmee je echte pagina's bouwt

De pagebuilder had de basis. 0.3.7 voegt de blokken toe die je op elke tweede pagina nodig hebt, en zorgt ervoor dat elk blok veilig wordt weergegeven op de openbare site, met het toetsenbord werkt en editorinstellingen heeft die logisch zijn.
  • Structuur: geneste lijsten en checklists, bewerkbare tabellen, Details en Accordeons, tabbladen die met het toetsenbord werken, kaarten, knoppen, iconen en meldingen die je kunt wegklikken.
  • Media: covers met afbeelding en video, Media & tekst, en nieuwe blokken voor video, audio en bestandsdownloads, met bijschriften, afspeelknoppen, videoposters en formaatinstellingen.
  • Siteblokken die live blijven: sitelogo, titel en slogan, navigatie, kruimelpad, sociale links en een inhoudsopgave (dit bericht gebruikt er een).
  • Contentquery: lijsten met gepubliceerde content met filters, sortering, paginering en lay-outinstellingen, zodat een archief of een strook met "nieuwste berichten" een blok is en geen templatewijziging.
Ankerlinks binnen dezelfde pagina blijven nu behouden, dus een navigatie-item dat naar #pricing wijst, blijft werken in thema's.

Instellingen die alleen tonen wat van toepassing is

Meer blokken betekent meer instellingen, en een zijbalk die elke instelling voor elk blok toont, is onbruikbaar. Alle 51 core-blokken hebben nu expliciete regels voor de inspector. Dubbele en nutteloze algemene instellingen zijn verborgen. Themastyling toont een samengestelde selectie plus de overrides die je al had gemaakt, in plaats van de volledige catalogus aan themavariabelen. Blokspecifieke velden volgen de keuze die ze aanstuurt: video-instellingen verschijnen alleen bij een videocover, nummeringsinstellingen bij een genummerde lijst en pagineringsinstellingen als paginering aan staat.
Daar kwamen twee veiligheidsregels bij. Een instelling verbergen verwijdert nooit wat die heeft opgeslagen; een bestaande waarde blijft zichtbaar zodat je die kunt wissen. En een blok met een stijlvariant uit zijn schema verbergt de algemene stylinginstellingen die die variant zouden overschrijven. Pluginblokken krijgen dezelfde behandeling: ze kunnen hun eigen inspector-schakelaars declareren.

Licht en donker in de builder

In de donkere modus toonden de zijpanelen, de blokbibliotheek, de inspector en de patroonvoorbeelden van de builder witte vlakken. Erger nog: het canvas mengde de lichte kleuren van het thema met delen van het donkere palet, en placeholders gebruikten admin-kleuren in plaats van die van de site. Het canvas toont de site nu in één gekozen kleurenschema, met een schakelaar Licht/Donker in de werkbalk, en selectiekaders en hints volgen het getoonde schema zodat ze leesbaar blijven.

Contenttypes die je kunt configureren, niet alleen aanmaken

De instellingen van contenttypes kregen een echt scherm: een tabeloverzicht en een editor in twee kolommen voor labels, beschrijvingen, cachebeleid, systeemvelden en eigen velden, met uitklapbare veldinstellingen, volgorde en een waarschuwing voordat je weggaat met niet-opgeslagen wijzigingen.
Belangrijker: gedrag dat eerder per type vastlag, is nu een instelling op elk type: meervoudslabels, snelkoppelingen op het dashboard, welke editor het gebruikt, of revisies worden bewaard, voorbeelden, opname in de openbare zoekfunctie, SEO-metadata en opname in de sitemap, en reacties. Bestaande types nemen precies het gedrag over dat ze al hadden, dus er verandert niets tot jij iets verandert. Dit is de enige databasemigratie in deze release: 0050_content_type_settings.

Plugin-SDK 0.1.7: hooks die het hele netwerk bestrijken

Sommige functies gelden niet per site. Een meettag voor de hele installatie, een supportknop in de admin van elke site, een melding die de beheerder overal wil tonen. Tot nu toe kon een plugin dat alleen doen door op elke afzonderlijke site te worden geactiveerd, en elke sitebeheerder kon hem weer uitzetten. SDK 0.1.7 biedt daar een echt antwoord op.
Een plugin met de nieuwe permissie platform:network kan een hook registreren met { network: true }. Die handler draait dan op elke site zolang de plugin actief is op de hoofdsite, ook op sites die hem nooit hebben geactiveerd. Al het andere aan de plugin blijft per site: de andere hooks, routes en taken, en binnen de netwerkhandler horen ctx.settings en ctx.data nog steeds bij de site die het verzoek afhandelt.
// manifest.permissions includes "platform:network"
async activate(ctx: PluginContext) {
  // Runs on every site while the plugin is active on the main site
  ctx.hooks.filter("admin.body", async (html) => {
    const label = await ctx.network?.mainSiteSettings.get<string>("buttonLabel");
    return label ? `${html}<support-button label="${label}"></support-button>` : html;
  }, { network: true });
}
  • ctx.network.mainSiteSettings.get() leest vanaf elke site de instellingen van de plugin op de hoofdsite, alleen-lezen. Zo bereikt de keuze van de beheerder elke site zonder dat de beheerders van een andere site die kunnen zien of wijzigen.
  • ctx.network.sites() toont elke live site, de hoofdsite eerst. Het werkt alleen op de hoofdsite en weigert overal anders.
  • Bestanden die die hooks laden vanuit /ext/<plugin-id>/ worden op elke site geserveerd, dus een script dat netwerkbreed wordt ingevoegd, laadt ook netwerkbreed.
  • Een route kan revalidate: "network" teruggeven om de paginacache van elke site te legen na het opslaan van iets dat netwerkhooks invoegen. Zonder de permissie, of buiten de hoofdsite, werkt het als true.
Analytics 0.2.0 gebruikt dit voor de netwerktag, en Helpdesk gebruikt het voor de supportknop in de admin van andere sites.

Meer voor pluginauteurs

  • Actie page.viewed. Gaat af nadat een bezoeker een openbare pagina heeft ontvangen, met het pad, de taal, het content-id, de user agent, de referrer en de host. Gaat niet af voor voorbeelden, foutpagina's of de crawl van de statische exporter, dus je telt mensen, geen tooling. Hiermee registreert Analytics nu.
  • req.trustedOrigin. Pluginroutes kunnen zien of de header Origin de site zelf is of een origin waar de CORS-allowlist van de host voor instaat, in plaats van dat elke plugin headers op zijn eigen manier parset.
  • operatorKey.ensure, hierboven beschreven, voor plugins die een geheime sleutel in .env nodig hebben.
  • Hosts in de Content Security Policy. Een plugin kan de hosts die zijn pagina's laden toevoegen aan de CSP van de site. De Stripe Buy Button voegt nu https://js.stripe.com en de checkoutframes en API van Stripe toe, zodat hij werkt op sites met het standaardbeleid. Alleen https://-origins worden geaccepteerd.
  • inspector-schakelaars voor pluginblokken, en plugin-id's met koppeltekens in ctx.plugins.call.
ctx.hooks.action("page.viewed", async (view) => {
  // Real visitors only: no previews, error pages or export crawls
  await ctx.data.put("views", crypto.randomUUID(), { path: view.path, referrer: view.referrer ?? null });
});

Core-updates die zelf opruimen

Updaten vanuit de admin installeerde vroeger dependencies en bouwde ter plekke. Mislukte de build of een migratie halverwege, dan kon je overblijven met een site die niet opstartte. 0.3.7 verandert de volgorde:
  • Dependencies worden geïnstalleerd en de build draait in een stagingmap, voordat er een live bestand wordt aangeraakt.
  • Eerst wordt een back-up gemaakt van core-bestanden en dependencies. Mislukken de activatie of migraties, dan worden die teruggezet en wordt de herstart overgeslagen, zodat de draaiende site blijft draaien.
  • De vorige release blijft bewaard in .updates/previous-release voor handmatig herstel.
  • Databasemigraties die al zijn uitgevoerd, blijven staan. Migraties gaan alleen vooruit.
Dit geldt vanaf de volgende update: de updater die draait, is die van de versie waarvandaan je updatet. Updaten naar 0.3.7 gebruikt nog de updater van 0.3.6, dus maak deze keer je gebruikelijke back-up.

Eigen domeinen, goed opgelost

Je eigen domein koppelen op Justflows Cloud, of op een installatie achter Bunny, liep tegen een reeks problemen aan die allemaal uit hetzelfde feit voortkwamen: de admin blijft op het platformadres, terwijl de openbare site vanaf je domein wordt geserveerd. Voor een browser zijn dat twee verschillende sites.
  • Beveiligingsheaders bevatten het gekoppelde domein. script-src 'self', connect-src 'self' en frame-ancestors 'self' verhinderden dat de admin de scripts van het domein laadde, de extensie-endpoints aanriep en het in een frame toonde voor voorbeelden. Gekoppelde adressen maken nu deel uit van dat beleid. De openbare pagina laat X-Frame-Options: SAMEORIGIN weg, dat het platformadres niet kan noemen en het voorbeeld nog steeds weigerde, en Cross-Origin-Resource-Policy wordt cross-origin als de adressen niet dezelfde site zijn. Een domein dat nog op DNS wacht, wordt niet toegevoegd.
  • Het themavoorbeeld blijft bij de admin. Een verzoek met ?preview=1 blijft nu op het adres waarop het is geopend, in plaats van te worden doorgestuurd naar het primaire domein, waar de sessie van de editor niet bestaat.
  • Statische exports lopen niet meer in een rondje. Nadat een eigen domein primair werd, volgde de exporter de doorverwijzing, hield alleen het pad over en sloeg / op als een pagina die naar / ververste. De crawl blijft nu op de host die hij ophaalde.
  • Domeinen met eigen DNS krijgen sneller een certificaat. Een domein met records bij je eigen DNS-provider wordt aan de pull zone toegevoegd zodra het TXT-record aanwezig is, en dan wordt het gratis certificaat aangevraagd. Het hoeft niet meer te wachten tot één lookup van de CDN-hostnaam overeenkomt met het afgevlakte ALIAS-adres.
  • De domeincontrole vraagt het aan je nameservers. Een kaal domein kon blijven hangen op "wijst niet naar het doel" zolang een openbare resolver het oude adres in de cache had, of zolang de CDN-pool met een ander adres antwoordde. De controle vraagt het nu aan de eigen nameservers van het domein en accepteert CDN-adressen uit meerdere antwoorden.

Space Voyage, en scripts voor thema's

Het thema Space Voyage wordt geleverd met de volledige, bewerkbare Planet Jumping-homepage: de preloader en het logo dat op zijn plek schuift, het canvasportaal dat meekantelt met de aanwijzer, de videoovergangen Mars → aarde → Venus met stilstaande achtergronden, feiten over de planeten, een eigen cursor en responsieve lay-outs. Om dat mogelijk te maken zonder thema's vrij spel te geven, kunnen actieve thema's nu begrensde clientscripts meeleveren, geserveerd via /theme.js. Sites die al een homepage hebben opgeslagen, kunnen het bijgewerkte landingspatroon invoegen in plaats van hun wijzigingen kwijt te raken. De gedragstests van het thema zijn naar het themaregister verhuisd, zodat de CI van CE geen externe themabestanden meer nodig heeft.

Kleinere dingen die het weten waard zijn

  • Geen React Router-vingerafdruk meer. Technologiescanners lazen window.__reactRouterVersion uit de adminbundel en meldden de exacte release. Die waarde wordt niet meer gezet, en het versietoken is uit de licentiebanner verdwenen. De copyrightvermelding blijft.
  • Quotaformulieren met veel meters slaan weer op. Websitelimieten en standaardwaarden met meer dan 50 velden, inclusief velden die onbeperkt zijn gelaten, worden nu opgeslagen. Elke meter, scope en waarde wordt nog steeds gevalideerd.
  • Accountpagina's slaan op met hun vastgezette cachebeleid. Een accountpagina zoals Offertes opslaan mislukt niet meer omdat die het privé-cachebeleid opslaat. Een openbaar beleid wordt nog steeds geweigerd.
  • Slankere adminbundels. Blok- en validatiecode is uit de builderchunk gehaald, en op zichzelf staande server-gerenderde modules zijn gescheiden.
  • Dependencies. pnpm 12.15.0, Turborepo 2.11.10, Vitest 5, EJS 7, React 19.3 en Vite 8.3, vernieuwde transitieve dependencies en een bijgewerkte security-override voor ip-address.

Upgraden

Drie dingen om te controleren:
  • Gebruikers van Analytics: update de Analytics-plugin samen met de core naar 0.2.0.
  • Eén migratie: 0050_content_type_settings. Bestaande contenttypes houden hun gedrag.
  • Maak eerst een back-up. De nieuwe updater die zichzelf herstelt, wordt vanaf de volgende update gebruikt, niet voor deze.
De release-zip heeft een SHA-256-checksum, een handtekening en een CycloneDX-SBOM, allemaal bijgevoegd bij de release op GitHub. Gaat er iets mis, open dan een issue op GitHub of een ticket op support.justflows.com, dat vanaf deze release draait op alles wat hierboven is beschreven.
Lees de volledige changelog