Claude Code’s existing hooks also run on events, as a shell command, HTTP request, or prompt you configure in a settings file. A mod’s handlers are functions that run inside Claude Code instead. Claude Code calls both kinds hooks: on these pages, “hook” means a mod’s handler, and the settings-file kind is a “settings hook”.
What a mod can do
Settings hooks, skills, status lines, and MCP servers work from outside Claude Code: each one runs a script, or gives Claude text or tools. A mod runs inside Claude Code, so it can do things they can’t:- Draw an interface you can use: a pane beside the transcript or a band above the prompt, with tabs, buttons, and text fields. See Draw in the interface.
- Redraw Claude Code’s own interface: replace or restyle parts Claude Code draws itself, such as a tool call’s row, the spinner, or the dialog Claude asks questions in. See Change what Claude Code already draws.
- Step into a tool call or a request: for example, hold a tool call while you ask the user a question, answer it without running the tool, or send one request to a different model. See Guard or change a tool call and Follow a turn.
- Run your own code on a command: a
/commandthat runs your function at once, with no Claude turn, even while Claude is working. See Add a command or a tool. - Share data between hooks: a mod’s hooks share the variables in its file, so what one hook records, another can show. For example, one hook can count tool calls while another shows the count beside the spinner, or one can read each request’s token usage while another charts it in a pane. See React to events.
claude -p, and cloud sessions. If a settings hook, a skill, or an MCP server already does what you need, compare them before you write a mod. To manage mods for an organization, see Manage mods for your organization.
Get a mod
You can start with a mod in one of three ways:- Use one you already have: some of Claude Code’s own features are mods, such as
/diff. See Mods built into Claude Code. - Make one: describe what you want in a Claude Code session, and Claude writes the mod. See Ask Claude for a mod. To learn how a mod’s code works, write one yourself.
- Install one: see Install or update a mod
Install or update a mod
A mod installs as a plugin, from a marketplace. Give the plugin’s name, an@, and the marketplace’s name. These examples install a plugin named token-chart from a marketplace named your-org:
- In a Claude Code session, run
/plugin install token-chart@your-org. - In your shell, run
claude plugin install token-chart@your-org.
/reload-plugins in that session to load it. Otherwise it loads the next time you start Claude Code.
Decide whether to trust a mod
A mod is code that runs with your permissions, inside Claude Code. Install mods only from authors and marketplaces you trust.What a mod can reach
A mod runs with your permissions, so before you install one, know what it has access to. Once it loads, a mod can:- Act on your machine as you: read and write files anywhere your user account can, start programs, and make network requests
- Read your secrets: environment variables and settings files, including an API key you keep in either
- See your session: every prompt you send and every tool call Claude makes
- Change your session: rewrite a prompt or a tool call, submit a prompt as if you had typed it, or send a message to another of your sessions
- Act without asking you: approve a tool call before you’re asked
- Spend your usage: call a model on your plan or API key
ask rule would prompt for, or that one of your own PreToolUse hooks blocked. Extend permissions with hooks lists what such a mod can approve, including when it can approve a call that a deny rule refuses.
A mod can restyle much of Claude Code’s interface, but not the permission prompt. It can’t change what a prompt shows you.
List what a mod does before you install one
Before you install a mod, you can list which events it hooks and what it asks Claude Code to do, such as read a file or make a network request, without running it. Get the plugin’s files first, for example by cloning its repository. Then, in your shell, runclaude plugin validate on the plugin’s directory:
hooks: and calls: lines in the output list the events the mod handles and what it asks Claude Code to do. Review what a mod can do shows the output and which calls to look for.
Turn mods on or off
Mods require Claude Code v2.1.287 or later, and they’re on by default. In your shell, runclaude --version to check, and update Claude Code if yours is older.
To turn mods off, choose how many to stop, and for how long. To turn them back on, undo the same change:
- One mod: disable or uninstall its plugin from the Installed tab in
/plugin - Every installed mod, for one session: start Claude Code with
--safe-mode, which also leaves out your other customizations - Every mod you installed, in every session: set
"disableAllHooks": truein~/.claude/settings.json. Your settings hooks and custom status line stop too. What your organization manages keeps running.
If you set
CLAUDE_CODE_ENABLE_FUNCTION_HOOKS during early access, remove it. Claude Code v2.1.287 and later ignores it, so setting it to 0 doesn’t keep mods off.See which mods a session loaded
To see which mods a terminal session loaded, run/plugin at the Claude Code prompt. A dim line under the tabs gives the count and the names, such as 1 mod active · first-mod. If a mod you installed isn’t named there, see Find out why a mod does nothing.
How a mod works
A mod is a plugin whose code registers event handlers, called hooks. Claude Code runs a hook when its event happens, such as when Claude calls a tool or when the spinner is drawn. A small mod has three files:plugin.json: the plugin’s manifesthooks.json: points to your code fileregister.js: your code, called the hooks module. It tells Claude Code which events to run your functions on.
register.js. It counts the tool calls Claude makes and shows the count beside the spinner while Claude works, as in Thinking · tool calls: 3….
hooks/register.js
calls variable at the top:
- The
tool.callhook runs each time Claude is about to use a tool. It adds one tocalls, asks Claude Code to draw the interface again, and lets the tool run as usual. - The
ui.renderhook runs each time Claude Code draws the spinner. It keeps Claude Code’s own spinner and adds the count after the word.
Thinking · tool calls: 1…, then 2…, then 3….
What a hook can do with an event
Claude Code runs your hook before it acts on the event, so the hook decides what happens next. It has three choices:- Observe: note what’s happening and let it continue unchanged, as the
tool.callhook in the example does - Rewrite: change the event before it continues, as the
ui.renderhook does when it adds the count to the spinner - Answer: handle the event itself, so the usual behavior doesn’t run, such as refusing a command
Where mods run
A mod’s hooks run in every kind of session that loads the plugin. Drawing is narrower: only the terminal and the Desktop app show a mod’s panes, bands, and replaced rows. This table lists each place you might run Claude Code:
A mod that draws can check which app it’s running in, and fall back to a line in the transcript or a command’s text reply where nothing draws.
Control mods for your organization
Administrators decide whether mods run and which ones, through managed settings. Manage mods for your organization covers what happens by default, how to review a mod, and how to enforce a policy with a mod of your own.Compare mods, settings hooks, skills, and MCP servers
Mods, settings hooks, skills, and MCP servers overlap. This table shows what each one is and when to pick it.
Each of the others has its own page: Hooks, Skills, and MCP. A plugin can hold all four, so a mod can ship in the same plugin as a skill and an MCP server.
Mods built into Claude Code
Some of Claude Code’s own features are mods. To see the ones your session has, run/plugin at the Claude Code prompt and go to the Installed tab, which lists them under Built-in. You can’t update or uninstall a built-in mod, and the table’s last column says how to turn each one off. The mods active line leaves built-in mods out.
This table lists each entry by the name /plugin shows:
The settings and flags that stop installed mods, such as
disableAllHooks, --bare, and --safe-mode, don’t stop built-in mods.
Read the source of built-in mods
The source of four of these mods is public in themods directory of the Claude Code repository. Each one is a complete plugin with its hooks module and tests:
diff: the/diffpane, with buttons bound to keyboard actions and scrolling the mod handles itselfagents-md: loadsAGENTS.mdas project instructions, with auserConfigoptionsec-default: the guard described in Know what happens by default, a model for a mod that enforces policytelemetry: adds methods that other mods can call, and ships their types
Next steps
- Create a mod: build one that counts tool calls, shows the count beside the spinner, and adds a command, and learn the edit and reload loop
- Draw in the interface: panes, the band above the prompt, buttons, text fields, and state
- React to events: tool calls, prompts, turns, and the order mods run in
- Use the mods API: commands, tools, model calls, timers, and files
- Test a mod: automated tests that run without a session
- Troubleshoot a mod: the reasons a mod does nothing, and the debug log
- Manage mods for your organization: defaults, managed settings, reviewing a mod, and policy mods
- Mods reference: every event, method, element, and limit