Tags: reflex-dev/reflex
Tags
Surface package changelogs on docs site (#6636) * Publish package changelogs on the docs site under /docs/changelog/ At startup the docs app now reaches up to the repo root and pulls in the towncrier-managed changelogs (repo-root CHANGELOG.md plus each packages/*/CHANGELOG.md), serving them through the regular docgen pipeline: - /changelog/ renders the main reflex changelog; each subpackage gets /changelog/<package>/. New package changelogs appear automatically. - The reflex-enterprise changelog is read from the installed distribution (via its dist RECORD) instead of a checked-in copy, so it can never go stale; the page appears once the published wheel ships a CHANGELOG.md. - Changelog markdown is normalized with a canonical H1 title, and the on-page TOC is limited to version headings. - Pages are listed in a Changelog section of the API Reference sidebar, included in llms.txt/llms-full.txt and .md asset serving, and the footer/navbar Changelog links now point at the new page instead of GitHub releases. https://claude.ai/code/session_01ToXo8Yg1VTuuT2jgBqK6T7 * Prefer the shallowest CHANGELOG.md record in installed distributions A wheel can vendor third-party changelogs deeper in its tree (e.g. bundled frontend assets); picking the first RECORD match could surface the wrong file. Sort candidates by path depth so the package-level changelog wins. https://claude.ai/code/session_01ToXo8Yg1VTuuT2jgBqK6T7 * Bump reflex-enterprise floor to 0.9.0.post1 for the bundled changelog The 0.9.0.post1 wheel ships reflex_enterprise/CHANGELOG.md, so the docs site now renders the enterprise changelog at /changelog/reflex-enterprise/. Exempt reflex-enterprise from the exclude-newer cutoff like the other internal lockstep packages. https://claude.ai/code/session_01ToXo8Yg1VTuuT2jgBqK6T7 * Set APP_HARNESS_FLAG for CI jobs that run the docs app in prod mode reflex-enterprise 0.9.0 restricts `reflex run --env prod` to paid tiers, which broke the reflex-docs integration jobs after the version bump. The gate explicitly exempts reflex's own integration tests via the app harness flag, so set it for every job that boots the docs app in prod. https://claude.ai/code/session_01ToXo8Yg1VTuuT2jgBqK6T7 * bump lock file * docs/app: update reflex-enterprise to 0.9.1 * pin wrapt < 2.2 wrapt 2.2 adds generic typing to ObjectProxy and needs some code change to pass pyright * revert ruff, pyright, typer, wrapt upgrades these upgrades introduced pre-commit issues, will upgrade separately and mitigate the changes in code * remove useless TYPE_CHECKING import of AuthProvider --------- Co-authored-by: Claude <noreply@anthropic.com>
SEO follow-up: longer docs meta descriptions + missing H1/alt (#6692) * 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>
SEO audit fixes: docs meta/titles/H1/alt + shared redirect & structur… …ed-data (#6686) * SEO: dedupe sitewide redirect links and fix JSON-LD in shared site package Footer/navbar link to /blog/ and /docs/ (was /blog, /docs which 301) and FORUM_URL -> GitHub Discussions, clearing ~1400 'links to redirect' rows sitewide. pricing_jsonld drops the price-less Enterprise offer and blog_index_jsonld drops the invalid ListItem datePublished (Google rich-results / schema.org errors). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * SEO: emit complete per-page meta for docs pages Docs pages now emit description + full Open Graph + Twitter card + canonical (previously only a title), with page-specific OG values and a /docs-prefixed trailing-slash canonical that also drives the sitemap loc. Titles lengthened and de-duplicated; descriptions auto-extracted from each page's first paragraph. Fixes Twitter-card-missing (~770), OG-incomplete (~691), meta-description-missing (~770), duplicate-without-canonical (~765), title-too-short (~549), and non-canonical/3XX-in-sitemap. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * SEO: add missing H1s, image alt text, and fix broken docs links Add a top-level H1 to 10 docs pages that had none; add descriptive alt text to ~97 rx.image() calls across docs and to integrations-docs screenshots; repoint the dead build.reflex.dev/tokens link to /docs/hosting/tokens. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Apply pre-commit ruff formatting to docs code blocks Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * SEO: address review — broaden numbered-list skip + bound title fallback extract_doc_description now skips ordered-list items 1.-9. (was 1.-3.) so later numbered items aren't pulled into descriptions; the bare-title fallback is now length-checked, dropping to the unsuffixed title when even that would exceed ~60 chars. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * SEO: emit a single og:image (fix favicon + preview duplicate) Reflex's compiler always renders one og:image from add_page's image kwarg (defaulting to favicon.ico). Pass the real preview image to add_page and strip og:image from the create_meta_tags meta list, so each page has exactly one og:image (the preview) plus one twitter:image, instead of favicon + preview. Applies to the docs renderer (reflex_docs.py) and docs landing page. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * SEO: stop frontmatter leaking into docs meta descriptions; add image alt extract_doc_description now prefers a frontmatter description field and otherwise strips the whole --- block before scanning, so lines like 'title: Aligned Grids' or 'tags: DevTools' no longer become the meta description. Also add alt text to docs-landing and shared gallery/markdown images. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * SEO: eliminate remaining multiple-H1 and redirect-link sources Multiple H1: demote demo rx.heading() to as_=h2 across 57 docs (164 calls), demote section-level markdown '# ' headings to '##' in 18 docs, and render the component 'API Reference' heading as h2 — each docs page now has a single H1. Redirect links: make all top-level internal links in the shared footer/navbar/sidebar trailing-slash (/docs/, /blog/, /pricing/, ...) so they no longer hit 301s. Alt text: add descriptive alt to ui.avatar.image logos/avatars in docs-landing, integration gallery, and shared gallery. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * optimize documentation rendering and add missing trailing slash * fix canonical leading slash on some pages --------- Co-authored-by: Alek <alek@reflex.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: carlosabadia <cutillascarlos@gmail.com>
ENG-9923: Add REFLEX_EXTRA_PLUGINS env var to append to plugin list (#… …6685) * ENG-9923: Add REFLEX_EXTRA_PLUGINS env var to append to plugin list REFLEX_EXTRA_PLUGINS defined plugin import paths that will be added to the Config.plugins list if the list does not already contain a plugin of that type. When adding extra plugins, the `disable_plugins` config field is respected, so explicitly disabled plugins cannot be injected from the environment. * Remove warning when disabling a non-builtin plugin * add CHANGELOG entry for 0.9.6.post1 directly * track invalid plugins when handling env vars * use more specific InvalidPluginConfigError throughout _normalize_plugins * let AttributeError fall through in interpret_plugin_class_env Changes the error message on a bad plugin name which was confusing: ``` Warning: Ignoring invalid REFLEX_EXTRA_PLUGINS entry 'repro_hydrate_fallback.Foobar' (Invalid plugin class: 'Foobar' for REFLEX_EXTRA_PLUGINS[0]. Must be a subclass of Plugin.). ``` To a more clear error ``` Warning: Ignoring invalid REFLEX_EXTRA_PLUGINS entry 'repro_hydrate_fallback.Foobar' (Failed to get plugin class 'Foobar' from module 'repro_hydrate_fallback' for REFLEX_EXTRA_PLUGINS[0]: module 'repro_hydrate_fallback' has no attribute 'Foobar'). ``` * CHANGELOG: error message for interpret_plugin_class_env Improved error messaging for plugin specifications and fixed warning for non-built-in plugins in config. * tersify description of REFLEX_EXTRA_PLUGINS * fix test assertions previous test cases were asserting on the "wrong" message
ENG-9923: Add REFLEX_EXTRA_PLUGINS env var to append to plugin list (#… …6685) * ENG-9923: Add REFLEX_EXTRA_PLUGINS env var to append to plugin list REFLEX_EXTRA_PLUGINS defined plugin import paths that will be added to the Config.plugins list if the list does not already contain a plugin of that type. When adding extra plugins, the `disable_plugins` config field is respected, so explicitly disabled plugins cannot be injected from the environment. * Remove warning when disabling a non-builtin plugin * add CHANGELOG entry for 0.9.6.post1 directly * track invalid plugins when handling env vars * use more specific InvalidPluginConfigError throughout _normalize_plugins * let AttributeError fall through in interpret_plugin_class_env Changes the error message on a bad plugin name which was confusing: ``` Warning: Ignoring invalid REFLEX_EXTRA_PLUGINS entry 'repro_hydrate_fallback.Foobar' (Invalid plugin class: 'Foobar' for REFLEX_EXTRA_PLUGINS[0]. Must be a subclass of Plugin.). ``` To a more clear error ``` Warning: Ignoring invalid REFLEX_EXTRA_PLUGINS entry 'repro_hydrate_fallback.Foobar' (Failed to get plugin class 'Foobar' from module 'repro_hydrate_fallback' for REFLEX_EXTRA_PLUGINS[0]: module 'repro_hydrate_fallback' has no attribute 'Foobar'). ``` * CHANGELOG: error message for interpret_plugin_class_env Improved error messaging for plugin specifications and fixed warning for non-built-in plugins in config. * tersify description of REFLEX_EXTRA_PLUGINS * fix test assertions previous test cases were asserting on the "wrong" message
Materialize changelogs for reflex v0.9.6 and friends (#6679) * Materialize changelogs for reflex v0.9.6 and friends Build the pending news fragments into CHANGELOG.md for the framework and the modified subpackages. Each version is the next dot bump from the package's latest release tag: - reflex 0.9.5.post2 -> 0.9.6 - reflex-base 0.9.5.post2 -> 0.9.6 - reflex-components-core 0.9.5 -> 0.9.6 - reflex-components-moment 0.9.1 -> 0.9.2 - reflex-components-plotly 0.9.2 -> 0.9.3 - reflex-hosting-cli 0.1.67 -> 0.1.68 Also strip the issue link embedded in the #6617/#6621 fragment text so towncrier renders each link exactly once. Dependency pin updates (reflex-components-core's reflex-base >= 0.9.5.post2.dev0 dev pin, and the root reflex-base floor) are intentionally left out: they pin to as-yet-unpublished versions and must land after reflex-base 0.9.6 is published, matching the established two-wave release flow. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ELfV78gRoQiknTTEXctPs * Update changelog for version reflex-hosting-cli 0.1.67 v0.1.67 was released without actually publishing the changelog, so publishing it now. --------- Co-authored-by: Claude <noreply@anthropic.com>
Materialize changelogs for reflex v0.9.6 and friends (#6679) * Materialize changelogs for reflex v0.9.6 and friends Build the pending news fragments into CHANGELOG.md for the framework and the modified subpackages. Each version is the next dot bump from the package's latest release tag: - reflex 0.9.5.post2 -> 0.9.6 - reflex-base 0.9.5.post2 -> 0.9.6 - reflex-components-core 0.9.5 -> 0.9.6 - reflex-components-moment 0.9.1 -> 0.9.2 - reflex-components-plotly 0.9.2 -> 0.9.3 - reflex-hosting-cli 0.1.67 -> 0.1.68 Also strip the issue link embedded in the #6617/#6621 fragment text so towncrier renders each link exactly once. Dependency pin updates (reflex-components-core's reflex-base >= 0.9.5.post2.dev0 dev pin, and the root reflex-base floor) are intentionally left out: they pin to as-yet-unpublished versions and must land after reflex-base 0.9.6 is published, matching the established two-wave release flow. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ELfV78gRoQiknTTEXctPs * Update changelog for version reflex-hosting-cli 0.1.67 v0.1.67 was released without actually publishing the changelog, so publishing it now. --------- Co-authored-by: Claude <noreply@anthropic.com>
Materialize changelogs for reflex v0.9.6 and friends (#6679) * Materialize changelogs for reflex v0.9.6 and friends Build the pending news fragments into CHANGELOG.md for the framework and the modified subpackages. Each version is the next dot bump from the package's latest release tag: - reflex 0.9.5.post2 -> 0.9.6 - reflex-base 0.9.5.post2 -> 0.9.6 - reflex-components-core 0.9.5 -> 0.9.6 - reflex-components-moment 0.9.1 -> 0.9.2 - reflex-components-plotly 0.9.2 -> 0.9.3 - reflex-hosting-cli 0.1.67 -> 0.1.68 Also strip the issue link embedded in the #6617/#6621 fragment text so towncrier renders each link exactly once. Dependency pin updates (reflex-components-core's reflex-base >= 0.9.5.post2.dev0 dev pin, and the root reflex-base floor) are intentionally left out: they pin to as-yet-unpublished versions and must land after reflex-base 0.9.6 is published, matching the established two-wave release flow. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ELfV78gRoQiknTTEXctPs * Update changelog for version reflex-hosting-cli 0.1.67 v0.1.67 was released without actually publishing the changelog, so publishing it now. --------- Co-authored-by: Claude <noreply@anthropic.com>
Materialize changelogs for reflex v0.9.6 and friends (#6679) * Materialize changelogs for reflex v0.9.6 and friends Build the pending news fragments into CHANGELOG.md for the framework and the modified subpackages. Each version is the next dot bump from the package's latest release tag: - reflex 0.9.5.post2 -> 0.9.6 - reflex-base 0.9.5.post2 -> 0.9.6 - reflex-components-core 0.9.5 -> 0.9.6 - reflex-components-moment 0.9.1 -> 0.9.2 - reflex-components-plotly 0.9.2 -> 0.9.3 - reflex-hosting-cli 0.1.67 -> 0.1.68 Also strip the issue link embedded in the #6617/#6621 fragment text so towncrier renders each link exactly once. Dependency pin updates (reflex-components-core's reflex-base >= 0.9.5.post2.dev0 dev pin, and the root reflex-base floor) are intentionally left out: they pin to as-yet-unpublished versions and must land after reflex-base 0.9.6 is published, matching the established two-wave release flow. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ELfV78gRoQiknTTEXctPs * Update changelog for version reflex-hosting-cli 0.1.67 v0.1.67 was released without actually publishing the changelog, so publishing it now. --------- Co-authored-by: Claude <noreply@anthropic.com>
Materialize changelogs for reflex v0.9.6 and friends (#6679) * Materialize changelogs for reflex v0.9.6 and friends Build the pending news fragments into CHANGELOG.md for the framework and the modified subpackages. Each version is the next dot bump from the package's latest release tag: - reflex 0.9.5.post2 -> 0.9.6 - reflex-base 0.9.5.post2 -> 0.9.6 - reflex-components-core 0.9.5 -> 0.9.6 - reflex-components-moment 0.9.1 -> 0.9.2 - reflex-components-plotly 0.9.2 -> 0.9.3 - reflex-hosting-cli 0.1.67 -> 0.1.68 Also strip the issue link embedded in the #6617/#6621 fragment text so towncrier renders each link exactly once. Dependency pin updates (reflex-components-core's reflex-base >= 0.9.5.post2.dev0 dev pin, and the root reflex-base floor) are intentionally left out: they pin to as-yet-unpublished versions and must land after reflex-base 0.9.6 is published, matching the established two-wave release flow. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ELfV78gRoQiknTTEXctPs * Update changelog for version reflex-hosting-cli 0.1.67 v0.1.67 was released without actually publishing the changelog, so publishing it now. --------- Co-authored-by: Claude <noreply@anthropic.com>
PreviousNext