SEO & GEO

A site that search engines and AI answer engines read well — how lidgeai.com is built

How this site is built for SEO and GEO: reciprocal hreflang, JSON-LD, llms.txt, answer-first paragraphs and a build-time checker.

Author Byungjun KimPublished 2 min read

lidgeai.com is a static site built with Astro 7. Every page has a Korean and English twin that point at each other with hreflang; tool pages carry SoftwareApplication and FAQPage structured data, posts carry BlogPosting. Search and AI crawlers are both allowed, and llms.txt provides a summary of the site. A checker verifies these rules right after each build.

Start with the answer

Generative answer engines are good at lifting “the paragraph that answers the question.” So every tool page and post opens with a 40–60 word summary — the box at the top of this post is one. Detail follows, and an FAQ closes the page.

Two languages, one pair

Korean pages live at /, English at /en/. Every page links to itself, its other-language twin and the default (x-default) with hreflang. Translation pairs are keyed by file name — posts/ko/abc.md and posts/en/abc.md are one pair — so a link pointing only one way is hard to create by accident.

Structured data

Page JSON-LD
Every page Organization
Every page except home BreadcrumbList
Home WebSite
Tool pages SoftwareApplication, FAQPage
Posts BlogPosting, FAQPage (when there are questions)

Fields without real data, such as ratings or reviews, are left out.

Crawlers and llms.txt

robots.txt explicitly allows AI crawlers such as GPTBot, ClaudeBot and PerplexityBot alongside general crawlers, and points to the sitemap. llms.txt holds a one-line description of the site and lists of tools and posts; llms-full.txt holds the full English text. llms.txt is not a standard search engines require, but it costs almost nothing and helps an agent understand the site quickly.

Numbers at build time, as floors

GitHub stars and npm downloads on the tool cards are fetched from the APIs at build time and shown as floors, like “16,000+”. If an API fails, the build uses a snapshot committed to the repository and labels it as a snapshot on the page. An inflated number, once caught, discounts everything else.

Rules are enforced by a checker

Rules kept only in documents drift. So after each build a script reads every page and checks:

  • <html lang> matches the path language, and there is exactly one <h1>
  • the title is 60 characters or fewer, and the description length is sensible
  • the canonical points exactly at the page’s own address
  • all three hreflang links exist, their targets exist, and they point back
  • every JSON-LD block parses
  • robots.txt, llms.txt, RSS and the sitemap exist

If anything fails, the build fails. We also broke one hreflang on purpose to confirm the checker catches it.

Performance

There is scroll motion and a card animation, but the largest contentful paint is un-animated hero text, and the card art is not painted until the deck is drawn. On a local preview, mobile Lighthouse scored the home page 99 for performance, 100 for accessibility, best practices and SEO, with zero layout shift. The motion effects come from the design-isms catalog, adapted to this site’s tone, and they stop when reduced motion is on.

FAQ

How is GEO different from SEO?

SEO is about ranking in search results; GEO is about being cited inside generated answers from tools like ChatGPT or Perplexity. The foundation is shared — fast, clearly structured pages help both.

Is llms.txt required?

It is not a standard search engines require. It costs almost nothing, so we keep it as a summary AI agents can use when they read the site.

Where do these checks run?

After every build, scripts/verify-dist.mjs reads every page and fails the build if anything is off.