diff --git a/blog/2024-04-16-custom-components.md b/blog/custom-components.md similarity index 95% rename from blog/2024-04-16-custom-components.md rename to blog/custom-components.md index 56fd07766..7d0dc9ef1 100644 --- a/blog/2024-04-16-custom-components.md +++ b/blog/custom-components.md @@ -2,7 +2,8 @@ author: Nikhil Rao date: 2024-04-16 title: Custom Components -description: Announcing our custom component ecosystem. +title_tag: "Reflex Custom Components - Build & Share" +description: Announcing the Reflex custom component ecosystem. Build and share reusable components, wrap React libraries, and extend Reflex with your own Python components. image: /blog/custom_components.webp tag: Open Source meta: [ diff --git a/blog/2023-10-11-graphing-update.md b/blog/graphing-update.md similarity index 96% rename from blog/2023-10-11-graphing-update.md rename to blog/graphing-update.md index 3e76a0538..ce7816c9d 100644 --- a/blog/2023-10-11-graphing-update.md +++ b/blog/graphing-update.md @@ -2,7 +2,8 @@ author: Alek Petuskey date: 2023-10-11 title: "New Core Graphing Components" -description: "Using Reflex's new core graphing feature to build a live streaming graphing app." +title_tag: "New Core Graphing Components in Reflex" +description: "Use Reflex's new core graphing feature to build a live streaming graphing app. Real-time charts, custom visualizations, and Python-native APIs." image: /blog/graphing.webp tag: Open Source meta: [ @@ -23,7 +24,7 @@ class self(object): With the release of [Reflex v0.2.9](https://github.com/reflex-dev/reflex/releases/tag/v0.2.9) we've reworked the core graphing components from the ground up. The new components are more flexible and easier to use. -In this post we'll walk through the new components and show how to build a live streaming graphing app. This will also build on the [Unlocking New Workflows with Background Tasks](https://reflex.dev/blog/2023-09-28-unlocking-new-workflows-with-background-tasks/) post, so if you haven't read that yet, check it out first. +In this post we'll walk through the new components and show how to build a live streaming graphing app. This will also build on the [Unlocking New Workflows with Background Tasks](https://reflex.dev/blog/unlocking-new-workflows-with-background-tasks) post, so if you haven't read that yet, check it out first. ## Striking a Balance diff --git a/blog/2023-10-25-implementing-sign-in-with-google.md b/blog/implementing-sign-in-with-google.md similarity index 93% rename from blog/2023-10-25-implementing-sign-in-with-google.md rename to blog/implementing-sign-in-with-google.md index 06aac4fd9..455a48040 100644 --- a/blog/2023-10-25-implementing-sign-in-with-google.md +++ b/blog/implementing-sign-in-with-google.md @@ -2,12 +2,17 @@ author: Masen Furer date: 2023-10-25 title: "Implementing Sign In with Google" -description: "How to wrap a third-party auth component and integrate it into a Reflex app." +description: "Learn how to wrap a third-party auth component and integrate Google Sign-In into your Reflex app. Step-by-step guide with code examples." image: /blog/google_auth.webp tag: Open Source meta: [ {"name": "keywords", "content": ""}, ] +faq: [ + {"question": "How do I add Google Sign-In to my Reflex app?", "answer": "Create an OAuth client ID in Google Cloud Console, then wrap the @react-oauth/google React component for use in Reflex. The post includes step-by-step setup and code examples."}, + {"question": "Does Reflex have built-in Google Auth?", "answer": "Reflex offers multiple auth options. For Google Sign-In specifically, you can use the built-in Google Auth provider or integrate a third-party component like @react-oauth/google via a Reflex wrapper."}, + {"question": "What scopes do I need for Google Sign-In?", "answer": "For basic profile and email, select Email, Profile, and OpenID Connect scopes in the Google Cloud Console consent screen. Add your production domain (HTTPS) to Authorized JavaScript origins."}, +] --- ```python exec diff --git a/blog/2025-06-03-internal-tool-builders-2025.md b/blog/internal-tool-builders-2025.md similarity index 96% rename from blog/2025-06-03-internal-tool-builders-2025.md rename to blog/internal-tool-builders-2025.md index 7a7048396..38a53a431 100644 --- a/blog/2025-06-03-internal-tool-builders-2025.md +++ b/blog/internal-tool-builders-2025.md @@ -2,13 +2,17 @@ author: Tom Gotsman date: 2025-06-03 title: The 10 best internal tool builders in 2025 -description: Reflex vs Retool vs Budibase vs Appsmith vs ToolJet vs Zapier Interfaces vs Glide vs Softr vs DronaHQ vs Microsoft Power Apps +description: Compare Reflex, Retool, Budibase, Appsmith, ToolJet, Zapier Interfaces, Glide, Softr, DronaHQ, and Microsoft Power Apps for building internal tools in 2025. image: /blog/10_best_internal_tool_builders.webp tag: Builder meta: [ {"name": "keywords", "content": "Reflex vs Retool, internal tool builders 2025, Appsmith alternatives, Budibase vs ToolJet, low-code tools, no-code internal apps, best internal app platforms, enterprise internal tools, Power Apps review, build dashboards, admin panel builders, internal tool comparison, open source internal tools, Zapier Interfaces, Glide app builder, DronaHQ, Softr"} ] - +faq: [ + {"question": "What is an internal tool builder?", "answer": "Internal tool builders help technical and non-technical teams create custom dashboards, admin panels, and operational tools without building everything from scratch. They shorten development from weeks to hours."}, + {"question": "Which internal tool builder is best for Python teams?", "answer": "Reflex is ideal for Python teams. It's open source, full-stack Python, and offers full control with built-in auth, database integration, and deployment. No low-code lock-in—you own the code."}, + {"question": "When should I choose Reflex over Retool or Appsmith?", "answer": "Choose Reflex when you want pure Python, no vendor lock-in, and to scale from prototype to production in one framework. Retool and Appsmith suit teams heavily invested in their low-code ecosystems."}, +] --- ```python exec import reflex as rx diff --git a/blog/2024-11-19-microsoft-azure-authentication.md b/blog/microsoft-azure-authentication.md similarity index 92% rename from blog/2024-11-19-microsoft-azure-authentication.md rename to blog/microsoft-azure-authentication.md index 7f65f85be..c8ccbf6a8 100644 --- a/blog/2024-11-19-microsoft-azure-authentication.md +++ b/blog/microsoft-azure-authentication.md @@ -2,7 +2,8 @@ author: Tom Gotsman date: 2024-11-19 title: Microsoft Azure Auth -description: Implementing Microsoft Azure Single Sign-On (SSO) Auth in Reflex app. +title_tag: "Microsoft Azure SSO Auth in Reflex Apps" +description: Step-by-step guide to implementing Microsoft Azure Single Sign-On (SSO) authentication in your Reflex app. Integrate with Entra ID and enterprise auth. image: /blog/azure_auth.webp tag: Open Source meta: [ @@ -17,6 +18,11 @@ meta: [ " }, ] +faq: [ + {"question": "How do I add Microsoft Azure SSO to my Reflex app?", "answer": "Use the MSAL (Microsoft Authentication Library) for Python with client_id, client_secret, and tenant_id from your Azure portal. Configure the auth provider in your Reflex app and handle the redirect flow."}, + {"question": "What credentials do I need from Azure for Reflex auth?", "answer": "You need client_id, client_secret, and tenant_id from your Azure Entra ID (formerly Azure AD) app registration. Your SSO team or Azure portal can provide these values."}, + {"question": "Does Reflex support enterprise SSO besides Azure?", "answer": "Yes. Reflex supports multiple auth options including Google Auth, Magic Link, Descope, and Clerk. For custom SSO like Azure, you can integrate via OAuth providers or MSAL."}, +] --- diff --git a/blog/2025-12-05-on-premises-deployment.md b/blog/on-premises-deployment.md similarity index 85% rename from blog/2025-12-05-on-premises-deployment.md rename to blog/on-premises-deployment.md index 2956fcef2..ace74a0d6 100644 --- a/blog/2025-12-05-on-premises-deployment.md +++ b/blog/on-premises-deployment.md @@ -2,7 +2,8 @@ author: Alek Petuskey date: 2025-12-05 title: "Reflex Build On-Prem: The Secure AI App Builder That Runs Inside Your Company Infrastructure" -description: An enterprise, on-premises AI app builder for developing secure internal tools and dashboards using Python. +title_tag: "Reflex Build On-Prem - Enterprise AI App Builder" +description: Reflex Build on-premises—an enterprise AI app builder for developing secure internal tools and dashboards using Python. Deploy inside your infrastructure. image: /blog/on-prem.png tag: Cloud meta: [ @@ -27,6 +28,12 @@ meta: [ " }, ] +faq: [ + {"question": "What is Reflex Build on-premises?", "answer": "Reflex Build on-premises is our AI-powered app builder running inside your company infrastructure. It lets you build full-stack Python web apps using natural language while keeping all code, data, and development within your controlled environment."}, + {"question": "Can Reflex run in air-gapped environments?", "answer": "Yes. Reflex Enterprise supports deployment in completely isolated networks, meeting the highest security standards for government, defense, and regulated industries."}, + {"question": "Does Reflex on-premises support my existing data sources?", "answer": "Yes. Reflex Build on-premises securely connects with your internal databases, APIs, documentation, data warehouses, and identity providers (SSO/SAML) all within your infrastructure."}, + {"question": "What compliance standards does Reflex on-premises support?", "answer": "Reflex on-premises deployment helps meet HIPAA, SOC 2, GDPR, and other regulatory requirements. All data remains within your infrastructure with zero PII collection and complete audit trails."}, +] --- ```python exec @@ -163,4 +170,3 @@ rx.el.div( ``` With Reflex Build on-premises, you get the best of both worlds: the power and productivity of AI-powered app building, with the control and security of your own infrastructure. Build full-stack Python web apps faster than ever, all while keeping your code, data, and development process completely within your controlled environment. - diff --git a/blog/2024-12-20-python-comparison.md b/blog/python-comparison.md similarity index 93% rename from blog/2024-12-20-python-comparison.md rename to blog/python-comparison.md index c66e59192..cf5b57a19 100644 --- a/blog/2024-12-20-python-comparison.md +++ b/blog/python-comparison.md @@ -2,12 +2,17 @@ author: Tom Gotsman date: 2024-12-20 title: Top Python Web Development Frameworks in 2025 -description: Reflex vs Django vs Flask vs Gradio vs Streamlit vs Dash vs FastAPI +description: Compare Reflex, Django, Flask, Gradio, Streamlit, Dash, and FastAPI for Python web development. Pick the right framework for your app. image: /blog/top_python_web_frameworks.webp tag: Builder meta: [ {"name": "keywords", "content": "streamlit python, streamlit, streamlit alternatives, plotly, dash app, plotly python, fastapi"}, ] +faq: [ + {"question": "Which Python framework is best for full-stack web apps?", "answer": "Reflex lets you build full-stack apps in pure Python with no JavaScript. Django is ideal for large-scale applications. FastAPI excels at high-performance APIs. Choose based on whether you need full-stack, API-only, or data dashboards."}, + {"question": "What is the best alternative to Streamlit for data apps?", "answer": "Reflex offers more flexibility and production readiness—multi-page routing, custom components, and true backend separation. Streamlit is faster for quick prototypes; Reflex scales better from prototype to production."}, + {"question": "Can I build web apps with only Python?", "answer": "Yes. Reflex, Streamlit, Gradio, and Dash let you build UIs without JavaScript. Reflex is the only one that gives you a full-stack Python app with routing, state management, and deployment in one framework."}, +] --- diff --git a/blog/2023-06-28-rebrand-to-reflex.md b/blog/rebrand-to-reflex.md similarity index 89% rename from blog/2023-06-28-rebrand-to-reflex.md rename to blog/rebrand-to-reflex.md index 01335e415..b316a57c9 100644 --- a/blog/2023-06-28-rebrand-to-reflex.md +++ b/blog/rebrand-to-reflex.md @@ -2,7 +2,8 @@ author: Nikhil Rao date: 2023-06-28 title: Pynecone is now Reflex -description: We have some exciting news to share about the next stage of our company! +title_tag: "Pynecone is Now Reflex - Python Web Framework" +description: Pynecone is now Reflex! The same great Python web framework with a new name and a bold vision for full-stack development. image: /reflex_banner.png tag: Announcements meta: [ diff --git a/blog/2025-07-01-reflex-080.md b/blog/reflex-080.md similarity index 98% rename from blog/2025-07-01-reflex-080.md rename to blog/reflex-080.md index ac2aefc77..99b9c8c21 100644 --- a/blog/2025-07-01-reflex-080.md +++ b/blog/reflex-080.md @@ -2,7 +2,7 @@ author: Reflex Team date: 2025-07-01 title: Reflex v0.8.0 - Refactoring for Performance -description: Major improvements in Reflex v0.8.0 developer experience and performance. +description: Major improvements in Reflex v0.8.0—2-3x faster builds with Vite and Rolldown, 18% faster components with our Pydantic replacement, and reduced memory usage. image: /blog/080.webp tag: Open Source meta: [ diff --git a/blog/2024-03-21-reflex-architecture.md b/blog/reflex-architecture.md similarity index 99% rename from blog/2024-03-21-reflex-architecture.md rename to blog/reflex-architecture.md index c49c76585..85386e1be 100644 --- a/blog/2024-03-21-reflex-architecture.md +++ b/blog/reflex-architecture.md @@ -2,7 +2,7 @@ author: Nikhil Rao date: 2024-03-21 title: Designing a Pure Python Web Framework -description: A look at how Reflex works under the hood. +description: A deep dive into how Reflex works under the hood—from reactive state management to compilation of Python components into React. image: /blog/web_framework.webp tag: Open Source meta: [ diff --git a/blog/2024-12-05-reflex-cloud.md b/blog/reflex-cloud.md similarity index 74% rename from blog/2024-12-05-reflex-cloud.md rename to blog/reflex-cloud.md index 0c8518cfb..ecc9dcd39 100644 --- a/blog/2024-12-05-reflex-cloud.md +++ b/blog/reflex-cloud.md @@ -2,12 +2,18 @@ author: Nikhil Rao date: 2024-12-05 title: Reflex Cloud -description: Deploy your Reflex apps with a single command +title_tag: "Reflex Cloud - Deploy Python Apps in One Command" +description: Deploy your Reflex apps to the cloud with a single command. Reflex Cloud offers zero-config deployment, automatic scaling, and built-in observability. image: /blog/reflex-cloud.webp tag: Cloud meta: [ {"name": "keywords", "content": ""}, ] +faq: [ + {"question": "How do I deploy a Reflex app to the cloud?", "answer": "Run reflex deploy from your app directory. The command handles environment variables, machine sizes, and regions. Your app will be live in minutes."}, + {"question": "What is included in Reflex Cloud?", "answer": "Reflex Cloud offers one-command deployment, a unified dashboard for all your apps, automatic scaling, built-in observability, and optional Enterprise features like custom domains and on-prem hosting."}, + {"question": "Is there a free tier for Reflex Cloud?", "answer": "Yes. Reflex Cloud has a free tier that lets you deploy your first app at no cost. Enterprise tier adds one-click auth, custom domains, and on-premise hosting options."}, +] --- ```python exec diff --git a/blog/2025-06-20-reflex-dash.md b/blog/reflex-dash.md similarity index 97% rename from blog/2025-06-20-reflex-dash.md rename to blog/reflex-dash.md index 76d572da7..f26f9a311 100644 --- a/blog/2025-06-20-reflex-dash.md +++ b/blog/reflex-dash.md @@ -2,7 +2,8 @@ author: Tom Gotsman date: 2025-06-20 title: Reflex vs Plotly Dash -description: A Comparison of Python Frameworks for Building Interactive Financial Dashboards +title_tag: "Reflex vs Plotly Dash - Framework Comparison" +description: A detailed comparison of Reflex and Plotly Dash for building interactive financial dashboards. Compare performance, flexibility, and deployment options. image: /blog/reflex-dash.webp tag: Builder meta: [ diff --git a/blog/2025-06-30-reflex-databricks-partnership.md b/blog/reflex-databricks-partnership.md similarity index 79% rename from blog/2025-06-30-reflex-databricks-partnership.md rename to blog/reflex-databricks-partnership.md index 17f609bea..de9cc0578 100644 --- a/blog/2025-06-30-reflex-databricks-partnership.md +++ b/blog/reflex-databricks-partnership.md @@ -2,12 +2,18 @@ author: Reflex Team date: 2025-06-30 title: "Reflex x Databricks: Python-Powered Vibe Coding for Enterprises" -description: "We're excited to announce our official partnership with Databricks and the launch of our Reflex AI Builder integration with Databricks Apps." +title_tag: "Reflex x Databricks Partnership" +description: "Announcing the Reflex and Databricks partnership. Build and deploy Python apps directly in Databricks with the AI Builder." image: /blog/databricks-partnership.webp tag: Announcements meta: [ {"name": "keywords", "content": "Reflex Databricks, Python apps, enterprise development, AI Builder, Unity Catalog, data apps, Python framework, Databricks Apps"} ] +faq: [ + {"question": "What is the Reflex and Databricks partnership?", "answer": "Reflex and Databricks partnered to let Python teams build and deploy full internal apps directly on Databricks data. The Reflex AI Builder integrates with Databricks Apps for prompt-to-production workflows."}, + {"question": "Does Reflex work with Unity Catalog?", "answer": "Yes. Reflex supports Databricks Unity Catalog, so your apps have secure, governed access to your data while respecting existing catalog permissions."}, + {"question": "Can I deploy Reflex apps on Databricks?", "answer": "Yes. Reflex apps deploy to Databricks Apps, so your data never leaves your stack. Build dashboards, workflow tools, and LLM-powered interfaces using Python and natural language prompts."}, +] --- ```python exec diff --git a/blog/2025-09-03-reflex-jupyter.md b/blog/reflex-jupyter.md similarity index 93% rename from blog/2025-09-03-reflex-jupyter.md rename to blog/reflex-jupyter.md index 1714e363a..052d208bf 100644 --- a/blog/2025-09-03-reflex-jupyter.md +++ b/blog/reflex-jupyter.md @@ -2,7 +2,8 @@ author: Ahmad Al Hakim date: 2025-09-03 title: Turn Jupyter Notebooks into Production Dashboards in Python -description: "Convert Jupyter notebooks into interactive, production-ready dashboards with Python and Reflex. Keep your pandas logic, add UI, and deploy in minutes." +title_tag: "Jupyter to Reflex Dashboards in Python" +description: "Convert Jupyter notebooks into production-ready dashboards with Reflex. Keep your pandas logic, add UI components, and deploy." image: /blog/jupyter_reflex.png tag: Open Source meta: [ @@ -11,6 +12,11 @@ meta: [ "content": "Jupyter Notebook, Python dashboards, data science workflows, interactive dashboards, productionizing notebooks, Python web apps, data visualization, machine learning apps, data scientist guide, dashboard deployment" } ] +faq: [ + {"question": "Can I convert my Jupyter notebook to a production dashboard?", "answer": "Yes. Reflex lets you keep your pandas, NumPy, and sklearn logic from your notebook and wrap it in production-ready UI components. Deploy in minutes without leaving Python."}, + {"question": "Do I need to learn JavaScript to deploy a Jupyter-based dashboard?", "answer": "No. Reflex is pure Python—both frontend and backend are written in Python. You build UIs with Reflex components and deploy with a single command."}, + {"question": "How does Reflex differ from Streamlit for notebook-to-dashboard workflows?", "answer": "Reflex offers true multi-page routing, production-grade state management, and customizable components. It scales from prototype to production without switching platforms."}, +] --- ## The Data Scientist's Dilemma diff --git a/blog/2025-08-20-reflex-streamlit.md b/blog/reflex-streamlit.md similarity index 86% rename from blog/2025-08-20-reflex-streamlit.md rename to blog/reflex-streamlit.md index 49eaf48ca..fd5e488bb 100644 --- a/blog/2025-08-20-reflex-streamlit.md +++ b/blog/reflex-streamlit.md @@ -2,7 +2,8 @@ author: Tom Gotsman date: 2025-08-20 title: Reflex vs Streamlit -description: "A head‑to‑head comparison of two Python frameworks for building fast, interactive web apps" +title_tag: "Reflex vs Streamlit - Framework Comparison" +description: "A head-to-head comparison of Reflex and Streamlit for building fast, interactive web apps. Compare architecture, use cases, and when to choose each framework." image: /blog/reflex-streamlit.webp tag: Builder meta: [ @@ -11,6 +12,11 @@ meta: [ "content": "Reflex vs Streamlit, Streamlit alternative, Reflex Python framework, Streamlit Python framework, Python web app frameworks, low‑code Python apps, interactive data apps Python, reactive UI Python, Reflex state management, Streamlit session state" } ] +faq: [ + {"question": "What is the main difference between Reflex and Streamlit?", "answer": "Streamlit uses a script-rerun model ideal for quick prototypes. Reflex is a full-stack framework with true routing, backend separation, and production-grade state management—better for scaling from prototype to production."}, + {"question": "Should I use Reflex or Streamlit for my project?", "answer": "Use Streamlit for rapid prototyping and simple dashboards. Choose Reflex when you need multi-page apps, custom components, production deployment, or to scale beyond a single script."}, + {"question": "Does Reflex require JavaScript?", "answer": "No. Reflex is pure Python—the frontend compiles to React/Next.js automatically. You write only Python for both UI and backend."}, +] --- ```python exec diff --git a/blog/2024-02-16-reflex-v0-4-0.md b/blog/reflex-v0-4-0.md similarity index 96% rename from blog/2024-02-16-reflex-v0-4-0.md rename to blog/reflex-v0-4-0.md index 79c34c19e..4b4fa7673 100644 --- a/blog/2024-02-16-reflex-v0-4-0.md +++ b/blog/reflex-v0-4-0.md @@ -2,7 +2,8 @@ author: Nikhil Rao date: 2024-02-16 title: "Reflex v0.4.0" -description: "New features coming in the 0.4.0 release." +title_tag: "Reflex v0.4.0 Release - New Features & Improvements" +description: "New features coming in Reflex v0.4.0—improved styling, better components, and enhanced developer experience. See what's new in this release." image: /blog/reflex-040.webp tag: Open Source meta: [ diff --git a/blog/2024-09-21-reflex-v060.md b/blog/reflex-v060.md similarity index 95% rename from blog/2024-09-21-reflex-v060.md rename to blog/reflex-v060.md index 17416247a..d498747bf 100644 --- a/blog/2024-09-21-reflex-v060.md +++ b/blog/reflex-v060.md @@ -2,7 +2,8 @@ author: Alek Petuskey date: 2024-09-21 title: Reflex v0.6.0 -description: New features and improvements in Reflex v0.6.0 +title_tag: "Reflex v0.6.0 Release - New Features & Improvements" +description: Explore new features and improvements in Reflex v0.6.0, including enhanced performance, better component APIs, and improved developer experience. image: /blog/reflex-060.webp tag: Open Source meta: [ diff --git a/blog/2023-08-02-seed-annoucement.md b/blog/seed-annoucement.md similarity index 95% rename from blog/2023-08-02-seed-annoucement.md rename to blog/seed-annoucement.md index b4edc487d..4f547035a 100644 --- a/blog/2023-08-02-seed-annoucement.md +++ b/blog/seed-annoucement.md @@ -2,7 +2,8 @@ author: Reflex Team date: 2023-08-02 title: Announcing our Seed Round -description: Reflex has raised a $5M seed led by Lux Capital. +title_tag: "Reflex Raises $5M Seed Round - Lux Capital" +description: Reflex has raised a $5M seed round led by Lux Capital. Learn how we're building the future of Python web development and accelerating our platform. image: /blog/fundraise_dark.webp tag: Announcements meta: [ diff --git a/blog/2024-10-8-self-hosting-reflex-with-docker.md b/blog/self-hosting-reflex-with-docker.md similarity index 93% rename from blog/2024-10-8-self-hosting-reflex-with-docker.md rename to blog/self-hosting-reflex-with-docker.md index ec2be0514..4467e6f89 100644 --- a/blog/2024-10-8-self-hosting-reflex-with-docker.md +++ b/blog/self-hosting-reflex-with-docker.md @@ -2,7 +2,7 @@ author: Tom Gotsman date: 2024-10-08 title: Self Hosting Reflex with Docker -description: Hosting Reflex on your own infra using Docker for efficient containerization. +description: Step-by-step guide to hosting Reflex apps on your own infrastructure using Docker. Learn containerization, orchestration, and deployment best practices. image: /blog/self-hosting-with-docker.webp tag: Open Source meta: [ @@ -29,6 +29,11 @@ meta: [ " }, ] +faq: [ + {"question": "How do I deploy a Reflex app with Docker?", "answer": "Create compose.yml, Dockerfile, web.Dockerfile, and nginx.conf at your app root. Use docker compose to build and run. The Reflex docs include complete examples for containerizing your app."}, + {"question": "What files do I need to Dockerize a Reflex app?", "answer": "You need four files: compose.yml for orchestration, Dockerfile for the backend, web.Dockerfile for the frontend, and nginx.conf for serving. All go at the same level as rxconfig.py."}, + {"question": "Can I self-host Reflex instead of using Reflex Cloud?", "answer": "Yes. Reflex is open source and supports self-hosting via Docker. You can run it on your own infrastructure with full control over deployment and resources."}, +] --- ```python exec diff --git a/blog/2024-03-27-structuring-a-large-app.md b/blog/structuring-a-large-app.md similarity index 98% rename from blog/2024-03-27-structuring-a-large-app.md rename to blog/structuring-a-large-app.md index e3a4fe122..d741e1fb0 100644 --- a/blog/2024-03-27-structuring-a-large-app.md +++ b/blog/structuring-a-large-app.md @@ -2,7 +2,8 @@ author: Masen Furer date: 2024-03-27 title: "Structuring a Large App" -description: "So your Reflex app is getting large? Here's some advice on how to lay it out." +title_tag: "How to Structure a Large Reflex App" +description: "So your Reflex app is getting large? Here's practical advice on project structure, organization, and layout patterns for scaling Python web apps." image: /blog/project_structure.webp tag: Open Source meta: [ diff --git a/blog/2025-01-27-top-10-data-visualization-libraries.md b/blog/top-10-data-visualization-libraries.md similarity index 92% rename from blog/2025-01-27-top-10-data-visualization-libraries.md rename to blog/top-10-data-visualization-libraries.md index 6fa36a382..43c470167 100644 --- a/blog/2025-01-27-top-10-data-visualization-libraries.md +++ b/blog/top-10-data-visualization-libraries.md @@ -2,12 +2,18 @@ author: Sumanth Papareddy and Tom Gotsman date: 2025-01-27 title: Top 10 Python Data Visualization Libraries in 2025 -description: Matplotlib vs Seaborn vs Plotly vs Bokeh vs Altair vs GeoPandas vs HoloViews vs Pygal vs Geoplotlib vs GGPlot +title_tag: "Top 10 Python Data Visualization Libraries" +description: Compare Matplotlib, Seaborn, Plotly, Bokeh, Altair, GeoPandas, HoloViews, Pygal, Geoplotlib, and GGPlot—the top Python data visualization libraries for 2025. image: /blog/data_visualization_blog.webp tag: Builder meta: [ {"name": "keywords", "content": "matplotlib, seaborn, plotly, bokeh, altair, geopandas, holoviews, pygal, Geoplotlib, ggplot"}, ] +faq: [ + {"question": "What is the best Python data visualization library for beginners?", "answer": "Matplotlib and Seaborn are great for beginners. Seaborn builds on Matplotlib with simpler, more elegant defaults for statistical plots. Both integrate well with pandas and NumPy."}, + {"question": "Which Python library is best for interactive dashboards?", "answer": "Plotly and Bokeh excel at interactive, web-based visualizations. Plotly is ideal for dashboards and business intelligence; Bokeh offers more customization for complex applications."}, + {"question": "Can I use these visualization libraries in Reflex web apps?", "answer": "Yes. Reflex supports Plotly via rx.plotly, Matplotlib via reflex-pyplot, and other chart types through its graphing components. See the Reflex docs for integration examples."}, +] --- @@ -194,4 +200,4 @@ Python's data visualization ecosystem includes Matplotlib, as a foundational too Choosing the best Python data visualization tools depends on factors such as visualization type, interactivity requirements, data complexity, and the target platform. Often, combining libraries can maximize their strengths and deliver the best results for your project. -If you're also looking to choose the right Python framework for your web app, check out our latest guide comparing [Reflex](https://reflex.dev), [Django](https://www.djangoproject.com), [Flask](https://flask.palletsprojects.com/en/stable/), [Gradio](https://www.gradio.app), [Streamlit](https://streamlit.io), [Dash](https://dash.plotly.com), and [FastAPI](https://fastapi.tiangolo.com). Whether you're building a full-stack application, data dashboard, or API, the [Top Python Web Development Frameworks in 2025](https://reflex.dev/blog/2024-12-20-python-comparison/) blog will help you make an informed decision based on each framework's unique capabilities. \ No newline at end of file +If you're also looking to choose the right Python framework for your web app, check out our latest guide comparing [Reflex](https://reflex.dev), [Django](https://www.djangoproject.com), [Flask](https://flask.palletsprojects.com/en/stable/), [Gradio](https://www.gradio.app), [Streamlit](https://streamlit.io), [Dash](https://dash.plotly.com), and [FastAPI](https://fastapi.tiangolo.com). Whether you're building a full-stack application, data dashboard, or API, the [Top Python Web Development Frameworks in 2025](https://reflex.dev/blog/python-comparison) blog will help you make an informed decision based on each framework's unique capabilities. \ No newline at end of file diff --git a/blog/2025-05-16-top-5-ai-app-builders.md b/blog/top-5-ai-app-builders.md similarity index 82% rename from blog/2025-05-16-top-5-ai-app-builders.md rename to blog/top-5-ai-app-builders.md index cf8f1bf2c..43eab1be7 100644 --- a/blog/2025-05-16-top-5-ai-app-builders.md +++ b/blog/top-5-ai-app-builders.md @@ -2,13 +2,18 @@ author: Tom Gotsman date: 2025-05-16 title: Top AI App Builders in 2025 -description: Reflex.build vs Replit Agent vs v0.dev vs Bolt.new vs Lovable.dev +title_tag: "Top 5 AI App Builders in 2025 - Comparison" +description: Compare Reflex.build, Replit Agent, v0.dev, Bolt.new, and Lovable.dev for building AI-powered web apps. Find the best fit for your use case. image: /blog/ai_app_builders.webp tag: Builder meta: [ {"name": "keywords", "content": "Reflex vs Replit, v0.dev alternatives, build AI apps, no-code AI tools, Replit agent, AI developer tools, app builders for developers, AI UI generators, v0.dev review, Replit AI tools, Lovable.dev, Bolt.new, AI in software development, full-stack AI apps"} ] - +faq: [ + {"question": "What is the best AI app builder for Python developers?", "answer": "Reflex.build is ideal for Python teams. It's a code-first AI app builder that lets you build full-stack apps in pure Python with an AI agent for scaffolding and editing code. It supports any PostgreSQL, MySQL, or SQLite database."}, + {"question": "What is the difference between Reflex.build and no-code AI tools?", "answer": "Reflex.build is code-first—you get production Python code you can customize. No-code tools like Lovable or v0.dev generate UI but limit your ability to extend and scale. Reflex suits data apps and internal tools that need real backend logic."}, + {"question": "Can I use an AI app builder for enterprise applications?", "answer": "Yes. Reflex.build is enterprise-ready with built-in auth, database integration, background tasks, and deployment. It also offers on-prem deployment for organizations with strict data requirements."}, +] --- diff --git a/blog/2025-12-17-top-7-enterprise-ai-app-builders-2026.md b/blog/top-7-enterprise-ai-app-builders-2026.md similarity index 91% rename from blog/2025-12-17-top-7-enterprise-ai-app-builders-2026.md rename to blog/top-7-enterprise-ai-app-builders-2026.md index 78a794246..86c35142f 100644 --- a/blog/2025-12-17-top-7-enterprise-ai-app-builders-2026.md +++ b/blog/top-7-enterprise-ai-app-builders-2026.md @@ -2,7 +2,8 @@ author: Tom Gotsman date: 2025-12-17 title: "Top 7 Enterprise AI App Builders in 2026: A Practical Comparison" -description: Reflex.build vs Microsoft Power Apps vs Superblocks vs Blaze.tech vs Knack vs Lovable.dev vs Replit Agent +title_tag: "Top 7 Enterprise AI App Builders 2026" +description: Compare Reflex.build, Microsoft Power Apps, Superblocks, Blaze.tech, Knack, Lovable.dev, and Replit Agent for enterprise AI app development in 2026. image: /blog/top7.webp tag: Builder meta: [ @@ -27,6 +28,11 @@ meta: [ " }, ] +faq: [ + {"question": "What is an enterprise AI app builder?", "answer": "Enterprise AI app builders are platforms that help teams create secure, compliant applications using AI assistance. They support regulated industries, on-prem deployment, and integration with existing data and identity systems."}, + {"question": "Which AI app builder is best for Python teams?", "answer": "Reflex.build is built for Python-first teams. It lets you build full-stack apps in pure Python with AI assistance, and offers on-prem deployment for organizations with strict data requirements."}, + {"question": "Can I run an AI app builder on-premises?", "answer": "Yes. Reflex Enterprise offers on-premises deployment, letting you run the AI app builder inside your own infrastructure with full control over data and compliance."}, +] --- diff --git a/blog/2026-01-09-top-python-web-frameworks-2026.md b/blog/top-python-web-frameworks-2026.md similarity index 98% rename from blog/2026-01-09-top-python-web-frameworks-2026.md rename to blog/top-python-web-frameworks-2026.md index 221e1ca1a..e9b755143 100644 --- a/blog/2026-01-09-top-python-web-frameworks-2026.md +++ b/blog/top-python-web-frameworks-2026.md @@ -4,8 +4,8 @@ author_bio: Tom Gotsman is a Software Engineer at Reflex. date: 2026-01-09 updated_at: 2026-01-09 title: Top Python Web Development Frameworks in 2026 -title_tag: Best Python Web Frameworks 2026 - Reflex, Django, Flask & More -description: Reflex vs Django vs Flask vs Gradio vs Streamlit vs Dash vs FastAPI +title_tag: "Best Python Web Frameworks 2026 Compared" +description: A comprehensive comparison of Reflex, Django, Flask, Gradio, Streamlit, Dash, and FastAPI—the top Python web frameworks in 2026 for full-stack and data apps. image: /blog/top_python_web_frameworks_2026.png tag: Builder meta: [ diff --git a/blog/2023-09-28-unlocking-new-workflows-with-background-tasks.md b/blog/unlocking-new-workflows-with-background-tasks.md similarity index 96% rename from blog/2023-09-28-unlocking-new-workflows-with-background-tasks.md rename to blog/unlocking-new-workflows-with-background-tasks.md index aac39927a..68e833bfa 100644 --- a/blog/2023-09-28-unlocking-new-workflows-with-background-tasks.md +++ b/blog/unlocking-new-workflows-with-background-tasks.md @@ -2,7 +2,7 @@ author: Masen Furer date: 2023-09-28 title: Unlocking New Workflows with Background Tasks -description: What is a background task and how can it help you build better apps? +description: Learn what background tasks are and how they help you build better Reflex apps. Run long-running jobs, send emails, and process data without blocking the UI. image: /blog/background_tasks.webp tag: Open Source meta: [ diff --git a/blog/2024-09-25-using-ag-grid-in-reflex.md b/blog/using-ag-grid-in-reflex.md similarity index 98% rename from blog/2024-09-25-using-ag-grid-in-reflex.md rename to blog/using-ag-grid-in-reflex.md index 7140e13b6..ca7b1d2ad 100644 --- a/blog/2024-09-25-using-ag-grid-in-reflex.md +++ b/blog/using-ag-grid-in-reflex.md @@ -2,7 +2,8 @@ author: Tom Gotsman date: 2024-10-03 title: AG Grid in Reflex -description: Getting started with powerful data tables in your Python web apps +title_tag: "How to Use AG Grid in Reflex Python Apps" +description: Get started with AG Grid in Reflex for powerful, enterprise-grade data tables in your Python web apps. Sort, filter, and edit data with ease. image: /blog/ag-grid.webp tag: Open Source meta: [ diff --git a/blog/2024-06-28-using-table-component.md b/blog/using-table-component.md similarity index 99% rename from blog/2024-06-28-using-table-component.md rename to blog/using-table-component.md index 86b64a829..4c00c22e2 100644 --- a/blog/2024-06-28-using-table-component.md +++ b/blog/using-table-component.md @@ -2,7 +2,8 @@ author: Tom Gotsman date: 2024-06-28 title: Creating Tables in Reflex -description: Describing main uses of the Table component with a Database +title_tag: "Creating Tables in Reflex - Python Data Tables" +description: Explore the main uses of Reflex's Table component with a database. Build CRUD apps, data dashboards, and admin panels with Python-native tables. image: /blog/table.webp tag: Open Source meta: [ diff --git a/case-studies/ansa.md b/case-studies/ansa.md index 4a3a2d41e..0fef9a42e 100644 --- a/case-studies/ansa.md +++ b/case-studies/ansa.md @@ -1,6 +1,7 @@ --- company: Ansa -description: "Why Ansa chose Reflex over a no-code/low-code framework for their workflow automations" +h1: "How Ansa Uses Reflex for AI-Powered Workflow Automation" +description: "Why Ansa chose Reflex over no-code and low-code frameworks for their workflow automations. Full Python control for AI-powered business process automation." domain: "https://www.ansa.co" founded: "New York, 2021" investors: "" diff --git a/case-studies/bayesline.md b/case-studies/bayesline.md index 61c50d0fa..d09936461 100644 --- a/case-studies/bayesline.md +++ b/case-studies/bayesline.md @@ -1,6 +1,6 @@ --- company: Bayesline -description: "Why Bayesline chose Reflex over Plotly Dash for their production-grade Python web app" +description: "Why Bayesline chose Reflex over Plotly Dash for their production-grade Python web app. Learn how they built scalable risk models and data visualizations." domain: "https://bayesline.com/" founded: "New York, 2024" investors: "Y Combinator" diff --git a/case-studies/sellerx.md b/case-studies/sellerx.md index a320bfb35..3731779e9 100644 --- a/case-studies/sellerx.md +++ b/case-studies/sellerx.md @@ -1,6 +1,6 @@ --- company: SellerX -description: "Why SellerX chose Reflex over Streamlit for their data processing pipeline" +description: "Why SellerX chose Reflex over Streamlit for their data processing pipeline. Building scalable e-commerce analytics and internal tools with Python." domain: "https://sellerx.com" founded: "Berlin, 2020" investors: "L Catterton, Sofina, BlackRock and more" diff --git a/pcweb/components/hosting_banner.py b/pcweb/components/hosting_banner.py index 07d490e4d..007924dc3 100644 --- a/pcweb/components/hosting_banner.py +++ b/pcweb/components/hosting_banner.py @@ -13,7 +13,7 @@ def glow() -> rx.Component: POST_LINK = "https://www.producthunt.com/products/reflex-5?launch=reflex-7" -BLOG_LINK = "/blog/2025-12-05-on-premises-deployment/" +BLOG_LINK = "/blog/on-premises-deployment" # October 25, 2025 12:01 AM PDT (UTC-7) = October 25, 2025 07:01 AM UTC DEADLINE = datetime.datetime(2025, 10, 25, 7, 1, tzinfo=datetime.UTC) diff --git a/pcweb/meta/meta.py b/pcweb/meta/meta.py index 1b9d25371..1aaca65e8 100644 --- a/pcweb/meta/meta.py +++ b/pcweb/meta/meta.py @@ -5,7 +5,7 @@ from pcweb.constants import REFLEX_DOMAIN, REFLEX_DOMAIN_URL, TWITTER_CREATOR TITLE = "The unified platform to build and scale enterprise apps." -ONE_LINE_DESCRIPTION = "Build with AI, iterate in Python, deploy to any cloud. The unified platform to build and scale enterprise apps." +ONE_LINE_DESCRIPTION = "Build with AI, iterate in Python, deploy to any cloud. Reflex is the platform for full-stack web apps and internal tools." # Common constants APPLICATION_NAME = "Reflex" @@ -183,3 +183,87 @@ def blog_jsonld( "@graph": graph, } return rx.el.script(json.dumps(data), type="application/ld+json") + + +def website_organization_jsonld(url: str = REFLEX_DOMAIN_URL) -> rx.Component: + """Create Organization + WebSite JSON-LD for the homepage.""" + org_url = REFLEX_DOMAIN_URL.rstrip("/") + data = { + "@context": "https://schema.org", + "@graph": [ + { + "@type": "Organization", + "@id": f"{org_url}/#organization", + "name": "Reflex", + "url": REFLEX_DOMAIN_URL, + "logo": f"{org_url}/meta/apple-touch-icon.png", + }, + { + "@type": "WebSite", + "name": "Reflex", + "url": url, + "description": ONE_LINE_DESCRIPTION, + "publisher": {"@id": f"{org_url}/#organization"}, + }, + ], + } + return rx.el.script(json.dumps(data), type="application/ld+json") + + +def blog_index_jsonld(posts: list[tuple[str, dict]], url: str) -> rx.Component: + """Create Blog JSON-LD with ItemList of posts for the blog index page.""" + items = [ + { + "@type": "ListItem", + "position": i + 1, + "url": f"{REFLEX_DOMAIN_URL.rstrip('/')}/blog/{path}", + "name": meta.get("title_tag") or meta.get("title", ""), + "datePublished": str(meta.get("date", "")), + } + for i, (path, meta) in enumerate(posts[:20]) + ] + blog_posts = [ + { + "@type": "BlogPosting", + "headline": meta.get("title_tag") or meta.get("title", ""), + "url": f"{REFLEX_DOMAIN_URL.rstrip('/')}/blog/{path}", + "datePublished": str(meta.get("date", "")), + } + for path, meta in posts[:20] + ] + data = { + "@context": "https://schema.org", + "@graph": [ + { + "@type": "Blog", + "name": "Reflex Blog", + "description": "Python web app tutorials, framework comparisons, and tips for building with Reflex.", + "url": url, + "publisher": { + "@type": "Organization", + "name": "Reflex", + "url": REFLEX_DOMAIN_URL, + }, + "blogPost": blog_posts, + }, + { + "@type": "ItemList", + "itemListElement": items, + "numberOfItems": len(items), + }, + ], + } + return rx.el.script(json.dumps(data), type="application/ld+json") + + +def pricing_jsonld(url: str) -> rx.Component: + """Create SoftwareApplication JSON-LD for the pricing page.""" + data = { + "@context": "https://schema.org", + "@type": "SoftwareApplication", + "name": "Reflex", + "applicationCategory": "DeveloperApplication", + "description": "The platform to build and scale enterprise apps. Python full-stack framework for web apps and internal tools.", + "url": url, + } + return rx.el.script(json.dumps(data), type="application/ld+json") diff --git a/pcweb/pages/about/__init__.py b/pcweb/pages/about/__init__.py index 60f50ff2e..33c908ac4 100644 --- a/pcweb/pages/about/__init__.py +++ b/pcweb/pages/about/__init__.py @@ -16,10 +16,11 @@ @marketing_page( path="/about", - title="Reflex · About", + title="About Reflex - Team, Mission & Python Web Apps", + description="Learn about Reflex, the team behind it, and our mission to make Python the best language for building full-stack web applications and internal tools.", meta=create_meta_tags( - title="Reflex · About", - description="About Reflex - The platform to build and scale enterprise apps", + title="About Reflex - Team, Mission & Python Web Apps", + description="Learn about Reflex, the team behind it, and our mission to make Python the best language for building full-stack web applications and internal tools.", image="/previews/index_preview.webp", ), ) diff --git a/pcweb/pages/blog/blog.py b/pcweb/pages/blog/blog.py index 3a3f0e0ef..e584981bf 100644 --- a/pcweb/pages/blog/blog.py +++ b/pcweb/pages/blog/blog.py @@ -4,7 +4,7 @@ from pcweb.components.hosting_banner import HostingBannerState from pcweb.components.marketing_button import button as marketing_button -from pcweb.meta.meta import create_meta_tags +from pcweb.meta.meta import blog_index_jsonld, create_meta_tags from pcweb.signup import IndexState from pcweb.templates.marketing_page import marketing_page @@ -174,21 +174,23 @@ def component_grid() -> rx.Component: @marketing_page( path="/blog", - title="Reflex Blog", - description="Reflex Blog", + title="Reflex Blog - Python Web App Development", + description="Reflex blog: tutorials, framework comparisons, release notes, and tips for building Python web apps, dashboards, and internal tools.", image="/previews/index_preview.webp", meta=create_meta_tags( - title="Reflex Blog", - description="Reflex Blog", + title="Reflex Blog - Python Web App Development", + description="Reflex blog: tutorials, framework comparisons, release notes, and tips for building Python web apps, dashboards, and internal tools.", image="/previews/index_preview.webp", url="https://reflex.dev/blog", ), ) def blogs(): + posts = [(path, doc.metadata) for path, doc in list(blog_data.items())[:20]] return rx.el.section( + blog_index_jsonld(posts, url="https://reflex.dev/blog"), rx.el.header( rx.el.h1( - "Blog", + "Reflex Blog - Python Web App Development", class_name="text-4xl font-[575] text-m-slate-12 dark:text-m-slate-3 text-center", ), rx.el.h2( diff --git a/pcweb/pages/blog/page.py b/pcweb/pages/blog/page.py index 14891c1cf..9c40989c7 100644 --- a/pcweb/pages/blog/page.py +++ b/pcweb/pages/blog/page.py @@ -234,7 +234,7 @@ def page(document, route) -> rx.Component: ), rx.el.header( rx.el.h1( - meta["title"], + meta.get("title_tag") or meta["title"], class_name="lg:text-5xl text-3xl text-m-slate-12 dark:text-m-slate-3 font-[575] mb-6 text-center text-balance", ), rx.el.h2( diff --git a/pcweb/pages/blog/paths.py b/pcweb/pages/blog/paths.py index 794a45568..d5ccfec93 100644 --- a/pcweb/pages/blog/paths.py +++ b/pcweb/pages/blog/paths.py @@ -5,12 +5,13 @@ def get_blog_data(paths): - blogs = {} - for path in sorted(paths, reverse=True): + items = [] + for path in paths: document = Document.from_file(path) path_str = str(path).replace(PAGES_PATH, "").replace(".md", "/") - blogs[path_str] = document - return blogs + items.append((path_str, document)) + items.sort(key=lambda x: str(x[1].metadata.get("date", "")), reverse=True) + return dict(items) def get_route(path: str): diff --git a/pcweb/pages/booked.py b/pcweb/pages/booked.py index dcd5b0a78..9332e59fc 100644 --- a/pcweb/pages/booked.py +++ b/pcweb/pages/booked.py @@ -27,7 +27,7 @@ def booked_title(): title="Call Successfully Booked | Reflex", meta=create_meta_tags( title="Call Successfully Booked | Reflex", - description="Your call has been successfully scheduled. A confirmation email has been sent with all the details.", + description="Your call has been successfully scheduled with Reflex. A confirmation email has been sent with all the details and calendar invites for your meeting.", image="/previews/index_preview.webp", ), ) diff --git a/pcweb/pages/check_your_email_demo.py b/pcweb/pages/check_your_email_demo.py index 5bef3da32..032f84be5 100644 --- a/pcweb/pages/check_your_email_demo.py +++ b/pcweb/pages/check_your_email_demo.py @@ -7,6 +7,7 @@ @webpage( path="/thank-you", title="Thanks for Submitting a Demo Request · Reflex.dev", + description="Thanks for your demo request. Check your email for next steps to schedule a call with Reflex.", add_as_page=True, ) def page_thank_you(): diff --git a/pcweb/pages/customers/data/customers.py b/pcweb/pages/customers/data/customers.py index fdf2c8733..df778cec3 100644 --- a/pcweb/pages/customers/data/customers.py +++ b/pcweb/pages/customers/data/customers.py @@ -43,6 +43,7 @@ def get_route(path: str): path=route, company=document.metadata["company"], description=document.metadata["description"], + h1=document.metadata.get("h1"), domain=document.metadata["domain"], founded=document.metadata["founded"], investors=document.metadata["investors"], diff --git a/pcweb/pages/customers/landing.py b/pcweb/pages/customers/landing.py index be5e8dfd7..92bf93160 100644 --- a/pcweb/pages/customers/landing.py +++ b/pcweb/pages/customers/landing.py @@ -7,7 +7,11 @@ from pcweb.templates.mainpage import mainpage -@mainpage(path="/customers", title="Reflex · Customers") +@mainpage( + path="/customers", + title="Reflex Customer Stories - Case Studies", + description="Case studies: Bayesline, SellerX, and Ansa use Reflex to build production Python web apps. Real success stories.", +) def customers() -> rx.Component: """Get the Customers landing page.""" return rx.box( diff --git a/pcweb/pages/databricks/databricks.py b/pcweb/pages/databricks/databricks.py index 55e3e27d5..b69644c02 100644 --- a/pcweb/pages/databricks/databricks.py +++ b/pcweb/pages/databricks/databricks.py @@ -11,10 +11,11 @@ @mainpage( path="/databricks", - title="Databricks - Reflex", + title="Reflex on Databricks - Deploy Python Apps", + description="Deploy Reflex apps on Databricks and Snowflake. Build Python web apps in your data platform.", meta=create_meta_tags( - "Databricks - Reflex", - "Databricks - Reflex", + "Reflex on Databricks - Deploy Python Apps", + "Deploy Reflex apps on Databricks and Snowflake. Build Python web apps in your data platform.", "/previews/databricks_preview.png", ), ) diff --git a/pcweb/pages/demo/book_demo.py b/pcweb/pages/demo/book_demo.py index a5b69165f..2d4effa36 100644 --- a/pcweb/pages/demo/book_demo.py +++ b/pcweb/pages/demo/book_demo.py @@ -6,7 +6,12 @@ from pcweb.templates.mainpage import mainpage -@mainpage(path="/demo", title="Reflex · Book Demo", meta=meta_tags) +@mainpage( + path="/demo", + title="Book a Demo - Reflex Enterprise", + description="Schedule a demo of Reflex Enterprise. See how AI helps your team build and deploy Python web apps.", + meta=meta_tags, +) def book_demo() -> rx.Component: """Get the Book Demo landing page.""" return rx.el.main( diff --git a/pcweb/pages/demo/header.py b/pcweb/pages/demo/header.py index 0063f1ef6..15538d4ad 100644 --- a/pcweb/pages/demo/header.py +++ b/pcweb/pages/demo/header.py @@ -10,7 +10,7 @@ def custom_quote_form() -> rx.Component: """Custom quote form component with clean, maintainable structure.""" return rx.box( rx.box( - rx.el.h2( + rx.el.h1( "Book a Demo", class_name="text-slate-12 text-4xl font-bold", ), diff --git a/pcweb/pages/docs_landing/__init__.py b/pcweb/pages/docs_landing/__init__.py index e8d96ef28..80cd17855 100644 --- a/pcweb/pages/docs_landing/__init__.py +++ b/pcweb/pages/docs_landing/__init__.py @@ -18,11 +18,12 @@ @rx.page( route="/docs", - title="Reflex · Docs", + title="Reflex Documentation - Build Web Apps in Pure Python", meta=create_meta_tags( - title="Reflex · Docs", - description="Docs for Reflex - The platform to build and scale enterprise apps", + title="Reflex Documentation - Build Web Apps in Pure Python", + description="Reflex documentation: tutorials, API reference, and guides for building full-stack Python web apps. Get started in minutes.", image="/previews/index_preview.webp", + url="https://reflex.dev/docs", ), ) def docs_landing() -> rx.Component: diff --git a/pcweb/pages/errors.py b/pcweb/pages/errors.py index 733b5fb87..6a6b8af6b 100644 --- a/pcweb/pages/errors.py +++ b/pcweb/pages/errors.py @@ -234,7 +234,11 @@ def errors_content() -> rx.Component: ) -@webpage(path="/errors", title="Common Errors · Reflex") +@webpage( + path="/errors", + title="Common Reflex Errors & Troubleshooting Guide", + description="Solutions for common Reflex errors: hydration, state, and build issues. Get your Python web app back on track.", +) def errors() -> rx.Component: return rx.el.section( rx.box( diff --git a/pcweb/pages/faq.py b/pcweb/pages/faq.py index 2e8d291da..4718e6c82 100644 --- a/pcweb/pages/faq.py +++ b/pcweb/pages/faq.py @@ -154,7 +154,11 @@ def faq_item(question: str, answer: str, index: int): ) -@webpage(path="/faq", title="Frequently Asked Questions · Reflex") +@webpage( + path="/faq", + title="Frequently Asked Questions · Reflex", + description="FAQ: Reflex installation, deployment, pricing, and how it compares to Streamlit and Django. Get your Python web app questions answered.", +) def faq(): return rx.el.section( rx.box( diff --git a/pcweb/pages/framework/framework.py b/pcweb/pages/framework/framework.py index a99016a63..0ad2a53e6 100644 --- a/pcweb/pages/framework/framework.py +++ b/pcweb/pages/framework/framework.py @@ -14,7 +14,12 @@ from .views.stats import stats -@mainpage(path="/open-source", title="Reflex · Web apps in Pure Python", meta=meta_tags) +@mainpage( + path="/open-source", + title="Reflex · Web apps in Pure Python", + description="Reflex is the open-source Python framework for full-stack web apps. No JavaScript required—frontend and backend in pure Python.", + meta=meta_tags, +) def framework() -> rx.Component: """Get the main Reflex landing page.""" return rx.box( diff --git a/pcweb/pages/gallery/gallery.py b/pcweb/pages/gallery/gallery.py index a4ef3ffa3..6f4fd6790 100644 --- a/pcweb/pages/gallery/gallery.py +++ b/pcweb/pages/gallery/gallery.py @@ -230,7 +230,7 @@ def create_grid_with_items(): def create_header(): return rx.box( rx.box( - rx.el.h2( + rx.el.h1( "Reflex Build Templates", class_name="text-slate-12 text-4xl font-bold mb-6", ), @@ -244,7 +244,11 @@ def create_header(): ) -@webpage(path="/templates", title="Templates · Reflex") +@webpage( + path="/templates", + title="Reflex App Templates - Python Dashboards & Tools", + description="Reflex app templates: dashboards, chatbots, data tools, and AI apps. Start from a template and customize in Python.", +) def gallery() -> rx.Component: return rx.el.section( rx.box( diff --git a/pcweb/pages/hosting/hosting.py b/pcweb/pages/hosting/hosting.py index fb37aba4c..5b8a76fc6 100644 --- a/pcweb/pages/hosting/hosting.py +++ b/pcweb/pages/hosting/hosting.py @@ -12,7 +12,12 @@ from .views.templates import templates -@mainpage(path="/hosting", title="Reflex · Hosting", meta=hosting_meta_tags) +@mainpage( + path="/hosting", + title="Reflex Hosting - Deploy Python Apps to Cloud", + description="Deploy Reflex apps to the cloud or self-host. Zero-config deployment, auto-scaling, and enterprise reliability.", + meta=hosting_meta_tags, +) def hosting_landing() -> rx.Component: """Get the main Reflex landing page.""" return rx.box( diff --git a/pcweb/pages/landing/landing.py b/pcweb/pages/landing/landing.py index f80d83dc1..0db7b6086 100644 --- a/pcweb/pages/landing/landing.py +++ b/pcweb/pages/landing/landing.py @@ -1,6 +1,6 @@ import reflex as rx -from pcweb.meta.meta import meta_tags +from pcweb.meta.meta import meta_tags, website_organization_jsonld from pcweb.pages.landing.views.ai_bento import ai_bento from pcweb.pages.landing.views.app_build import app_build from pcweb.pages.landing.views.companies import companies @@ -23,10 +23,12 @@ @mainpage( path="/", title="Reflex · The platform to build and scale enterprise apps", + description="Build with AI, iterate in Python, deploy to any cloud. Reflex is the unified platform for full-stack web apps and internal tools.", meta=meta_tags, ) def landing() -> rx.Component: return rx.el.div( + website_organization_jsonld(url="https://reflex.dev"), hero(), app_build(), social_stats(), diff --git a/pcweb/pages/meeting_successfully_booked.py b/pcweb/pages/meeting_successfully_booked.py index 535da7acb..49e699a6a 100644 --- a/pcweb/pages/meeting_successfully_booked.py +++ b/pcweb/pages/meeting_successfully_booked.py @@ -7,6 +7,7 @@ @webpage( path="/meeting-successfully-booked", title="Meeting Successfully Booked · Reflex.dev", + description="Your meeting is scheduled. Check your email for the calendar invite and meeting details.", add_as_page=True, ) def page_meeting_successfully_booked(): diff --git a/pcweb/pages/pricing/pricing.py b/pcweb/pages/pricing/pricing.py index f19af2080..3e32778de 100644 --- a/pcweb/pages/pricing/pricing.py +++ b/pcweb/pages/pricing/pricing.py @@ -1,6 +1,6 @@ import reflex as rx -from pcweb.meta.meta import hosting_meta_tags +from pcweb.meta.meta import hosting_meta_tags, pricing_jsonld from pcweb.pages.framework.index_colors import index_colors from pcweb.pages.framework.views.divider import divider from pcweb.pages.framework.views.footer_index import footer_index @@ -14,7 +14,8 @@ @rx.page( route=pricing_path, - title="Reflex · Pricing", + title="Reflex Pricing Plans - Cloud & Self-Hosted", + description="Compare Reflex pricing plans: free tier, Pro, Team, and Enterprise. Cloud hosting or self-hosted deployment.", meta=hosting_meta_tags, ) def pricing() -> rx.Component: @@ -22,6 +23,7 @@ def pricing() -> rx.Component: from pcweb.views.marketing_navbar import marketing_navbar return rx.box( + pricing_jsonld(url="https://reflex.dev/pricing"), index_colors(), marketing_navbar(), rx.el.main( diff --git a/pcweb/pages/sales.py b/pcweb/pages/sales.py index 79aa942ba..490f5f305 100644 --- a/pcweb/pages/sales.py +++ b/pcweb/pages/sales.py @@ -4,10 +4,18 @@ from pcweb.templates.webpage import webpage -@webpage(path="/sales", title="Pricing · Reflex") +@webpage( + path="/sales", + title="Contact Sales - Enterprise Pricing | Reflex", + description="Get a custom quote for Reflex Enterprise. On-prem deployment, dedicated support, and enterprise features.", +) def sales(): return rx.el.section( rx.box( + rx.el.h1( + "Contact Sales - Enterprise Pricing", + class_name="text-4xl font-[575] text-m-slate-12 dark:text-m-slate-3 text-center mb-8", + ), rx.box( demo_form(), class_name="mt-12 w-full", diff --git a/pcweb/pages/use_cases/consulting/__init__.py b/pcweb/pages/use_cases/consulting/__init__.py index ac6749840..5e28b7b1f 100644 --- a/pcweb/pages/use_cases/consulting/__init__.py +++ b/pcweb/pages/use_cases/consulting/__init__.py @@ -15,7 +15,10 @@ @mainpage( - path="/use-cases/consulting", title="Consulting Use Case - Reflex", meta=meta_tags + path="/use-cases/consulting", + title="Consulting Use Case - Build Client Tools with Reflex", + description="How consulting firms use Reflex for client dashboards and internal tools. Python web apps for professional services.", + meta=meta_tags, ) def consulting_use_case_page() -> rx.Component: return rx.el.div( diff --git a/pcweb/pages/use_cases/finance/__init__.py b/pcweb/pages/use_cases/finance/__init__.py index 72a3ef7fe..3e0da4f0d 100644 --- a/pcweb/pages/use_cases/finance/__init__.py +++ b/pcweb/pages/use_cases/finance/__init__.py @@ -15,7 +15,12 @@ from pcweb.templates.mainpage import mainpage -@mainpage(path="/use-cases/finance", title="Finance Use Case - Reflex", meta=meta_tags) +@mainpage( + path="/use-cases/finance", + title="Finance Use Case - Build Fintech Apps with Reflex", + description="Finance use of Reflex: dashboards, risk models, and internal tools. Python web apps for fintech.", + meta=meta_tags, +) def finance_use_case_page() -> rx.Component: return rx.el.div( hero(), diff --git a/pcweb/pages/use_cases/government/__init__.py b/pcweb/pages/use_cases/government/__init__.py index 7377d12d3..e793d69da 100644 --- a/pcweb/pages/use_cases/government/__init__.py +++ b/pcweb/pages/use_cases/government/__init__.py @@ -15,7 +15,10 @@ @mainpage( - path="/use-cases/government", title="Government Use Case - Reflex", meta=meta_tags + path="/use-cases/government", + title="Government Use Case - Build Civic Apps with Reflex", + description="Government use of Reflex: civic apps, data portals, and secure internal tools for the public sector.", + meta=meta_tags, ) def government_use_case_page() -> rx.Component: return rx.el.div( diff --git a/pcweb/pages/use_cases/healthcare/__init__.py b/pcweb/pages/use_cases/healthcare/__init__.py index 8aca31b53..2764cfa68 100644 --- a/pcweb/pages/use_cases/healthcare/__init__.py +++ b/pcweb/pages/use_cases/healthcare/__init__.py @@ -15,7 +15,10 @@ @mainpage( - path="/use-cases/healthcare", title="Healthcare Use Case - Reflex", meta=meta_tags + path="/use-cases/healthcare", + title="Healthcare Use Case - Build Medical Apps with Reflex", + description="Healthcare use of Reflex: HIPAA-compliant apps, patient dashboards, and clinical tools in Python.", + meta=meta_tags, ) def healthcare_use_case_page() -> rx.Component: return rx.el.div( diff --git a/pcweb/pages/use_cases/use_cases.py b/pcweb/pages/use_cases/use_cases.py index c1037d0fb..2dc690b5a 100644 --- a/pcweb/pages/use_cases/use_cases.py +++ b/pcweb/pages/use_cases/use_cases.py @@ -8,9 +8,19 @@ def use_cases_content() -> rx.Component: - return rx.box(xd.render(document, document.filename)) + return rx.box( + rx.el.h1( + "Use Cases by Industry", + class_name="text-slate-12 text-4xl font-bold mb-6 text-center", + ), + xd.render(document, document.filename), + ) -@highlight_page(path="/use-cases", title="Use Cases - Reflex") +@highlight_page( + path="/use-cases", + title="Use Cases by Industry - Reflex", + description="How organizations use Reflex for finance, healthcare, government, and consulting. Python web apps for dashboards, CRUD, and internal tools.", +) def use_cases_page(): return use_cases_content() diff --git a/pcweb/pcweb.py b/pcweb/pcweb.py index 950d2fd06..bfdedf9c6 100644 --- a/pcweb/pcweb.py +++ b/pcweb/pcweb.py @@ -151,14 +151,83 @@ ("/docs/overview", "/docs/getting-started/introduction"), ("/docs/assets/referencing_assets", "/docs/assets/overview"), ("/changelog", "https://github.com/reflex-dev/reflex/releases"), + # Blog: redirect old date-prefixed URLs to new slug-only URLs + ("/blog/2023-06-28-rebrand-to-reflex", "/blog/rebrand-to-reflex"), + ("/blog/2023-08-02-seed-annoucement", "/blog/seed-annoucement"), + ( + "/blog/2023-09-28-unlocking-new-workflows-with-background-tasks", + "/blog/unlocking-new-workflows-with-background-tasks", + ), + ("/blog/2023-10-11-graphing-update", "/blog/graphing-update"), + ( + "/blog/2023-10-25-implementing-sign-in-with-google", + "/blog/implementing-sign-in-with-google", + ), + ("/blog/2024-02-16-reflex-v0-4-0", "/blog/reflex-v0-4-0"), + ("/blog/2024-03-21-reflex-architecture", "/blog/reflex-architecture"), + ("/blog/2024-03-27-structuring-a-large-app", "/blog/structuring-a-large-app"), + ("/blog/2024-04-16-custom-components", "/blog/custom-components"), + ("/blog/2024-06-28-using-table-component", "/blog/using-table-component"), + ("/blog/2024-09-21-reflex-v060", "/blog/reflex-v060"), + ("/blog/2024-09-25-using-ag-grid-in-reflex", "/blog/using-ag-grid-in-reflex"), + ( + "/blog/2024-10-8-self-hosting-reflex-with-docker", + "/blog/self-hosting-reflex-with-docker", + ), + ( + "/blog/2024-11-19-microsoft-azure-authentication", + "/blog/microsoft-azure-authentication", + ), + ("/blog/2024-12-05-reflex-cloud", "/blog/reflex-cloud"), + ("/blog/2024-12-20-python-comparison", "/blog/python-comparison"), ( - "/blog/2025-10-27-top-10-data-visualization-libraries", "/blog/2025-01-27-top-10-data-visualization-libraries", + "/blog/top-10-data-visualization-libraries", + ), + ("/blog/2025-05-16-top-5-ai-app-builders", "/blog/top-5-ai-app-builders"), + ( + "/blog/2025-06-03-internal-tool-builders-2025", + "/blog/internal-tool-builders-2025", + ), + ("/blog/2025-06-20-reflex-dash", "/blog/reflex-dash"), + ( + "/blog/2025-06-30-reflex-databricks-partnership", + "/blog/reflex-databricks-partnership", + ), + ("/blog/2025-07-01-reflex-080", "/blog/reflex-080"), + ("/blog/2025-08-20-reflex-streamlit", "/blog/reflex-streamlit"), + ("/blog/2025-09-03-reflex-jupyter", "/blog/reflex-jupyter"), + ("/blog/2025-12-05-on-premises-deployment", "/blog/on-premises-deployment"), + ( + "/blog/2025-12-17-top-7-enterprise-ai-app-builders-2026", + "/blog/top-7-enterprise-ai-app-builders-2026", + ), + ( + "/blog/2025-10-27-top-10-data-visualization-libraries", + "/blog/top-10-data-visualization-libraries", + ), + ( + "/blog/2026-01-09-top-python-web-frameworks-2026", + "/blog/top-python-web-frameworks-2026", ), ] + +def _redirect_page(): + return rx.fragment( + rx.el.h1("Redirecting", class_name="sr-only"), + ) + + for source, target in redirects: if _check_whitelisted_path(target): - app.add_page(lambda: rx.fragment(), route=source, on_load=rx.redirect(target)) + app.add_page( + _redirect_page, + route=source, + title="Redirecting - Reflex Web Framework", + description="You are being redirected to the requested page.", + on_load=rx.redirect(target), + context={"sitemap": None}, + ) app.add_page(page404.component, route=page404.path) diff --git a/pcweb/templates/gallery_app_page.py b/pcweb/templates/gallery_app_page.py index 1cb4f4b0b..583a3f0a0 100644 --- a/pcweb/templates/gallery_app_page.py +++ b/pcweb/templates/gallery_app_page.py @@ -81,7 +81,7 @@ def wrapper(*children, **props) -> rx.Component: return Route( path=path, - title=title + " · Reflex App", + title=title.replace("_", " ").title() + " - Reflex App Template", description=description, meta=meta, image=image, diff --git a/pcweb/templates/mainpage.py b/pcweb/templates/mainpage.py index 49e1bd3cb..21c3f298f 100644 --- a/pcweb/templates/mainpage.py +++ b/pcweb/templates/mainpage.py @@ -6,7 +6,7 @@ from pcweb.route import Route DEFAULT_TITLE = "The platform to build and scale enterprise apps" -DEFAULT_DESCRIPTION = "Connect to all your company data and systems to build secure internal apps with AI. Deployed on prem with built-in governance and production-grade reliability, so technical and nontechnical teams can ship together." +DEFAULT_DESCRIPTION = "Build secure internal apps with AI. Deploy on prem or cloud with governance. Technical and nontechnical teams ship together." def mainpage( diff --git a/pcweb/templates/marketing_page.py b/pcweb/templates/marketing_page.py index b43582ab3..d92b9fb63 100644 --- a/pcweb/templates/marketing_page.py +++ b/pcweb/templates/marketing_page.py @@ -8,7 +8,7 @@ from pcweb.route import Route DEFAULT_TITLE = "The platform to build and scale enterprise apps" -DEFAULT_DESCRIPTION = "Connect to all your company data and systems to build secure internal apps with AI. Deployed on prem with built-in governance and production-grade reliability, so technical and nontechnical teams can ship together." +DEFAULT_DESCRIPTION = "Build secure internal apps with AI. Deploy on prem or cloud with governance. Technical and nontechnical teams ship together." def marketing_page( diff --git a/pcweb/templates/storypage.py b/pcweb/templates/storypage.py index e03238e63..f84f0c570 100644 --- a/pcweb/templates/storypage.py +++ b/pcweb/templates/storypage.py @@ -8,7 +8,12 @@ from pcweb.route import Route -def hero(company: str, description: str, stats: list[dict[str, str]]) -> rx.Component: +def hero( + company: str, + description: str, + stats: list[dict[str, str]], + h1: str | None = None, +) -> rx.Component: return rx.box( rx.link( rx.icon( @@ -22,7 +27,7 @@ def hero(company: str, description: str, stats: list[dict[str, str]]) -> rx.Comp class_name="flex items-center gap-2 text-slate-9 hover:!text-slate-11 transition-color w-fit", ), rx.el.h1( - company, + h1 if h1 else company, class_name="gradient-heading font-x-large lg:font-xx-large text-start text-transparent", ), rx.el.h2(description, class_name="text-slate-9 font-md-smbold"), @@ -201,6 +206,7 @@ def storypage( path: str, description: str, company: str, + h1: str | None = None, domain: str | None = None, founded: str | None = None, investors: str | None = None, @@ -217,6 +223,7 @@ def storypage( path: The path of the page. description: The description of the page. company: The company name. + h1: Optional H1 for the hero. Used when company name alone is too short for SEO. domain: The company domain. founded: The company founded date. investors: The company investors. @@ -263,7 +270,7 @@ def wrapper(*children, **props) -> rx.Component: marketing_navbar(), company_card(company, founded, investors, domain), rx.el.main( - hero(company, description, stats), + hero(company, description, stats, h1), contents(*children, **props), more_customers(company), rx.box(class_name="flex-grow"), @@ -280,7 +287,7 @@ def wrapper(*children, **props) -> rx.Component: return Route( path=path, - title=company + " · Reflex Customer Story", + title=company + " Case Study - Reflex Customer Stories", description=description, meta=meta, component=wrapper, diff --git a/pcweb/templates/webpage.py b/pcweb/templates/webpage.py index 43c19900b..42654dab9 100644 --- a/pcweb/templates/webpage.py +++ b/pcweb/templates/webpage.py @@ -6,7 +6,7 @@ from pcweb.route import Route DEFAULT_TITLE = "The platform to build and scale enterprise apps" -DEFAULT_DESCRIPTION = "Connect to all your company data and systems to build secure internal apps with AI. Deployed on prem with built-in governance and production-grade reliability, so technical and nontechnical teams can ship together." +DEFAULT_DESCRIPTION = "Build secure internal apps with AI. Deploy on prem or cloud with governance. Technical and nontechnical teams ship together." def webpage(