* SEO: longer docs meta descriptions + missing H1/alt (post-deploy report)
extract_doc_description now accumulates prose across sections to ~120-155 chars (was stopping at the first short sentence) and strips 'N minutes' reading-time markers — fixes meta-description-too-short on ~60 docs. Promote recipes/content/forms.md intro to a real # H1 (its only headings were demo rx.heading, now h2). Add alt to the html_embed banner image.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* SEO: early-exit description accumulation at structural lines once long enough
Address review: stop gathering at a heading/list when prose already >= min_len so a later section can't be stitched into the meta description; short openers still accumulate across sections.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* SEO: use body prose when frontmatter description is short; drop demo H1
extract_doc_description short-circuited on any frontmatter
description/meta_description >= 20 chars, so docs with a short authored
description (airtable, langchain, connect_to_github) kept a too-short
meta description even though their body prose was rich. Gate the
frontmatter/metadata short-circuit on the same ~120-char minimum used for
body accumulation: a short authored description now falls through to the
body prose, and a result that still can't reach the minimum returns None
so docpage's title-based fallback (~115 chars) applies. Net: every docs
page now has a >=~115-char description (205 body-derived, ~40 fallback),
none below 120.
Also drop the live <h1> from the html_embed demo so the rendered page has
a single H1 (its own "HTML Embed"); the demo now shows an h2->h6 ramp,
which still demonstrates raw-HTML heading rendering.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* SEO: descriptive HTML <title> for API/CLI-reference pages (title-too-short)
API-reference (App, State, Var, Config, …) and Cloud CLI-reference (Deploy,
Login, Regions, …) pages had <title>s under 30 chars because the title
doubles as the short sidebar/nav label. Add an optional Route.seo_title that
overrides only the HTML <title>/OG/Twitter (via reflex_docs.py head_title =
seo_title or title), leaving the sidebar namespace key (to_snake_case(title))
unchanged. e.g. "App" -> "reflex.App API Reference · Reflex Docs".
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* SEO: remove extra <h1> on docs component/reference & index pages
Each docs page must have a single <h1> (its doc title). Demote extra
rendered headings:
- heading.md: demo rx.heading(as_="h1") -> as_="h2"
- markdown.md: demo rx.markdown("# …") strings -> "## …" (react-markdown
renders "#" as a live <h1>)
- form-ll.md: "# " inside `md warning` (not `alert`, so it renders as a real
<h1>) -> "## "; input-ll.md, databricks.md: level-1 body "# " -> "## "
- library.py / recipes_overview.py / enterprise/components.md index pages:
per-category rx.el.h1 / h1_comp -> h2 (e.g. /docs/library had 16 <h1>)
- component.py: interactive props-table preview forces as_="h2" for the
Heading component (rx.heading defaults to <h1>)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* SEO: fix /pricing structured-data (Google rich results validation error)
The pricing SoftwareApplication had no offers/review/aggregateRating (a
required field for the SoftwareApplication rich result), and the Product
listed a single misleading "$0 Free" offer. Add an AggregateOffer over the
real tier range (Free $0 / Pro $200 / Enterprise custom => lowPrice 0,
highPrice 200, offerCount 3) to both entities and set operatingSystem="Web".
Applied to both the imported meta/meta.py and the parallel lib/meta/meta.py.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fixes
---------
Co-authored-by: Alek <alek@reflex.dev>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Carlos <cutillascarlos@gmail.com>