Skip to content

SEO + GEO Improvements — Automated (Claude-executable)

Date: 2026-04-10 Scope: avelia-health.com website Companion doc: 2026-04-10-seo-geo-manual.md — things you (the human) need to do outside the codebase

All items below can be implemented directly by Claude with no external accounts, credentials, or off-site actions required. They are grouped by priority and effort.


PRIORITY 1 — Quick wins (<1 day total)

1.1 Preconnect to CMS origin

Why: Saves ~100-300ms on first content fetch by starting DNS + TLS handshake early. Files: src/layouts/BaseLayout.astroChange: Add to <head>:

html
<link rel="preconnect" href="https://cms.avelia-health.com" crossorigin>
<link rel="dns-prefetch" href="https://cms.avelia-health.com">

Effort: 5 min


Why: Near-instant page transitions on hover/viewport entry. Files: astro.config.mjsChange: Add prefetch config:

js
prefetch: {
  prefetchAll: true,
  defaultStrategy: 'viewport',
}

Effort: 5 min


1.3 FAQPage JSON-LD on privacy pages

Why: Google shows FAQ-rich results in SERPs and AI Overviews. LLMs prefer to cite FAQ-structured answers. Files:

  • src/pages/[lang]/privacy/zero-knowledge.astro
  • src/pages/[lang]/privacy/security.astro
  • src/pages/[lang]/privacy/safe-mode.astro

Change: Add a second JSON-LD object in each page's jsonLd array containing FAQPage with 3–5 questions extracted from the existing step cards. Example for zero-knowledge:

json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Can Avelia read my data?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. Avelia uses zero-knowledge encryption: your phone generates a unique key on account creation that never leaves your device. All data is encrypted before reaching our servers; we store only ciphertext and cannot decrypt it."
      }
    }
  ]
}

Questions should come from i18n to support both locales. Effort: 2 hours


1.4 Enrich Organization schema

Why: LLMs use sameAs, knowsAbout, founder, and foundingLocation for entity disambiguation. Files: src/pages/[lang]/index.astro (the Organization JSON-LD block) Change: Expand the current Organization block to include:

  • legalName, alternateName
  • founder (Person with jobTitle, sameAs → LinkedIn URL, once available)
  • foundingLocation (Place with PostalAddress)
  • sameAs array with social profile URLs (see manual doc — we'll start with empty array and fill as URLs become available)
  • knowsAbout — array of topics Avelia covers
  • areaServed — ISO country codes

Note: Some values depend on data from the manual doc (social URLs, legal name). Claude will implement the structure and leave placeholders with clear TODO comments where data is needed. Effort: 30 min


1.5 Pricing: multi-tier schema

Why: Currently offers only mentions the free tier. LLMs answering "how much does Avelia cost" miss Light and Premium. Files: src/pages/[lang]/index.astroChange: Turn offers into an array of 3 Offer objects (Free, Light 2,99€, Premium 8,99€), each with price, priceCurrency, name, billingDuration (P1M or P1Y). Effort: 15 min


1.6 llms.txt enhancement

Why: Currently 30 lines; can be much richer without bloat. Files: public/llms.txtChanges:

  • Add "Last updated: YYYY-MM-DD" header
  • Add "Key technical facts" section with specific numbers (encryption algorithms, jurisdictions, dates)
  • Add "What Avelia is not" section for disambiguation (not telehealth, not AI prediction, not data-monetised)
  • Cross-reference /llms-full.txt (see 1.7) Effort: 20 min

1.7 Create llms-full.txt

Why: Long-form markdown for LLM crawlers that want deep context. Follows the llms.txt spec. Files: public/llms-full.txt (new) Contents: ~1,500 words covering:

  • Product overview
  • The 7 life stages with brief descriptions
  • Privacy architecture (zero-knowledge, encryption algorithms, Safe Mode)
  • Pricing tiers with exact prices
  • Team and medical review policy
  • FAQ block (10+ Q&A)
  • "Not what we are" disambiguation

Everything already exists in scattered form (product spec, privacy pages, llms.txt). This consolidates it. Effort: 2 hours


1.8 robots.txt polish

Why: Explicit disallows prevent accidental indexing of utility routes. Files: public/robots.txtChanges:

  • Add Disallow: /api/
  • Add Disallow: /*/confirm
  • Add explicit Allow: /sitemap-index.xmlEffort: 5 min

PRIORITY 2 — Medium effort (~1 day each)

2.1 Image optimisation pipeline

Why: Current <img> tags have no width/height (CLS risk) and no WebP (LCP risk). Both directly affect Core Web Vitals, which affect Google rankings.

Sub-tasks:

  1. Extend fileUrl() in src/lib/cms.ts to return { url, width, height, mime } by reading Cockpit's image metadata endpoint.
  2. Update src/pages/[lang]/blog/[slug].astro to use a <picture> element with:
    • srcset for 1x/2x densities
    • WebP source + JPEG fallback
    • Explicit width/height for CLS prevention
    • fetchpriority="high" on the hero image
  3. Do the same for guides and checklists.
  4. PhoneFrame.astro — replace raw <img> with local Astro Image component if the images are bundled, or add width/height attributes if CMS-served.

Prerequisite: Confirm Cockpit has on-the-fly image resize endpoint (usually /api/assets/image?...). Claude will check and implement accordingly. Effort: 1 day


2.2 Reading time, dateModified, medical reviewer on articles/guides

Why: Freshness signals for YMYL health content. Google actively rewards these for medical topics.

Sub-tasks:

  1. Reading time display — show {reading_time_minutes} min read in article/guide headers (already in CMS model, just not displayed).
  2. dateModified in JSON-LD — add "dateModified": "{updated_at}" to Article and MedicalWebPage schemas.
  3. Visible "Last updated" line — display "Updated {date}" under the title if updated_at > published_at + 30 days.
  4. Medical reviewer block — add a visible "Reviewed by {reviewer}, {credentials} on {reviewDate}" line on guides. Add reviewedBy schema as a Person with jobTitle and affiliation.
  5. timeRequired in JSON-LD — format reading_time_minutes as ISO 8601 duration (PT7M).

Prerequisite: CMS models may need new fields (reviewer_name, reviewer_credentials, reviewer_date, updated_at). Claude can add these to cockpit/models/*.model.json. Effort: 1 day


2.3 Dynamic OG images

Why: Every article currently shares the same static og-default.svg. Custom per-article OG images dramatically increase social click-through.

Sub-tasks:

  1. Check current state of src/pages/api/og.ts. If empty/unused, implement using Satori + @vercel/og.
  2. Template: Avelia logo top-left, article title (Fraunces font), stage emoji + name, cream background.
  3. Wire up in SeoHead.astro: if article has no CMS cover image, use /api/og?title=...&stage=.... Effort: Half a day

2.4 GEO copy rewrite — extractable facts

Why: Current privacy pages are written as flowing prose. LLMs extract specific, self-contained sentences with numbers and named entities, not narrative.

Sub-tasks for each privacy page:

  1. Add a "Technical summary" block at the end with 5–10 bullet points of extractable facts:
    • Encryption: AES-256-GCM
    • Key derivation: Argon2id
    • Key storage: iOS Keychain / Android Keystore
    • Server storage: opaque ciphertext only
    • Data centre location: Germany
    • Jurisdiction: EU law, no CLOUD Act exposure
    • Compliance: GDPR
  2. Rewrite the hero paragraph so the first sentence names the entity ("Avelia uses...") and contains at least one specific technical term.
  3. Add citable numbers throughout: replace "encrypted by default" with "encrypted with AES-256-GCM", etc.

Files: src/i18n/en.ts, src/i18n/de.ts (the privacy sections) Effort: 1 day of careful copywriting


2.5 FAQ blocks on major pages

Why: Visible FAQ HTML + FAQPage schema is the highest-leverage GEO improvement per hour invested.

Pages to add FAQ sections:

  1. Homepage — "Frequently asked questions about Avelia" (5 Qs)
  2. Zero-knowledge page — "How our encryption works" (4 Qs)
  3. Security page — "Data security FAQs" (4 Qs)
  4. Safe Mode page — "Safe Mode FAQs" (5 Qs)
  5. About page — "About Avelia" (3 Qs)

Implementation:

  • Add Q&A arrays to src/i18n/en.ts and src/i18n/de.ts
  • Render as semantic <details><summary> accordions (also accessible)
  • Emit FAQPage JSON-LD matching the visible content (Google penalises mismatches)

Effort: 2 days (writing + schema)


2.6 Quotable glossary page

Why: If Avelia owns the definition of "zero-knowledge cycle tracker", LLMs cite it.

Files:

  • New: src/pages/[lang]/glossary.astro
  • i18n: src/i18n/en.ts, src/i18n/de.ts (new glossary section)

Contents: 20 concise definitions (each <60 words), covering:

  • Zero-knowledge encryption
  • End-to-end encryption (E2EE)
  • Safe Mode / plausible deniability
  • Argon2id, AES-256-GCM, TLS 1.3
  • Natural family planning (NFP)
  • Basal body temperature (BBT)
  • Fertile window, ovulation prediction
  • IVF, ICSI, OPU, ET (IVF lifecycle terms)
  • Symptothermal method
  • Plus Avelia-specific terms (partner linking, selective sharing, shared timeline)

Each entry: dictionary-style first sentence + "Avelia implements X by..." follow-up. Also emit DefinedTermSet schema for the whole page. Effort: 1 day


PRIORITY 3 — Larger infrastructure (1–2 weeks)

3.1 Stage pillar pages

Why: No URLs currently exist for "everything about trying to conceive" etc. Pillar pages consolidate topic authority.

New routes:

  • /en/stages/considering and /de/stages/erwaegen
  • /en/stages/trying and /de/stages/versuchen
  • /en/stages/ivf and /de/stages/ivf
  • /en/stages/pregnant and /de/stages/schwanger
  • /en/stages/birth and /de/stages/geburt
  • /en/stages/first-year and /de/stages/erstes-jahr
  • /en/stages/growing-up and /de/stages/aufwachsen

Template structure:

  1. Hero: stage name, emoji, short intro
  2. "What this stage is about" (evergreen content, ~500 words)
  3. "Common questions" (FAQ block with FAQPage schema)
  4. "Guides for this stage" (dynamic list from CMS)
  5. "Checklists for this stage" (dynamic list from CMS)
  6. "Blog posts" (dynamic list)
  7. "How Avelia helps in this stage" (feature showcase)

Infrastructure:

  • New file: src/pages/[lang]/stages/[stage].astro
  • i18n: add stages section to translations
  • Nav/footer: add "Stages" link to main navigation

Effort: 2 days infrastructure + ongoing content


3.2 Author pages

Why: Google YMYL (Your Money Your Life) ranking explicitly values named, credentialed authors for health content.

New routes:

  • /en/team/[slug] and /de/team/[slug]

Template:

  • Photo (optional)
  • Full name, role, credentials
  • Bio (2-3 paragraphs)
  • List of articles/guides they authored or reviewed
  • Social profile links (LinkedIn, etc.)
  • Person JSON-LD schema with jobTitle, affiliation, sameAs, knowsAbout

Prerequisite: CMS needs a team collection. Claude can add cockpit/models/team.model.json.

Link from:

  • Article/guide article:author meta tag → team page URL
  • JSON-LD author.url → team page URL
  • About page team cards → link to individual pages

Effort: 1 day infrastructure


3.3 Pagination for content indexes

Why: When content exceeds ~20 items, thin paginated pages hurt crawl budget.

Files: src/pages/[lang]/blog/index.astro, src/pages/[lang]/guides/index.astro, src/pages/[lang]/checklists/index.astro

Implementation:

  • Use Astro's built-in getStaticPaths pagination or manual query pagination (given prerender = false)
  • Page numbers in URL: /en/blog/page/2
  • rel="next" / rel="prev" links
  • First page canonical = unpaginated URL
  • Subsequent pages canonical = their own URL

Effort: Half a day (but only needed once content grows)


PRIORITY 4 — Polish

4.1 Citable numbers audit across all pages

Why: Vague claims don't get cited by LLMs. Every vague phrase should be replaced with a specific, verifiable fact.

Files to audit:

  • src/i18n/en.ts and src/i18n/de.ts — entire file, especially:
    • common.siteDescription
    • home.hero, home.science, home.privacy
    • about.*
    • privacy.*

Substitution patterns:

VagueSpecific
"encrypted by default""encrypted with AES-256-GCM before leaving the device"
"European servers""hosted in Frankfurt, Germany under EU jurisdiction"
"built by parents""founded in 2024 in Germany by parents who experienced IVF and early parenthood"
"multiple languages""English and German; more scheduled for 2026"

Effort: Half a day


Why: Signals "reference-quality content" to LLM crawlers. Overkill for most sites, distinctive for Avelia.

Files: New component src/components/CitationFooter.astro, used on privacy pages, about, glossary.

Contents: A small link at the page bottom: "Cite this page" → modal/tooltip showing plain-text, BibTeX, and APA formats with the current page URL and last-updated date.

Effort: 2 hours


4.3 Web manifest expansion

Files: public/manifest.json

Improvements:

  • Verify name, short_name, description are present and accurate
  • Add theme_color matching brand red #e6194c
  • Add background_color matching cream #f7f3ee
  • Add icons array with multiple sizes (192, 256, 384, 512 PNG)
  • Add orientation: "portrait-primary"
  • Add display: "standalone"
  • Add categories: ["health", "lifestyle", "medical"]
  • Add lang and dir

Effort: 30 min (mostly asset generation from existing SVG logo)


4.4 hreflang for content pages

Why: Currently hreflang alternates only work for pages that exist in both locales. Content pages (blog/guides) where only one locale has been published should emit rel="alternate" conditionally.

Files: src/layouts/ContentLayout.astro or each content page

Check: Ensure CMS ready_languages filter drives hreflang output so we don't emit links to 404s.

Effort: 1 hour


Implementation order

If we're executing in sequence, do P1 all at once (~1 day), then P2 items one at a time based on highest ROI:

  1. P1 — all items in a single batch
  2. P2.1 — Image optimisation (biggest Core Web Vitals win)
  3. P2.4 — GEO copy rewrite (biggest GEO win)
  4. P2.5 — FAQ blocks (compounding SEO + GEO)
  5. P2.2 — Reading time + dateModified (freshness for YMYL)
  6. P2.6 — Glossary (citation magnet)
  7. P2.3 — Dynamic OG images (social + preview polish)
  8. P3.1 — Stage pillar pages
  9. P3.2 — Author pages
  10. P4 items — polish pass

Success metrics (for items Claude can measure)

After each batch, we can verify:

  • Schema validity via https://validator.schema.org/ (manual step, but Claude can generate test JSON)
  • FAQ rich result eligibility via https://search.google.com/test/rich-results (manual)
  • Page weight, LCP, CLS via local Lighthouse run (Claude can run npx lighthouse if available)
  • Internal link count — count unique internal URLs per page
  • Extractable fact density — count of specific numbers/named entities per page
  • llms.txt reachability — verify curl https://avelia-health.com/llms.txt returns content

Private by design.