Configuration
A config file lets you persist audit settings and silence false positives without passing flags on every run. It is optional — Orino works with zero configuration — but it is the right home for a project’s URL, ignore rules, and CI thresholds.
Creating a config file
Section titled “Creating a config file”Run orino init to write a fully commented template to the current directory:
npx orino-cli initEvery option is documented inline, commented out. Uncomment the ones you need. orino init refuses to overwrite an existing orino.config.json.
Where Orino looks
Section titled “Where Orino looks”Orino checks these locations in order and uses the first one it finds:
orino.config.jsonin the current directory.orino/config.json- An
"orino"key insidepackage.json
The dedicated orino.config.json and .orino/config.json files may contain // and /* */ comments — the template orino init writes relies on this. The package.json variant must be strict JSON, since it shares a file with your package manifest.
Priority order
Section titled “Priority order”Settings resolve from highest priority to lowest:
CLI flag → environment variable → config file → built-in default
A flag always overrides the config file, and the config file always overrides the defaults. For example, with "pages": 10 in the config, --pages 0 on the command line still wins and audits the homepage only.
Schema
Section titled “Schema”All fields are optional.
{ "url": "https://example.com", "psiKey": "YOUR_KEY", "psiStrategy": "mobile", "pages": 25, "framework": "nextjs-app-router", "ignore": [ "thin-content", "schema-organization-missing", "app/studio/**" ], "severity": { "thin-content": "info", "lcp-too-slow": "critical" }, "thresholds": { "lcp": 3000, "cls": 0.15, "inp": 300, "ttfb": 800 }, "failOn": "critical", "baseline": "./orino-baseline.json"}| Field | Type | Equivalent flag | Description |
|---|---|---|---|
url |
string | --url |
Live URL to audit |
psiKey |
string | --psi-key |
Google PageSpeed Insights API key |
psiStrategy |
string | none | PageSpeed strategy: mobile (default) or desktop |
pages |
number | --pages |
Pages to audit beyond the homepage |
framework |
string | --framework |
Force framework detection |
ignore |
string[] | none | Suppress checks by ID or location glob |
severity |
object | none | Override the severity of individual checks |
thresholds |
object | none | Override Core Web Vitals warning thresholds |
failOn |
string | --fail-on |
Severity level that fails the run |
baseline |
string | --baseline |
Path to a baseline file |
Ignore rules
Section titled “Ignore rules”The ignore array suppresses checks. Each entry is matched two ways:
- By check ID. An exact ID such as
"thin-content"suppresses that check everywhere. The ID is the same slug shown in the fix link at the end of each finding. - By location glob. A pattern such as
"app/studio/**"suppresses any finding whose location matches. Globs support*(one path segment),**(any number of segments), and?(a single character).
{ "ignore": [ "thin-content", "app/studio/**", "app/(marketing)/legal/*" ]}A suppressed check reports as skipped, exactly like any other skipped check — it is excluded from both sides of the score calculation, so it neither helps nor hurts your number.
Severity overrides
Section titled “Severity overrides”The severity object promotes or demotes individual checks between critical, warning, and info.
{ "severity": { "thin-content": "info", "lcp-too-slow": "critical" }}- Promote a warning to critical when it matters more for your project than the default weighting.
- Demote a critical to warning when it is real but not release-blocking.
- Demote anything to info to keep it visible in the output without affecting the score. Info findings never move the number — the honest alternative to suppressing a check entirely.
See Scoring for how critical and warning checks are weighted.
Thresholds
Section titled “Thresholds”The thresholds object overrides the Core Web Vitals warning thresholds used by the performance checks. Values are lcp/inp/ttfb in milliseconds and cls as a decimal.
{ "thresholds": { "lcp": 3000, "cls": 0.15, "inp": 300, "ttfb": 800 }}Overrides raise or lower the warning boundary. The stricter critical boundary for each metric is kept at its built-in level and is never lowered below your warning threshold, so a threshold change can never leave a metric with a warning tier above its critical tier.
Errors
Section titled “Errors”A malformed orino.config.json or .orino/config.json — a JSON syntax error, or a field with the wrong type — stops the run immediately with a clear message and exit code 1. Orino never silently ignores a config file it could not parse. A malformed package.json, by contrast, is treated as “no config” rather than a fatal error, since it is not primarily an Orino file.