Seo
@c9n/seov2026.09.29.1
01README
Programmatic SEO auditing toolkit — on-page audits with sitemap discovery, site-level technical checks, prospect triage across many domains, PageSpeed/Core Web Vitals measurement and root-cause performance diagnosis, headless-browser capture, and a prospect-ready pitch report.
02Behaviors
@c9n/seo/page-auditv2026.08.25.2seo/page_audit.ts
Global Arguments
| Argument | Type | Description |
|---|---|---|
| siteUrl | string | Root URL of the site to audit, e.g. https://example.com. Used to locate robots.txt and sitemap.xml during discovery, and to resolve relative sitemap entries. |
| urls | array | Explicit list of page URLs to audit. Takes precedence over discovered sitemap URLs. |
| sitemapUrl | string | Explicit sitemap URL. When empty, discovery falls back to robots.txt then <siteUrl>/sitemap.xml. |
| userAgent | string | User-Agent header sent with every request. |
| timeoutMs | number | Per-request timeout in milliseconds. |
| concurrency | number | How many pages to fetch in parallel. |
| maxPages | number | Maximum number of pages to audit in a single run. |
| crawlFallback | boolean | When no sitemap can be found, discover URLs by following internal links from the site root instead. Many sites worth auditing have no sitemap at all. |
| respectRobots | boolean | Honour the target's robots.txt disallow rules. Leave enabled when auditing sites you do not own. |
| minIntervalMs | number | Minimum gap between requests to the same host. Raised automatically when robots.txt declares a longer Crawl-delay. |
| maxRetries | number | Retries for transient failures (429, 503, network errors). |
| titleMinLength | number | Titles shorter than this are reported as too short. |
| titleMaxLength | number | Titles longer than this are reported as too long. |
| descriptionMinLength | number | Meta descriptions shorter than this are reported as too short. |
| descriptionMaxLength | number | Meta descriptions longer than this are reported as too long. |
| thinContentWords | number | Pages with fewer body words than this are reported as thin. |
fn discover(sitemapUrl: string, maxUrls: number)
Discover page URLs from the site's sitemap.xml, following sitemap indexes and robots.txt Sitemap directives.
| Argument | Type | Description |
|---|---|---|
| sitemapUrl | string | Sitemap to read instead of the one configured on the model. |
| maxUrls | number | Cap on discovered URLs. 0 uses the model's maxPages setting. |
fn audit(targetUrls: array, useDiscovered: boolean)
Fetch each page and record its on-page SEO signals, writing one resource per page plus a site-level summary.
| Argument | Type | Description |
|---|---|---|
| targetUrls | array | Audit exactly these URLs, ignoring global arguments and discovery. |
| useDiscovered | boolean | Force use of the URLs stored by the last `discover` run. |
Resources
page(30d)— SEO audit result for a single page.
summary(infinite)— Site-level roll-up of the most recent audit run.
discovery(30d)— URLs discovered from the site's sitemaps.
@c9n/seo/prospectorv2026.08.25.1seo/prospector.ts
Global Arguments
| Argument | Type | Description |
|---|---|---|
| domains | array | Domains or URLs to triage, e.g. example.com or https://example.com. |
| userAgent | string | User-Agent header sent with every request. |
| timeoutMs | number | Per-request timeout in milliseconds. |
| concurrency | number | How many domains to probe in parallel. |
| minIntervalMs | number | Minimum gap between requests to the same host. Triage hits each host only a few times, so 0 is usually fine. |
| maxRetries | number | Retries for transient failures. |
| maxDomains | number | Maximum domains to triage in a single run. |
fn triage(targetDomains: array)
Probe every configured domain's homepage, robots.txt and sitemap in one run, scoring each by how much SEO work it visibly needs.
| Argument | Type | Description |
|---|---|---|
| targetDomains | array | Triage exactly these domains, ignoring the model's `domains` global argument. |
Resources
prospect(90d)— Triage result for one prospect domain.
ranking(infinite)— Prospect leaderboard for the most recent triage run.
@c9n/seo/site-healthv2026.08.25.1seo/site_health.ts
Global Arguments
| Argument | Type | Description |
|---|---|---|
| siteUrl | string | Root URL of the site to check, e.g. https://example.com. |
| importantPaths | array | Paths that must remain crawlable, e.g. /products. Reported as blocking issues when robots.txt disallows them. |
| userAgent | string | User-Agent header sent with every request. |
| timeoutMs | number | Per-request timeout in milliseconds. |
| concurrency | number | How many link checks to run in parallel. |
| minIntervalMs | number | Minimum gap between requests to the same host. |
| maxRetries | number | Retries for transient failures. |
| maxLinkChecks | number | Maximum internal links to status-check in one run. |
fn check(links: array, skipLinkCheck: boolean)
Run the site-level checks: origin canonicalisation, robots.txt analysis, and an internal link status sweep.
| Argument | Type | Description |
|---|---|---|
| links | array | Internal links to status-check. Typically fed from a page-audit run's internalLinks. |
| skipLinkCheck | boolean | Run only the canonicalisation and robots.txt checks. |
Resources
canonical(30d)— How the origin's URL variants consolidate.
robots(30d)— robots.txt analysis for the site.
links(30d)— Status of the internal links that were checked.
@c9n/seo/pagespeedv2026.08.28.1seo/pagespeed.ts
Global Arguments
| Argument | Type | Description |
|---|---|---|
| urls | array | URLs to measure. Keep this short — each measurement is a full Lighthouse run. |
| apiKey | string | Google API key for the PageSpeed Insights API. Strongly recommended: the anonymous quota is shared and usually exhausted. Reference a vault entry rather than inlining a key. |
| strategies | array | Which form factors to measure. Mobile is what Google ranks on. |
| categories | array | Lighthouse categories to request. |
| timeoutMs | number | Per-request timeout. Lighthouse runs are slow; 120s is a sensible floor. |
| concurrency | number | Parallel measurements. The API rate-limits aggressively, so 1 is safest. |
| minIntervalMs | number | Minimum gap between API requests. |
| maxRetries | number | Retries for 429 and transient failures. |
| maxUrls | number | Maximum URLs to measure in one run. |
fn measure(targetUrls: array)
Run PageSpeed Insights against each configured URL and form factor, capturing Lighthouse scores and Core Web Vitals field data.
| Argument | Type | Description |
|---|---|---|
| targetUrls | array | Measure exactly these URLs, ignoring the model's `urls` global argument. |
fn diagnose(targetUrls: array, strategy: enum, minImpactMs: number, maxFindings: number)
Diagnose why a page is slow: rank the root causes behind its Core Web Vitals, name the offending resources, and give the concrete fix for each. Use this when you need to act on a poor PageSpeed score rather than just record it.
| Argument | Type | Description |
|---|---|---|
| targetUrls | array | Diagnose exactly these URLs, ignoring the model's `urls` global argument. |
| strategy | enum | Form factor to diagnose. Mobile is what Google ranks on and where problems show up first. |
| minImpactMs | number | Drop findings whose estimated saving is below this, to cut long-tail noise. |
| maxFindings | number | Maximum findings to keep per URL, highest weighted first. |
Resources
measurement(90d)— PageSpeed result for one URL on one form factor.
summary(infinite)— Roll-up across every measurement in the run.
diagnosis(90d)— Ranked root causes of slowness for one URL, with the fix for each.
@c9n/seo/browserv2026.08.25.1seo/browser.ts
Global Arguments
| Argument | Type | Description |
|---|---|---|
| urls | array | URLs to render and capture. |
| browserPath | string | Path to a Chrome or Chromium binary. Empty means probe the well-known install locations. |
| viewportWidth | number | Viewport width in CSS pixels. |
| viewportHeight | number | Viewport height in CSS pixels. |
| mobile | boolean | Emulate a mobile device. |
| fullPage | boolean | Capture the full scrollable page rather than just the viewport. |
| screenshots | boolean | Capture a PNG screenshot per URL. Disable for a metadata-only render pass. |
| settleMs | number | How long to wait after load for late-rendering content to settle. |
| navigationTimeoutMs | number | Per-page navigation timeout. |
| launchTimeoutMs | number | How long to wait for Chrome to expose its DevTools endpoint. |
| maxUrls | number | Maximum URLs to capture in one run. |
fn capture(targetUrls: array)
Render each URL in headless Chrome, storing a PNG screenshot and the metadata visible only after JavaScript has run.
| Argument | Type | Description |
|---|---|---|
| targetUrls | array | Capture exactly these URLs, ignoring the model's `urls` global argument. |
Resources
capture(30d)— Rendered-page capture for one URL.
summary(infinite)— Roll-up across the capture run.
Files
screenshot(image/png)— PNG screenshot of a rendered page.
03Reports
@c9n/seo/pitchmethod
seo_pitch.ts
Turns a page-audit run into a prioritised, plain-language SEO brief you can send to a site owner.
seopitchsales
04Stats
B
80 / 100
Downloads
37
Archive size
148.4 KB
- Has README or module doc2/2earned
- README has a code example1/1earned
- README is substantive1/1earned
- Most symbols documented1/1earned
- No slow types (deprecated)1/1earned
- Dependencies pass trust audit2/2earned
- Has description1/1earned
- Platform support declared (or universal)2/2earned
- License1/2partial
no SPDX license declared
- Verified public repository0/2missing
05Platforms