AI / GenAI·9 min·8 oktober 2026

Claude Code heeft nu mods, en mijn eigen machine heeft geen portier

In deze repo hangt een hook die niet kan falen, en dat is uitgerekend degene die mijn artikelen nakijkt. blog-gates.mjs draait na elke schrijfactie vier redactionele controles, en zijn laatste regel is:

main().catch(() => {}).finally(() => process.exit(0));

Elke fout verdwijnt in die lege catch. Vindt hij een verzonnen getal, dan schrijft hij dat naar stderr en sluit hij af met nul. Claude Code ziet een geslaagde hook.

Begin september las ik een voorstel dat dat probleem in één klap zou oplossen. Een issue in de repo van Claude Code, met de titel “Function Hooks - make plugins 10x more powerful”, en de vraag aan de gemeenschap of dit gebouwd moest worden. Ik ging in mijn eigen installatie kijken en vond de motor al terug in de build van 29 augustus, vijf dagen voordat die vraag gesteld werd. Op 1 oktober is het uitgekomen, onder een andere naam: mods.

Over automatiseren met de hooks zoals ze tot nu toe bestonden schreef ik eerder, bij de plugin die je Claude Code-setup voor je uitdenkt. Dit stuk gaat over wat er nu bij komt, en over één regel in de aankondiging die ik twee keer moest lezen.

Wat een mod is

Een hook was tot nu toe een shell-commando. Claude Code start bij een event een script, geeft het JSON op stdin, en leest de exit-code terug. Een mod is een TypeScript- of JavaScript-module in een gewone plugin. In hooks/hooks.json staat één regel modules, en de module exporteert een functie register(on, options). Daarin hang je functies aan events:

on("tool.call", { tool: "Bash" }, async ($, e, next) => {
  return next(e);
});

Drie argumenten. e is het event als platte data. next geeft het event door aan de volgende plugin en uiteindelijk aan Claude Code zelf. $ is alles wat een mod mag doen: de interface, de sessie, bestanden, processen, het netwerk, het model.

Een mod wordt één keer geladen en blijft in de sessie. Hij kan dus onthouden wat er eerder gebeurde, en hij herlaadt zichzelf als je het bestand opslaat. Een shell-hook start bij elk event opnieuw en weet niets.

Mods stapelen als middleware. Wie het eerst laadt, ziet een event als eerste en het resultaat als laatste. Dat geeft drie bewegingen:

bewegingwat de mod doetvorm
kijkende rest laten lopen, dan het resultaat lezenconst r = await next(e)
herschrijveneen gewijzigd event doorgevenreturn next({ ...e, command: veiliger })
antwoordenzelf beslissen, de rest overslaanreturn { deny: "..." }

Daarmee kan een mod een prompt herschrijven voordat het model hem ziet, een tool-aanroep blokkeren of opnieuw proberen, een toestemmingsvraag zelf beantwoorden en geheimen uit tool-output halen voordat Claude ze leest. Tekenen is ook een event, dus een mod kan een deel van de interface vervangen of er knoppen bij zetten.

Voor mijn eigen hook betekent het dat falen uitdrukbaar wordt. Een functie die een waarde teruggeeft, kan iets anders teruggeven dan “alles goed”.

Anthropic gebruikt het model zelf. In de repo staat een map mods/ met vier mods die in Claude Code zijn ingebouwd: /diff, de ondersteuning voor AGENTS.md, de telemetrie, en sec-default. Op die laatste twee kom ik terug.

Wat er tussen voorstel en release veranderde

Het issue staat nog open. De titel is aangepast naar “Mods - make Claude 10x more extensible”. Op 8 september telde het 143 reacties en 126 emoji, op 2 oktober 233 reacties en 218 emoji, waarvan 130 duimen omhoog en nog altijd nul omlaag. De aankondiging bedankt iedereen die heeft meegedacht.

Wat ik op 8 september in mijn eigen builds vond:

buildbestandsdatumtreffers op functionHooks
2.1.23315 augustus 20260
2.1.24124 augustus 20260
2.1.25129 augustus 2026138

Het issue is van 3 september. De motor zat er dus al vóór de vraag of hij moest komen. Een prototype bouwen om een voorstel te kunnen laten zien is gewoon werk, dus een verwijt is het niet. Maar wie in september reageerde, dacht mee over de afwerking van iets dat er al stond.

Mods vragen versie 2.1.287. Mijn installatie staat op 2.1.283, de build van 28 september, en daarin staat functionHooks 151 keer. Ook sec-default staat er al in. Draaien kan ik ze nog niet.

De kanttekening

Op je eigen machine laadt er geen portier. De aankondiging zegt het in één zin: mods hebben dezelfde toegang tot je machine als Claude Code zelf, ze zitten niet in een sandbox, en je installeert ze alleen van bronnen die je vertrouwt. De beschermende mod sec-default laadt als eerste, maar alleen bij Team en Enterprise of op een machine met managed settings. Wie met een Pro- of Max-abonnement op zijn eigen laptop werkt, heeft die eerste plek in de keten dus leeg. Daar komt bij dat sec-default volgens zijn eigen README “adds no policy of its own”. Hij beschermt de regels van een organisatie, zoals deny-regels en beheerde instellingen. Bestanden lezen, processen starten en het netwerk op laat hij gewoon door. De gids die bij de lancering hoort zegt dat een mod in “a sandbox of its own” draait, en dat klopt ook: de module zelf ziet geen Node. Maar via $ krijgt hij fs, process en http. Allebei waar.

Een plugin-update is nu een code-update. Ik heb elf plugins geïnstalleerd, uit negen marketplaces. Geen ervan levert vandaag een mod mee; ik heb in de hooks.json van alle elf gezocht naar modules en niets gevonden. Maar een mod komt mee in een gewone plugin, dus de volgende update van een van die elf kan er een bevatten, met toegang tot alles wat Claude Code ziet. Bij een shell-hook kon je twintig regels bash nalezen. Een mod die zichzelf vooraan zet ziet elk event, inclusief wat andere plugins doen. De aankondiging noemt dat zelf als voordeel voor bedrijven: een mod die als eerste laadt kan elke aanroep van elke andere mod vastleggen. Dezelfde plek is voor een thuisgebruiker een plek om mee te lezen.

De handige mod kost je telemetrie. Bij dezelfde release zit “You should know”, een ingebouwde mod met een agent die meekijkt en waarschuwt voor dingen die jij of Claude missen. Hij werkt alleen in sessies waar telemetrie aanstaat. Wie analytics heeft uitgezet, en dat hebben mensen meestal met een reden gedaan, krijgt hem niet. Ook de telemetrie zelf is nu een mod. Volgens de README stuurt die niets als analytics uit staan, en weigert hij aanroepen van plugins die je zelf installeert. Dat is netjes geregeld. Het verschuift wel de afweging, want de functie die je tegen fouten beschermt zit nu achter de schakelaar die je privacy regelt.

Wat ik nu doe

Ik heb mods nog niet zelf getest. Op het moment van schrijven draait hier 2.1.283, en mods vragen 2.1.287. Alles hierboven over hoe ze werken komt dus uit de aankondiging, de gids en de broncode, niet uit mijn eigen sessies.

Testen ga ik wel. De voor de hand liggende eerste kandidaat is blog-gates.mjs, die nog altijd eindigt op dezelfde lege catch. Als mod zou hij kunnen laten weten dat er iets mis is. Of dat het waard is, weet ik pas als ik het geprobeerd heb. Ik ruil dan een script van 92 regels dat ik in zijn geheel kan lezen in voor een module in een keten waarvan de volgorde afhangt van wat er nog meer geladen is. Als ik het gedaan heb, schrijf ik hier een vervolg op, met wat werkte en wat niet.

De controle die ik vandaag heb gedaan, kan iedereen herhalen: zoek in de hooks.json van je geïnstalleerde plugins naar modules. Dat is één grep, en zonder sec-default is het op een eigen machine de enige plek waar je ziet dat er een mod binnenkomt.

Veelgestelde vragen

Wat is het verschil tussen een hook en een mod?

Een hook is een shell-commando dat bij elk event opnieuw start, JSON op stdin krijgt en via een exit-code antwoordt. Een mod is een module die één keer laadt, in de sessie blijft, state kan bewaren, interface kan tekenen en events kan herschrijven of zelf beantwoorden. Hooks blijven bestaan; een mod is een extra soort, aangewezen met modules in dezelfde hooks.json.

Heb ik de bescherming van sec-default als ik alleen werk?

Nee, tenzij je zelf managed settings hebt ingericht. sec-default laadt bij Team- en Enterprise-organisaties en op machines met managed settings. En ook daar beschermt hij de regels van de organisatie, niet je bestanden of je netwerk.

Moet ik “You should know” aanzetten?

Dat hangt af van wat je met telemetrie wilt. De mod staat standaard uit, je zet hem aan met /plugin enable cc-plugin-you-should-know@builtin, en hij werkt alleen in sessies met telemetrie aan. Heb je die uitgezet, dan werkt hij niet.

Kan ik zien of een plugin een mod bevat?

Ja. Een mod staat in de hooks.json van een plugin onder de sleutel modules. Geïnstalleerde plugins staan in ~/.claude/plugins/cache/, en een zoekopdracht op "modules" in die bestanden laat zien welke er een meeleveren.

Bronnen

  • Anthropic, “Customize Claude Code with mods”, claude.com/blog, 1 oktober 2026, geraadpleegd 2 oktober 2026.
  • Addy Osmani, “Getting started with Claude Code mods”, claude.dev, 1 oktober 2026, geraadpleegd 2 oktober 2026.
  • Claude Code changelog, versie 2.1.287, geraadpleegd 2 oktober 2026.
  • Map mods/ in anthropics/claude-code, README’s van sec-default en telemetry, geraadpleegd 2 oktober 2026.
  • GitHub-issue anthropics/claude-code#91870, geopend 3 september 2026, geraadpleegd 8 september en 2 oktober 2026.
  • Eigen metingen in ~/.local/share/claude/versions/ op 8 september en 2 oktober 2026.

Gecontroleerd op 2 oktober 2026. De aantallen reacties komen uit de GitHub-API van die dag en lopen op. Mods zelf heb ik niet kunnen draaien, want mijn installatie staat op 2.1.283 en mods vragen 2.1.287; wat hier over hun gedrag staat komt uit de aankondiging, de gids en de broncode in mods/. De aankondiging zegt dat mods niet gesandboxed zijn, de gids dat de module in een eigen sandbox draait zonder Node. Ik houd de aankondiging aan voor de veiligheidsvraag, omdat de gids zelf beschrijft dat $ bestanden, processen en netwerk doorgeeft.