From 0a2f0ef733f8333db4d9f13b873243eca32c245d Mon Sep 17 00:00:00 2001 From: Nik Cubrilovic Date: Thu, 11 Jun 2026 08:56:40 +1000 Subject: [PATCH 1/2] docs(nav): reorganize into Guides/Rules/Reference/Cloud tabs + cloud docs - docs.json: horizontal tabs (Guides, Rules, Reference, Cloud) - new Cloud section: overview, credits & pricing, cloud rules, rendering - new rule docs: ai/site-type, ai/page-type-match, eeat/authority-signals, adblock/privacy-blocked, links/dead-links, gaps/{index,keywords,content} - cloud-login notice banners on all cloud rule pages - guides/browser-rendering how-to; cloud/rendering explains the service - reference: cli/credits command, configuration/cloud section - rules index counts updated (233 rules / 21 categories), stale OpenRouter prerequisites removed from AI rules --- cli/audit.mdx | 4 +- cli/auth.mdx | 4 +- cli/credits.mdx | 63 +++++++++++++ cli/index.mdx | 3 +- cloud/credits.mdx | 77 +++++++++++++++ cloud/index.mdx | 65 +++++++++++++ cloud/rendering.mdx | 38 ++++++++ cloud/rules.mdx | 68 ++++++++++++++ configuration/cloud.mdx | 55 +++++++++++ configuration/index.mdx | 4 +- docs.json | 151 ++++++++++++++++++++---------- guides/browser-rendering.mdx | 64 +++++++++++++ rules/adblock/blocked-links.mdx | 8 +- rules/adblock/element-hiding.mdx | 9 +- rules/adblock/index.mdx | 9 +- rules/adblock/privacy-blocked.mdx | 41 ++++++++ rules/ai/index.mdx | 31 ++---- rules/ai/llm-parsability.mdx | 23 +---- rules/ai/page-type-match.mdx | 45 +++++++++ rules/ai/site-type.mdx | 41 ++++++++ rules/eeat/authority-signals.mdx | 36 +++++++ rules/eeat/index.mdx | 3 + rules/gaps/content.mdx | 42 +++++++++ rules/gaps/index.mdx | 39 ++++++++ rules/gaps/keywords.mdx | 43 +++++++++ rules/index.mdx | 19 ++-- rules/links/dead-links.mdx | 43 +++++++++ rules/links/index.mdx | 3 + 28 files changed, 916 insertions(+), 115 deletions(-) create mode 100644 cli/credits.mdx create mode 100644 cloud/credits.mdx create mode 100644 cloud/index.mdx create mode 100644 cloud/rendering.mdx create mode 100644 cloud/rules.mdx create mode 100644 configuration/cloud.mdx create mode 100644 guides/browser-rendering.mdx create mode 100644 rules/adblock/privacy-blocked.mdx create mode 100644 rules/ai/page-type-match.mdx create mode 100644 rules/ai/site-type.mdx create mode 100644 rules/eeat/authority-signals.mdx create mode 100644 rules/gaps/content.mdx create mode 100644 rules/gaps/index.mdx create mode 100644 rules/gaps/keywords.mdx create mode 100644 rules/links/dead-links.mdx diff --git a/cli/audit.mdx b/cli/audit.mdx index af9ca5e..692343d 100644 --- a/cli/audit.mdx +++ b/cli/audit.mdx @@ -31,8 +31,10 @@ squirrel audit [options] | `--debug` | | Enable debug logging | `false` | | `--trace` | | Enable performance tracing | `false` | | `--project-name` | `-n` | Project name (overrides config and prompts) | auto | -| `--publish` | `-p` | Publish report to reports.squirrelscan.com | `false` | +| `--publish` | `-p` | Publish report to reports.squirrelscan.com (costs 2 credits) | `false` | | `--visibility` | | Visibility: `public`, `unlisted`, `private` | `public` | +| `--yes` | `-y` | Skip confirmation prompts (e.g. cloud credit spend) | `false` | +| `--render` | | Render pages with a cloud browser for this run ([uses credits](/guides/browser-rendering); requires login) | `false` | ### Coverage Modes diff --git a/cli/auth.mdx b/cli/auth.mdx index 79a5fcf..261d266 100644 --- a/cli/auth.mdx +++ b/cli/auth.mdx @@ -1,9 +1,9 @@ --- title: "auth" -description: "Authenticate with squirrelscan for publishing reports" +description: "Authenticate with squirrelscan for cloud features and publishing" --- -The `auth` command manages authentication for publishing reports to [reports.squirrelscan.com](https://reports.squirrelscan.com). +The `auth` command manages authentication for [cloud features](/cloud) - cloud rules, browser rendering, and publishing reports. Logging in grants 1,000 free credits on new accounts. ## Subcommands diff --git a/cli/credits.mdx b/cli/credits.mdx new file mode 100644 index 0000000..9c45076 --- /dev/null +++ b/cli/credits.mdx @@ -0,0 +1,63 @@ +--- +title: "credits" +description: "Show cloud credit balance and feature pricing" +--- + +The `credits` command shows your [cloud credit](/cloud/credits) balance, plan, and current feature pricing. + +## Usage + +```bash +squirrel credits [options] +``` + +Requires login - run [`squirrel auth login`](/cli/auth) first. + +## Options + +| Option | Description | +|--------|-------------| +| `--json` | Output as JSON | + +## Example + +```bash +squirrel credits +``` + +``` +Plan: starter +Balance: 2340 credits (2000 monthly + 340 purchased) + monthly credits reset 2026-07-08 + +Pricing: + adblock_detect 5 per run + ai_parse 1 per page + authority_signals 1 per page + dead_links 1 per 100 urls + render 2 per page + report_publish 2 per report + site_type 5 per run + ... + +Top up: https://squirrelscan.com/account/credits +``` + +JSON output: + +```bash +squirrel credits --json +``` + +```json +{ + "balance": { "total": 2340, "monthly": 2000, "pack": 340, "periodEnd": "2026-07-08T00:00:00Z" }, + "plan": { "id": "starter", "name": "starter" }, + "pricing": { "ai_parse": { "cost": 1, "per": 1, "unit": "page" } } +} +``` + +## Related + +- [Credits & Pricing](/cloud/credits) - how credits work and what features cost +- [auth](/cli/auth) - log in to enable cloud features diff --git a/cli/index.mdx b/cli/index.mdx index da0b94c..1f23ae6 100644 --- a/cli/index.mdx +++ b/cli/index.mdx @@ -20,7 +20,8 @@ Commands that operate on websites and projects: | [`init`](/cli/init) | Create squirrel.toml config file | | [`config`](/cli/config) | View and modify configuration | | [`feedback`](/cli/feedback) | Send feedback to squirrelscan team | -| [`auth`](/cli/auth) | Authentication for publishing | +| [`auth`](/cli/auth) | Authentication for cloud features and publishing | +| [`credits`](/cli/credits) | Show cloud credit balance and pricing | ### Self-Management Commands diff --git a/cloud/credits.mdx b/cloud/credits.mdx new file mode 100644 index 0000000..a4c7824 --- /dev/null +++ b/cloud/credits.mdx @@ -0,0 +1,77 @@ +--- +title: "Credits & Pricing" +description: "How cloud credits work, what each feature costs, and how to control spend" +icon: "coins" +--- + +Cloud features are priced in **credits** - small integers, not dollars. Local audits never cost credits. + +## Getting credits + +| Source | Credits | Notes | +|--------|---------|-------| +| Signup grant | 1,000 | One-time, free, no card required | +| Starter plan ($19/mo) | 2,000/month | Resets each billing period; unused monthly credits expire | +| Credit pack ($9) | 1,000 | Never expire | +| Credit pack ($39) | 5,000 | Never expire | + +Monthly credits are spent before purchased pack credits. Buy plans and packs from the **Billing & Credits** page in the [dashboard](/dashboard). + +## Checking your balance + +```bash +squirrel credits +``` + +``` +Plan: starter +Balance: 2340 credits (2000 monthly + 340 purchased) + monthly credits reset 2026-07-08 + +Pricing: + ai_parse 1 per page + site_type 5 per run + ... + +Top up: https://squirrelscan.com/account/credits +``` + +`squirrel auth status` also shows your balance, and the start banner of every audit shows the estimated spend against it. + +## Pricing + +| Feature | Cost | Used by | +|---------|------|---------| +| Report publishing | 2 per report | `squirrel audit --publish` | +| AI page analysis | 1 per page | [`ai/llm-parsability`](/rules/ai/llm-parsability), [`ai/page-type-match`](/rules/ai/page-type-match) | +| Site type detection | 5 per audit | [`ai/site-type`](/rules/ai/site-type) | +| Authority signals | 1 per page | [`eeat/authority-signals`](/rules/eeat/authority-signals) | +| Adblock/privacy check | 5 per audit | All three [adblock rules](/rules/adblock) share one check | +| Dead link checking | 1 per 100 URLs | [`links/dead-links`](/rules/links/dead-links) | +| Browser rendering | 2 per page | [Cloud rendering](/cloud/rendering) | +| Keyword gaps | 25 per audit | [`gaps/keywords`](/rules/gaps/keywords) (opt-in) | +| Content gaps | 25 per audit | [`gaps/content`](/rules/gaps/content) (opt-in) | +| Issue enrichment | 1 per issue | AI recommendations in the dashboard | + +A typical 50-page audit with the default cloud rules costs around **60-110 credits** depending on how many pages the per-page rules analyze. + +## Spend controls + +Three guardrails keep an audit from spending more than you expect: + +```toml squirrel.toml +[cloud] +max_credits_per_audit = 200 # hard cap per audit; 0 = unlimited +confirm_threshold = 50 # estimates above this prompt before spending +enabled = true # master switch for all cloud features +``` + +- **Per-audit cap** - if the estimate exceeds `max_credits_per_audit`, work is truncated deterministically at the cap and remaining rules report `skipped` with reason `credit-cap-reached`. +- **Confirmation prompt** - in a terminal, an estimate above `confirm_threshold` asks before proceeding. Use `--yes` to skip prompts (e.g. in CI or agent workflows). Non-interactive runs proceed without prompting, bounded by the cap. +- **Master switch** - `enabled = false` turns off all cloud calls for the project. + +See the [cloud configuration reference](/configuration/cloud) for all options. + +## When credits run out + +Nothing breaks. Cloud rules report `skipped` with reason `insufficient-credits`, the audit completes with all local rules, and you see a single warning with a top-up link. If a cloud service fails entirely after you were charged, the charge is automatically refunded. diff --git a/cloud/index.mdx b/cloud/index.mdx new file mode 100644 index 0000000..a23ede6 --- /dev/null +++ b/cloud/index.mdx @@ -0,0 +1,65 @@ +--- +title: "Cloud Overview" +description: "What squirrelscan cloud adds on top of free local audits" +icon: "cloud" +--- + +Local audits are **free and unlimited, forever**. The cloud exists to do only what your machine can't: + +- **AI analysis** - page classification, site-type detection, parsability scoring, authority assessment +- **Browser rendering** - audit JavaScript-heavy sites with a real headless browser +- **Shared data** - full adblock/privacy filter lists, a global dead-link cache, search demand data +- **Publishing & teams** - publish reports, track issues over time, share with your team in the [dashboard](/dashboard) + +Cloud features are priced in [credits](/cloud/credits). Every new account gets **1,000 free credits** - no card required. + +## Getting started + +```bash +squirrel auth login +``` + +That's it. Your next `squirrel audit` automatically includes the [cloud rules](/cloud/rules) - results merge into the same report alongside the local rules. + +```bash +squirrel credits # check your balance and pricing +``` + +## How cloud rules behave + +- **Logged in** - cloud rules run as part of the audit. Calls are batched during a dedicated cloud phase, and spend is shown in the audit summary. +- **Logged out** - cloud rules report `skipped` with a hint to log in. Your audit still completes; nothing fails. +- **Out of credits or service down** - same thing: rules skip, the audit completes, you see a one-line warning. + +You stay in control of spend with a per-audit credit cap and a confirmation prompt for larger runs. See [Credits & Pricing](/cloud/credits#spend-controls). + +## What's in the cloud + + + + The audit rules powered by cloud services, and what each costs + + + How credits work, full pricing, and spend controls + + + Render JavaScript-heavy sites with a cloud headless browser + + + Published reports, issue tracking, and billing at app.squirrelscan.com + + + +## Publishing reports + +Publishing a report to the dashboard costs **2 credits** and gives you a shareable URL plus issue history for the site: + +```bash +squirrel audit https://example.com --publish +``` + +See [Reports](/reports) for publishing details. + +## Privacy + +Cloud analysis works on slim page summaries - URL, title, and a short text excerpt - never your full raw HTML. Third-party data providers are proxied through our API; your pages are never sent to them directly. diff --git a/cloud/rendering.mdx b/cloud/rendering.mdx new file mode 100644 index 0000000..dc61cff --- /dev/null +++ b/cloud/rendering.mdx @@ -0,0 +1,38 @@ +--- +title: "Browser Rendering" +description: "How cloud browser rendering works under the hood" +icon: "globe" +--- + +By default the crawler fetches pages with plain HTTP - fast, free, and accurate for server-rendered sites. Sites that build their content with JavaScript (SPAs, client-side frameworks) can look nearly empty to a plain fetch, which skews every content rule. + +Cloud browser rendering fixes that: each page is loaded in a **real headless browser** in the cloud, and the fully rendered DOM is returned to your local crawler. Everything downstream - parsing, rules, reports - works exactly as it does with plain HTTP, just on the post-JavaScript HTML. + +Looking for setup instructions? See the [browser rendering guide](/guides/browser-rendering). This page explains how the service behaves. + +## Cost + +**2 credits per page rendered.** A 100-page crawl with rendering costs 200 credits, so mind your [per-audit cap](/cloud/credits#spend-controls) - the default cap of 200 covers rendering for about 100 pages and nothing else. The crawl progress line shows the running spend: + +``` +Crawling (cloud-rendered) 34/100 · ~68 credits +``` + +## Fallback behavior + +Rendering is best-effort and degrades gracefully: + +- **Single page fails or times out** - that page falls back to plain HTTP; the crawl continues rendering the rest. +- **Out of credits, auth error, or service outage** - the crawler switches permanently to plain HTTP for the remainder of the crawl, prints a one-line warning, and notes the fallback in the report metadata. + +A render failure never fails the audit. + +## When to use it + +| Site | Recommendation | +|------|----------------| +| Server-rendered (most CMS, SSR frameworks, static sites) | Plain HTTP (default) - rendering adds cost, not accuracy | +| Client-side SPA (React/Vue/Angular without SSR) | Browser rendering | +| Mixed - mostly SSR with a few JS-dependent pages | Try plain HTTP first; if content rules report thin/missing content on pages you know have content, switch | + +A quick tell: run `squirrel audit` normally, and if word counts or headings look implausibly low on pages that render fine in your browser, the site needs rendering. diff --git a/cloud/rules.mdx b/cloud/rules.mdx new file mode 100644 index 0000000..540303e --- /dev/null +++ b/cloud/rules.mdx @@ -0,0 +1,68 @@ +--- +title: "Cloud Rules" +description: "Audit rules powered by cloud services - what they check and what they cost" +icon: "list-checks" +--- + +Cloud rules are regular audit rules that need data your machine doesn't have - AI models, full filter lists, search demand data, or a shared link cache. They run automatically when you're [logged in](/cloud) and report `skipped` when you're not. + +## The rules + +| Rule | What it checks | Cost | +|------|----------------|------| +| [`ai/llm-parsability`](/rules/ai/llm-parsability) | How well LLMs can parse and understand each page | 1 credit per page | +| [`ai/page-type-match`](/rules/ai/page-type-match) | AI-classified page type agrees with declared structured data | 1 credit per page (shared with parsability) | +| [`ai/site-type`](/rules/ai/site-type) | Classifies the overall site type (blog, ecommerce, saas, docs, ...) | 5 credits per audit | +| [`eeat/authority-signals`](/rules/eeat/authority-signals) | Per-page authorship, citations, and outbound references | 1 credit per page | +| [`adblock/element-hiding`](/rules/adblock/element-hiding) | Elements hidden by EasyList cosmetic rules | 5 credits per audit, shared | +| [`adblock/blocked-links`](/rules/adblock/blocked-links) | Links and resources ad blockers would block | shared with above | +| [`adblock/privacy-blocked`](/rules/adblock/privacy-blocked) | Trackers that EasyPrivacy filter lists would block | shared with above | +| [`links/dead-links`](/rules/links/dead-links) | External links verified through a shared global cache | 1 credit per 100 URLs | +| [`gaps/keywords`](/rules/gaps/keywords) | Keywords competitors rank for that you don't | 25 credits per audit, **opt-in** | +| [`gaps/content`](/rules/gaps/content) | Topic clusters with search demand you don't cover | 25 credits per audit, **opt-in** | + +The three adblock rules share a single 5-credit blocklist check per audit - enabling all three costs the same as enabling one. + +The two gap-analysis rules are **disabled by default** because of their cost. Enable them explicitly: + +```toml squirrel.toml +[rules] +enable = ["gaps/keywords", "gaps/content"] +``` + +## How they run + +Cloud rules match rule filters like any other rule - `enable = ["*"]` (the default) includes them. During an audit, a dedicated cloud phase batches all the required service calls, then rules read the results. You'll see the estimate in the start banner and the actual spend per service in the audit summary: + +``` +☁ Cloud: 67 credits spent (ai_parse 22, authority_signals 22, site_type 5, ...) +``` + +## Skip behavior + +A cloud rule never fails your audit. When it can't run, it reports `skipped` with a reason: + +| Skip reason | Meaning | +|-------------|---------| +| `not-authenticated` | Not logged in - run `squirrel auth login` | +| `insufficient-credits` | Balance too low - top up or lower the page count | +| `credit-cap-reached` | The audit hit `max_credits_per_audit`; work was truncated at the cap | +| `service-unavailable` | The cloud service errored; charges for failed calls are refunded | + +## Controlling spend + +The per-audit cap, confirmation threshold, and `--yes` flag are covered in [Credits & Pricing](/cloud/credits#spend-controls). + +To opt out of specific cloud rules while keeping the rest: + +```toml squirrel.toml +[rules] +disable = ["adblock/*", "links/dead-links"] +``` + +Or disable all cloud calls for a project: + +```toml squirrel.toml +[cloud] +enabled = false +``` diff --git a/configuration/cloud.mdx b/configuration/cloud.mdx new file mode 100644 index 0000000..2c46243 --- /dev/null +++ b/configuration/cloud.mdx @@ -0,0 +1,55 @@ +--- +title: "Cloud Settings" +description: "Configure cloud features, spend limits, and browser rendering" +--- + +The `[cloud]` section of `squirrel.toml` controls [cloud features](/cloud): whether they run, how much an audit may spend, and whether pages are rendered with a cloud browser. + +All cloud settings are no-ops when you're not logged in - cloud rules simply report `skipped`. + +## Options + +```toml squirrel.toml +[cloud] +enabled = true # master switch for all cloud features +max_credits_per_audit = 200 # hard spend cap per audit; 0 = unlimited +confirm_threshold = 50 # estimates above this prompt for confirmation +batch_size = 20 # pages per cloud service request +rendering = "http" # "http" (default) or "browser" +``` + +### `enabled` + +**Default:** `true` + +Master switch. Set to `false` to disable all cloud calls for this project - cloud rules report `skipped`, publishing and rendering are unaffected by other settings. + +### `max_credits_per_audit` + +**Default:** `200` + +Hard cap on credits a single audit may spend. When the estimate exceeds the cap, cloud work is truncated deterministically and the rules that didn't run report `skipped` with reason `credit-cap-reached`. Set to `0` for unlimited. + +### `confirm_threshold` + +**Default:** `50` + +In an interactive terminal, an estimated spend above this value prompts for confirmation before the cloud phase runs. Set to `0` to always confirm. Non-interactive runs (CI, agents, pipes) never prompt - they proceed bounded by `max_credits_per_audit`. Pass `--yes` to skip the prompt explicitly. + +### `batch_size` + +**Default:** `20` (also the maximum) + +Pages per request to per-page cloud services. Lower it only if you hit request-size limits with very heavy pages. + +### `rendering` + +**Default:** `"http"` + +Crawl fetch mode. `"browser"` renders every page with a cloud headless browser at **2 credits per page** - see the [browser rendering guide](/guides/browser-rendering). The `--render` flag on `squirrel audit` enables it for a single run without changing config. + +## Related + +- [Cloud overview](/cloud) - what cloud features add +- [Credits & Pricing](/cloud/credits) - pricing and spend controls in depth +- [Cloud rules](/cloud/rules) - which rules use cloud services diff --git a/configuration/index.mdx b/configuration/index.mdx index ac0636c..0437eb1 100644 --- a/configuration/index.mdx +++ b/configuration/index.mdx @@ -14,7 +14,8 @@ squirrelscan works out of the box with sensible defaults. You only need configur - 100ms delay between requests - Respects robots.txt - Checks external links (cached 7 days) -- Runs all rules except AI-powered ones +- Runs all rules (gap-analysis rules are opt-in) +- Cloud rules run when logged in, capped at 200 credits per audit - Console output format ## Configuration System @@ -144,6 +145,7 @@ Project configuration is stored in `squirrel.toml` using TOML format. | `[rules]` | Enable/disable audit rules | [Rules Configuration](/configuration/rules) | | `[external_links]` | External link checking | [External Links](/configuration/external-links) | | `[output]` | Default output format | [Output Settings](/configuration/output) | +| `[cloud]` | Cloud features, spend limits, rendering | [Cloud Settings](/configuration/cloud) | | `[rule_options.*]` | Per-rule configuration | [Rule Options](/configuration/rule-options) | ### Quick Start diff --git a/docs.json b/docs.json index a362956..7ed8de7 100644 --- a/docs.json +++ b/docs.json @@ -38,50 +38,40 @@ }, "rounded": "none", "navigation": { - "groups": [ + "tabs": [ { - "group": "Getting Started", - "pages": [ - "index", - "quickstart", - "agents" - ] - }, - { - "group": "Concepts", - "pages": [ - "projects", - "crawl", - "reports" - ] - }, - { - "group": "Dashboard", - "pages": [ - "dashboard/index" - ] - }, - { - "group": "CLI Reference", - "pages": [ - "cli/index", - "cli/audit", - "cli/crawl", - "cli/analyze", - "cli/report", - "cli/init", - "cli/config", - "cli/feedback", - "cli/auth", - "cli/self", - "cli/skills", - "cli/debug" + "tab": "Guides", + "icon": "book-open", + "groups": [ + { + "group": "Getting Started", + "pages": [ + "index", + "quickstart", + "agents" + ] + }, + { + "group": "Concepts", + "pages": [ + "projects", + "crawl", + "reports", + "guides/browser-rendering" + ] + } ] }, { - "group": "Rules Reference", - "pages": [ - "rules/index", + "tab": "Rules", + "icon": "list-checks", + "groups": [ + { + "group": "Rules Reference", + "pages": [ + "rules/index" + ] + }, { "group": "Core SEO", "pages": [ @@ -129,6 +119,7 @@ "rules/links/invalid-links", "rules/links/broken-links", "rules/links/broken-external-links", + "rules/links/dead-links", "rules/links/redirect-chains", "rules/links/nofollow-internal", "rules/links/orphan-pages", @@ -401,6 +392,7 @@ "rules/eeat/content-dates", "rules/eeat/author-expertise", "rules/eeat/citations", + "rules/eeat/authority-signals", "rules/eeat/about-page", "rules/eeat/editorial-policy", "rules/eeat/contact-page", @@ -418,7 +410,8 @@ "pages": [ "rules/adblock/index", "rules/adblock/element-hiding", - "rules/adblock/blocked-links" + "rules/adblock/blocked-links", + "rules/adblock/privacy-blocked" ] }, { @@ -426,22 +419,78 @@ "pages": [ "rules/ai/index", "rules/ai/llm-parsability", + "rules/ai/page-type-match", + "rules/ai/site-type", "rules/ai/ai-content" ] + }, + { + "group": "Gap Analysis", + "pages": [ + "rules/gaps/index", + "rules/gaps/keywords", + "rules/gaps/content" + ] + } + ] + }, + { + "tab": "Reference", + "icon": "terminal", + "groups": [ + { + "group": "CLI Reference", + "pages": [ + "cli/index", + "cli/audit", + "cli/crawl", + "cli/analyze", + "cli/report", + "cli/init", + "cli/config", + "cli/feedback", + "cli/auth", + "cli/credits", + "cli/self", + "cli/skills", + "cli/debug" + ] + }, + { + "group": "Configuration", + "pages": [ + "configuration/index", + "configuration/project", + "configuration/crawler", + "configuration/rules", + "configuration/external-links", + "configuration/output", + "configuration/cloud", + "configuration/rule-options", + "configuration/examples" + ] } ] }, { - "group": "Configuration", - "pages": [ - "configuration/index", - "configuration/project", - "configuration/crawler", - "configuration/rules", - "configuration/external-links", - "configuration/output", - "configuration/rule-options", - "configuration/examples" + "tab": "Cloud", + "icon": "cloud", + "groups": [ + { + "group": "Cloud", + "pages": [ + "cloud/index", + "cloud/credits", + "cloud/rules", + "cloud/rendering" + ] + }, + { + "group": "Dashboard", + "pages": [ + "dashboard/index" + ] + } ] } ] diff --git a/guides/browser-rendering.mdx b/guides/browser-rendering.mdx new file mode 100644 index 0000000..2b22600 --- /dev/null +++ b/guides/browser-rendering.mdx @@ -0,0 +1,64 @@ +--- +title: "Browser Rendering" +description: "Audit JavaScript-heavy sites with cloud browser rendering" +--- + +Some sites build their content with JavaScript - single-page apps, client-rendered frameworks, content loaded after the initial response. A plain HTTP fetch sees the empty shell, so content rules report missing headings, thin word counts, and absent meta tags that are actually there. + +Browser rendering solves this: pages are loaded in a real headless browser in the cloud, and the audit runs against the fully rendered HTML. + +Browser rendering is a [cloud feature](/cloud) - it requires login and costs **2 credits per page**. See [how it works under the hood](/cloud/rendering). + +## Try it on one run + +```bash +squirrel auth login # once +squirrel audit https://example.com --render +``` + +`--render` uses the cloud browser for this run only. The crawl progress shows the running credit spend: + +``` +Crawling (cloud-rendered) 34/100 · ~68 credits +``` + +## Make it permanent for a project + +If a site always needs rendering, set it in `squirrel.toml`: + +```toml squirrel.toml +[cloud] +rendering = "browser" # default: "http" +``` + +Every audit of this project now renders pages, no flag needed. + +## Watch your page count + +At 2 credits per page, rendering is the most spend-sensitive cloud feature. Two settings to keep in mind: + +- `--max-pages` / `[crawler] max_pages` - fewer pages, fewer credits. +- `[cloud] max_credits_per_audit` (default **200**) - the hard cap. A 100-page rendered crawl alone hits it; raise it or cap your pages. + +```toml squirrel.toml +[cloud] +rendering = "browser" +max_credits_per_audit = 400 +``` + +## Do I need it? + +Run a normal audit first. If pages you know are full of content come back with implausibly low word counts or missing headings, the site is client-rendered - switch to browser rendering. Server-rendered sites (most CMSs, SSR frameworks, static sites) gain nothing from it. + +## If rendering fails + +You never lose an audit to rendering problems: + +- A single page that fails to render falls back to plain HTTP; the rest keep rendering. +- If you run out of credits or the service is down, the whole crawl falls back to plain HTTP with a one-line warning, and the report notes the fallback. + +## Related + +- [Cloud rendering explained](/cloud/rendering) - service behavior, costs, fallback details +- [Credits & Pricing](/cloud/credits) - balance, pricing, spend controls +- [Crawler settings](/configuration/crawler) - page limits and crawl behavior diff --git a/rules/adblock/blocked-links.mdx b/rules/adblock/blocked-links.mdx index ee04519..962ca67 100644 --- a/rules/adblock/blocked-links.mdx +++ b/rules/adblock/blocked-links.mdx @@ -3,15 +3,15 @@ title: "Blocked Tracking Links" description: "Checks for links and resources pointing to blocked tracking domains" --- -**Beta Rule** - This rule is experimental and may change significantly in future releases. +**Cloud rule** - requires login (`squirrel auth login`). All three [adblock rules](/rules/adblock) share a single **5-credit** blocklist check per audit. Skipped when not logged in. See [Cloud rules](/cloud/rules). -Checks for links and resources pointing to blocked tracking domains +Checks for links and resources pointing to blocked tracking domains (matched server-side against the full EasyList filter rules) | | | |---|---| | **Rule ID** | `adblock/blocked-links` | | **Category** | [Adblock Detection](/rules/adblock) | -| **Scope** | Per-page | +| **Scope** | Site-wide | | **Severity** | info | | **Weight** | 2/10 | @@ -31,7 +31,7 @@ This rule supports the following configuration options: ```toml squirrel.toml [rules."adblock/blocked-links"] -maxMatchesToReport = undefined +maxMatchesToReport = 20 ``` ## Enable / Disable diff --git a/rules/adblock/element-hiding.mdx b/rules/adblock/element-hiding.mdx index 378341e..e9e5a26 100644 --- a/rules/adblock/element-hiding.mdx +++ b/rules/adblock/element-hiding.mdx @@ -3,15 +3,15 @@ title: "Adblock Element Hiding" description: "Checks for elements that would be hidden by common adblockers" --- -**Beta Rule** - This rule is experimental and may change significantly in future releases. +**Cloud rule** - requires login (`squirrel auth login`). All three [adblock rules](/rules/adblock) share a single **5-credit** blocklist check per audit. Skipped when not logged in. See [Cloud rules](/cloud/rules). -Checks for elements that would be hidden by common adblockers +Checks for elements that would be hidden by common adblockers (matched server-side against the full EasyList cosmetic rules) | | | |---|---| | **Rule ID** | `adblock/element-hiding` | | **Category** | [Adblock Detection](/rules/adblock) | -| **Scope** | Per-page | +| **Scope** | Site-wide | | **Severity** | warning | | **Weight** | 3/10 | @@ -32,8 +32,7 @@ This rule supports the following configuration options: ```toml squirrel.toml [rules."adblock/element-hiding"] -maxMatchesToReport = undefined -lists = undefined +maxMatchesToReport = 20 ``` ## Enable / Disable diff --git a/rules/adblock/index.mdx b/rules/adblock/index.mdx index 640f237..c6c3c20 100644 --- a/rules/adblock/index.mdx +++ b/rules/adblock/index.mdx @@ -1,11 +1,11 @@ --- title: "Adblock Detection" -description: "Detection of content blocked by ad blockers" +description: "Detection of content blocked by ad blockers and privacy filters" --- -**Beta Category** - These rules are experimental and may change significantly in future releases. +**Cloud rules** - requires login (`squirrel auth login`). All three rules share a single **5-credit** blocklist check per audit, matched server-side against the full EasyList and EasyPrivacy filter lists. Skipped when not logged in. See [Cloud rules](/cloud/rules). -Detection of content blocked by ad blockers +Detection of content blocked by ad blockers and privacy filters. ## Rules @@ -16,6 +16,9 @@ Detection of content blocked by ad blockers Checks for links and resources pointing to blocked tracking domains + + Checks for trackers and analytics that EasyPrivacy would block + ## Disable All Adblock Detection Rules diff --git a/rules/adblock/privacy-blocked.mdx b/rules/adblock/privacy-blocked.mdx new file mode 100644 index 0000000..d71193b --- /dev/null +++ b/rules/adblock/privacy-blocked.mdx @@ -0,0 +1,41 @@ +--- +title: "Privacy Filter Matches" +description: "Checks for trackers and analytics that privacy filter lists (EasyPrivacy) would block" +--- + +**Cloud rule** - requires login (`squirrel auth login`). All three [adblock rules](/rules/adblock) share a single **5-credit** blocklist check per audit. Skipped when not logged in. See [Cloud rules](/cloud/rules). + +Checks for trackers and analytics that privacy filter lists (EasyPrivacy) would block. + +| | | +|---|---| +| **Rule ID** | `adblock/privacy-blocked` | +| **Category** | [Adblock Detection](/rules/adblock) | +| **Scope** | Site-wide | +| **Severity** | info | +| **Weight** | 2/10 | +| **Default** | Enabled | + +## What it checks + +The site's scripts, pixels, and request URLs are matched server-side against the full **EasyPrivacy** filter list - the list used by privacy-focused browsers and extensions (uBlock Origin, Brave, Firefox strict mode). Matches are reported with the specific filter rule that would block them. + +## Solution + +Analytics, session replay, and tracking pixels on matched domains will silently fail for visitors using privacy tooling, skewing your measurement data. Consider first-party or privacy-respecting analytics so measurement survives tracker blocking. + +## Enable / Disable + +### Disable this rule + +```toml squirrel.toml +[rules] +disable = ["adblock/privacy-blocked"] +``` + +### Disable all adblock rules + +```toml squirrel.toml +[rules] +disable = ["adblock/*"] +``` diff --git a/rules/ai/index.mdx b/rules/ai/index.mdx index ca953ff..fbc52ed 100644 --- a/rules/ai/index.mdx +++ b/rules/ai/index.mdx @@ -1,19 +1,11 @@ --- title: "AI" -description: "LLM parsability and AI content detection" +description: "AI-powered page classification, parsability, and content analysis" --- -**Beta Category** - These rules are experimental and may change significantly in future releases. They are disabled by default and require `OPENROUTER_API_KEY` to be set. +**Cloud rules** - these rules use AI analysis in the cloud and require login (`squirrel auth login`). They are skipped (never failed) when you're not logged in. See [Cloud rules](/cloud/rules) for costs and behavior. -LLM parsability and AI content detection - -## Prerequisites - -AI rules require an OpenRouter API key to function. Set the environment variable: - -```bash -export OPENROUTER_API_KEY=your_key_here -``` +AI-powered page classification, parsability, and content analysis. ## Rules @@ -21,20 +13,17 @@ export OPENROUTER_API_KEY=your_key_here Analyzes how well LLMs can parse and understand the content + + Checks the AI-classified page type agrees with declared structured data + + + Classifies the overall site type (blog, ecommerce, saas, docs, ...) + - Detects if content appears to be AI-generated + Detects if content appears to be AI-generated (currently disabled) -## Enable AI Rules - -AI rules are disabled by default. To enable them: - -```toml squirrel.toml -[rules] -enable = ["ai/*"] -``` - ## Disable All AI Rules ```toml squirrel.toml diff --git a/rules/ai/llm-parsability.mdx b/rules/ai/llm-parsability.mdx index b7784ef..99bfc04 100644 --- a/rules/ai/llm-parsability.mdx +++ b/rules/ai/llm-parsability.mdx @@ -3,7 +3,7 @@ title: "LLM Parsability" description: "Analyzes how well LLMs can parse and understand the content" --- -**Beta Rule** - This rule is experimental and may change significantly in future releases. +**Cloud rule** - requires login (`squirrel auth login`) and costs **1 credit per page** (shared with [Page Type Match](/rules/ai/page-type-match) - both read the same analysis). Skipped when not logged in. See [Cloud rules](/cloud/rules). Analyzes how well LLMs can parse and understand the content @@ -14,15 +14,7 @@ Analyzes how well LLMs can parse and understand the content | **Scope** | Per-page | | **Severity** | info | | **Weight** | 3/10 | -| **Default** | Disabled | - -## Prerequisites - -This rule requires an OpenRouter API key: - -```bash -export OPENROUTER_API_KEY=your_key_here -``` +| **Default** | Enabled | ## Solution @@ -47,13 +39,6 @@ The rule scores content from 0-100 based on: ## Enable / Disable -### Enable this rule - -```toml squirrel.toml -[rules] -enable = ["ai/llm-parsability"] -``` - ### Disable this rule ```toml squirrel.toml @@ -61,9 +46,9 @@ enable = ["ai/llm-parsability"] disable = ["ai/llm-parsability"] ``` -### Enable all AI rules +### Disable all AI rules ```toml squirrel.toml [rules] -enable = ["ai/*"] +disable = ["ai/*"] ``` diff --git a/rules/ai/page-type-match.mdx b/rules/ai/page-type-match.mdx new file mode 100644 index 0000000..d87bcc3 --- /dev/null +++ b/rules/ai/page-type-match.mdx @@ -0,0 +1,45 @@ +--- +title: "Page Type Match" +description: "Checks that the page's AI-classified type agrees with its declared structured data" +--- + +**Cloud rule** - requires login (`squirrel auth login`) and costs **1 credit per page** (shared with [LLM Parsability](/rules/ai/llm-parsability) - both read the same analysis). Skipped when not logged in. See [Cloud rules](/cloud/rules). + +Checks that the page's AI-classified type agrees with its declared structured data. + +| | | +|---|---| +| **Rule ID** | `ai/page-type-match` | +| **Category** | [AI](/rules/ai) | +| **Scope** | Per-page | +| **Severity** | warning | +| **Weight** | 3/10 | +| **Default** | Enabled | + +## What it checks + +The cloud service classifies what each page *is* - the way an AI assistant or search engine reads it (article, product, contact, docs, ...). The rule then compares that classification against the page's declared JSON-LD `@type`: + +- **No page-type structured data declared** - passes, reporting the classification for reference. +- **Classification matches the declared type** (or the classifier isn't confident) - passes. +- **Page reads as one type but declares another** - warns, e.g. *"Page reads as `product` but declares Article structured data"*. + +## Solution + +A mismatch between what a page is and what its structured data declares confuses rich-result eligibility and AI answers. Either fix the JSON-LD `@type` to describe the page truthfully, or restructure the page content so its primary purpose is unambiguous. + +## Enable / Disable + +### Disable this rule + +```toml squirrel.toml +[rules] +disable = ["ai/page-type-match"] +``` + +### Disable all AI rules + +```toml squirrel.toml +[rules] +disable = ["ai/*"] +``` diff --git a/rules/ai/site-type.mdx b/rules/ai/site-type.mdx new file mode 100644 index 0000000..4c85105 --- /dev/null +++ b/rules/ai/site-type.mdx @@ -0,0 +1,41 @@ +--- +title: "Site Type" +description: "Classifies the overall site type (blog, ecommerce, saas, docs, ...)" +--- + +**Cloud rule** - requires login (`squirrel auth login`) and costs **5 credits per audit**. Skipped when not logged in. See [Cloud rules](/cloud/rules). + +Classifies the overall site type (blog, ecommerce, saas, docs, ...) using AI analysis of the crawled pages. + +| | | +|---|---| +| **Rule ID** | `ai/site-type` | +| **Category** | [AI](/rules/ai) | +| **Scope** | Site-wide | +| **Severity** | info | +| **Weight** | 1/10 | +| **Default** | Enabled | + +## What it checks + +The cloud service classifies the site's overall type from a sample of crawled pages and reports the classification with a confidence score. This is informational - it never fails - but the detected type anchors other audit analyses: expected pages, content depth, and schema choices. + +## Solution + +If the classification looks wrong, the site's purpose may not be coming through to readers, search engines, or AI assistants. Sharpen the homepage value proposition, titles, and meta descriptions so the site's primary purpose is unambiguous. + +## Enable / Disable + +### Disable this rule + +```toml squirrel.toml +[rules] +disable = ["ai/site-type"] +``` + +### Disable all AI rules + +```toml squirrel.toml +[rules] +disable = ["ai/*"] +``` diff --git a/rules/eeat/authority-signals.mdx b/rules/eeat/authority-signals.mdx new file mode 100644 index 0000000..7a43412 --- /dev/null +++ b/rules/eeat/authority-signals.mdx @@ -0,0 +1,36 @@ +--- +title: "Authority Signals" +description: "AI assessment of per-page authority signals: authorship, citations, and outbound references" +--- + +**Cloud rule** - requires login (`squirrel auth login`) and costs **1 credit per page**. Skipped when not logged in. See [Cloud rules](/cloud/rules). + +AI assessment of per-page authority signals: authorship, citations, and outbound references. + +| | | +|---|---| +| **Rule ID** | `eeat/authority-signals` | +| **Category** | [E-E-A-T](/rules/eeat) | +| **Scope** | Per-page | +| **Severity** | warning | +| **Weight** | 3/10 | +| **Default** | Enabled | + +## What it checks + +The cloud service reads each page and reports whether an author is attributed, how many claims are backed by citations, and how many outbound references the page makes. A page with **no author attribution and zero citations** warns; otherwise the rule passes and lists the detected signals. + +Unlike the pattern-based [`eeat/author-byline`](/rules/eeat/author-byline) and [`eeat/citations`](/rules/eeat/citations) rules, this is a semantic assessment - it understands attribution and sourcing in context rather than matching markup patterns. + +## Solution + +Pages that demonstrate who wrote them and what their claims rest on earn more trust from readers, search engines, and AI assistants. Add a visible author byline (with credentials where relevant), cite sources for factual claims, and link out to authoritative references. + +## Enable / Disable + +### Disable this rule + +```toml squirrel.toml +[rules] +disable = ["eeat/authority-signals"] +``` diff --git a/rules/eeat/index.mdx b/rules/eeat/index.mdx index 3f5c899..ebe8359 100644 --- a/rules/eeat/index.mdx +++ b/rules/eeat/index.mdx @@ -20,6 +20,9 @@ Experience, expertise, authority, trust signals Checks for author credentials and expertise indicators + + AI assessment of authorship, citations, and outbound references (cloud) + Checks for citations to authoritative external sources diff --git a/rules/gaps/content.mdx b/rules/gaps/content.mdx new file mode 100644 index 0000000..f02d752 --- /dev/null +++ b/rules/gaps/content.mdx @@ -0,0 +1,42 @@ +--- +title: "Content Gaps" +description: "Finds topic clusters with search demand that lack dedicated coverage" +--- + +**Cloud rule, opt-in** - requires login (`squirrel auth login`), costs **25 credits per audit**, and is **disabled by default**. See [Cloud rules](/cloud/rules). + +Finds topic clusters with search demand around the site's existing content that lack dedicated coverage. + +| | | +|---|---| +| **Rule ID** | `gaps/content` | +| **Category** | [Gap Analysis](/rules/gaps) | +| **Scope** | Site-wide | +| **Severity** | info | +| **Weight** | 1/10 | +| **Default** | Disabled (opt-in) | + +## What it checks + +Using live search data, the rule maps topic clusters adjacent to what your site already covers and reports clusters with combined search volume that have no dedicated page on your site. + +## Solution + +Each gap is a topic cluster with combined search volume the site doesn't cover directly. Plan content (guides, comparisons, FAQs) around the highest-volume clusters first - they're adjacent to what you already rank for, so new pages benefit from existing topical authority. + +## Options + +```toml squirrel.toml +[rule_options."gaps/content"] +country = "US" # ISO country for search data (default US) +language = "en" # language code for search data (default en) +``` + +## Enable / Disable + +This rule is opt-in - enable it explicitly: + +```toml squirrel.toml +[rules] +enable = ["gaps/content"] +``` diff --git a/rules/gaps/index.mdx b/rules/gaps/index.mdx new file mode 100644 index 0000000..1953c91 --- /dev/null +++ b/rules/gaps/index.mdx @@ -0,0 +1,39 @@ +--- +title: "Gap Analysis" +description: "Keyword and content gap analysis backed by live search data" +--- + +**Cloud rules, opt-in** - these rules require login (`squirrel auth login`), cost **25 credits each per audit**, and are **disabled by default** so a routine audit never spends them by surprise. See [Cloud rules](/cloud/rules). + +Gap analysis compares your site against live search demand data: what people search for, what competitors rank for, and which of those topics your site doesn't cover. + +## Rules + + + + Keywords competitors rank for (or seed-keyword opportunities) that this site doesn't rank for + + + Topic clusters with search demand around your existing content that lack dedicated coverage + + + +## Enable Gap Analysis + +Both rules are opt-in: + +```toml squirrel.toml +[rules] +enable = ["gaps/keywords", "gaps/content"] +``` + +## Options + +Both rules accept the same options: + +```toml squirrel.toml +[rule_options."gaps/keywords"] +country = "US" # ISO country for search data +language = "en" # language code for search data +competitors = ["competitor.com"] # up to 5 competitor domains +``` diff --git a/rules/gaps/keywords.mdx b/rules/gaps/keywords.mdx new file mode 100644 index 0000000..365cd34 --- /dev/null +++ b/rules/gaps/keywords.mdx @@ -0,0 +1,43 @@ +--- +title: "Keyword Gaps" +description: "Finds keywords competitors rank for that this site doesn't rank for" +--- + +**Cloud rule, opt-in** - requires login (`squirrel auth login`), costs **25 credits per audit**, and is **disabled by default**. See [Cloud rules](/cloud/rules). + +Finds keywords competitors rank for (or seed-keyword opportunities) that this site doesn't rank for. + +| | | +|---|---| +| **Rule ID** | `gaps/keywords` | +| **Category** | [Gap Analysis](/rules/gaps) | +| **Scope** | Site-wide | +| **Severity** | info | +| **Weight** | 1/10 | +| **Default** | Disabled (opt-in) | + +## What it checks + +Using live search data, the rule compares your site's ranking footprint against competitor domains (or seed keywords derived from your content) and reports keywords with real search volume where competitors rank and you don't. + +## Solution + +Review the listed gap keywords and prioritize the high-volume ones that match your site's intent. Create or expand pages targeting them - a dedicated page per keyword cluster generally outranks a page that mentions the topic in passing. Configure competitor domains via the `competitors` option to sharpen the analysis. + +## Options + +```toml squirrel.toml +[rule_options."gaps/keywords"] +country = "US" # ISO country for search data (default US) +language = "en" # language code for search data (default en) +competitors = ["competitor.com"] # up to 5 competitor domains +``` + +## Enable / Disable + +This rule is opt-in - enable it explicitly: + +```toml squirrel.toml +[rules] +enable = ["gaps/keywords"] +``` diff --git a/rules/index.mdx b/rules/index.mdx index d0e4ad5..36dd5b1 100644 --- a/rules/index.mdx +++ b/rules/index.mdx @@ -1,9 +1,11 @@ --- title: "Rules Reference" -description: "All 221 audit rules organized by category" +description: "All 233 audit rules organized by category" --- -squirrelscan includes **221 rules** across **20 categories**. Each rule checks for specific SEO, accessibility, performance, or security issues. +squirrelscan includes **233 rules** across **21 categories**. Each rule checks for specific SEO, accessibility, performance, or security issues. + +Most rules run locally for free. A handful of [cloud rules](/cloud/rules) use AI analysis, full filter lists, or live search data - they require login and are skipped when you're not logged in. Cloud rules carry a notice banner on their doc pages. ## Categories @@ -15,7 +17,7 @@ squirrelscan includes **221 rules** across **20 categories**. Each rule checks f Text quality, readability, and content structure (12 rules) - Internal and external link health and structure (13 rules) + Internal and external link health and structure (14 rules) Image optimization and accessibility (14 rules) @@ -33,10 +35,10 @@ squirrelscan includes **221 rules** across **20 categories**. Each rule checks f Language declarations and multi-region support (2 rules) - Content quality signals for AI/LLM systems (0 rules) + AI page classification, parsability, and content analysis (4 rules) - Page speed and loading performance (24 rules) + Page speed and loading performance (25 rules) Open Graph and social sharing metadata (4 rules) @@ -63,10 +65,13 @@ squirrelscan includes **221 rules** across **20 categories**. Each rule checks f Tracking and measurement implementation (2 rules) - Experience, expertise, authority, trust signals (14 rules) + Experience, expertise, authority, trust signals (15 rules) - Detection of content blocked by ad blockers (0 rules) + Detection of content blocked by ad blockers (3 rules) + + + Keyword and content gaps backed by live search data (2 rules, opt-in) diff --git a/rules/links/dead-links.mdx b/rules/links/dead-links.mdx new file mode 100644 index 0000000..e35405d --- /dev/null +++ b/rules/links/dead-links.mdx @@ -0,0 +1,43 @@ +--- +title: "Dead Links (Cloud)" +description: "Verifies external links through the cloud dead-links service with a shared global cache" +--- + +**Cloud rule** - requires login (`squirrel auth login`) and costs **1 credit per 100 external URLs**. Skipped when not logged in (external links are then checked locally as usual). See [Cloud rules](/cloud/rules). + +Verifies external links through the cloud dead-links service, which shares a global link-check cache across all audits. + +| | | +|---|---| +| **Rule ID** | `links/dead-links` | +| **Category** | [Links](/rules/links) | +| **Scope** | Site-wide | +| **Severity** | info | +| **Weight** | 1/10 | +| **Default** | Enabled | + +## What it does + +This rule is the **enable gate** for cloud external-link checking. When it's enabled and you're logged in, the audit's external-link phase routes through the cloud service instead of fetching every link from your machine: + +- **Shared global cache** - links checked by any recent audit (yours or anyone's) return instantly from cache, so repeat audits are much faster and third-party sites aren't hammered. +- **Fresh results** - working links are cached for 7 days, failures for 24 hours. +- **Same report shape** - broken links found this way are detailed by [`links/broken-external-links`](/rules/links/broken-external-links), exactly as with local checking. + +If an audit's estimated dead-link spend exceeds your `confirm_threshold`, you're prompted before the phase runs. Declining (or being logged out) falls back to local per-link checking. + +## Enable / Disable + +### Disable cloud link checking (keep local checking) + +```toml squirrel.toml +[rules] +disable = ["links/dead-links"] +``` + +### Disable external link checking entirely + +```toml squirrel.toml +[external_links] +enabled = false +``` diff --git a/rules/links/index.mdx b/rules/links/index.mdx index d73e160..9b7fbd3 100644 --- a/rules/links/index.mdx +++ b/rules/links/index.mdx @@ -17,6 +17,9 @@ Internal and external link health and structure Detects links returning 404 or 5xx errors + + Verifies external links through the cloud service with a shared global cache + Pages with no outgoing internal links, potentially trapping users From 895aaa2b705973c9efcc090d84bed5f5d7a25070 Mon Sep 17 00:00:00 2001 From: Nik Cubrilovic Date: Thu, 11 Jun 2026 09:06:17 +1000 Subject: [PATCH 2/2] =?UTF-8?q?docs(cloud):=20update=20credit=20sources=20?= =?UTF-8?q?=E2=80=94=20free=20500/mo,=20starter=205000/mo,=20custom=20top-?= =?UTF-8?q?ups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloud/credits.mdx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cloud/credits.mdx b/cloud/credits.mdx index a4c7824..e0606cb 100644 --- a/cloud/credits.mdx +++ b/cloud/credits.mdx @@ -10,12 +10,11 @@ Cloud features are priced in **credits** - small integers, not dollars. Local au | Source | Credits | Notes | |--------|---------|-------| -| Signup grant | 1,000 | One-time, free, no card required | -| Starter plan ($19/mo) | 2,000/month | Resets each billing period; unused monthly credits expire | -| Credit pack ($9) | 1,000 | Never expire | -| Credit pack ($39) | 5,000 | Never expire | +| Free plan | 500/month | Every account, no card required; resets each calendar month | +| Starter plan ($19/mo) | 5,000/month | Resets each billing period; unused monthly credits expire | +| Credit top-up (min $10) | 100 per $1 | Paid plan only; pick any amount; never expire | -Monthly credits are spent before purchased pack credits. Buy plans and packs from the **Billing & Credits** page in the [dashboard](/dashboard). +Monthly credits are spent before purchased top-up credits. Subscribe and top up from the **Billing & Credits** page in the [dashboard](/dashboard). ## Checking your balance