Agent skill

Daily Site SEO Audit

by aeonfun in aeonfun/aeon

Audits every page of a site each day from its sitemap, scores on-page and technical SEO, checks duplicates across pages and reports what changed since the last run.

MITAuto-check passedMarketing & SEO

Install Daily Site SEO Audit

skills CLI
$ npx skills add aeonfun/aeon --skill seo-audit -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install aeonfun/aeon seo-audit --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/seo-audit .claude/skills/seo-audit && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
seo-audit
GitHub stars
767
Token cost
~5.1k tokens
SKILL.md length
2,629 words
Files
2 (incl. references)
Skills in repo
82
Repo updated
First seen
Licence
MIT

At a glance

Audits every page of a site each day from its sitemap, scores on-page and technical SEO, checks duplicates across pages and reports what changed since the last run.

  • Works in 8 steps: Resolve the targets. Split ${var} on… → Audit each site → Read the findings, don't re-derive them.… → …
  • Running a recurring SEO health check across an entire site
  • SKILL.md covers What this does, Capability notes (read before…, Workflow and Prioritizing what to report, plus 2 more sections
  • Calls node; needs PAGESPEED_API_KEY

What it does

The skill takes one or more site origins and audits each whole site. It finds pages through robots.txt and sitemap.xml, following sitemap indexes and respecting Disallow rules for all crawlers, and falls back to a one-hop crawl of homepage links when no sitemap exists. A Node script, scripts/seo-audit.mjs, does the discovery, fetching, parsing and checking and returns machine-readable findings, so the agent reasons from data rather than reading raw HTML.

Covering the whole site makes cross-page checks possible: duplicate titles and meta descriptions, canonicals that point to another page, and pages that are linked but missing from the sitemap. Results are compared with the previous run, and a score line plus any regressions is sent as a notification. With no target set, it logs that and exits without notifying. It covers on-page and technical SEO only, not keyword research, rank tracking or backlinks, and a references/checklist.md file holds the checks.

When your agent uses it

  • Running a recurring SEO health check across an entire site
  • Finding duplicate titles or meta descriptions between pages
  • Catching canonical or sitemap problems after a deploy
  • Seeing which pages regressed since yesterday's audit

Example prompts

  • “Audit https://www.example.com and tell me what regressed since the last run.”
  • “Check my site for duplicate titles, canonicals pointing elsewhere and pages missing from the sitemap.”
  • “Audit both of our marketing sites and send me only the score line and regressions.”

Requirements

  • Node.js to run the dependency-free auditor script
  • The origin URL of each site to audit

Workflow steps

8 steps, taken from the first numbered list in SKILL.md.

  1. Resolve the targets. Split ${var} on commas and trim. No confirmation
  2. Audit each site
  3. Read the findings, don't re-derive them. The report has two levels
  4. Diff against the previous run. Every run writes its own timestamped
  5. Write this run's state before notifying, so the next diff has a baseline
  6. Update the remediation doc, memory/seo-audit/FIXES.md. This is the
  7. Notify — every day, even when nothing changed (as long as a target was
  8. Log it. End your final output with the log record (the guard writes it to

What it can do on your machine

Read from SKILL.md and the folder at commit c0cb7c4. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • PAGESPEED_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Daily Site SEO Audit loads about 5.1k tokens when it runs, and up to ~6.8k if it reads all its reference files. Until then it costs about 66 tokens; SKILL.md has 2,629 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~66
When it runs · the whole SKILL.md, loaded when a task matches
~5.1k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~6.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from aeonfun/aeon at commit c0cb7c4, republished under its MIT licence (© aeonfun). 2,629 words, ~5,069 tokens.

Download SKILL.mdSave it as .claude/skills/seo-audit/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
seo-audit
description
Daily on-page and technical SEO audit of every page on a site - discovers URLs from the sitemap, scores each page, adds cross-page checks (duplicate titles, canonicals, sitemap gaps), diffs against yesterday, and sends the score line plus any regressions
metadata.title
SEO Audit
metadata.mode
read-only
metadata.category
dev
metadata.tags
monitoring, web
metadata.requires
PAGESPEED_API_KEY?
metadata.capabilities
external_api, read_only, sends_notifications

Today is ${today}.

${var} — the target sites, comma-separated (an origin, not a page: https://www.example.com). Each site is audited whole and independently. A bare host gets https:// prepended. A path in ${var} (…/docs) still works — its origin is what gets crawled.

Empty ${var} → there is nothing to audit. This skill has no built-in default site (it ships general-purpose). Log SEO_NO_TARGET, send no notification, and exit clean — a daily "set a target" ping would just get muted. Set the target once in the dashboard (the skill's var) and it runs from the next tick.

What this does

Discovers every page a site publishes, audits all of them, compares the result against the previous run, and reports. The heavy lifting (discovery, fetching, parsing, checking) happens in scripts/seo-audit.mjs, which returns machine-readable findings so you reason over facts instead of eyeballing HTML.

Discovery is sitemap-first: robots.txt → sitemap.xml (following sitemap indexes), honouring the robots * Disallow rules, falling back to a one-hop crawl of the homepage's internal links when a site has no sitemap. That is the same list Google works from, so auditing it is auditing what actually ranks.

Auditing the whole site — not three sample templates — is what makes the cross-page checks possible: duplicate titles, duplicate meta descriptions, canonicals pointing away from their own page, and pages linked but missing from the sitemap. None of those are visible from inside a single page, and all of them are ways a site quietly loses search traffic.

This is on-page and technical SEO only — no keyword research, rank tracking, or backlink analysis. If a finding would need those, say so rather than guessing.

Capability notes (read before editing this skill)

This skill is mode: read-only, and that is load-bearing:

  • The auditor is Node, not Python, because Bash(node:*) is in the read-only capability base while Bash(python3:*) is write-tier only (scripts/skill_mode.sh). Porting it back to Python would force mode: write.
  • It is dependency-free stdlib Node, matching every other helper in scripts/. There is no install step. If you find yourself wanting a package, you are about to break the thing that makes this skill cheap and safe.
  • You have no Write or Edit tool. Every file this skill produces is written with a shell redirection (>/>>) from an allowed command. The workflow's read-only guard reverts writes to code/config paths but preserves memory/ and output/, which is exactly where this skill writes.
  • The guard also appends the ### seo-audit run-log entry from your final output, so put the log detail there (step 8), never a second self-written entry.

PAGESPEED_API_KEY is optional. When set, the script folds in Core Web Vitals — it reads the env var itself, so never pass the key as a command-line argument; the workflow's permission analyzer blocks $SECRET expansions on the Bash line. It prefers real-user field data (Chrome UX Report p75 — LCP, INP since it replaced FID in 2024, and CLS — the metrics Google's page-experience signal actually uses), preferring page-level then origin-level, and falls back to the lab Lighthouse score only when a URL has too little traffic for field data (the finding says which). In site mode it samples the entry page only (PageSpeed is slow and quota-limited; per-page Lighthouse runs would dominate the runtime). When unset, Core Web Vitals are simply absent. That is a degraded run, not a failed one — don't mention the missing key in the notification.

Workflow

  1. Resolve the targets. Split ${var} on commas and trim. No confirmation step — this runs unattended, so treat ${var} as final. If ${var} is empty, there is no site to audit: log SEO_NO_TARGET (Step 8), send no notification, and exit. Do not invent a default origin.

  2. Audit each site:

    bash
    node scripts/seo-audit.mjs --site <origin> --format json

    Useful flags: --max N (page cap, default 50) and --concurrency N (default 4 — politeness as much as speed). Add --check-links on the first site only; it probes up to 40 links and is the slow part. In site mode links are deduped across every page first, so a footer link is checked once for the whole site rather than once per page.

    A site where no page could be fetched returns "ok": false and exits 1. Record it and keep going — one dead site must not abort the others. Individual pages that fail are reported inside the run as the pages_fetched finding.

  3. Read the findings, don't re-derive them. The report has two levels:

    • pages[] — one per URL, each with its own score, summary, and findings (same check / status / message / detail shape as before).
    • site_findings[] — the cross-page checks: pages_fetched, duplicate_titles, duplicate_descriptions, canonical_targets, sitemap_coverage.

    The headline score is the mean page score, and discovery records how the URLs were found (sitemap or crawl), how many existed, how many were audited, and whether the --max cap truncated the run.

  4. Diff against the previous run. Every run writes its own timestamped snapshot (step 5), so the baseline is the newest snapshot that already exists — i.e. the previous run's, since this run hasn't written its own yet. Filenames sort chronologically, so:

    bash
    PREV=$(ls -1 memory/seo-audit/*.json 2>/dev/null | sort | tail -1)

    $PREV is the baseline (empty on the very first run). Match pages by URL, per site, and compare:

    • New fails — a check that was pass/warn yesterday and is fail today.
    • Site score movement — any change of 3+ points, either direction.
    • New / removed pages — URLs in today's sitemap that weren't in yesterday's, and vice versa. A page vanishing from the sitemap is a real finding; so is a new page shipping with no meta description.
    • New cross-page problems — a title or description that became a duplicate, a canonical that started pointing elsewhere.
    • Newly broken links — URLs in broken_links that were not there before.
    • Fixed — a check that was fail/warn yesterday and is pass today. Report these too; a skill that only ever delivers bad news gets muted.

    Compare like with like: a page-level score change is only meaningful against the same URL, and the site score is only meaningful when discovery.audited is roughly the same on both sides. If the page count moved a lot, say so instead of attributing the score change to the site's quality.

    If there is no previous file (first run), skip the diff and say so once.

    Three rules that stop the diff from lying. Each is here because the diff already got it wrong once:

    • Never claim a fix across an auditor version boundary. Compare auditor_version in both files. If they differ, the two runs used different rulers: report the movement but label it (auditor v1→v2 — may be the tool, not the site) and do not put it under "Fixed". A previous run announced a site had "resolved" a broken link that was only ever a bug in this script.
    • response_time never counts as fixed or regressed. It is a single sample over a network and swings hundreds of ms run to run. 866ms → 147ms is weather, not work. Still report it as a finding; just keep it out of the movement section unless it stays over threshold for 3+ consecutive runs.
    • Attribute a fix only to something a human could have changed. Markup, copy, links, headers. If you cannot name the edit that caused it, it is noise — leave it out.
  5. Write this run's state before notifying, so the next diff has a baseline even if the notification step fails. One new file per run, named by a UTC timestamp — never overwrite a date-named file. This is what makes a manual re-run (or a second scheduled run) safe: it can't clobber or fail to update an earlier run's snapshot, and the diff in step 4 always picks up the newest one. Shell redirection, not the Write tool. Loop the script over every origin in ${var} and fold the per-site JSON into one snapshot — redirect the script's own output, never retype it:

    bash
    mkdir -p memory/seo-audit
    export STAMP=$(date -u +%Y-%m-%dT%H-%M-%SZ)   # e.g. 2026-07-24T13-00-07Z
    i=0; files=""
    for site in <each trimmed origin from ${var}>; do
      i=$((i+1))
      node scripts/seo-audit.mjs --site "$site" > "/tmp/seo-$i.json"
      files="$files /tmp/seo-$i.json"
    done
    node -e 'const fs=require("fs"); const sites=process.argv.slice(1).map(f=>JSON.parse(fs.readFileSync(f)));
      console.log(JSON.stringify({date:"${today}",run:process.env.STAMP,sites},null,2))' $files \
      > "memory/seo-audit/${STAMP}.json"

    Redirect the script's own JSON; never retype it. A hand-copied 20-page report is where transcription errors and invented numbers come from — and it is the file the next diff trusts.

    Snapshots accumulate one per run (older date-named files stay valid — they still sort before any timestamped one). This skill is read-only and has no rm, so it cannot prune them itself; if the directory ever grows unwieldy, clear out old snapshots out-of-band (a write-mode maintenance step or a manual sweep). The newest file is all the diff ever needs.

  6. Update the remediation doc, memory/seo-audit/FIXES.md. This is the durable half of the skill: the notification is a daily nudge that scrolls away, this is the standing work list someone can open and act on. Rewrite it in full each run (shell redirection — no Write tool), preserving history from the previous copy.

    Structure, highest-impact first (site names below are placeholders — use the real hosts from ${var}):

    markdown
    ---
    title: "SEO Fixes"
    description: "Standing list of open SEO fixes, refreshed by seo-audit each run."
    ---
    
    # SEO fixes
    _Updated ${today} · auditor v<n> · example.com 94 (18 pages)_
    
    ## example.com — open
    
    ### 1. /docs — meta description is 512 chars (impact: high)
    - **Page:** https://www.example.com/docs → `<head>`
    - **Now:** `"How the product works: ..."` (512 chars)
    - **Target:** 120–160 chars
    - **Fix:**
      ```html
      <meta name="description" content="…the drafted replacement…">
    • Why: Google truncates around 160; the rest is wasted and the snippet reads as cut off.
    • First seen: 2026-07-21 · Open for: 3 runs
    2. site-wide — 18 pages have an image with no alt text (impact: medium)
    • Pages: all 18 (/, /docs, /blog/*, …) — one shared component
    • Fix: …

    example.com — recently fixed

    • 2026-07-24 — /blog: alt text added to all 4 images (was open 3 runs)
    
    Rules that keep it useful rather than decorative:
    - **One section per site**, sites ordered by how much work is open.
    - **Group by cause, not by page.** With 18 pages audited, the same warning on
      every one of them is *one* fix in a shared layout component, not 18
      entries — write it once, list the affected pages, and say where the shared
      markup lives if you can tell. Per-page entries are for per-page copy
      (a specific title, a specific meta description).
    - **Draft the actual replacement text**, don't describe it. A title or meta
      description the operator can paste is worth ten "consider shortening".
      Write it in the site's voice and state its character count. For a
      grouped finding, draft the one-line component change instead.
    - **Carry `First seen` and `Open for` forward** from the previous copy. Aging
      is the signal — a finding open for 20 runs is either important or should be
      consciously dropped.
    - **Write clean UTF-8; never carry mojibake forward.** If the previous copy
      shows `·` where a `·` belongs, or `â`/`â€"` where a `—`/`→` belongs, that is
      corruption from an earlier run — **fix it, don't reproduce it.** When in
      doubt, use plain ASCII separators (` - `, ` | `) rather than a middot. The
      file is rewritten in full each run, so one clean rewrite ends the cycle.
    - **Move resolved items to `Recently fixed` with the date**, and keep the last
      ~10. Delete older ones; this is a work list, not an archive.
    - **Only genuine, actionable findings.** Same bar as the diff: if a human
      can't act on it, it doesn't belong here.
    - If everything is clear, say so in one line and keep the `Recently fixed`
      section. Don't invent work.
  7. Notify — every day, even when nothing changed (as long as a target was set). This skill is deliberately not silent-on-no-signal; the daily score line is the point. Keep the unchanged case to a few lines and expand only when something moved:

    SEO — example.com 94 (18 pages) · blog.example.com 92 (11 pages)
    
    Regressed
    · example.com /docs — meta description removed (was 148 chars, now absent)
      <meta name="description" content="How the product works: architecture,
      the self-healing loop, persistent memory.">  (118 chars)
    
    Weakest pages
    · example.com /pricing 84 · /contact 88 — both short on body copy
    
    Top open fix
    · example.com /docs title 63 chars → trim to ≤60:
      "Docs: Skills, Memory, Self-Healing, Chains"  (42 chars)
    
    11 other open fixes · full list in [FIXES.md](…)

    With two sites and ~30 pages the score line is the headline, not a list of pages: one line per site, then only what moved. Name the site on every page reference (example.com /docs) — a bare /docs is ambiguous once more than one site is audited. Include the "weakest pages" line only when a page sits clearly below its site's average.

    Send it with ./notify -f <file>.md (multi-line always goes through -f).

    Write that body under /tmp/, never memory/ or output/. Those two are preserved by the read-only guard and committed by the post-run step, so a scratch notify body written there ships as junk on main, not a cosmetic slip. This skill has no rm, so it cannot clean up after itself; the fix is to never write it there:

    bash
    cat > /tmp/seo-notify.md <<'NOTIFY'
    <the digest markdown>
    NOTIFY
    ./notify -f /tmp/seo-notify.md

    The only files this skill is meant to persist are the Step 5 snapshot (memory/seo-audit/<STAMP>.json) and the Step 6 memory/seo-audit/FIXES.md.

    Any file you point at must be a clickable link, never a bare path. Telegram delivery runs parse_mode=HTML and scripts/notify_format.py converts [text](url) into <a href="url">text</a> — but a bare memory/seo-audit/FIXES.md passes through as dead plain text that nobody can open from their phone. Build the URL from the run's own environment so it stays correct in any fork:

    bash
    FIXES_URL="${GITHUB_SERVER_URL:-https://github.com}/${GITHUB_REPOSITORY}/blob/main/memory/seo-audit/FIXES.md"

    then write the pointer as [FIXES.md]($FIXES_URL). Same rule for the audited pages — [docs](https://www.example.com/docs) rather than a naked path.

    Detail rules — the difference between a message that gets acted on and one that gets skimmed:

    • Show the current value and the replacement, both with character counts. Never write "consider shortening" when you can write the shorter string.
    • One concrete fix in the message, the highest-impact open item. The rest lives in FIXES.md; the notification points there with a count. A wall of five findings every morning gets muted.
    • Name the page and the element, not just the check (docs → <head> meta description, not meta_description).
    • Say what the reader loses, in plain terms — "Google cuts the snippet at ~160 chars" beats "suboptimal length".
    • references/checklist.md has the target and a copy-paste pattern for every check.
  8. Log it. End your final output with the log record (the guard writes it to memory/logs/${today}.md under ### seo-audit; don't append it yourself): the per-URL scores, what regressed, what was fixed, and any URL that failed to fetch. If ${var} was empty, log a single SEO_NO_TARGET line and nothing else.

Show full SKILL.md (488 more words)Show less

Prioritizing what to report

Order fixes by impact, not by the order they appear in the findings:

  • Fix first (fail): a page that failed to fetch, a page set to noindex that should rank (the indexable check — a page in the sitemap that is also noindex is a self-contradiction and a silent, total loss of that page), missing title, missing meta description, no H1, no viewport, not HTTPS, broken links, failing Core Web Vitals.
  • Then (warn): duplicate titles or descriptions, canonicals pointing elsewhere, sitemap URLs that noindex/redirect (sitemap_health), pages linked but missing from the sitemap, mixed (http) content on an https page, images missing width/height, incomplete Article schema, length tuning, multiple H1s, missing alt text, no canonical, thin content, incomplete Open Graph.
  • Nice to have (info): legacy image formats (WebP/AVIF), structured-data opportunities, social cards.

A cross-page finding usually outranks a single page's warning: one duplicate title costs two pages at once, and a canonical pointing away can remove a page from search entirely. Likewise weight by reach — the same warning on 18 of 18 pages is a bigger deal than a worse warning on one blog post.

Cap the notification at the top 5 items. Everything else lives in the JSON and the log — a daily message nobody finishes reading is a muted message.

Interpreting the score

The score is a rough health signal (pass = full credit, warn = half, fail = none; info is not scored), impact-weighted — a missing <title>, a noindex, or no HTTPS costs far more than a missing twitter:card (weights live in WEIGHTS in the auditor). It is not a Google ranking. Treat it as a before/after yardstick, not a promise about SERP position. Never claim a change guarantees higher rankings — outcomes depend on competition, content quality, and off-page factors this skill doesn't measure.

Limits

  • One site per script run. The workflow above loops over ${var}.
  • Discovery is only as good as the sitemap. A page absent from sitemap.xml and unlinked from the pages that are in it will not be audited. The sitemap_coverage finding catches the linked-but-unlisted case; nothing catches a page that is both unlisted and unlinked.
  • --max truncates the tail. The cap keeps the homepage and shallow pages and drops the deepest paths (usually dated posts). When discovery.truncated is true, say so — a score over 50 of 200 pages is not the site's score.
  • sitemap_coverage is skipped entirely on a truncated or crawl-discovered run; it would otherwise report the skill's own cap as missing pages.
  • Sees the initial HTML response, not JavaScript-rendered content — the scanner reads raw markup. For heavy SPAs, findings reflect the pre-hydration DOM and Google may render more; flag server-side rendering or prerendering if key content is missing from the raw HTML. Worth stating the first time a target looks SPA-shaped, then not repeating it daily.
  • On-page and technical only. No keyword research, rank tracking, or backlinks.
  • Never edit the audited site. This skill reports; a human decides what ships.

© aeonfun, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (references) in skills/seo-audit of aeonfun/aeon.

  • SKILL.md
  • references/checklist.md

Open the folder on GitHubat commit c0cb7c4

Compare with similar skills

Daily Site SEO Audit next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Daily Site SEO Audit compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Daily Site SEO Audit this skillaeonfun/aeon767—~5.1kAutomated safety check: PassMIT
Site ArchitectureAvdLee/RocketSimApp80311 repos~3.3kAutomated safety check: PassCustom licence
SEO Drift MonitorAgriciDaniel/claude-seo18k1 repos~1.9kAutomated safety check: PassMIT
SEO Optimizerailabs-393/ai-labs-claude-skills4541 repos~3.2kAutomated safety check: PassMIT
SEO Auditfreekmurze/dotfiles1k34 repos~2.2kAutomated safety check: PassNone
Universal SEO AnalysisAgriciDaniel/claude-seo18k—~4.9kAutomated safety check: PassMIT

Similar skills

  • Site Architecture

    AvdLee/RocketSimApp

    When the user wants to plan, map, or restructure their website's page hierarchy, navigation, URL structure, or internal linking.

    803 GitHub starsUsed in 11 repos~3.3k tokens
    Marketing & SEOAuto-check passed
  • SEO Drift Monitor

    AgriciDaniel/claude-seo

    Captures baselines of a page's SEO-critical elements, compares later snapshots against them and flags regressions by severity, like version control for on-page SEO.

    18k GitHub starsUsed in 1 repo~1.9k tokens
    Marketing & SEOAuto-check passed
  • SEO Optimizer

    ailabs-393/ai-labs-claude-skills

    This skill should be used when analyzing HTML/CSS websites for SEO optimization, fixing SEO issues, generating SEO reports, or implementing SEO best practices.

    454 GitHub starsUsed in 1 repo~3.2k tokens
    Marketing & SEOAuto-check passed
  • SEO Audit

    freekmurze/dotfiles

    When the user wants to audit, review, or diagnose SEO issues on their site.

    1k GitHub starsUsed in 34 repos~2.2k tokens
    Marketing & SEOAuto-check passed
  • Universal SEO Analysis

    AgriciDaniel/claude-seo

    Hub for site-wide SEO work: audits, technical checks, schema, content quality, local, hreflang and AI-search readiness, run through slash commands.

    18k GitHub stars~4.9k tokensUpdated 4 days ago
    Marketing & SEOAuto-check passed
  • Crawl4AI SEO Site Crawler

    artwist-polyakov/polyakov-claude-skills

    Crawls a site with Crawl4AI to audit titles, meta tags, H1s, canonicals, navigation and internal links, and to compare landing pages and competitor sites.

    206 GitHub stars~1.7k tokensUpdated 15 days ago
    Marketing & SEOAuto-check passed

More from aeonfun/aeon

All 82 skills in this repo
  • Browses open tasks on the TaskMarket agent-worker market and, with explicit operator approval, creates tasks, tracks submissions and submits finished work.

    767 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed
  • Sets up and manages an Aeon agent instance that runs skills on a schedule through GitHub Actions: starting, rescheduling, debugging, editing skills and mining chat history.

    767 GitHub stars~9k tokensUpdated yesterday
    Auto-check: warnings
  • Reads a Base Account's address, portfolio and transaction history through the Base MCP server, and stays strictly read-only in unattended Aeon runs, reporting only changes.

    767 GitHub stars~2.5k tokensUpdated yesterday
    Auto-check passed
  • Action Converter

    aeonfun/aeon

    5 concrete real-life actions, leverage-scored against open loops with specificity and anti-fluff gates

    767 GitHub stars~2.5k tokensUpdated yesterday
    Auto-check passed
  • Aeon Config Doctor

    aeonfun/aeon

    Static linter for an Aeon instance's configuration that catches silent failures such as unquoted schedules, duplicate keys, unconfigured skills and broken MCP references.

    767 GitHub stars~3.3k tokensUpdated yesterday
    Auto-check passed
  • Auto Merge

    aeonfun/aeon

    Automatically merge open PRs that have passing CI, no blocking reviews, and no conflicts

    767 GitHub stars~2.6k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Daily Site SEO Audit

What does Daily Site SEO Audit do?

Audits every page of a site each day from its sitemap, scores on-page and technical SEO, checks duplicates across pages and reports what changed since the last run. The skill takes one or more site origins and audits each whole site.xml, following sitemap indexes and respecting Disallow rules for all crawlers, and falls back to a one-hop crawl of homepage links when no sitemap exists.

When should I use Daily Site SEO Audit?

Daily Site SEO Audit fits situations like: running a recurring SEO health check across an entire site; finding duplicate titles or meta descriptions between pages; catching canonical or sitemap problems after a deploy; seeing which pages regressed since yesterday's audit.

How do I install Daily Site SEO Audit in Claude Code?

Run `npx skills add aeonfun/aeon --skill seo-audit -a claude-code`. Or copy the skill folder (skills/seo-audit in aeonfun/aeon) into .claude/skills/seo-audit in your project. Claude Code loads it when a task matches its description.

How do I install Daily Site SEO Audit in Codex?

Run `npx skills add aeonfun/aeon --skill seo-audit -a codex`. Or copy the skill folder (skills/seo-audit in aeonfun/aeon) into .agents/skills/seo-audit in your project. Codex loads it when a task matches its description.

Can I use Daily Site SEO Audit in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add aeonfun/aeon --skill seo-audit -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/seo-audit, .gemini/skills/seo-audit, .github/skills/seo-audit and .opencode/skills/seo-audit in your project.

What does Daily Site SEO Audit need to run?

Going by SKILL.md and its folder, Daily Site SEO Audit needs the command-line tools its instructions call (node) and credentials named PAGESPEED_API_KEY. Our summary lists: Node.js to run the dependency-free auditor script; The origin URL of each site to audit.

Does Daily Site SEO Audit access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Daily Site SEO Audit safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Daily Site SEO Audit use?

Daily Site SEO Audit is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Daily Site SEO Audit use?

About 5.1k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.7k tokens, read only when the agent opens those files.

What are the alternatives to Daily Site SEO Audit?

Skills that share tags, products or a category with Daily Site SEO Audit: Site Architecture (AvdLee/RocketSimApp, 803 stars), SEO Drift Monitor (AgriciDaniel/claude-seo, 18k stars), SEO Optimizer (ailabs-393/ai-labs-claude-skills, 454 stars) and SEO Audit (freekmurze/dotfiles, 1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Daily Site SEO Audit?

aeonfun (a GitHub organization) maintains it in aeonfun/aeon, which has 767 GitHub stars. The repository holds 82 skills in this directory. The repository was last updated on October 8, 2026.

Source: aeonfun/aeon on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.