Naar de inhoud
florisknol.com
NLEN

Ik vroeg AI om een WhatsApp-client. 82 minuten later draaide hij

Telefoon met een WhatsApp-gesprek naast een laptop met code, label 82 MIN

Op 5 oktober om 20:34 typte ik twee zinnen.

"I want a Wantzel implement of whatsapp-ws. Can we make a pure Wantzel implementation for studio of this."

Meer was het niet. Een verwijzing naar een kleine open-source WhatsApp-brug, en de wens om die in Wantzel te hebben, de programmeertaal waarop mijn eigen omgeving draait. Om 21:56 stuurde mijn assistent Ilse haar eerste antwoord via WhatsApp. Daartussen zitten 82 minuten, afgelezen uit het ticket en het ruwe berichtenlog.

Sinds vanochtend staat de video online waarin je het hele verloop ziet, met de prompt, de tijdstempels en de toetsen die groen worden: https://youtu.be/LAdXqhevjrM

In dit artikel vertel ik wat er in die anderhalf uur gebeurde en wat er de weken daarna uit groeide. En waarom het snelle deel niet het interessante deel is.

Twee zinnen zijn geen specificatie

Wie "WhatsApp-client in 82 minuten" leest, denkt aan een AI die blind code uitspuugt. Zo ging het niet.

Het origineel is ongeveer duizend regels Go. Het zware werk zit in een bibliotheek daaronder: de versleuteling, het binaire berichtformaat en het Signal-protocol. Pure Wantzel betekent dat die bibliotheek er niet is. Wat die bibliotheek deed, moest de agent zelf schrijven.

Dus begon de agent niet met code maar met een ticket. Wat is het origineel? Wat bouwen we, in zes punten? Wat blijft er voorlopig buiten, zoals media en groepen?

Daarna de licenties. Het origineel valt onder GPL, de bibliotheek onder MPL. Mijn software is gesloten, dus er wordt geen regel code overgenomen. Die projecten dienen alleen als beschrijving van het protocol.

En dan het belangrijkste kopje: af als. De handshake werkt tegen de live server van WhatsApp. Elke laag is getoetst tegen een onafhankelijke referentie. Een bewuste breuk maakt de toets rood. En op mijn telefoon lukt het koppelen, ontvangen en antwoorden, ook na een herstart zonder opnieuw te koppelen.

Twaalf minuten na mijn prompt stonden er zes nieuwe tickets klaar, één per laag. De verbinding met haar handshake. Het binaire formaat. Koppelen met een QR-code. De Signal-sessies. Berichten heen en terug. De interface van het origineel.

Onderweg zag de agent dat de map met gebouwde programma's was volgelopen tot zeven gigabyte. Niet zijn taak. Hij schreef er een ticket voor en ging terug naar WhatsApp. De volgende dag was het opgeruimd.

Elke laag werd gecontroleerd tegen iets wat de agent niet zelf had geschreven. De decoder van de Go-bibliotheek, en de Signal-bibliotheek die voor de andere telefoon speelde. Zo toets je het protocol, en niet je eigen aannames.

Om 21:23 kwam de eerste commit: twintig bestanden en bijna 6.400 regels, de toetsen inbegrepen. Er was toen nog geen enkel bericht verstuurd. Die toetsen bestaan nog steeds. Gisteravond zijn ze opnieuw gedraaid, en ze zijn allemaal groen.

Waarom de firewall code is en geen prompt

Een minuut na die eerste commit kwam ik met een extra wens. Ilse zou mijn WhatsApp gaan beantwoorden, dezelfde assistent die al mijn mail doet. Ze mocht nooit een link volgen, en nooit ingaan op spam of phishing.

De voor de hand liggende oplossing is een regel in haar instructies. Dat is precies wat ik niet wilde.

Een regel in een prompt is een verzoek aan een taalmodel. Een slim geschreven bericht praat er omheen. Een regel in code laat zich niet overhalen.

Daarom kwam de firewall in lagen. Eerst kijkt de hub zelf, zonder taalmodel. Er is een blokkadelijst en een grens aan hoe snel iemand mag schrijven, en links komen binnen als platte tekst die niet te openen is. Daarna volgt een snelle controle op spam en phishing. De laatste laag is haar gereedschap: in een WhatsApp-beurt heeft ze geen browser. Ze kan geen link volgen, ook niet als een bericht haar daartoe probeert over te halen.

Om 21:44 stuurde ik: "Hallo dit is een test." Het bericht kwam binnen, werd ontsleuteld, en er kwam niets terug. Twaalf minuten lang. Ilse mocht pas antwoorden als haar firewall er stond.

Om 21:55 stond haar antwoordpad in git, achter de firewall. Een halve minuut later kwam haar eerste antwoord: de test is aangekomen.

Daarna vroeg ik wanneer mijn volgende boek uitkomt. Ze had geen datum, zei dat ook, en bood aan het te noteren. Op de vraag hoe ze wist wie ik was, antwoordde ze: aan je nummer. Iemand die vanaf een ander nummer zegt Floris te zijn, behandelt ze niet als Floris.

Wat er eerlijk bij hoort

Anderhalf uur klinkt snel. Daarom wil ik ook zeggen wat er omheen zat.

De cryptografische bouwstenen gingen diezelfde avond de standaardbibliotheek van Wantzel in, zo'n twintig minuten vóór de prompt. De 82 minuten zijn het WhatsApp-protocol daarbovenop.

De grote keuzes vielen de dag ervoor. Ik koos voor het onofficiële protocol, met het risico dat WhatsApp het nummer blokkeert. Dat risico heb ik bewust genomen. Verder één gekoppeld apparaat, en Ilse als eerste die antwoordt.

De firewall kwam er onderweg bij en zit binnen de 82 minuten. Het zijn de twaalf minuten stilte tussen het eerste bericht en het eerste antwoord.

Het snelle deel is dus niet het verhaal. Het verhaal is dat twee zinnen van mij een plan werden met een duidelijke lijst van wanneer iets af is. En dat elke laag getoetst werd tegen iets wat de AI niet zelf had bedacht. Ik besluit wat er moet gebeuren en waarom. De AI bouwt het en toetst het tegen die lijst.

Van chatkoppeling naar assistent

Dat was dag één. Daarna kwam het dagelijks gebruik, en in vier weken groeide de koppeling uit tot een assistent. Ze kreeg afbeeldingen, documenten en video's. Groepsgesprekken. Peilingen die ze kan sturen en teruglezen. Spraakberichten: ze luistert, en antwoordt met een eigen stem.

Zo gebruik ik haar nu. 's Ochtends zet ze mijn dag klaar. Komt er een offerteaanvraag binnen, dan hoor ik het van haar. Staat een factuur te lang open, dan herinnert ze me eraan. En ze denkt vooruit: "Je hebt morgen een workshop in Amsterdam. Zal ik je vaste hotel voorstellen?"

Wat ze niet zelf hoort te beslissen, geeft ze aan mij door. Een boeking, een prijs of een toezegging komt bij mij terecht, als gewoon WhatsApp-bericht.

Op 2 november verhuisde ze uit mijn studio naar een eigen programma: Mobile Chat Agent. Eén programma met één datamap, zodat het zelfstandig kan draaien. Ze heeft een beheerpagina en een MCP-koppeling. Daarmee werk ik vanuit Claude haar kennis bij, of pas ik haar instellingen aan. Geplande berichten komen uit gegevens: wat er die dag speelt, bepaalt wat ze stuurt.

Gisteravond: vijf agents tegelijk aan het moeilijkste deel

Eén onderdeel was nog niet van haar: bellen. Ilse kon vanaf 7 oktober opnemen, maar via een hulpprogramma in Go, met ffmpeg voor geluid en beeld. Het werkte. Toch was het het enige stuk dat niet in Wantzel stond.

Gisteravond werkten vijf AI-agents naast elkaar, elk op een eigen tak. De een zette de spraakcodec over die WhatsApp voor gesprekken gebruikt. Een ander bouwde het versleutelde transport. Weer anderen deden video, haalden ffmpeg uit de spraakberichten en voegden alles samen.

Hoe voorkom je dat agents elkaars werk stukmaken? Met twee afspraken.

De toetsen komen van het oude programma zelf. Dat legt precies vast wat het verstuurt en ontvangt, en de nieuwe code moet dat byte voor byte nadoen.

De naden worden vooraf opgeschreven. Welke routine het gesprek gebruikt om geluid door te geven, en welke voor beeld. Elke tak bouwt naar zo'n naad toe, en één tak voegt ze samen.

De spraakcodec komt nu op alle 152 toetspakketten byte voor byte gelijk uit met de referentie. Daar hoort een opname van een inkomend gesprek bij. Om zover te komen moesten zelfs de rekenfuncties van Go eronder exact worden nagebouwd. Bijna goed levert niet dezelfde bytes op.

Hoe weet je dat zo'n toets iets betekent? Door de code met opzet te breken. Eén verschuiving in één regel van de decoder, en negen van de dertien controles worden rood. Terug naar de originele code, en alles is weer groen. Een toets die je nooit rood hebt gezien, bewijst weinig.

Ook de video is nu Wantzel. De H.264-decoder maakt elk beeld gelijk aan wat ffmpeg ervan maakt. En om kwart voor negen gisteravond speelde op mijn telefoon het eerste spraakbericht af dat zonder ffmpeg was gemaakt.

Wat op het moment van schrijven nog niet gebeurd is: een telefoongesprek via de nieuwe Wantzel-versie. Elk onderdeel is getoetst tegen de referentie, op één machine. Het live gesprek is de volgende stap. Tot dat staat, blijft het Go-hulpprogramma als terugval.

Wat er nog komt, en wat ik ervan leer

Ilse groeit door naar een collega die dingen regelt. Op de lijst staan hotels en restaurants reserveren. Daarna offertes afhandelen en afspraken met klanten inplannen. Dan automatisch factureren en de boekhouding bijhouden. En aankopen doen in webwinkels, tot de boodschappen aan toe.

Wat ik uit deze weken meeneem, gaat weinig over snelheid. Een agent bouwt snel als het werk vooraf scherp staat. Wat moet er komen, wat blijft erbuiten, en wanneer is het af? Hij bouwt betrouwbaar als hij toetst tegen iets wat hij niet zelf schreef, en als hij die toets ook een keer rood heeft gezien. En hij blijft veilig als de grenzen in code staan, niet alleen in een prompt.

De mens beslist wat er gebouwd wordt en waarom. De agent bouwt het, toetst het, en geeft door wat hij niet zelf mag beslissen.

Zo'n agent bouw ik ook voor klanten, in één dag. Dat doe ik op een Expert Day, bij jou op locatie. Meer daarover vind je op mijn profiel.

Alle stukken