Een codereview op elke pull request.
Installeer de GitHub-App en elke PR krijgt binnen minuten een concrete, vriendelijke review: wat de PR doet, wat er écht stuk is, wat je zou overwegen. Geen ruis, geen lofprietpraat. De grootste horde was niet de AI — het was n8n zelf: de secrets die deze keten nodig heeft, kon een Code node domweg niet bereiken. Deze pagina laat zien hoe dat werd opgelost, en bewijst het met een echte pull request.
Het probleem zat niet in de AI — het zat in de sandbox
ReviewPilot moet een GitHub-webhook verifiëren en een App-JWT ondertekenen — allebei met een geheim dat nergens in platte tekst mag staan. n8n’s Code nodes draaien echter in een externe sandbox die process (en dus elke omgevingsvariabele) principieel niet doorlaat. Twee wegen liepen dood voordat de derde werkte.
Het probleem
- “process is not defined” — Code nodes draaien in n8n’s externe Task Runner-sandbox, met een harde whitelist die nooit iets van process bevat
- Bevestigd door de n8n-broncode zelf te lezen (js-task-runner.js, task-runner-process-js.js) — niet door op documentatie te vertrouwen
- Optie 1: secrets als losse env-vars aan het proces meegeven — werkt, maar ligt open voor elke Code node die ooit misbruikt wordt
- Optie 2: n8n-credentials aan een Code node hangen — technisch onmogelijk, Code nodes kunnen de credential-vault niet bereiken
- Twee doodlopende wegen, geen van beide veilig genoeg voor een GitHub-App-secret
De oplossing
- De twee Code nodes die crypto deden vervangen door native nodes: een Crypto-node voor de HMAC, een JWT-node voor de App-ondertekening
- Native nodes draaien in het hoofdproces en lezen rechtstreeks uit n8n’s versleutelde credential-vault — buiten de sandbox om, geen env-vars nodig
- Onderweg nog drie verborgen bugs blootgelegd door écht te testen: HMAC over de verkeerde bytes, een HTTP-node die stilletjes een lege body verstuurde, en velden die verloren gingen tussen HTTP-nodes
- Elke fix geverifieerd tegen de échte GitHub API — niet gemocked
- Resultaat: geen secrets in code, geen sandbox-gok, en elke stap bewezen op een echte pull request
Wat het nu kan: van webhook tot review, met een vangrail vooraan
GitHub tikt aan, een native Crypto-node verifieert eerst de handtekening en pas dan gebeurt er iets — buiten n8n’s Code-sandbox om, want daar kan geen enkel geheim veilig wonen. De diff bepaalt welk model het werk doet; het antwoord komt als één comment terug. Onderin loopt dezelfde correlatie-draad als door de rest van het lab: elke review is een kostenregel.
Zeven stappen, één comment
Van PR tot review
- GitHub stuurt een webhook zodra een pull request opent of bijwerkt — de ruwe bytes gaan mee, niet alleen de JSON
- Een native Crypto-node herberekent de HMAC-SHA256 over die ruwe bytes en vergelijkt met de handtekening — geen geldig secret, geen review; het secret zelf leeft alleen in n8n’s versleutelde credential-vault
- Publieke repo → gratis tier; privérepo → klantcheck
- Een native JWT-node ondertekent een GitHub App-JWT met de app-sleutel uit de vault; die wisselt in voor een installatie-token dat read-only de diff ophaalt
- Diffgrootte bepaalt het model: klein → DeepSeek V4 Flash, groot → DeepSeek V4 Pro
- De review komt terug als één nette PR-comment, met bronverwijzing naar bestand en regel
- Elke call krijgt een correlatie-id, zodat AgentLedger de kosten per review vastlegt
Een echte review, op een echte pull request
Geen synthetische demo. Op een verse, publieke test-repo (Xreative/reviewpilot-test) ging een echte PR open met twee met opzet ingebouwde bugs. ReviewPilot ving het echte, door GitHub ondertekende webhook-event op, verifieerde het, koos een model en plaatste deze reactie — als de echte GitHub-App-bot, geverifieerd via GitHub’s eigen API (performed_via_github_app.id komt overeen met App-ID 4409542).
Samenvatting. Het toegevoegde bestand bevat een hardgecodeerde API-sleutel en een deling die gegarandeerd crasht op het aanroeppad.
Kritiek.
- Hardgecodeerde API-sleutel — hoort uit een omgevingsvariabele te komen
- divide(10, 0) — veroorzaakt een ZeroDivisionError
Aanbevolen. Ongebruikte import verwijderen, de sleutel niet naar stdout printen, typehints en een deling-door-nul-check toevoegen.
Zo samengevat — de originele, letterlijke reactie staat op GitHub. — 🧾 review.neuralex.nl
Geen zoveelste bot
Direct na het openen
Feedback binnen enkele minuten na een PR — geen wachtrij, geen handwerk.
Slimme routing
Kleine diffs naar een snel, goedkoop model; grote diffs naar een sterker model. Altijd de goedkoopste die past.
Privacy eerst
Geen dataretentie, geen training op jouw code. De review is vluchtig: gebruikt en weg.
Bewezen op echte bugs
Niet in theorie: de eerste live test ving een hardgecodeerde secret én een deling-door-nul, direct raak in de eerste PR.
Kosten transparant
Elke review krijgt een eigen correlatie-id voor de kostenregistratie via AgentLedger — geen black box.
Geen vendor lock-in
Draait op een eigen model-router. Geen afhankelijkheid van één Amerikaanse API.
Waar het nu staat
ReviewPilot draait niet meer alleen in dogfood: de hele keten is 100% getest tegen de échte GitHub API — een echte installatie, een echte pull request, een echte reactie van de bot, geverifieerd via GitHub’s eigen API. Wat nog open staat: de Sentinel-logkoppeling geeft momenteel een 404 op de audit-events — niet blokkerend voor de review zelf, maar de kostenregistratie in AgentLedger draait daardoor nog niet volledig automatisch. Dat staat als eerstvolgende op de lijst, net als bij AgentLedger.
De hele keten staat open op GitHub
Geen screenshot, geen bewerkte demo — de echte reactie van de echte GitHub-App-bot, op een publieke pull request die iedereen kan naspeuren.
Testrepo: github.com/Xreative/reviewpilot-test