FIG. 04 — Case study
zemITis
A client-rendered React SPA rebuilt as a static Astro site: every page pre-rendered HTML, SEO guarded by a build gate, leads brought in by three price calculators.
- Client
- Zemitis Advisory Kft. — infosec consultancy
- Year
- 2025–26
- Role
- SPA rebuild + SEO/AEO machinery + lead calculators
- Status
- Live Visit site ↗
- Stack
- AstroReact islandsGTMJSON-LDCoolify
The challenge
Search engines saw an empty page.
Zemitis Advisory is an information-security consultancy: NIS2 compliance, ISO 27001, outsourced security officers — exactly the topics clients research in search engines and, increasingly, AI assistants. The previous site, however, ran as a client-rendered React/Babel SPA export: the browser assembled the content, and crawlers saw practically none of it.
So the rebuild had two jobs. One: make the content genuinely readable — for Google and for AI search alike. Two: turn visitors into leads, because nobody buys a compliance service on impulse — first they want to know what it costs.
The system — 01 · Foundation
From SPA to static HTML
The site was rebuilt on Astro 5: every page is produced at build time as finished, pre-rendered HTML, with no JavaScript by default — React runs only as islands where real interaction is needed. What used to assemble in the browser now arrives from the server, ready.
The rest of the foundation is equally owned: self-hosted fonts, content-hash cache busting, Hetzner + Coolify hosting. A Hungarian-language, light, fast site.
The system — 02 · Findability
Content written for machines too
Structured data runs through the whole site: Organization, Service, FAQPage, BreadcrumbList and BlogPosting JSON-LD schemas describe the services to search engines. The blog is an Astro content collection — every post passes through the same schema and SEO layer.
AI search got its own layer: an AI-crawler-friendly robots.txt and an llms.txt generated dynamically at build time, so language models can consume the content as well. OG images are also generated per page at build time, with astro-og-canvas.
The system — 03 · Leads
A price calculator as lead magnet
Three service landing pages, each with its own interactive price calculator: NIS2 compliance, an outsourced information-security officer, and ISO 27001. The calculators run as React islands inside the static pages — the visitor gets a realistic price range instantly, the client gets a warmed-up lead.
The lead path is measured end to end: the calculators store UTM and gclid attribution and push a generate_lead event to the dataLayer; forms run on Formspark; tracking goes through GTM with Consent Mode v2 and a per-category cookie banner — everything denied by default.
The system — 04 · Build gate
SEO that cannot break
The weakest link in SEO is the human who forgets a meta description once. Here quality is guarded not by a checklist but by the build itself: every deploy passes through this chain, and if anything is missing, the site does not build.
-
ASTRO BUILD
Every page becomes HTML
Astro renders every route to finished HTML at build time. Hydration JavaScript ships only for the React islands — not a byte anywhere else.
✓ all routes pre-rendered
-
CHECK-SEO.MJS
The gate
A custom script combs the generated pages: a missing title, description, canonical or OG tag fails the build. Broken SEO physically cannot reach production.
✓ SEO check — 0 violations
-
ASTRO-OG-CANVAS
An OG image per page
Every page gets its own share image at build time — link previews that never need manual upkeep.
✓ OG images generated
-
LLMS.TXT
What the machines read
The build regenerates llms.txt from the current content, next to the AI-crawler-friendly robots.txt — AI search always gets a fresh map of the site.
✓ llms.txt refreshed
-
COOLIFY
Deploy with content hashes
Assets ship as content-hashed files, so cache busting is automatic. The finished build runs on Hetzner, under Coolify.
✓ deploy done — hashed assets
Results
SEO here is not a checklist — it's a build condition.
- pages shipped as pre-rendered HTML
- 100%
- JS by default — islands only where needed
- 0
- price calculators, each a lead source
- 3
- JSON-LD schema types
- 6+
- build gate — an SEO violation fails the build
- 1
This list is about the system built — traffic and lead figures belong to the client and are not public.