@bynaree/orino
Orino
SEO and GEO audit tool for developers. One command to audit any Next.js, Astro, SvelteKit, Nuxt, or plain HTML site for SEO issues, GEO visibility gaps, and Core Web Vitals problems.
Quick start
# Run from inside your project
npx orino-cli audit
# Or point it at a URL
npx orino-cli audit --url https://yoursite.com
# Create missing robots, sitemap and llms.txt files
npx orino-cli fix --url https://yoursite.com
What it checks
- Crawlability — robots.txt rules, sitemap presence and validity, indexability signals
- Metadata — title tags, meta descriptions, Open Graph and Twitter Card tags
- Structured data — JSON-LD presence, schema.org types, required field completeness
- Performance — Core Web Vitals via PageSpeed Insights, image optimisation, render-blocking resources
- On-page — heading hierarchy, image alt text, internal link quality
- GEO readiness — content signals that improve visibility in AI-generated answers (ChatGPT, Perplexity, Gemini)
- Architecture — internal link graph, orphaned pages, crawl depth
Framework support
| Framework | Version |
|---|---|
| Next.js (App Router) | 13+ |
| Next.js (Pages Router) | 12+ |
| Astro | 2+ |
| SvelteKit | 1+ |
| Nuxt | 3+ |
| Plain HTML / Static | — |
Options
All options belong to the audit subcommand.
| Flag | Description |
|---|---|
--url <url> |
Live URL to run URL-based checks against |
--dir <path> |
Project directory to audit (default: .) |
--framework <name> |
Force framework detection instead of auto-detecting |
--psi-key <key> |
Google PageSpeed Insights API key (or set ORINO_PSI_KEY env var) |
--no-url |
Skip all live URL checks, run codebase analysis only |
--no-codebase |
Skip all codebase analysis, run URL checks only |
--quiet |
Print criticals and score summary only |
--json |
Output results as JSON |
--output <path> |
Write JSON output to a file (implies --json) |
--pages <number> |
Pages to audit beyond the homepage, sampled from the sitemap (default: 0) |
--fail-on <level> |
Exit 1 when issues at this severity or above are found: critical | warning | any (default: critical) |
--baseline <path> |
Baseline file — only new findings (not in the baseline) trigger --fail-on |
--report-txt [path] |
Export plain text report (default: ./orino-report.txt) |
--report-md [path] |
Export Markdown report (default: ./orino-report.md) |
--report-pdf [path] |
Export PDF report (default: ./orino-report.pdf) |
Valid --framework values: nextjs-app-router, nextjs-pages-router, astro, sveltekit, nuxt, html.
Fixing
orino fix creates the missing files it can generate safely from your route map: robots, sitemap and llms.txt, in the right place for your framework. It never modifies or overwrites existing files. Add --dry-run to preview. Sitemaps list static routes only and need a site URL (--url or config).
Multi-page audits
By default Orino audits the homepage. Pass --pages 25 to sample up to 25 more pages from your sitemap (pages linked from the homepage first) and run the full URL check suite on each — including cross-page checks like duplicate titles and descriptions that are impossible with a single page. Site-level checks (robots.txt, sitemap, PageSpeed) still run once.
Config file
Persist settings and suppress false positives with a config file — run npx orino-cli init to generate a documented template. Orino looks for orino.config.json, then .orino/config.json, then an "orino" key in package.json. All fields are optional; CLI flags always win (flag > env var > config > default).
{
"url": "https://example.com",
"pages": 10,
"ignore": ["thin-content", "app/studio/**"],
"severity": { "thin-content": "info" },
"thresholds": { "lcp": 3000, "cls": 0.15 },
"failOn": "critical",
"baseline": "./orino-baseline.json"
}
ignore entries are check IDs or globs matched against the finding location; suppressed checks are reported as skipped and excluded from the score. severity promotes or demotes individual checks (info findings never affect the score). thresholds overrides the Core Web Vitals warning thresholds (lcp/inp/ttfb in ms, cls as a decimal).
CI
Exit codes: 0 — passed the --fail-on threshold, 1 — issues at or above the threshold, 2 — configuration error.
To fail builds only on regressions rather than pre-existing issues, record a baseline once and commit it:
npx orino-cli baseline --output ./orino-baseline.json
npx orino-cli audit --fail-on critical --baseline ./orino-baseline.json
The JSON output (--json) includes exitCode, pagesAudited, baselineCompared, and newFindings for CI tooling. --sarif [path] writes SARIF 2.1.0 for GitHub Code Scanning.
GitHub Action
The repo doubles as a GitHub Action. It runs the audit, keeps a single score comment up to date on each pull request, and can upload findings to Code Scanning:
name: Orino
on: [pull_request]
permissions:
contents: read
pull-requests: write # score comment
security-events: write # only needed with sarif: 'true'
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: tinotenda0/orino@v0.4.0
with:
url: ${{ vars.SITE_URL }}
fail-on: critical
sarif: 'true'
psi-key: ${{ secrets.ORINO_PSI_KEY }}
Inputs: url, dir, fail-on (critical | warning | any | never), pages, baseline, psi-key, comment (default true), sarif (default false), version. Outputs: score, exit-code, results.
Reports
Three export formats are available. Pass the flag and optionally a custom path:
# Markdown report at the default path
npx orino-cli audit --report-md
# PDF report at a custom path
npx orino-cli audit --url https://yoursite.com --report-pdf ./reports/audit.pdf
# All three at once
npx orino-cli audit --report-txt --report-md --report-pdf
Without any --report-* flag, Orino asks interactively after the audit whether you want to export a report.
PSI key
Performance checks use the Google PageSpeed Insights API. Without a key the audit still runs but PSI data is skipped. Keys are free — get one from the Google Cloud Console under APIs & Services.
ORINO_PSI_KEY=your_key npx orino-cli audit
# or
npx orino-cli audit --psi-key your_key
Requirements
Node.js 18 or later.
Documentation
Full documentation at https://orino.app/docs
Related Packages
Deterministic technical-SEO audit from your terminal. Crawls a site, measures re...
Lint your SEO before Google does. Alias for @ranklint/cli: the SEO linter for CI...
Create a blog wired to ContioReach in one command. Pick Next.js, Nuxt, Astro, Sv...
Version History
| Version | Released | License |
|---|---|---|
| 0.4.0 | MIT | |
| 0.3.3 | MIT | |
| 0.3.2 | MIT | |
| 0.3.1 | MIT | |
| 0.3.0 | MIT | |
| 0.2.1 | MIT | |
| 0.2.0 | MIT | |
| 0.1.0 | MIT |