Skip to content

Tracking: SEO Groundwork + Content Optimization for nicegui.io #151

Description

@evnchn

Drafted by Claude Code working with @evnchn.

Two-layer SEO work split. Groundwork = plumbing primitives (sitemap, robots, canonical, lang, status codes) — agent-shippable, low-risk, narrowly-scoped Falko-friendly PRs. Content optimization = per-page payload work (meta descriptions, OG, Twitter Cards, JSON-LD, examples-as-URLs, two-tier search) — discussed at zauberzeug#5833, depends on groundwork.

This issue tracks state across both. Ship groundwork before any content.


Layer 1: Groundwork (plumbing primitives)

Item State Upstream PR Effort Notes
HTTP status codes (ui.status_code()) ✅ Shipped zauberzeug#5810 (merged 2026-04-01) Split out from zauberzeug#5767 per Falko BLOCKER #1
sitemap.xml endpoint 🟢 Ship-now candidate — (fork has impl in seo-pr-clean-reimpl-2026-04-15) ~30 LoC + tests Couples cleanly with robots.txt
robots.txt endpoint 🟢 Ship-now candidate — (fork has impl) ~5 LoC Points to sitemap.xml
Per-page <link rel="canonical"> 🟡 Ship-next — (fork has impl in website/seo.py) ~15 LoC Tiny, website-only
ESM empty-path 404 hardening 🟡 Ship-next — (was bundled in zauberzeug#5767) ~10 LoC Touches core lib (nicegui/nicegui.py) — separate review surface
Per-page <meta description> mechanism 🟠 Mechanism-then-content ~20 LoC + per-page plumbing Mechanism is groundwork; per-page content is Layer 2
<html lang> attribute 🔴 Blocked zauberzeug#5811 (open) 1 line + i18n strategy Parked on i18n strategy (post-3.10, per Falko + Evan)
<meta robots> per-page noindex/follow ⚪ Not needed yet Only relevant if specific pages need noindex

Live-site state (probed 2026-05-14)

  • https://nicegui.io/sitemap.xml404
  • https://nicegui.io/robots.txt404 (falls through to SPA HTML)
  • https://nicegui.io/documentation/button HEAD has only <meta name="viewport">. No canonical, no description, no OG, no JSON-LD.

Recommended ship order

  1. First focused PR: sitemap.xml + robots.txt together (coupled by Sitemap: directive; share URL enumeration; ~50 LoC + tests; addresses Falko's Add comprehensive SEO support for documentation website zauberzeug/nicegui#5767 BLOCKER Bump cookie and socket.io #1 verbatim).
  2. Then: canonical URL (separate small PR).
  3. Then: ESM empty-path 404 (separate small PR; touches core lib).
  4. Then: meta-description mechanism + content (may split mechanism vs content again).

Layer 2: Content optimization (per-page payload)

Per zauberzeug#5833 ("Proposal: Revamped Examples, Search & SEO for nicegui.io"). All depends on Layer 1.

Item State Source Effort Notes
Per-page meta description content Not started zauberzeug#5833, zauberzeug#5767 Per page Needs description sourcing strategy (docstring? hand-curated? AI-summarized?)
Open Graph tags Not started zauberzeug#5767 (closed), fork seo.py Per page Title, description, image, type, locale
Twitter Card tags Not started zauberzeug#5767 (closed), fork seo.py Per page Summary card
JSON-LD structured data Not started zauberzeug#5767 (closed) Page-class Organization, SoftwareApplication, BreadcrumbList
Title strategy + 60-char cap Not started zauberzeug#5767 (open question) Per page Currently no enforcement
Googlebot screenshot: eager first demo ✅ Shipped zauberzeug#5800 (merged 2026-02-17) First demo no longer lazy
Examples-as-URLs (deep-linkable) Not started zauberzeug#5833 problem 1 Large Each example gets its own /examples/{slug} page with interactive preview
Two-tier search (per-page slim + dedicated search page) Not started zauberzeug#5833 problem 2 Large Server-side fuzzy search experiment was zauberzeug#5827 (self-archived after zauberzeug#5910 made CWV green)
Technological Foundations content page ✅ Shipped zauberzeug#5835 (merged 2026-04-01) SEO-relevant content addition

Cross-references

Closed-with-context upstream PRs (lore)

Discussions

Fork branches (this repo)

Maintainer signals to honor


Decision points (open)

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions