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

answer-audit

v1.0.0

Published

Grade how ready a website is to be found, parsed, and cited by AI answer engines (ChatGPT, Perplexity, Gemini, Claude). 0-100 score with prioritized fixes.

Readme

answer-audit

Grade how ready a website is to be found, parsed, and cited by AI answer engines — ChatGPT, Perplexity, Gemini, and Claude. One command, ~30 seconds, no API keys, no account: a 0-100 score with the prioritized fixes that move it.

demo

Quickstart

npx answer-audit yourbrand.com
answer-audit v1.0.0
Audited https://yourbrand.com/

Score: 72/100 (C)

AI Crawler Access        21/30  ██████████░░░░
Structured Data          18/25  ██████████░░░░
Content Extractability   20/25  ███████████░░░
Answerability & Trust    13/20  █████████░░░░░

FAIL  A2  GPTBot is blocked in robots.txt
FAIL  A8  No llms.txt found at /llms.txt
WARN  B5  Schema is missing: Product offers.availability

Top fixes
1. Allow GPTBot in robots.txt (User-agent: GPTBot / Allow: /) so ChatGPT can read your pages
2. Add an llms.txt file describing your brand and key pages for AI engines
3. Complete your schema: add Product offers.availability

Why

AI answer engines are becoming a major traffic source, but traditional SEO tools ignore the signals they depend on: AI crawler permissions in robots.txt, llms.txt, answer-friendly structured data, and server-rendered extractable content. answer-audit is the 30-second diagnostic for exactly those signals.

Flags

| Flag | Description | |---|---| | --json | Machine-readable JSON to stdout | | --md <file> | Write a shareable Markdown report | | --min-score <n> | Exit with code 2 when the score is below n (CI gate) | | --timeout <ms> | Fetch timeout, default 15000 | | --quiet | Print only the score line | | --no-color | Disable colors (also respects NO_COLOR) | | --version | Print the version |

Exit codes: 0 success, 1 fetch/runtime error, 2 score below --min-score.

The checks

Weighted categories: AI Crawler Access 30, Structured Data 25, Content Extractability 25, Answerability & Trust 20. Each check scores pass = 1, warn = 0.5, fail = 0. Grades: A ≥ 90, B ≥ 80, C ≥ 70, D ≥ 60, F below.

| ID | Category | Check | |---|---|---| | A1 | AI Crawler Access | robots.txt exists | | A2 | AI Crawler Access | GPTBot allowed | | A3 | AI Crawler Access | ClaudeBot allowed | | A4 | AI Crawler Access | PerplexityBot allowed | | A5 | AI Crawler Access | Google-Extended allowed | | A6 | AI Crawler Access | CCBot allowed | | A7 | AI Crawler Access | No blanket disallow | | A8 | AI Crawler Access | llms.txt present | | A9 | AI Crawler Access | llms.txt valid | | A10 | AI Crawler Access | Sitemap discoverable | | B1 | Structured Data | JSON-LD present | | B2 | Structured Data | No JSON-LD syntax errors | | B3 | Structured Data | Site identity schema | | B4 | Structured Data | Page-type schema | | B5 | Structured Data | Schema completeness | | C1 | Content Extractability | Title tag | | C2 | Content Extractability | Meta description | | C3 | Content Extractability | Single H1 | | C4 | Content Extractability | Heading hierarchy | | C5 | Content Extractability | Canonical | | C6 | Content Extractability | Text ratio | | C7 | Content Extractability | Semantic landmarks | | C8 | Content Extractability | Image alt coverage | | C9 | Content Extractability | html lang attribute | | D1 | Answerability & Trust | FAQ content | | D2 | Answerability & Trust | Visible dates | | D3 | Answerability & Trust | Attribution | | D4 | Answerability & Trust | Contact/About discoverable | | D5 | Answerability & Trust | HTTPS |

JSON output

{
  "url": "yourbrand.com",
  "finalUrl": "https://yourbrand.com/",
  "fetchedAt": "2026-07-04T12:00:00.000Z",
  "score": 72,
  "grade": "C",
  "categories": [
    { "id": "crawler-access", "label": "AI Crawler Access", "score": 21, "max": 30 }
  ],
  "checks": [
    {
      "id": "A2",
      "category": "crawler-access",
      "status": "fail",
      "message": "GPTBot is blocked in robots.txt",
      "fix": "Allow GPTBot in robots.txt (User-agent: GPTBot / Allow: /) so ChatGPT can read your pages"
    }
  ],
  "topFixes": ["..."]
}

CI usage

Fail the build when AI-readiness regresses:

- name: AEO gate
  run: npx answer-audit https://yourbrand.com --min-score 80 --quiet

Library usage

import { audit } from "answer-audit";

const result = await audit("yourbrand.com");
console.log(result.score, result.grade, result.topFixes);

Scope (v1)

Audits the given URL plus site-level files (/robots.txt, /llms.txt, /sitemap.xml). It does not query LLMs, track rankings, render JavaScript (it flags likely client-side rendering instead), or crawl multiple pages. No telemetry of any kind.

Contributing

Issues and PRs welcome. Each check lives in src/checks/ and registers itself in src/checks/index.ts; adding a check means one object with a run(ctx) function and a pair of unit tests. npm test must stay green. The checks table above is generated from the registry with npm run gen:checks.

License

MIT © Arthur Carlson