# SEO indexability snapshot — a replayable Reelier skill

On-page SEO/indexability signals for a public page — title, meta description, canonical, Open Graph — read-only

A real, read-only Reelier skill against a live public API — no account, no keys, no writes. Every replay proves: A public page serves the core on-page SEO signals in its server-rendered HTML — title, meta description, canonical, and Open Graph.

- Steps: 1 · Assertions: 6 · Effect: read (counts parsed from the file, never hand-typed)
- Endpoints: https://www.reelier.com/skills
- Canonical file: https://raw.githubusercontent.com/seldonframe/reelier/main/examples/portfolio/seo-indexability-snapshot.skill.md
- HTML page: https://www.reelier.com/skills/seo-indexability-snapshot

## What this checks

One step: an HTTP GET to a public page, then six assertions against the raw HTML — the server answered 200, and the head carries a <title>, a name="description" meta, a rel="canonical" link, and og:title / og:description Open Graph tags. The page title and canonical URL are bound onto the receipt.

It asserts the HTML exactly as the server delivered it — the same bytes a crawler sees before running any JavaScript — so a page that only injects these tags client-side after hydration will correctly fail, because a crawler wouldn't see them either. The asserts pin the presence of each tag marker, never a value that would rot when you re-title the page.

Not a rank checker. There is no free, read-only, unauthenticated SERP/position API, so this skill never claims to know where a page ranks — it checks the on-page signals that decide how the page is indexed and previewed, never its position.

## The skill file (verbatim)

```markdown
---
name: seo-indexability-snapshot
description: On-page SEO/indexability signals for a public page — title, meta description, canonical, Open Graph — read-only
---

<!-- synced from seldonframe/reelier examples/portfolio — edit there -->

# SEO indexability snapshot

Inputs: (none — this file replays green as-is; see the personalization note)

<!--
  Personalization: swap the literal page URL `https://www.reelier.com/skills`
  in the action for your own page (the portfolio README's "Point these at
  YOUR project" section has the one-command version). The skill grammar has
  no default-value syntax for {{var}} holes — an unbound {{var}} is an
  explicit error, never a guessed fallback — so this file ships with a
  literal that replays green with zero flags.

  Honesty note — this is NOT a rank checker. There is no free, read-only,
  unauthenticated SERP/position API, so this skill never claims to know where
  a page ranks. It checks on-page INDEXABILITY SIGNALS: the head tags that
  decide how a crawler indexes the page and how it previews when shared. The
  `body contains` asserts test the HTML exactly as the server delivered it —
  the same bytes a crawler sees before running any JavaScript — so a page
  that only injects these tags client-side after hydration will (correctly)
  fail, because a crawler wouldn't see them either.

  Endpoint verified live on 2026-07-21: 200; head carries <title>,
  name="description", rel="canonical", og:title, og:description.
-->

The assertions pin the PRESENCE of each signal (the tag marker is in the
served HTML), never its exact value — the title text and canonical URL are
bound onto the receipt instead, so re-titling the page or moving its
canonical changes the recorded values without ever breaking the replay.

## Steps

### Step 1 — Fetch the page and check its indexability head tags
- intent: GET a public page and confirm it serves the core on-page SEO signals — title, meta description, canonical, and Open Graph
- action: http.get {"url": "https://www.reelier.com/skills"}
- assert: status == 200
- assert: body contains "<title>"
- assert: body contains "name="description""
- assert: body contains "rel="canonical""
- assert: body contains "og:title"
- assert: body contains "og:description"
- bind: title = body match /<title>([^<]*)<\/title>/
- bind: canonical = body match /rel="canonical" href="([^"]*)"/
- effect: read
```

## Run it yourself

`reelier run` takes a local file, so fetch the canonical copy first (or clone the repo). The replay writes its receipt to `.reelier/runs/`.

```sh
curl -fsSL https://raw.githubusercontent.com/seldonframe/reelier/main/examples/portfolio/seo-indexability-snapshot.skill.md -o seo-indexability-snapshot.skill.md
npx -y reelier@latest run seo-indexability-snapshot.skill.md

# or from a clone:
git clone https://github.com/seldonframe/reelier
cd reelier && npx -y reelier@latest run examples/portfolio/seo-indexability-snapshot.skill.md
```

## Seed receipt — 2026-07-21

Replayed for real with the published CLI (resolved to reelier@0.15.0) on 2026-07-21; the run record confirms passed: true and 0 LLM tokens (input + output). Verbatim output:

```
✓ Step 1 — Fetch the page and check its indexability head tags [passed] 239ms

PASSED: 1/1 steps ok, 0 failed, 239ms total
```

Standing audit log: a GitHub Action replays all five portfolio skills every 6 hours (plus on demand) — https://github.com/seldonframe/reelier/actions/workflows/portfolio-replay.yml. A failing endpoint produces an honestly failing receipt, never a retried-until-green one.

## Point it at your project

Swap the one literal page URL `https://www.reelier.com/skills` in the action for your own page URL. The skill grammar has no default-value syntax for {{var}} holes — an unbound {{var}} is an explicit error, never a guessed fallback — so this file ships with a literal that replays green with zero flags.

```sh
sed 's#https://www.reelier.com/skills#https://YOUR-SITE.com/your-page#g' seo-indexability-snapshot.skill.md > my-seo-snapshot.skill.md \
  && npx -y reelier@latest run my-seo-snapshot.skill.md
```

---

Reelier — agents make claims, Reelier writes receipts. AGPL-3.0.
Portfolio index: https://www.reelier.com/skills (twin: https://www.reelier.com/skills.md) · Replay ledger: https://www.reelier.com/replays · Machine-readable summary: https://www.reelier.com/llms.txt
