seo-audit — Grunnleggende SEO-revisjon
En lettvektig SEO-agentferdighet designet for raske, standard enkeltside SEO-revisjoner. Drevet av OpenClaw. Egnet for førstegangssidesjekker eller når en rask vurdering er nødvendig uten full teknisk dybde.
Når du skal bruke denne ferdigheten
Bruk seo-audit når:
- Brukeren sier: «reviser denne siden», «sjekk SEO», «analyser URL-en min», «rask SEO-sjekk», «hva er galt med siden min»
- Ingen spesifikk dybde er etterspurt — dette er standard inngangspunkt
- Brukeren trenger en rask, lesbar oppsummering snarere enn en omfattende teknisk gjennomgang
Hvis brukeren ønsker mer dybde, oppgrader til seo-audit-full:
Tips: For dype tekniske revisjoner, avansert on-page SEO eller fullstendige rapporter, bruk
seo-audit-full-ferdigheten.
Forventet input
| Input | Obligatorisk | Merknader |
|---|---|---|
| Side-URL | Ja | Siden som skal revideres |
| Rå HTML eller sideinnhold | Valgfritt | Muliggjør mer nøyaktig on-page-analyse |
| GSC / analysedata | Valgfritt | Ikke nødvendig for grunnleggende revisjon |
Hvis bare en URL er oppgitt og ingen kildekode eller crawlerdata er tilgjengelig, oppgi tydelig:
Begrensning: Denne revisjonen er kun basert på synlig sideinnhold og offentlig tilgjengelige signaler. Kildekode, GSC-data, crawl-logger og ytelsesmålinger er ikke tilgjengelige for denne revisjonen.
Output
Produser en Grunnleggende SEO-revisjonsrapport ved å fylle ut malen på assets/report-template.html, og lagre den til en fil — aldri skriv ut rå HTML til terminalen.
Filnavngiving: reports/<hostname>-<slug>-audit.html
https://example.com/blog/best-tools → reports/example-com-blog-best-tools-audit.html
https://example.com/ → reports/example-com-audit.html
Etter lagring, fortell brukeren:
✅ Rapport lagret → reports/example-com-audit.html
Åpne den nå? (ja / nei)
Hvis ja → kjør: open reports/example-com-audit.html
Malplassholdere — fyll ut hver uavhengig:
| Plassholder | Innhold |
|---|---|
{{summary_verdict}} | Én setning: totalt antall kontroller kjørt, hvor mange mislyktes/advarte/bestod |
{{summary_critical_html}} | <li> per kritisk (mislykket) element, eller <li class="summary-empty">Ingen</li> |
{{summary_warnings_html}} | <li> per advarselselement, eller <li class="summary-empty">Ingen</li> |
{{summary_passing_html}} | <li> per bestått kontroll, eller <li class="summary-empty">Ingen</li> |
Skript
Kjør disse skriptene før du skriver noen funn. De sender ut strukturert JSON — bruk JSON-en direkte som bevis; ikke hent de samme URL-ene manuelt på nytt.
Avhengigheter: pip install requests (html-parsing bruker Python stdlib)
# Step 1: site-level checks (robots.txt + sitemap.xml)
python scripts/check-site.py https://example.com
# Step 2: page-level checks (H1, title, meta description, canonical)
python scripts/check-page.py https://example.com
# With primary keyword (recommended — enables H1 keyword presence check)
python scripts/check-page.py https://example.com --keyword "running shoes"
# Optional: fetch raw page HTML for further inspection
python scripts/fetch-page.py https://example.com --output page.html
# Step 3: JSON-LD schema validation
python scripts/check-schema.py https://example.com
# Or from previously fetched HTML (avoids redundant fetch):
python scripts/check-schema.py --file page.html
Hvert skript avslutter med kode 0 (alle bestått/advarsel) eller 1 (noen mislykket/feil).
STRENGT OMFANG — ikke legg til noen kontroll som ikke er oppført nedenfor. Ingen unntak.
Tillatte nettstedsnivåkontroller (i {{site_checks_html}}):
- robots.txt · sitemap.xml · 404-håndtering · URL-kanonisering · i18n / hreflang
Tillatte E-E-A-T-kontroller (i {{eeat_checks_html}}):
- Om oss · Kontakt · Personvernerklæring · Tjenestevilkår · Media/Partnere (bare hvis til stede)
Tillatte sidenivåkontroller (i {{page_checks_html}}), output i nøyaktig denne rekkefølgen:
URL-slug · Tittel-tag · Metabeskrivelse · H1-tag · Canonical-tag · Bilde-alt-tekst · Ordtelling · Nøkkelordplassering · Overskriftsstruktur · Interne lenker · Schema (JSON-LD)
Logikk for bilde-alt-tekst:
- Parse <img>-tagger fra statisk HTML
- Bestått: alle bilder har ikke-tom alt (dekorative bilder med alt="" er OK)
- Advarsel: ethvert innholdsbilde som mangler alt-attributt
- Ubekreftet (status-info): 0 bilder funnet i statisk HTML → sannsynligvis JS-rendret, kan ikke bekrefte
⛔ HARD REGEL — Output KUN kontrollradene definert i report-template.html. Hvis en kontroll ikke er i de tillatte listene ovenfor, IKKE output den — ikke engang hvis du finner problemer. Ingen unntak. Ingen «bonus»-kontroller. Ingen improvisasjon. Malen er den eneste sannhetskilden. Behandle den som en streng hviteliste.
Fortsatt FORBUDT (tilhører seo-audit-full): OG-tagger · Twitter Card · Sosiale tagger · Sidevekt · Core Web Vitals · Robots Meta
Slik bruker du JSON-outputen:
- Map hvert felts
status→pass/warn/fail/errordirekte til rapportens kontrolltabell - Bruk hvert felts
detail-streng som utgangspunkt for Bevis-linjen i funn - Ikke motsi skriptets output med mindre du har ytterligere observerbare bevis
- Skill kontrollgrupper med
<div class="subsection-label">Etikett</div>inne i{{site_checks_html}}:Crawlability·URL Canonicalization·i18n / hreflang·Schema (JSON-LD)og<div class="subsection-label">E-E-A-T-tillitssider</div>før{{eeat_checks_html}}
LLM-gjennomgang — obligatorisk når llm_review_required: true:
Skriptet flagger felt som krever semantisk eller kvalitetsvurdering det ikke kan utføre.
La aldri llm_review_required: true være uløst — gjør alltid en eksplisitt vurderingsavgjørelse.
H1 — utløses når keyword_match == "partial":
h1_text : (from h1.values[0])
keyword : (the --keyword passed to the script)
Judge: Does this H1 semantically cover the keyword's search intent?
- Consider synonyms, natural variants, topic coverage
- yes → downgrade to "pass", note the variant
- no → keep "warn" or upgrade to "fail", explain the gap
Tittel — utløses når keyword_match == "partial" ELLER keyword_position != "start":
title : (from title.value)
keyword : (the --keyword passed)
Judge:
1. Does the title semantically cover the keyword's search intent?
2. Is the title grammatically correct and naturally readable?
3. Keyword position — apply different standards by page type:
- Homepage : Brand + core keyword is correct (e.g. "Acme | AI Workflow Automation")
Do NOT flag brand-first as a problem.
- Inner pages: Core keyword should lead (e.g. "AI Workflow Automation for Teams — Acme")
Flag if keyword is buried mid-title without good reason.
IMPORTANT — do NOT flag these as negatives:
- Years (e.g. "2026") → signal freshness, increase CTR — treat as positive unless
the page is explicitly evergreen content where dating would hurt longevity.
- Numbers (e.g. "5 best", "Top 10", "3 steps") → set clear expectations,
consistently outperform non-numeric titles in CTR — always treat as a plus.
- Specific qualifiers ("Open-Source", "Self-Hosted", "Free") → narrow intent
and attract higher-quality clicks — do not penalize.
URL-slug — utløses når keyword_match != "full" eller is_homepage == false:
slug : (from url_slug.slug)
keyword : (the --keyword passed)
Judge:
1. Does the slug contain the primary keyword or a natural variant?
2. Is the path hierarchy logical? (/category/keyword is ideal)
3. Is it concise and human-readable?
Homepage (is_homepage: true): skip — no judgment needed.
Metabeskrivelse — alltid utløst når innhold er til stede:
meta_description : (from meta_description.value)
keyword : (the --keyword passed)
Judge all four:
1. Complete sentence(s)? (1-2 sentences, no fragments)
2. Mentions a concrete result — not vague fluff?
Good: "Cut design time by 60% with AI-powered templates"
Bad: "The best tool for all your design needs"
3. Keyword or natural synonym used once — not stuffed?
4. More specific than what a typical competitor would write?
IMPORTANT — do NOT flag these as negatives:
- Years (e.g. "2026") → signal freshness, improve CTR for time-sensitive queries.
Only note the year if the page is explicitly evergreen content where dating hurts.
- Numbers (e.g. "5 best", "3 steps") → concrete specificity, strong CTR signal.
- Trailing "and more." → minor style note at most, never a Warning or Fail.
Anbefalt arbeidsflyt
Følg disse trinnene i rekkefølge:
-
Anerkjenn omfang — bekreft at dette er en grunnleggende revisjon; noter eventuelle manglende data
-
Utled primært nøkkelord — hent siden med
fetch-page.py, og bestem deretter det primære nøkkelordet:- Hvis brukeren eksplisitt oppga et nøkkelord → bruk det direkte
- Hvis ikke → les sidens H1, tittel og første avsnitt, og utled det ene mest sannsynlige målnøkkelordfrasen (hva ville en søker skrevet for å finne denne siden?)
- Oppgi det utledede nøkkelordet eksplisitt før du kjører kontroller:
«Utledet primært nøkkelord: open source claude-alternativer»
-
Kjør
check-site.py— parse JSON-outputen for robots, sitemap, 404-håndtering og URL-kanonisering404-sjekk: hent
<origin>/this-page-definitely-does-not-exist-seo-audit-check- Returnerer 404 → Bestått · Returnerer 200 (myk 404) → Mislykket · Returnerer 301 til hjemmesiden → Advarsel
Kontroller av URL-kanonisering (hver er en separat underkontroll):
- HTTP→HTTPS: hent
http://<host>— må 301 tilhttps://. Returnerer 200 → Mislykket. - www-konsistens: hent både
https://www.<host>oghttps://<host>— en må 301 til den andre. Begge returnerer 200 → Advarsel. - Etterfølgende skråstrek: sammenlign URL-en som faktisk serveres mot canonical-taggen på siden. Avvik → Advarsel.
- Canonical match: href i canonical-taggen må nøyaktig samsvare med den endelige URL-en etter alle omdirigeringer. Avvik → Advarsel.
-
E-E-A-T-infrastrukturkontroll — for hver av tillitssidene nedenfor, kontroller to lag:
- Lag 1 — Finnes: hent URL-en, sjekk HTTP-status (200 = finnes, 404/redirect = mangler)
- Lag 2 — Nåbar: hent hjemmeside-HTML, sjekk om bunnteksten eller navigasjonen inneholder en lenke til denne siden
Side Påkrevd Om oss Ja Kontakt Ja Personvernerklæring Ja Tjenestevilkår Ja Media / Partnere Nei — inkluder bare hvis til stede Statusregler:
- Side mangler (ikke 200) → Mislykket
- Side finnes men er ikke lenket i bunntekst/nav → Advarsel
- Side finnes og er lenket i bunntekst/nav → Bestått
- Valgfri side mangler → hopp over, ikke inkluder rad
-
Kjør
check-page.py --keyword «<inferred_keyword>»— parse JSON-outputen for H1, tittel, metabeskrivelse, canonical og URL-slug -
i18n / hreflang-sjekk — kjør bare hvis siden inneholder hreflang-tagger eller
<html lang>antyder flerspråklighet:- Hopp over helt (N/A) hvis ingen hreflang-tagger er funnet og nettstedet ser ut til å være enspråklig
- Hvis hreflang-tagger er til stede, kontroller:
- Gjensidig symmetri: hver referert URL må lenke tilbake til alle andre varianter — enhver ødelagt lenke = Mislykket
- Språkkoder: må være gyldig BCP 47 (f.eks.
zh-CNikkezh,en-USikkeen-us) — feil kode = Advarsel - x-default: bør være til stede for språkvelger- eller fallback-sider — mangler = Advarsel
- html[lang]-attributt: må samsvare med sidens primære hreflang — avvik = Advarsel
- URL-struktur: anbefalt mønster — standardspråk (vanligvis
en) i roten uten prefiks, andre språk under understier (/zh/,/es/)./page(en) +/zh/page+/es/page→ Bestått/en/page+/zh/page→ Advarsel (en-prefiks er redundant, sløser med crawl-dybde)- Flagg bare hvis mønsteret er tydelig inkonsistent eller en er unødvendig prefikset
-
Kjør
check-schema.py— parse JSON-outputen for skjematyper og feltvalideringpython scripts/check-schema.py https://example.com # Or from previously fetched HTML: python scripts/check-schema.py --file page.htmlSkriptet trekker ut JSON-LD-blokker, validerer
@typeog påkrevde felt i henhold til Schema.org-spesifikasjonen.llm_review_required: trueer alltid satt — bekreft atinferred_page_typesamsvarer med faktisk sideinnhold.Sidetype → forventet
@type-referanse:Sidetype Forventet @type Min. påkrevde felt Hjemmeside WebSite + Organization name, url, logo Blogg / Artikkel Article or BlogPosting headline, datePublished, author, image Produkt Product name, image, offers (price, priceCurrency) FAQ FAQPage mainEntity[].name, acceptedAnswer.text Hvordan HowTo name, step[].text Lokal bedrift LocalBusiness name, address, telephone Generisk landingsside — N/A — hopp over, ingen støttet type med bred støtte - Bestått: riktig @type til stede, alle påkrevde felt gyldige, ingen konflikter
- Advarsel: @type til stede men mangler anbefalte felt
- Mislykket: forventet @type mangler helt
- N/A: generisk landingsside — ikke straff
-
Oppsummer funn — hvert funn må følge formatet Bevis / Konsekvens / Løsning
-
Prioriterte handlinger — list opp de 3 viktigste tiltakene med høyest effekt
-
Gjengi rapport — lagre til
reports/<hostname>-<slug>-audit.html, og spør deretter brukeren om å åpne -
Oppgraderingsmelding — hvis problemer utover grunnleggende omfang blir funnet, foreslå
seo-audit-full
Regler for rapportdetaljer
Detaljcellen i kontrolltabeller må følge disse reglene — ingen unntak:
Bestått → én kort frase. Ingen lister, ingen utdypning.
Good: "Valid XML urlset · 104 URLs · referenced in robots.txt."
Bad: "Valid XML urlset with 104 URLs. Correctly referenced in robots.txt.
Blog posts are likely indexed through this sitemap."
Advarsel → én <div class="detail-issue"> med ≤2 kulepunkter. Én <div class="detail-fix"> med løsningen.
Good:
<div class="detail-issue">· Title 48 chars — 2 below minimum. · Year "2026" will date the page.</div>
<div class="detail-fix">Expand to 50–60 chars; remove year if evergreen.</div>
Bad: three-sentence prose explaining what a title tag is and why length matters.
Mislykket → samme som Advarsel. Start med den nøyaktige feilen. Ingen bakgrunnsforklaringer.
IKKE forklar hva en kontroll er, IKKE gjenta informasjon som allerede er synlig i statusmerket, IKKE behandle leseren som ukjent med SEO-grunnleggende.
Obligatorisk funnformat
Hvert viktige funn må følge denne strukturen:
**Finding: [Finding Title]**
- **Evidence:** [What was observed — direct quote, screenshot ref, or measurable data]
- **Impact:** [Why this matters for SEO or UX]
- **Fix:** [Specific, actionable recommendation]
Ikke skriv vage konklusjoner. Hvis beviset er utilstrekkelig, oppgi antakelser eksplisitt.
Oppgraderingsmelding
Inkluder dette på slutten av hver grunnleggende revisjonsrapport:
Ønsker du en dypere analyse? Dette var en grunnleggende SEO-revisjon som dekket signaler på nettstedsnivå og grunnleggende on-page-kontroller. For avansert teknisk SEO, innholdskvalitetsscoring, strukturert dataanalyse og fullstendige crawl-baserte funn, bruk
seo-audit-full-ferdigheten.
Referansefiler
- Detaljert revisjonsomfang og feltdefinisjoner: references/REFERENCE.md
- Endelig HTML-rapportmal: assets/report-template.html
- Nettstedsnivåkontrollskript: scripts/check-site.py
- Sidenivåkontrollskript: scripts/check-page.py
- Råsidehenter: scripts/fetch-page.py
- Skjemavalideringsskript: scripts/check-schema.py


