Zelf beheerd in plaats van ingekocht
Foutregistratie draait op een zelf gehoste GlitchTip-instantie op onze eigen Scaleway-infrastructuur: crashrapporten verlaten onze servers niet. En ze bevatten jou niet: voordat een rapport wordt verstuurd, worden gebruikersidentiteit, IP-adres, cookies, headers, autorisatietokens, request-body en querystring verwijderd. De body is daarvan het belangrijkste deel, want daar zouden anders notitie-inhoud en zoekopdrachten in staan. Performance-tracing staat standaard uit. De bezoekersstatistieken van deze website werken zonder cookies (Plausible, EU) en in de app zijn er helemaal geen.
Sleutels die maar één ding mogen
Toegangssleutels volgen het least-privilege-principe: elk systeem krijgt alleen de rechten die het echt nodig heeft. Voorbeeld: de automatische deploy van deze website heeft geen CDN-sleutel voor het hele account, alleen een token dat precies één ding kan: de cache van deze pagina's legen. De centrale sleutels zelf staan in de Secret Manager van Scaleway, niet in externe buildsystemen.
De scheiding zit in de database, niet in de code
Bij de meeste diensten zorgt applicatiecode ervoor dat je andermans gegevens niet ziet. Eén vergeten ‘where user = …’ in één enkele query is dan genoeg voor een lek. Bij Memexa zit de scheiding een laag dieper: PostgreSQL dwingt die af met row-level security. Zonder ingestelde gebruikerscontext geeft de database geen rijen terug: niet de verkeerde, maar helemaal geen. De context wordt per transactie ingesteld en vervalt automatisch bij het afronden, en kan dus niet overspringen naar de volgende verbinding uit de pool. Om dat zo te houden, draait bij de tests een controle mee die alarm slaat zodra er een nieuwe tabel bijkomt zonder row-level security of zonder expliciete classificatie: de build faalt, in plaats van stilletjes door te gaan.
Wat je AI mag, bepaal jij, en je trekt het weer in
Claude, ChatGPT en Cursor krijgen geen loper. De toegang loopt via OAuth: voordat je toestemming geeft, zie je welke AI-app het vraagt en waar de toegang naartoe gaat, en je bevestigt het zelf. De browser-clipper en de volledige AI-toegang hebben aparte rechten: de clipper mag opslaan, niet in je verzameling zoeken. Verbonden AI-apps koppel je op elk moment los in Memexa; daarnaast kan een AI-app zijn toegang ook zelf teruggeven. En de toegangscontrole hangt niet aan één centrale plek: elke interface controleert de sessie zelf, zodat een fout op één plek niet alles openzet.
Verwijderen is verwijderen: in deze volgorde
Je kunt je account zelf verwijderen, met bevestiging per e-mail. Wat er dan gebeurt, is bewust omgedraaid: eerst worden alle bestanden in de objectopslag verwijderd, over het volledige gebruikersprefix, dus inclusief verweesde bestanden die bij geen enkel item meer horen. Pas daarna verdwijnen de databaserecords. Mislukt het verwijderen van de bestanden, dan wordt het hele proces afgebroken en blijft je account bestaan, in plaats van dat de beheergegevens weg zijn en de documenten blijven liggen. Het proces kan veilig worden herhaald. Losse inhoud kun je op elk moment afzonderlijk verwijderen, zonder aan je account te komen.
De lijnen daartussen
Elk traject is versleuteld: TLS 1.2 en hoger aan de rand, oudere versies zijn uitgeschakeld; ook de databaseverbindingen controleren certificaat en hostnaam, niet alleen ‘op de een of andere manier versleuteld’. De database zit in een privénetwerk zonder openbaar adres. Daarvoor zitten een WAF en DDoS-bescherming, en de origin-server accepteert alleen verzoeken uit het netwerk van het CDN. Rechtstreeks kom je er niet bij. De applicatiecontainer draait zonder rootrechten, afhankelijkheden worden gebouwd uit een vastgezet lockfile, en het ene externe binaire programma dat we nodig hebben, is vastgepind op versie en checksum.