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

do-audit

v0.10.0

Published

Open-source SEO audit CLI. Full technical, on-page, keyword, authority and AI-search visibility audits from your terminal — bring your own API keys, everything runs locally.

Readme

do-audit

Open-source SEO audit CLI. Full technical, on-page, keyword, authority and AI-search-visibility audits — straight from your terminal, producing a beautiful client-ready HTML report.

Built by the team behind Visibility.so — the SEO workspace where human strategists and AI agents run audits, content, links and rank tracking together. Get started for free →

  • 🔑 Bring your own keys — you connect your own API keys during onboarding; nothing is proxied
  • 💻 100% local — no backend, no accounts, no telemetry; your data never leaves your machine
  • 🤖 AI-visibility testing across 8 platforms — ChatGPT, Claude, Gemini, Perplexity, DeepSeek, Groq, Grok, OpenRouter
  • 📊 Real SEO data — keywords, live SERPs, AI Overviews, competitors and backlinks via DataForSEO; Core Web Vitals via PageSpeed; DR via Ahrefs
  • 📄 Client-ready report — a polished, self-contained HTML report with health score, exhaustive issue lists, evidence links and an action plan
  • 🪶 Zero dependencies — plain Node ≥ 18, installs in seconds

Install

# npm
npm install -g do-audit

# bun
bun add -g do-audit

# or run without installing
npx do-audit example.com

Quick start

# 1. Connect your API keys (interactive, one-time)
do-audit init

# 2. Run an audit
do-audit example.com --open

That's it. The report lands in your current directory as audit-example.com-<date>.html.

  do-audit v0.1.0
  Open-source SEO audit — technical · on-page · keywords · authority · AI visibility

  Auditing example.com · AI: ChatGPT (OpenAI), Perplexity

  ✓ Crawled homepage + 4 pages
  ✓ Performance score 87/100 (mobile)
  ✓ Brief ready — market US, brand "Example"
  ✓ 42 ranked keywords found
  ✓ Competitors: rival-a.com, rival-b.com, rival-c.com
  ✓ 5 SERPs analyzed (incl. AI Overview presence)
  ✓ Authority data collected for site + competitors
  ✓ AI visibility 40% across 2 platforms
  ✓ Analysis complete — health score 71/100

  Health score:  71/100
  Issues:        2 critical · 5 high · 9 medium · 4 low
  Report:        ./audit-example.com-2026-08-26.html

API keys

You bring your own keys — do-audit init walks you through connecting them with an arrow-key menu (↑/↓ + Enter): pick a provider, paste the key, optionally set a custom model. Only one AI provider is required — the data integrations can be skipped in one step for an AI-only audit.

| Key | Used for | Required | Get it | | --- | --- | --- | --- | | OpenAI / Anthropic / Gemini / Perplexity / OpenRouter / DeepSeek / Groq / xAI | Audit analysis + AI-visibility testing (each connected platform is tested) | ≥ 1 of them | linked during init | | DataForSEO (login:password) | Keywords, live SERPs & AI Overviews, competitors, backlinks | optional | dataforseo.com | | Google API key | Lifts PageSpeed Insights rate limits (PSI works without it) | optional | PSI get-started | | Ahrefs | Free domain-rating endpoint | optional | ahrefs.com/api |

Keys are stored locally in ~/.config/do-audit/config.json (mode 0600). Environment variables (OPENAI_API_KEY, ANTHROPIC_API_KEY, DATAFORSEO_KEY, …) override the stored config — handy for CI.

Commands

do-audit <domain>              # run a full audit (report + internal notes)
do-audit edit [report.html]    # edit a report visually in your browser
do-audit init                  # connect / update API keys (interactive)
do-audit config                # show configuration status (keys are masked)
do-audit config set <k> <v>    # set a value non-interactively, e.g.:
                               #   do-audit config set keys.openai sk-…
                               #   do-audit config set brand "My Agency"
do-audit config path           # print the config file location

Flags

| Flag | Meaning | | --- | --- | | --open | Open the HTML report in your browser when done | | --out <file> | Report output path (default ./audit-<domain>-<date>.html) | | --market <ISO> | Target market, e.g. US, GB, IN (default: auto-detected from the site) | | --pages <n> | Extra internal pages to crawl (default 4) | | --json | Also write all collected raw data as JSON | | --agent | Machine mode — audit JSON on stdout, progress on stderr, no files, never prompts | | --full | With --agent, also include the complete raw data set under raw |

Use it from Claude Code (or any AI agent)

--agent turns do-audit into a tool an AI agent can call: stdout carries nothing but JSON, every progress line goes to stderr, no files are written, nothing ever prompts, and the exit code is non-zero on failure.

do-audit example.com --agent            # full audit as JSON on stdout
do-audit example.com --agent | jq .score
do-audit example.com --agent --out report.html   # JSON *and* the HTML report

So you can just say:

"Run an SEO audit for example.com with do-audit and summarise the report."

and the agent runs do-audit example.com --agent, parses stdout and writes the summary.

The payload is a curated projection built for context windows — raw HTML, internal-link lists and full SERP tables are summarized out (add --full for everything):

{
  "ok": true, "domain": "example.com", "date": "2026-08-27", "score": 71,
  "executive_summary": "…",
  "business":        { "brand": "Example", "summary": "…", "market": "US" },
  "issues":          { "counts": { "critical": 2, "high": 5, "medium": 9, "low": 4, "total": 20 },
                       "top": ["…"], "quick_wins": ["…"],
                       "technical": [{ "issue": "…", "severity": "high", "recommendation": "…", "evidence": "…" }],
                       "onpage":    [{ "issue": "…", "severity": "medium", "page": "/pricing" }] },
  "recommendations": [{ "priority": "critical", "action": "…", "impact": "…" }],
  "performance":     { "score": 64, "lcp": "3.1 s", "cls": "0.02", "tbt": "420 ms" },
  "technical":       { "robots": {…}, "sitemap": {…}, "llms_txt": false, "blocked_ai_bots": ["GPTBot"] },
  "crawl":           { "pages_crawled": 5, "pages": [{ "url": "…", "title_length": 58, "word_count": 820 }] },
  "keywords":        [{ "keyword": "…", "volume": 1200, "difficulty": 34, "rank": 12 }],
  "serps":           [{ "keyword": "…", "has_ai_overview": true, "site_position": 12, "top_3": […] }],
  "competitors":     { "picked": ["rival.com"], "source": "Google SERPs (DataForSEO)", "profiles": […] },
  "authority":       { "backlinks": 400, "referring_domains": 60, "domain_rating": 21 },
  "ai_visibility":   { "visibility_pct": 30, "citation_rate_pct": 10, "per_platform": {…}, "matrix": […] },
  "summaries":       { "technical": "…", "keyword": "…", "ai": "…" },
  "assumptions": ["…"], "warnings": ["psi: rate limited"],
  "data_sources":    { "dataforseo": true, "pagespeed": true, "ahrefs": true }
}

On failure it prints {"ok": false, "error": "…"} and exits 1 — including when no API key is configured, so an agent gets a clear message instead of hanging on the onboarding prompt. In CI or agent sandboxes, pass the keys as environment variables (OPENAI_API_KEY, DEEPSEEK_API_KEY, DATAFORSEO_KEY, …) instead of running do-audit init.

warnings is the honest part of the payload: any step that degraded (missing key, API error) is listed there, and the corresponding fields are null rather than zero.

As a library

import { loadConfig, runAudit, buildSummary } from "do-audit";

const { d, warnings } = await runAudit(loadConfig(), "example.com");
const summary = buildSummary(d, warnings, { version: "0.10.0" });

What the audit covers

  1. Crawl — robots.txt, sitemap, redirects, security headers, soft-404s, llms.txt, homepage + internal pages (titles, metas, canonicals, headings, schema, images, word counts)
  2. Performance — Lighthouse mobile score and Core Web Vitals via PageSpeed Insights
  3. Research brief — AI determines the business, brand, target market, competitors and visibility test prompts
  4. Keyword research — the business's main keywords (derived from its services, products and market — the terms customers actually search), then checks which of them the site ranks for via live SERPs; volume/difficulty shown where ranking data exists (with DataForSEO — plus AI Overview presence/citations, backlink and traffic estimates)
  5. AI visibility — runs 5 buyer-style test prompts on ChatGPT (with web search), Perplexity and Gemini via DataForSEO's AI Optimization API and measures whether the brand is mentioned or cited; without DataForSEO it falls back to asking your own connected AI providers directly
  6. Analysis — an AI auditor writes the report: health score, exhaustive technical and on-page issues with evidence and fixes, share-of-voice, and a prioritized action plan
  7. Report — a self-contained HTML file you can send to anyone; optionally put your own brand name on it (do-audit config set brand "My Agency"). An internal …-notes.html lands next to it with the AI's assumptions to verify, the market reasoning, and any pipeline warnings — check it before sending the report.

Editing reports

do-audit edit report.html (or just do-audit edit for the newest report in the folder) opens the report in your browser with a full visual editor — no HTML knowledge needed:

  • Click any text to edit in place; rich-text toolbar (bold/italic/size/color, headings, lists, alignment, links)
  • Add, drag-to-reorder, or delete whole sections; insert tables and images (uploads are compressed and embedded)
  • Version history: every save snapshots the previous version — preview and restore any of the last 20, or reset to the original AI-generated report
  • Runs on a localhost-only server (127.0.0.1); Save writes directly back to the file, versions live in report.html.versions/

Privacy

do-audit has no backend. The only network calls it makes are to the site being audited and to the APIs you configured, directly from your machine. No telemetry, no analytics, no account.

Requirements

  • Node.js ≥ 18.17 (or Bun ≥ 1.0)

License

MIT