# Så bygger vi coreai.no synlig för sök, svarsmotorer och AI-agenter

SEO, AEO och agent-vänlighet är inbyggt i coreAI:s hemsida som tre lager i samma respons: en central SEO-byggare producerar head-taggar och JSON-LD, en `.md`-yta serverar samma innehåll som ren markdown till AI-bottar, och ett eget sitemap-kommando håller bägge delar uppdaterade vid varje omindexering. Alla tre lagren läser från samma markdown-dokument – inget är bolt-on.

## Vad vi hämtar från befintliga paket

Tre paket täcker det grundläggande, så att vi slipper underhålla det själva:

- `prezet/prezet` – markdown-CMS som indexerar en lokaliserad content-mapp till en SQLite-fil. Varje rubrik, ingress och FAQ-post är en markdown-fil, och innehållet hämtas via Prezets query-API.
- `spatie/laravel-markdown-response` – global URL-rewrite-middleware som skalar `.md` från en URL och förhandlar `text/markdown` mot `Accept`-headern. Vi får agent-vänliga URL:er utan att duplicera rutter.
- `spatie/laravel-sitemap` – primitiver för att bygga sitemap-XML och ett sitemap-index. Vi orkestrerar vad som hamnar i det.

Inget av dem hanterar JSON-LD eller AEO – det är där egna komponenter tar över.

## Vad vi har byggt själva

Fem byggstenar, ett jobb var:

- En SEO-byggare som varje controller använder för att producera en `seo`-view-variabel. Den sätter sidtitel med varumärkessuffix, slår av och på frivilliga scheman (FAQ, brödsmulor), och räknar ut canonical och hreflang utifrån listan över stödda lokaler.
- Fem schema.org-byggare – Organization, WebSite, FAQPage, BreadcrumbList och Article – var och en en ren klass med en build-metod som returnerar JSON-LD som associativ array. Testbart i isolation och identiskt över sidor.
- En central head-partial som är enda stället i kodbasen där `<title>`, `<meta>`, `<link rel="canonical">`, hreflang-alternativ, OG-taggar och `<script type="application/ld+json">` renderas. Sidor kan inte skriva sin egen head.
- En markdown-driver med en assembler per redaktionell sida – serverar markdown 1:1 från källorna när en agent ber om det. Vi konverterar aldrig den renderade HTML:en tillbaka till markdown; vi läser samma `.md`-filer som Blade-mallarna, så agenten ser exakt det författaren skrev.
- `/llms.txt` och `/llms-full.txt` – ett index över marknadsföringssidorna plus de 20 senaste artiklarna, och alla sidor samlade i ett dokument. Båda är `noindex` och på engelska.

Ett eget sitemap-kommando orkestrerar XML:en till tre filer: `sitemap.xml` som index, `sitemap-pages.xml` för marknadsföringssidor × språk, och `sitemap-articles.xml` där en centralt underhållen blocklista filtrerar bort marknadsrelaterade sektioner så att dessa dokument inte läcker in i artikel-sitemappen. Efter varje omindexering åsidosätter vi Prezets sitemap-hook och kör dessutom en cache-flush mot markdown-ytan, så att agenterna aldrig läser föråldrat innehåll.

## AEO: tre regler vi graderar varje text mot

AEO (Answer Engine Optimization) är inte ett bibliotek, det är tre redaktionella regler som är inbyggda i skrivprocessen och dokumenterade i en intern stilguide:

- **Svar först.** Första meningen i varje ingress och varje FAQ-svar slår fast svaret. Ingen uppvärmning, inga retoriska frågor, inget "låt oss titta närmare på…".
- **En H1 per sida.** Hero:n äger den enda `<h1>`. Alla andra sektionsrubriker är `<h2>`, nästade `<h3>`. Hopp i nivå är förbjudet.
- **Inga "klicka här"-CTA:er.** Länktext beskriver målet ("Se prislistan", "Beställ nu"), inte gesten.

Reglerna upprätthålls i kodgranskning, inte av lint – men det är därför svarsmotorer som ChatGPT Search och Perplexity faktiskt klarar att plocka rätt mening från en coreAI-sida.

## Hur AI-agenter ser sidan

Tre triggers byter HTML mot markdown på de redaktionella rutterna: `.md`-suffix i URL:en, `Accept: text/markdown`-headern, och kända bot-user-agents som `GPTBot` och `ClaudeBot`. Alla tre leder till samma respons – källmarkdownen författaren skrev, inte en konvertering av den renderade HTML:en. Transaktionella rutter (`/order`, `/contact`) hålls utanför middlewaren, så `/order.md` returnerar vanlig HTML.

Vill du se det själv? [Hämta den här artikeln som markdown](https://coreai.no/articles/seo-aeo-and-agent-visibility.md) – samma URL, bara med `.md` på slutet. Det är exakt den respons `GPTBot` och `ClaudeBot` får när de besöker `/articles/seo-aeo-and-agent-visibility`.

Resultatet är att samma innehåll publiceras till människor, sökmotorer och AI-agenter utan duplicering: författaren skriver en markdown, och tre ytor levererar den där mottagaren letar.