Skip to content
The reference

Sixteen commands, no guesswork

Two of them do almost everything: init once, then check forever. The rest are there for the days something is wrong, or CI needs to work differently.

Six of them are verbs that run on their own — init, doctor, capture, compare, check, clean. The rest belong to a noun group and need a subcommand: cloud publish, not cloud. Typing a group on its own prints your choices, does nothing, and exits 2 — a noun is not a verb.

npx norma-scope init

Nothing to install first — npx fetches it on the first run. Node 18 or newer is the whole list of requirements.

16
commands
1
config file
0
accounts to run locally
A terminal running npx norma-scope compare with the --json and --strict flags. It prints one line per frame — 0.3% aligned with 5.6% unaligned, SSIM 99 and two drifted sections for the first, 0.0% for the other two — then reports where the report and summary were saved, and that --strict is exiting 1 because one frame is above the threshold.
One real run. Every command prints like this — one line per page, the numbers that matter, and exactly where it put the files.

Grouped by what they do

Setup4Capture2Compare2Share4AI1Utility3
Start here

Answer three questions, get a working config

This writes a real .bridge/config.json and the exact commands to run with it. Copy it into your project and it works.

1 · What are you comparing against?
2 · Can Normascope reach your app?
3 · What should CI do when a frame drifts?

.bridge/config.json

{
  "threshold": 5,
  "source": { "type": "images", "dir": "designs" },
  "app": { "baseUrl": "http://localhost:3000" },
  "frames": [
    {
      "label": "Pricing",
      "screenshot": "pricing.png",
      "route": "/pricing",
      "viewport": { "width": 1440, "height": 900 }
    }
  ]
}

init adds one more line per screen: a short code like fr_k3m9…. It is different for every project, so it is not shown here. It is what lets you rename pricing.png later without losing its history.

then run

$ npx norma-scope init

$ npx norma-scope doctor

# start your app, then:

$ npx norma-scope check

$ open .bridge/reports/report.html

No token, no network, no account — the reference is already in your repo.

Every command

Pick one to see what it does

Setup
Capture
Compare
Share
AI
Utility

Before choosing whether to share usage analytics.

  • Default collection is release-gated off. Preview opt-in uses NORMA_TELEMETRY=1.
Reads
Local telemetry preference.
Writes
Nothing; does not create an installation ID.
Network
None — it makes no request at all
Can it spend money?
No
Can it fail a build?
No.
At a glance

What each one touches

Everything here runs on your machine unless the network column says otherwise, and nothing spends money unless the money column says so.

CommandReadsWritesNetworkSpends
telemetry statusLocal telemetry preference.Nothing; does not create an installation ID.NoneNothing
telemetry disableLocal telemetry preference.Persistent opt-out; removes the saved installation ID.NoneNothing
inityour answers, the design source's API.bridge/config.json, the .bridge/ folders, .gitignore entries, a pre-commit hookyour design source, to list its framesNothing
doctorconfig, token, design file, your app URLnothing — diagnosis onlyyour design source and your running app, to check both answerNothing
captureconfig + your running app.bridge/screenshots/*.pngyour own running app, in a headless browserNothing
compare.bridge/screenshots/ + the reference your source points at.bridge/diff/, report.html, and summary.json with --jsonyour design source, unless a snapshot or cache already has the referenceNothing
checkeverything capture and compare readeverything capture and compare writethe same as capture and compare — your app, and your design sourceNothing
explain --local [frame]screenshots, diffs, captured DOM context, optional source excerpts, your API keyfindings in the terminal and in the reportyour own model provider, under your own key. Nothing goes to Normascope Cloudyour own provider account
cloud publishCloud.bridge/reports/summary.json and the images it names.bridge/reports/cloud.json — the receipt, written on every run including a failed oneNormascope Cloudnothing by itself; --explain spends Cloud credits
cloud validateCloud.bridge/config.jsonnothing — it exits 1 if it found somethingNoneNothing
frames listCloud.bridge/config.jsonnothing — it just printsNoneNothing
frames adoptCloud.bridge/config.json.bridge/config.json — then commit itNoneNothing
ci comment.bridge/reports/summary.json, and .bridge/reports/cloud.json when a publish wrote onemarkdown on stdoutNoneNothing
baseline approve.bridge/screenshots/.bridge/baseline/ plus a manifest — commit itNoneNothing
design snapshotthe design file.bridge/design/ — commit ityour design sourceNothing
clean—empties screenshots/, diff/, reports/ and the cacheNoneNothing
What leaves your machine

The four upload modes

Set cloud.upload in .bridge/config.json, least disclosure first. This only ever applies to cloud publish — nothing else in the CLI sends anything.

ModeWhat it sends
offNothing at all. No request is made, and `cloud publish` becomes a no-op rather than an error.
metricsThe numbers and nothing else. No pixels leave your machine — and a run with no images cannot be explained by Cloud.
reviewFull evidence for every frame over threshold, plus one preview for each clean frame. The default.
fullFull evidence for every compared frame.
Flags

Every option, by command

Anything not on this list is refused. A misspelled flag never runs the command anyway — --dry-runn is an error, not a publish.

--jsoncompare, check
Also write summary.json (schema v3, published and validated)
--jsondoctor
Print the result as one line of JSON instead of a table, for a pipeline to read
--fullcompare, check
Embed full-resolution images in the report
--freshcompare, check
Bypass the design cache and refetch
--strictcompare, check
Exit 1 on a measured regression — the only way a comparison turns a job red
--targetcompare
Zero-config mode: the mock PNG to diff against. Requires --url
--urlcompare
The page to capture, in zero-config mode
--selectorcompare
Capture one element instead of the full page, in zero-config mode
--localexplain
Required. Analyse here, on your own provider key — nothing goes to Normascope Cloud
--allexplain
Explain every compared frame, not just the flagged ones
--deepexplain
Use the stronger, more expensive model
--modecloud publish
Override the configured upload mode for one run: off, metrics, review or full
--dry-runcloud publish
List exactly what would be sent, and send none of it
--full-evidencecloud publish
Full images for every frame, not previews for the clean ones
--explaincloud publish
Ask Cloud to analyse the flagged frames after publishing. Spends Cloud credits
--checkdesign snapshot
Has the live design drifted from the committed exports?
--help, -hevery command
Print what this command does and run nothing
Which do I want?

Start from the problem

“Just tell me if this page matches this picture.”

compare --target x.png --url …

“Do that for five pages, on every commit.”

init, then check

“Take the screenshots for me.”

capture

“Capture and compare in one go.”

check

“Nothing loaded, or it says skipped.”

doctor

“Explain it using my own provider key.”

explain --local [frame]

“Explain it using the Cloud credits I bought.”

cloud publish --explain

“Will Cloud accept my config?”

cloud validate

“There's no designer — I just don't want surprises.”

mode: "baseline", then baseline approve

“CI shouldn't need a design token.”

design snapshot, and commit .bridge/design/

“Render the PR comment.”

ci comment

“Fail the build on a regression.”

compare --strict

Worth knowing

Three things that trip people up

Start your app first

Normascope photographs a running app; it doesn't start one. Run your dev server, then run the command.

Nothing is ever blocked

A bad score is information. The git hook always succeeds and CI stays green unless you explicitly ask for the opposite.

Name the file after the page

The screenshot filename is what ties your design, your capture and the difference together. Keep them the same and everything lines up.

Every command ships with --help, and doctor explains anything that’s misconfigured in your project rather than making you go and look it up.

Normascope Cloudnormascopecloud

All of that runs on one machine, for one person.

The moment a second person needs to see a result, or you need to know whether a page has been drifting, you need somewhere to put it.