Skip to main content
A mod is a plugin that changes how Claude Code looks and behaves. It’s made of JavaScript or TypeScript event handlers: Claude Code calls one when an event happens, such as a tool call, a submitted prompt, or a part of the interface being drawn, and the handler can watch the event, change it, or take it over. Use a mod to add a feature of your own to Claude Code, such as a pane that charts how full your context is after each request. For the files in a mod and a complete example, see How a mod works.
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 /command that 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.
Mods work in the Claude Code CLI and in the Code tab of the Claude Desktop app. See Where mods run to understand how they behave elsewhere, such as in the VS Code extension, 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:

Install or update a mod

A mod is code that runs with your permissions. It can read and write your files, start processes, and make network requests. Install mods only from authors and marketplaces you trust. See Decide whether to trust 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.
Install plugins covers marketplaces, scopes, the VS Code extension and the Desktop app, and keeping plugins updated, all of which apply to a plugin that contains a mod without changes. If you install or update a mod from your shell while a session is open, run /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
A mod that approves tool calls can approve one that an 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, run claude plugin validate on the plugin’s directory:
The 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, run claude --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": true in ~/.claude/settings.json. Your settings hooks and custom status line stop too. What your organization manages keeps running.
If you use Claude Code through an organization, an administrator can also limit which mods load. Administrators start at Stop user-installed mods from loading. To find out whether mods can load for you, see Check whether mods can load.
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:
This is a complete 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
The file registers two hooks, and both use the calls variable at the top:
  • The tool.call hook runs each time Claude is about to use a tool. It adds one to calls, asks Claude Code to draw the interface again, and lets the tool run as usual.
  • The ui.render hook runs each time Claude Code draws the spinner. It keeps Claude Code’s own spinner and adds the count after the word.
This recording shows the mod at work. Watch the spinner line above the prompt box: while Claude lists a directory and reads two files, it reads 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.call hook in the example does
  • Rewrite: change the event before it continues, as the ui.render hook 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
To do anything outside its own code, such as draw, add a command, call a model, read a file, start a process, or make a network request, a hook calls the mods API. A hook has no other way to do those things, which is why Claude Code can list what a mod does before you install it. For the code behind each choice, see React to events. For what a hook can call, see Use the mods API.

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 the mods directory of the Claude Code repository. Each one is a complete plugin with its hooks module and tests:

Next steps