EN NL
Projecten · 02 / 05

Clio

Privé-app, alleen met login

Logboek voor afspraken en klantgesprekken: één invoerregel die +klant, @persoon, #tag en !deadline live kleurt, met actiepunten, export, samenvattingen en een MCP-koppeling voor AI.

Periode
2026
Rol
Ontwerp en ontwikkeling
Gebouwd met
LaravelPHPMySQLFrankenPHPMCP

De screenshots tonen verzonnen demodata, geen echte accounts.

  • 5soorten tokens, gekleurd tijdens het typen
  • 190+automatische tests in PHP en JavaScript
  • 3exportformaten
  • 2FAbij elke login
Over het project

Clio is mijn logboek voor afspraken en klantgesprekken. Alles begint met één invoerregel: typ wat er besproken is en Clio herkent tijdens het typen de klant, personen, tags, deadlines en bestede tijd.

Uit die notities bouwt Clio een tijdlijn, een lijst met open actiepunten en samenvattingen per klant. Het draait op Laravel 13 en FrankenPHP zonder frontend-buildstap, achter inloggen met tweestapsverificatie en een strikte content security policy.

Wat ik bouwde
  • Live kleuring van +klant, @persoon, #tag, !deadline en ~tijd, uit één grammatica die de PHP-parser en de JavaScript-tokenizer delen
  • Aanvullen van klanten, personen en tags, met sneltoetsen voor bijna alles
  • Open actiepunten gegroepeerd in te laat en later, af te vinken in de tijdlijn
  • Samenvattingen per klant en dag die terugverwijzen naar hun bronnen
  • Exporteren naar Markdown, CSV en JSON, volgens het huidige filter
  • Een MCP-server zodat een AI-assistent het logboek kan lezen; schrijven vraagt aparte rechten op het token
  • Elke gebruiker heeft een eigen logboek, afgedwongen in de modellen en gecontroleerd door automatische tests
Onder de motorkap

Hoe het werkt

Eén grammatica, twee parsers

Notities worden twee keer geparsed: in JavaScript tijdens het typen, voor de kleuren en suggesties, en in PHP bij het opslaan. Beide draaien op één gedeeld bestand met testgevallen, dus wat je ziet tijdens het typen is altijd wat er wordt opgeslagen.

AI-toegang zonder de deur open te zetten

Het MCP-endpoint is de enige route buiten de login en de tweestapscontrole. Tokens kunnen alleen lezen, tenzij ze schrijfrechten krijgen, worden als hash opgeslagen en hebben een rate limit nog vóór het token wordt gecontroleerd. Mislukte pogingen komen in het log voor fail2ban.

Testen raakt nooit de live data

De lokale opzet heeft een eigen database. Commando's die data schrijven weigeren in productie en tegen elke andere database, en de testsuite stopt als hij niet naar de testcontainer wijst. Echte data komt alleen binnen via Clio's eigen JSON-export.

Zoeken en geschiedenis

Zoeken gebruikt een MySQL full-text-index waarin elk woord als begin van een woord telt. Elke wijziging wordt bewaard als revisie en verwijderen kan ongedaan worden gemaakt, dus er gaat nooit per ongeluk iets uit het logboek verloren.