@bynaree/orino

SEO and GEO audit tool for developers. Audits Next.js, Astro, SvelteKit, Nuxt, and plain HTML sites from the command line.
1,558
Install
npm install @bynaree/orino
Latest Version:0.4.0
License:MIT
Last Updated:Oct 9, 2026
Links: npm
Maintainer: geek1704

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

rankforge-cli

Deterministic technical-SEO audit from your terminal. Crawls a site, measures re...

374 0
ranklint

Lint your SEO before Google does. Alias for @ranklint/cli: the SEO linter for CI...

1,671 2
geoaeo

SEO, GEO, and AEO site audits with llms.txt, JSON-LD, sitemap generators, framew...

21,203 0
create-contioreach-blog

Create a blog wired to ContioReach in one command. Pick Next.js, Nuxt, Astro, Sv...

479 0
eurobase

The official Eurobase CLI for deployment debugging and deployments

1,569

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