Install
$ agentstack add skill-gunheeaug-web-seo-aeo-geo-google-naver-skill-web-seo-aeo-geo-google-naver-skill ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Web SEO + AEO + GEO — Google + Naver (Next.js)
Implement production search indexing (SEO), answer surfaces (AEO), and LLM citability (GEO) end-to-end: code, env instructions, build verification, and console handoff. Work autonomously after discovery.
Terminology
| Term | Meaning | Examples | |------|---------|----------| | SEO | Classic search indexing & ranking | sitemap, meta tags, GSC, Naver | | AEO | Answer Engine Optimization | Google AI Overviews, featured snippets, FAQ rich results | | GEO | Generative Engine Optimization | ChatGPT, Perplexity, Gemini citing your pages |
SEO is the foundation. AEO/GEO layers structured facts + crawlable HTML so machines can quote you accurately.
When to Use
- User deploys a Next.js web app and wants search indexing
- User mentions Google Search Console, Naver Search Advisor (서치어드바이저), sitemap, robots, JSON-LD
- User wants FAQ pages, review schema, AI-friendly entity pages, dynamic OG
- User hit Naver URL inspection warnings (description > 80 chars, og:description mismatch)
When NOT to use: non-web projects, audit-only with no code changes requested
Done Criteria
Google (SEO)
- [ ]
metadata.verification.googlefrom env - [ ]
app/sitemap.ts— all public indexable URLs, https, valid XML - [ ]
app/robots.ts— allow/, disallow private routes (/admin,/api/, etc.) - [ ] Per-page metadata: title, description, canonical, openGraph, twitter
- [ ] JSON-LD on home + detail pages (WebSite, page-appropriate types)
- [ ] SSR/SSG HTML for indexable routes (not SPA-only shells)
- [ ] Private routes:
noindex
Naver (SEO)
- [ ]
naver-site-verificationinmetadata.verification.other(or HTML file for subdomain-only sites) - [ ] Every indexable page:
description===openGraph.description===twitter.description - [ ] Every indexable page: description ≤ 80 chars (CJK-aware: count string length)
- [ ] Every indexable page: unique description (no site-wide duplicate)
- [ ] Site registered on https (not http)
- [ ] Sitemap submittable at Naver: 요청 → 사이트맵 제출
AEO + GEO
- [ ] SSR entity pages — each indexable place/item has
/entity/[id]with H1, address, facts, internal links (not?id=only) - [ ] FAQ route
/faq— visible Q&A matchesFAQPageJSON-LD exactly - [ ] Organization JSON-LD on home (brand entity)
- [ ] BreadcrumbList JSON-LD where breadcrumbs render
- [ ] Restaurant/LocalBusiness JSON-LD on detail pages: name, url, address, geo, telephone, sameAs, aggregateRating when available
- [ ] Review JSON-LD — user comments with
reviewBodyrendered in HTML; max ~10 in schema; no fake reviewRating unless you store per-review stars - [ ] Dynamic OG —
opengraph-image.tsxfor home/detail; API route for share links with query params (e.g. shared lists) - [ ] One canonical URL per entity (multi-domain: pick primary; aliases canonical-point or 301)
- [ ] Host-aware sitemap when multiple domains serve the same app
Copy separation (critical)
| Layer | Length | Purpose | |-------|--------|---------| | meta / OG / Twitter | ≤ 80 chars | Naver URL inspection | | JSON-LD / body SEO text | longer OK | Google + AEO/GEO richness |
Reference: https://searchadvisor.naver.com/guide/markup-content
Step 0 — Discovery
- Read project rules (
AGENTS.md, etc.) andapp/layout.tsx - Detect stack: Next.js App Router, deployment target (Vercel, etc.), data source
- Identify indexable routes vs noindex routes
- Resolve production domain(s) and canonical primary per product/locale
- Check existing verification env vars (do not invent codes):
NEXT_PUBLIC_GOOGLE_SITE_VERIFICATIONNEXT_PUBLIC_NAVER_SITE_VERIFICATION
- Run baseline
npm run buildif feasible - Brief plan (SEO → crawlable pages → AEO/GEO schema → OG), then implement
Ask user only when blocked: missing domain, missing page types, or verification codes needed for live check
Step 1 — Infrastructure (SEO)
1A. lib/naver-markup.ts
Short copy for meta + OG only. No import from lib/seo.ts (avoid circular deps).
export const NAVER_DESC_MAX = 80;
export function naverClamp(text: string, max = NAVER_DESC_MAX): string {
const trimmed = text.trim().replace(/\s+/g, " ");
if (trimmed.length ` + `` Q&A on page
- `FAQPage` JSON-LD — **same questions and answers** as visible content
- Naver: FAQ meta description ≤ 80 chars, unique
- Optional: per-locale FAQ (ko for Korea apps, en for international)
### 4B. Entity JSON-LD (detail pages)
**Restaurant / LocalBusiness** (adapt type to project):
- `name`, `url`, `description` (long copy OK)
- `address`, `geo`, `telephone`, `sameAs` (only real data)
- `aggregateRating` only when you have rating + count
- `image` from entity photo URLs
**Home:**
- `WebSite` + `SearchAction` if site search exists
- `Organization` — name, url, logo
**Navigation:**
- `BreadcrumbList` matching visible breadcrumb links
### 4C. Review schema (UGC)
```ts
function reviewJsonLd(
comments: { body: string | null; author_name: string | null; created_at: string }[],
defaultAuthor: string,
) {
return comments
.filter((c) => c.body?.trim())
.slice(0, 10)
.map((c) => ({
"@type": "Review",
reviewBody: c.body!.trim(),
author: { "@type": "Person", name: c.author_name?.trim() || defaultAuthor },
datePublished: c.created_at.slice(0, 10),
}));
}
Embed as Restaurant.review[]. Rule: if it's in JSON-LD, the same text must appear in SSR HTML.
4D. Dynamic Open Graph
app/opengraph-image.tsx— brand card (home)app/[entity]/[id]/opengraph-image.tsx— fetch entity; show name + subtitle- Share URLs with query params →
app/api/og/.../route.tsreturningImageResponse - Set
export const dynamic = "force-dynamic"on OG routes that fetch fonts/data at runtime - Load at least one font for
ImageResponse(Satori requirement)
In generateMetadata, point openGraph.images to generated OG URL when not using a real entity photo.
4E. Multi-domain canonical
When one codebase serves app.example.com, sub.example.com, otherbrand.net:
- Pick one primary URL per product/locale
- All aliases emit ``
- Sitemap on each host lists only URLs on that host's canonical origin
- GSC: separate property per registrable domain (DNS TXT)
- Naver: register each Korean primary host; HTML file upload OK for subdomains
Step 5 — Environment variables
Instruct user to set in production (never commit values):
NEXT_PUBLIC_SITE_URL=https://your-domain.com
NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION=
NEXT_PUBLIC_NAVER_SITE_VERIFICATION=
Codes come from each console after property registration. Agent wires layout metadata only.
Step 6 — Verify (mandatory)
npm run build
After deploy:
curl -sL "https://YOUR_DOMAIN/" | grep -E 'description|og:description|google-site-verification|naver-site-verification'
curl -sL "https://YOUR_DOMAIN/robots.txt"
curl -sL "https://YOUR_DOMAIN/sitemap.xml" | head -20
curl -sI "https://YOUR_DOMAIN/opengraph-image"
Sample detail + FAQ pages. Rich Results Test on one detail URL with reviews.
Do not claim success without build output or curl evidence.
Step 7 — User handoff
Google Search Console
- Add property (Domain TXT recommended for subdomains)
- Verify (HTML meta tag or DNS)
- 색인 생성 → Sitemaps → primary sitemap URL
- URL inspection: home + one detail +
/faq
Naver Search Advisor
- Register https://YOUR_DOMAIN (NOT http)
- Verify (meta tag or HTML file for subdomain)
- 요청 → 사이트맵 제출
- URL inspection: description ≤ 80, og matches meta
AEO/GEO monitoring (week 1)
- GSC → Performance + Page indexing
- Test FAQ/detail URLs in Rich Results Test
- Share a link in Kakao/iMessage — confirm dynamic OG
- Optional:
llms.txtat site root describing product + key URLs (emerging GEO convention)
Common Mistakes
- FAQ schema ≠ visible page content
- Review schema without SSR review text
- One long description inherited site-wide
- og:description ≠ meta description (Naver fails)
- SPA-only with no crawlable HTML (GEO fails)
- Multiple canonical URLs for same entity across domains
- Hardcode verification tokens in source
- Skip build / skip live verification
Output Format
When finished, provide:
- Summary — SEO + AEO/GEO what was implemented
- Files changed — path + one-line purpose
- Env vars — names only
- Console steps — Google + Naver
- Verification — build + curl + Rich Results (if applicable)
- Follow-up — indexing wait, optional GSC properties for extra domains
Additional Resources
- Code templates: [reference.md](reference.md)
- Trigger examples: [examples.md](examples.md)
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: gunheeaug
- Source: gunheeaug/web-seo-aeo-geo-google-naver-skill
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.