October 13, 2026

Justflows 0.3.6: inloggen in je eigen thema, categorieën en tags, en plugins die je AI-agent kan gebruiken

Inlogpagina's voor leden in je eigen thema, een verborgen admin die echt verborgen is, categorieën, tags en eigen taxonomieën, een duurzame takenwachtrij en pluginroutes die AI-agents kunnen aanroepen.

Justflows 0.3.6: inloggen in je eigen thema, categorieën en tags, en plugins die je AI-agent kan gebruiken
Justflows 0.3.6 is uit, twee dagen na 0.3.5. Deze release gaat over wie er binnen mag, en waar: leden krijgen inlogpagina's die eruitzien als je site, medewerkers krijgen een admin-login die een eigen adminpad echt verbergt, en AI-agents krijgen toegang tot plugins, maar alleen waar een plugin dat toestaat. En berichten krijgen eindelijk categorieën en tags. Hier zijn de hoogtepunten. De volledige changelog staat op GitHub.

Inlogpagina's in je eigen thema

/login, /register, /forgot-password en /reset-password worden nu binnen je thema weergegeven, met je eigen header, footer en stijlen. Het zijn vier gewone pagina's van het nieuwe ingebouwde contenttype Inloggen (Content → Inloggen), dus je bewerkt ze in de pagebuilder zoals al het andere. Elke pagina bevat een blok Accountformulier dat het eigenlijke werk doet.
  • Bestaande sites krijgen de vier pagina's zodra een van de URL's voor het eerst wordt geopend. Een pagina die je al hebt aangepast, wordt nooit vervangen.
  • Ze worden nooit gecachet, geïndexeerd, geëxporteerd, doorzocht of in lijsten getoond. Ontbreekt een pagina of heeft die een andere naam, dan valt de site terug op het eenvoudige ingebouwde formulier.
  • De sessie wordt gedeeld tussen de admin en de site. Ingelogde bezoekers worden van /login doorgestuurd naar hun accountpagina, inloglinks op de pagina worden Mijn account, registratielinks verdwijnen en de inlogwidget in de header krijgt Uitloggen. Gecachete pagina's blijven gecachet: een klein script past de links aan in de browser.

Een verborgen adminpad dat echt verborgen is

Vóór 0.3.6 verborg het verplaatsen van de admin via Beveiliging → Admin-URL wel de adminpagina's, maar /login accepteerde nog steeds wachtwoorden van medewerkers en gaf na het inloggen zelfs het verborgen pad terug. Het verplaatsen van de admin hield dus geen wachtwoordraders tegen en hield het pad ook niet geheim.
Nu loggen medewerkers alleen in op <adminpad>/login, in de eigen vormgeving van de admin, en /admin/* geeft een 404 zodra het pad is verplaatst. Een medewerkersaccount op de ledenpagina krijgt precies hetzelfde antwoord als een fout wachtwoord, nog vóór een vraag om tweestapsverificatie. Ledenpagina's mailen medewerkers nooit een resetlink, en een resetlink werkt alleen op de plek waarvoor hij is gemaild. Lees meer in Twee deuren: zo werkt inloggen in Justflows 0.3.6.
Let op: dit geldt ook voor het standaardpad /admin. Had je /login als bladwijzer om in de admin te komen, gebruik dan nu /admin/login.

Categorieën, tags en je eigen taxonomieën

Content → Categorieën & tags beheert termen: toevoegen, hernoemen, de slug wijzigen, categorieën nesten en verwijderen (subcategorieën schuiven een niveau op). Elke site krijgt category en tag voor berichten, en beheerders kunnen eigen taxonomieën toevoegen en per taxonomie kiezen welke contenttypes die gebruiken.
  • De zijbalk van de editor heeft een kiezer per taxonomie, die samen met het item wordt opgeslagen. Redacteuren kunnen daar direct nieuwe termen aanmaken.
  • De eerste categorie van een bericht vult %category% in permalinks, en archieven zoals /category/news tonen de bijbehorende items.
  • Verander je de categorie van een bericht of de slug van een term, dan worden de oude URL's doorgestuurd.
  • De beheer-API (/taxonomies, /content/{id}/terms) en de MCP-tools (taxonomies_*, terms_*, content_terms_get, content_terms_set) dekken dit allemaal.

AI-agents kunnen plugins gebruiken, waar de plugin dat toestaat

Een pluginroute kan nu als MCP-tool aan agents worden aangeboden met de nieuwe route-optie mcp. De tool voert de eigen handler van de route uit met de sessie van de agent, dus de controles van de plugin gelden ongewijzigd. De tool wordt alleen getoond op sites waar de plugin actief is, en alleen aan sessies met de rechten die de tool noemt. Routes zonder de optie worden nooit aangeboden.
  • API-sleutels werken op pluginroutes. Een jfk_…-sleutel authenticeert nu /ext/<plugin>/… en plugin-API-aliassen zoals /api/shop/v1/…, met dezelfde controles als de beheer-API: intrekking, vervaldatum, site, toegestane IP-adressen en Origins, en ratelimits.
  • Volledige adminsleutels volgen nieuwe plugins. Een sleutel met site:admin krijgt nu ook de rechten van plugins die na het aanmaken van de sleutel zijn geïnstalleerd, zolang de eigenaar die rechten nog heeft. Core-rechten worden op deze manier nooit uitgebreid.
  • Agents kunnen andere workspaces niet wijzigen, wat een plugin ook doet. De host weigert workspace-acties en limietwijzigingen als er een agent, API-sleutel of gekoppelde app achter de aanroep zit, inclusief de hooks die daardoor worden getriggerd.
  • Gevoelige output wordt gefilterd. Resultaten van MCP- en assistenttools, ook die van plugins, verbergen inloggegevens, tekst uit omgevingsbestanden, privésleutels en bekende installatiegeheimen.

Voor pluginontwikkelaars

  • Duurzame takenwachtrij. ctx.jobs.enqueue() slaat nu elke run op in een tabel job_queue, zodat werk een herstart overleeft en elke aanroep zijn eigen payload houdt. Processen claimen runs met een lease en heartbeat, zodat een run steeds op één proces draait. Mislukte runs worden opnieuw geprobeerd na 1, 5, 25 en daarna 60 minuten, tot maxAttempts, en beheerders kunnen ze opnieuw starten onder Diagnostiek → Takenwachtrij.
  • Plugintabellen upgraden mee met de plugin. ctx.databases.ensureSchema() voegt nu gedeclareerde kolommen en indexen toe die bestaande tabellen missen, op PostgreSQL, MySQL en MariaDB. Types worden nooit gewijzigd en er wordt niets verwijderd.
  • Losse mcp.tools-handlers zijn weg. Tools die alleen als filterhandler bestonden, worden niet meer getoond of uitgevoerd. Bied in plaats daarvan een geregistreerde route aan met de optie mcp.
  • Purge-gates. Het opschorten van een workspace start nu een bewaartermijn, en plugins krijgen een verplichte gate workspace.beforePurge en een laatste actie workspace.purged om hun eigen data op te ruimen.
// Survives a restart, runs on one process, retried with backoff
await ctx.jobs.enqueue("sync-catalog", { since });

Fixes die het weten waard zijn

  • Het installatieverzoek heeft een ratelimit. POST /api/install had geen limiet op verzoeken, dus op een nieuwe site kon de setupsleutel zonder pauze worden geraden. Nu zijn 20 verzoeken per 15 minuten per IP-adres toegestaan.
  • Inloggen voor leden sluit mee met de site. In onderhoudsmodus, of voordat een site openbaar is, tonen de inlog- en accountpagina's voor leden de onderhoudspagina, en het ledendeel van de auth-API antwoordt met 503. Inloggen voor medewerkers, de beheer-API en MCP blijven open.
  • Kapotte links blokkeren statische exports niet meer. Een 404 of 410 tijdens de crawl is nu een waarschuwing in plaats van een mislukte run, dus één kapotte link in de footer houdt een export naar objectopslag niet meer tegen.
  • Subsites versturen e-mail via het platform. Subsites proberen niet meer de sendmail van de host. Ze gebruiken Platformmail, onder hun eigen afzendernaam, tenzij de nieuwe functie Eigen e-mailinstellingen ze een eigen transport laat instellen.
  • Alleen actieve plugins tellen mee voor de pluginlimiet van een site.
  • Openbare registratie op een platform kan nu e-mailadressen en domeinen toestaan of blokkeren, en wegwerpadressen weigeren.

Upgraden

Deze release voegt twee databasemigraties toe: 0047_taxonomy_content_types en 0048_job_queue. Medewerkers op sites die nog /login gebruiken voor de admin moeten overstappen op /admin/login (of je eigen adminpad), en pluginauteurs met MCP-tools die alleen als handler bestaan, moeten die verplaatsen naar routes. Lees de volledige release notes voordat je upgradet.
Lees de volledige changelog