Once you work across more than one repository, your AI conventions start to drift.

canon is a CLI and Claude Code plugin that keeps one authoritative copy and installs it into each project on demand.

See how it installs

It runs on itself

The workflow this toolkit ships is the workflow that built it. Several Claude Code sessions run at once, each in its own git worktree on its own branch, and each opens its own pull request.

4 working 4 completed

3 working 5 completed

Pinned

  1. orchestrator-canon-lead dispatching the planners that need a plan 4d

Working

  1. worker-canon-agent-view-and-deploy PR #1510 open (landing page) #1510 5h
  2. planner-canon-context-wireframe-draft drafting the context and wireframe plan 2m
  3. planner-canon-skill-coverage-pointers reading the skill coverage pointers 1m
  4. planner-canon-screenshot-trap-guard planning the screenshot trap guard 1m

Completed

  1. worker-canon-agent-view-and-deploy pull request opened #1510 5h
  2. planner-canon-write-route-hook-bypass plan written; tested write probe 32m
  3. planner-canon-indexes-list-lookup plan and task board consistent 13m
  4. worker-canon-labels-scan-body-file address-review pass finished #1508 21m
  5. worker-canon-web-context-entry PR #1507 addressed with commit #1507 20m

… 16 more

Session rows are a real canon sessions list --json read taken on . The activity text and the pull request number are transcribed, since no verb here reports either.

Two commands and the toolkit is present

Add the marketplace, then install the Claude Code plugin.

claude plugin marketplace add https://github.com/erclx/canon
claude plugin install canon@canon

The skills land as /canon:<name>. If your session was already open, run /reload-plugins to pick them up.

Several skills call the canon CLI to read catalogs and run installs, and the plugin doesn't put it on your path.

bun install --global @erclx/canon

The size of what installs

78
skills
71
rules
30
standards
11
snippets
41
commands
20
audits

Read from the catalogs when this page was built.

Rules load into a Claude session when a matching path is edited. Every domain is listed below with the number of rules it holds, and a sample of each.

claude 2 of 24
500-prose **/*.md
501-markdown **/*.md
core 2 of 20
000-constitution every session
005-behavior every session
lib 2 of 10
300-testing-ts **/*.test.ts
305-e2e-reliability e2e/*.ts
framework 2 of 6
200-react **/*.tsx
210-astro **/*.astro
ui 2 of 6
400-ui **/*.tsx
410-a11y **/*.tsx
lang 2 of 3
100-typescript **/*.ts
110-python **/*.py
ci 1
700-ci-workflow .github/workflows/**
snippets 1
600-at-references every session

All 8 domains, a sample of each. 71 rules, read from the catalog when this page was built.

Claude Code plugin
skills that plan a feature, review a diff, sync the planning docs, and run the ship chain from branch through pull request
Governance rules
coding and authoring rules that load into a Claude session when a matching path is edited
Standards
authoring conventions read by name with canon standards <name> rather than copied into your project
Snippets
reusable prompts fired by @ reference, resolved live from the plugin with no install step
Tooling stacks
golden configs, seeds, and a reference per framework, laid down by canon init
Design system
a DESIGN.md token format, a skill that drafts one, and a render command

A rule arrives because of what you touched, not at startup

Governance rules load into a Claude session when a matching path is edited, installed per project and refreshed by sync.

Editing

src/design/tokens.ts

src/**/*.ts

Naming standards

Prefix booleans with is, has, should, or can: isLoading, hasAccess.

.claude/rules/canon/core/060-naming.md

What a target receives

Some domains are copied into your project and become yours to edit, and some are never copied at all. A tooling stack lands as real files under version control. A standard stays here and is opened by name, so there is no copy in your repo to drift from this one.

Copied into your project 6
astro 6 deps · 6 scripts
base 5 deps · 6 scripts
nextjs 2 deps · 2 scripts
python 0 deps · 6 scripts
vite-react 2 deps · 5 scripts
web 27 deps · 12 scripts
Never copied 6 of 30
architecture .claude/ARCHITECTURE.md
branch read by name
commit read by name
context .claude/context/
design .claude/DESIGN.md
diagrams .canon/diagrams/

Both columns are read from the tooling and standards catalogs when this page is built.

A rule with a glob loads only when a matching path is edited, and a rule with none loads every session. Stacks compose, so a project inherits every rule its stack depends on.

Work tracked in files, archived by a merge

.canon/tasks/ is gitignored session scratch, one row per task in flight, each naming the files it touches and the plan it runs under. A merge is what closes it, not a checkbox someone remembers to tick.

Run now 3
v81.0 a commit subject reaches the changelog unspelled title-spelling-check
v80.9 the key changes reader drops a path behind a code span key-changes-span-walk
v75.7 the planner in-flight read goes blind during a wave planner-in-flight-read

A hand-taken snapshot rather than something this build reads live, and it goes stale the moment the board moves.

Read the rest, or install it now

Everything above is read from this repository. The documentation is the same way.