Appearance
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
1.2 Enable Astro link prefetching
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.astrosrc/pages/[lang]/privacy/security.astrosrc/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,alternateNamefounder(Person withjobTitle,sameAs→ LinkedIn URL, once available)foundingLocation(Place with PostalAddress)sameAsarray with social profile URLs (see manual doc — we'll start with empty array and fill as URLs become available)knowsAbout— array of topics Avelia coversareaServed— 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:
- Extend
fileUrl()insrc/lib/cms.tsto return{ url, width, height, mime }by reading Cockpit's image metadata endpoint. - Update
src/pages/[lang]/blog/[slug].astroto use a<picture>element with:srcsetfor 1x/2x densities- WebP source + JPEG fallback
- Explicit
width/heightfor CLS prevention fetchpriority="high"on the hero image
- Do the same for guides and checklists.
PhoneFrame.astro— replace raw<img>with local AstroImagecomponent if the images are bundled, or addwidth/heightattributes 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:
- Reading time display — show
{reading_time_minutes} min readin article/guide headers (already in CMS model, just not displayed). - dateModified in JSON-LD — add
"dateModified": "{updated_at}"to Article and MedicalWebPage schemas. - Visible "Last updated" line — display "Updated {date}" under the title if
updated_at > published_at + 30 days. - Medical reviewer block — add a visible "Reviewed by {reviewer}, {credentials} on {reviewDate}" line on guides. Add
reviewedByschema as aPersonwithjobTitleandaffiliation. timeRequiredin JSON-LD — formatreading_time_minutesas 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:
- Check current state of
src/pages/api/og.ts. If empty/unused, implement using Satori + @vercel/og. - Template: Avelia logo top-left, article title (Fraunces font), stage emoji + name, cream background.
- 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:
- 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
- Rewrite the hero paragraph so the first sentence names the entity ("Avelia uses...") and contains at least one specific technical term.
- 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:
- Homepage — "Frequently asked questions about Avelia" (5 Qs)
- Zero-knowledge page — "How our encryption works" (4 Qs)
- Security page — "Data security FAQs" (4 Qs)
- Safe Mode page — "Safe Mode FAQs" (5 Qs)
- About page — "About Avelia" (3 Qs)
Implementation:
- Add Q&A arrays to
src/i18n/en.tsandsrc/i18n/de.ts - Render as semantic
<details><summary>accordions (also accessible) - Emit
FAQPageJSON-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(newglossarysection)
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/consideringand/de/stages/erwaegen/en/stages/tryingand/de/stages/versuchen/en/stages/ivfand/de/stages/ivf/en/stages/pregnantand/de/stages/schwanger/en/stages/birthand/de/stages/geburt/en/stages/first-yearand/de/stages/erstes-jahr/en/stages/growing-upand/de/stages/aufwachsen
Template structure:
- Hero: stage name, emoji, short intro
- "What this stage is about" (evergreen content, ~500 words)
- "Common questions" (FAQ block with
FAQPageschema) - "Guides for this stage" (dynamic list from CMS)
- "Checklists for this stage" (dynamic list from CMS)
- "Blog posts" (dynamic list)
- "How Avelia helps in this stage" (feature showcase)
Infrastructure:
- New file:
src/pages/[lang]/stages/[stage].astro - i18n: add
stagessection 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.)
PersonJSON-LD schema withjobTitle,affiliation,sameAs,knowsAbout
Prerequisite: CMS needs a team collection. Claude can add cockpit/models/team.model.json.
Link from:
- Article/guide
article:authormeta 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
getStaticPathspagination or manual query pagination (givenprerender = 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.tsandsrc/i18n/de.ts— entire file, especially:common.siteDescriptionhome.hero,home.science,home.privacyabout.*privacy.*
Substitution patterns:
| Vague | Specific |
|---|---|
| "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
4.2 Citation footer
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,descriptionare present and accurate - Add
theme_colormatching brand red#e6194c - Add
background_colormatching cream#f7f3ee - Add
iconsarray with multiple sizes (192, 256, 384, 512 PNG) - Add
orientation: "portrait-primary" - Add
display: "standalone" - Add
categories: ["health", "lifestyle", "medical"] - Add
langanddir
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:
- P1 — all items in a single batch
- P2.1 — Image optimisation (biggest Core Web Vitals win)
- P2.4 — GEO copy rewrite (biggest GEO win)
- P2.5 — FAQ blocks (compounding SEO + GEO)
- P2.2 — Reading time + dateModified (freshness for YMYL)
- P2.6 — Glossary (citation magnet)
- P2.3 — Dynamic OG images (social + preview polish)
- P3.1 — Stage pillar pages
- P3.2 — Author pages
- 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 lighthouseif 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.txtreturns content