Free tools

Claude Code Settings Check

Paste a settings.json (and, optionally, settings.local.json) and get every structural mistake in its hooks and permissions sections flagged in seconds — a matcher that can't compile, a hook with no command, a rule with unbalanced parentheses, a rule duplicated across lists, and a rule that contradicts itself across the two files.

Structural checks, not a runtime test. This tool never runs your hooks and never calls an LLM — it only looks at the text you paste and flags known failure shapes in it. It does not know which file or list Claude Code honours when two rules disagree; it only tells you that they disagree.

1. Paste your settings.json

The project's shared, committed configuration. Nothing here is uploaded — everything runs in this page.

Findings

Paste a settings.json above, or load the example, then press Check.

Usage is optional, stays in this browser, and counts only that a check ran or a summary was copied. Nothing you paste — no settings, hook commands, or file paths — is ever recorded, uploaded, or sent to an analytics service. Uncheck to turn it off. Do Not Track and Global Privacy Control disable counting automatically.

Common questions

What does this tool check in a settings.json file?

Two sections: hooks (a matcher regex that fails to compile, a matcher group with no hook commands, a hook entry with an empty or missing command, and event/type names checked against this tool's documented list as a caution) and permissions (a rule string with unbalanced parentheses, trailing text after the closing parenthesis, an empty specifier, leading or trailing whitespace, a rule duplicated within one list, and a rule appearing in more than one of allow/deny/ask).

Does this tool contact a network or Anthropic's servers?

No. Every check is a deterministic, structural check against the text you paste, entirely in your browser. It never uploads anything and never calls an LLM.

Does a clean result mean my hooks and permissions work correctly?

No. This tool checks the shape of the file, not Claude Code's runtime behaviour. A hook can be perfectly well-formed and still not do what you intended, and this tool has no way to observe that. It also does not know which file or list Claude Code honours when two rules disagree -- it only tells you that they disagree, and points you at the current documentation to resolve it.

Why check settings.local.json against settings.json together?

Because a rule that contradicts itself across the two files is invisible if you only ever look at one of them -- a deny in the shared, committed settings.json and an allow for the exact same rule in your own settings.local.json is easy to introduce and easy to miss, since nothing about either file alone looks wrong.