npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@bynaree/orino

v0.4.0

Published

SEO and GEO audit tool for developers. Audits Next.js, Astro, SvelteKit, Nuxt, and plain HTML sites from the command line.

Readme

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/[email protected]
        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