Een portaal is een eigen webspace op dezelfde server als Phrona — geen scherm bovenop het platform. Eigen subdomein, eigen database met eigen database-rol, eigen toegangstoken, en een development-omgeving met git, node, python en een terminal in de browser. Voor organisaties die hun eigen toepassingen, agents en workflows bouwen, en die willen draaien waar de kennis al staat.
Waarom een eigen omgeving en geen gedeelde ruimte
Kennis van de ene organisatie hoort niet in de omgeving van de andere te belanden. Dat los je niet op met een filter bovenop een gedeelde stapel; dat los je op in het fundament. Elk portaal heeft zijn eigen host, zijn eigen schema en zijn eigen database-rol. Een query die de verkeerde tabel raakt, kan die tabel niet zien.
Afdeling personeel
- Eigen schema
- portal_personeel
- Eigen database-rol
- portal_personeel
- Eigen brein
- handboek en CAO
- Eigen token
- portal:read · portal:db
Afdeling inkoop
- Eigen schema
- portal_inkoop
- Eigen database-rol
- portal_inkoop
- Eigen brein
- leveranciers en contracten
- Eigen token
- portal:files · portal:db
Klantomgeving
- Eigen schema
- portal_acme
- Eigen database-rol
- portal_acme
- Eigen brein
- eigen documentatie
- Eigen token
- portal:read · portal:files
Meerdere portalen per organisatie zijn mogelijk — één per afdeling, één per klant, één per experiment. Wat je in het ene wijzigt, raakt het andere niet.
Een echte ontwikkelomgeving, geen instellingenscherm
Een dev-container met een echte shell, bereikbaar via HTTPS: geen SSH, geen extra poort open, niets te installeren. Daarnaast een SQL-console die werkt als de database-rol van dat portaal, en die daardoor niet bij de centrale tabellen kan.
git clone git.phrona.dev/jouw-app
cd jouw-app && npm install
opencode
- git
- node
- npm
- python3
- pip3
- opencode
Een echte shell in je eigen dev-container, bereikbaar over HTTPS. De sessie blijft staan als je de browser sluit.
select * from dossier order by updated_at desc;
- eigen schema
- geen toegang tot centrale tabellen
- limiet 10 s
De console werkt als rol portal_<naam>, met het eigen schema als enige zoekpad. Centrale gebruikers- en integratietabellen zijn daarmee buiten bereik, en een volledig gekwalificeerde naam naar het centrale schema wordt geweigerd.
Daarnaast: bestanden beheren, een agent-token uitgeven met precies de scopes die je wilt, en je proces draaien zoals je het lokaal zou draaien. Wat je bouwt bepaal je zelf — het portaal levert de omgeving, niet de vorm.
Binaire communicatie in plaats van tekst
Een agent die met een brein praat, doet dat meestal via tekst: JSON heen, JSON terug. Dat werkt, maar het is de duurste vorm van uitwisseling die er is. Elk getal wordt een tekenreeks, elke structuur wordt opnieuw opgebouwd, en bij elke stap zit een parser tussen.
BIP, de interactietaal van het platform, heeft daarom twee codecs: dezelfde envelop, dezelfde werkwoorden, dezelfde antwoorden, maar naast application/json ook application/cbor — een compacte binaire vorm. Volgens de specificatie is een metadata-rijke aanroep er ruwweg dertig procent kleiner mee, bij grote tekstpayloads een paar procent. Je kiest per aanroep, en een agent die op snelheid let kiest de binaire vorm.
Belangrijker dan de omvang is wat er niet gebeurt: er zit geen tekstuele vertaalslag tussen agent en geheugen. De structuur die je aanbiedt komt aan zoals je hem aanbood.
Koppelen aan je eigen agent, workflow of applicatie
Wil je het gesprek ergens anders voeren — in je eigen applicatie, je eigen assistent, of een workflow die al loopt — dan is het portaal de ingang en niets meer dan dat. Een agent-token geeft toegang tot precies dat ene portaal, met scopes die je zelf uitgeeft:
- portal:read — status, bestanden lezen, database lezen.
- portal:files — bestanden lezen, schrijven, uploaden, verwijderen.
- portal:db — SQL op het eigen schema.
Tokens worden gehasht opgeslagen in het schema van het portaal zelf; de leesbare vorm zie je één keer bij het aanmaken. Intrekken is één handeling. En omdat een token bij één portaal hoort, geeft het geen toegang tot een ander portaal: dat is geen scope die je kunt vergeten, maar een grens die in de omgeving zit.
Voor de breinen die aan het portaal hangen, lopen de koppelingen via BIP en MCP. Een agent die zich bij sessiestart laat briefen, doet dat met één aanroep en zonder dat daar een taalmodel aan te pas komt.
Gebruikers, rollen en rechten
Gebruikersbeheer gebeurt centraal in de backend, per portaal. Er zijn drie rollen — beheerder, gids en klant — en elke rol heeft een eigen, expliciete lijst met toegestane handelingen. Komt er een handeling bij, dan krijgt geen enkele rol daar automatisch toegang toe; een beheerder wijst die eerst toe.
Een rol binnen een portaal staat los van iemands rol op het platform: wie daar gebruiker is, kan hier beheerder zijn, en andersom. Ook dossierrechten zijn fijnmaziger dan de rol zelf. Een gids beheert zijn eigen dossiers en niet die van een collega; een beheerder heeft toegang tot alle dossiers binnen het portaal.
Zelfstandig gebruiken, of binnen Phrona
Je kunt een portaal zelfstandig gebruiken: een losse ontwikkelomgeving waar je je eigen toepassing bouwt en draait, met het platform als leverancier van geheugen en breinen. Je kunt het ook als functie van Phrona inzetten: dan verschijnt het als Klantportaal en beheer je het vanuit dezelfde beheeromgeving, met dezelfde inlog en dezelfde rechtenstructuur.
Beide zijn hetzelfde portaal. Het verschil is waar je begint, niet wat je krijgt.
Wat het niet is
- Geen root op de host. Je krijgt een dev-container en een schema, niet de server.
- Geen openbare hosting. Een portaal is bereikbaar op zijn eigen subdomein, met zijn eigen gebruikers — geen plek om iets voor de hele wereld neer te zetten.
- Geen onbeperkte ruimte. Elk portaal heeft een opslagquotum en een limiet op verzoeken per minuut, zodat één proces de rest niet meesleept.
Waar je begint
Een portaal aanmaken duurt kort: je kiest een naam, je krijgt een subdomein en een schema, en je kunt inloggen. Wil je eerst zien hoe het werkt, dan is de demo de kortste route. Wil je het op je eigen bronnen, dan is een intake de juiste.
