Skip to content

Commit b61f631

Browse files
authored
Add on-premises deployment blog post and banner (#1702)
* Add on-premises deployment blog post and banner - Add new blog post about Reflex Build on-premises deployment - Add banner linking to on-premises blog post - Update blog image display to prevent cropping - Add images: on-prem.png, industries.png, connection.png * Update blog post author to Alek Petuskey * Update 'book a demo' link to open demo form dialog * Center and add spacing to Book a Demo button * Address PR review comments: add Secure Company Data Integration section, update title with AI, mention Reflex Cloud on-prem, and fix formatting * Update blog post title and description per review feedback * Address blog post comments: add data sources mention, open source code ownership, custom AI models, and multi-cloud support * Apply ruff formatting fixes * Clear whitelist to build all pages
1 parent eb6bd1d commit b61f631

File tree

8 files changed

+194
-30
lines changed

8 files changed

+194
-30
lines changed

assets/blog/connection.png

622 KB
Loading

assets/blog/industries.png

461 KB
Loading

assets/blog/on-prem.png

693 KB
Loading
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
---
2+
author: Alek Petuskey
3+
date: 2025-12-05
4+
title: "Reflex Build On-Prem: The Secure AI App Builder That Runs Inside Your Company Infrastructure"
5+
description: An enterprise, on-premises AI app builder for developing secure internal tools and dashboards using Python.
6+
image: /blog/on-prem.png
7+
meta: [
8+
{
9+
"name": "keywords",
10+
"content": "
11+
on-premises deployment,
12+
self-hosted reflex,
13+
enterprise deployment,
14+
private cloud deployment,
15+
air-gapped deployment,
16+
reflex enterprise,
17+
secure app deployment,
18+
compliance-ready deployment,
19+
infrastructure control,
20+
enterprise security,
21+
data sovereignty,
22+
private infrastructure,
23+
reflex self-hosting,
24+
enterprise python apps,
25+
secure web app deployment,
26+
"
27+
},
28+
]
29+
---
30+
31+
```python exec
32+
import reflex as rx
33+
import reflex_ui as ui
34+
from pcweb import pages, constants
35+
from reflex_image_zoom import image_zoom
36+
from reflex_ui.blocks.demo_form import demo_form_dialog
37+
```
38+
39+
For organizations with strict security, compliance, or data sovereignty requirements, building applications on your own infrastructure isn't just a preference — it's a necessity. With Reflex Enterprise, you can now run **Reflex Build**—our AI-powered app builder—on-premises or in your own private cloud, giving you complete control over your development environment while maintaining all the productivity benefits of building apps with AI. You can securely hook up with all your company data sources, internal services, documentation, databases, and APIs—all within your own infrastructure.
40+
41+
## Why On-Premises Deployment?
42+
43+
Many enterprises face unique challenges that require on-premises solutions:
44+
45+
```python eval
46+
rx.el.div(
47+
image_zoom(
48+
rx.image(
49+
src="/blog/connection.png",
50+
class_name="p-2 rounded-md h-auto w-full",
51+
border=f"0.81px solid {rx.color('slate', 5)}",
52+
),
53+
class_name="rounded-md overflow-hidden",
54+
),
55+
class_name="w-full flex flex-col rounded-md cursor-pointer py-6",
56+
)
57+
```
58+
59+
### Security and Compliance
60+
61+
Organizations in regulated industries—finance, healthcare, government, and defense—often have strict requirements about where their data can reside and how applications must be secured. On-premises deployment ensures:
62+
63+
- **Data Sovereignty**: Your data never leaves your infrastructure
64+
- **Compliance**: Meet HIPAA, SOC 2, GDPR, and other regulatory requirements
65+
- **Air-Gapped Environments**: Deploy in completely isolated networks
66+
- **Custom Security Policies**: Implement your own security controls and monitoring
67+
- **Secure Data Source Integration**: Easily and securely connect with your company's data sources using our AI-powered integration capabilities
68+
69+
### Infrastructure Control
70+
71+
Some organizations need full control over their infrastructure:
72+
73+
- **Existing Cloud Investments**: Leverage your current AWS, Azure, or GCP infrastructure
74+
- **Custom Networking**: Integrate with your existing network architecture
75+
- **Resource Management**: Allocate resources according to your policies
76+
- **Integration Requirements**: Connect with internal systems and services
77+
78+
## What's Included
79+
80+
Reflex Enterprise on-premises deployment includes **Reflex Build** running securely in your environment. You can also deploy **Reflex Cloud** on-premises to manage all your Reflex apps in a unified place, providing a complete on-premises solution for both building and deploying applications.
81+
82+
### Secure Company Data Integration
83+
84+
One of the biggest unlocks with Reflex Build on-premises is the ability to securely connect with your company's data sources and systems:
85+
86+
- **Company Data Sources**: Easily integrate with your internal databases, APIs, documentation, and data warehouses
87+
- **Authentication Providers**: Connect with your existing identity providers (SSO/SAML) and authentication systems
88+
- **Internal Services**: Seamlessly connect with all your company's internal services and APIs
89+
- **Your Own AI Models**: Hook up with your own AI models so no prompt information leaves your infrastructure—complete data privacy and control
90+
- **Zero External Dependencies**: All data access and processing happens within your infrastructure
91+
92+
### Infrastructure & Deployment
93+
94+
- **Complete Deployment on Your Infrastructure**: Full deployment with standard Helm charts and Docker containerization
95+
- **Fully Maintained by Reflex Team**: Automatic updates with latest security patches and features
96+
- **System Integration**: Full integration with your PostgreSQL databases and internal backend systems
97+
- **Performance Optimization**: Container lifecycle optimization and real-time state synchronization
98+
99+
### Data Sovereignty & Security
100+
101+
- **Zero PII Collection**: No Personally Identifiable Information collected
102+
- **Strict Data Confinement**: All data remains exclusively within your controlled infrastructure
103+
- **Access Control**: Data accessible only by authorized personnel, compliant with your security protocols
104+
- **SSO/SAML Integration**: Connect with your existing identity provider
105+
- **Audit Logs**: Complete audit trail of all builder activities
106+
107+
### Builder Features
108+
109+
- **AI-Powered App Building**: Build full-stack Python web apps using natural language prompts
110+
- **Private Projects**: Keep all projects private within your infrastructure
111+
- **Team Collaboration**: Manage team members and access controls
112+
- **Enterprise Integrations**: Connect with all your company's internal services, documentation, databases, and APIs through secure, AI-powered integration
113+
- **Download App Code**: Export generated app code for full control—all code is based on open source software, so you own all the code that is generated
114+
115+
## Use Cases
116+
117+
```python eval
118+
rx.el.div(
119+
image_zoom(
120+
rx.image(
121+
src="/blog/industries.png",
122+
class_name="p-2 rounded-md h-auto w-full",
123+
border=f"0.81px solid {rx.color('slate', 5)}",
124+
),
125+
class_name="rounded-md overflow-hidden",
126+
),
127+
class_name="w-full flex flex-col rounded-md cursor-pointer py-6",
128+
)
129+
```
130+
131+
### Financial Services
132+
133+
Financial institutions need to build internal tools and customer-facing apps while ensuring all code generation and app development happens within their controlled infrastructure. Reflex Build on-premises enables secure AI-powered app building in air-gapped environments.
134+
135+
### Government and Defense
136+
137+
Organizations with strict security requirements can use Reflex Build in completely isolated networks, meeting the highest security standards while leveraging AI to build modern web applications without exposing sensitive data.
138+
139+
### Healthcare
140+
141+
Healthcare organizations can run Reflex Build on-premises to meet HIPAA requirements, ensuring all app building activities and generated code remain within their controlled infrastructure.
142+
143+
### Multi-Cloud Enterprises
144+
145+
Large enterprises can run Reflex Build inside their own AWS, Azure, and GCP environments, integrating with their existing SSO, logging, and infrastructure management systems while maintaining complete control over the development process. Connect seamlessly with data platforms like Databricks and Snowflake to build AI-powered apps that leverage your existing data infrastructure.
146+
147+
## What's Next
148+
149+
If you're interested in deploying Reflex on-premises, book a demo to discuss your specific requirements. Our team will work with you to design a deployment that meets your security, compliance, and infrastructure needs.
150+
151+
```python eval
152+
rx.el.div(
153+
demo_form_dialog(
154+
ui.button(
155+
"Book a Demo",
156+
variant="primary",
157+
class_name="font-semibold",
158+
),
159+
),
160+
class_name="flex justify-center items-center my-8",
161+
)
162+
```
163+
164+
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.
165+

pcweb/components/hosting_banner.py

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def glow() -> rx.Component:
1010

1111

1212
POST_LINK = "https://www.producthunt.com/products/reflex-5?launch=reflex-7"
13+
BLOG_LINK = "/blog/2025-12-05-on-premises-deployment/"
1314

1415
# October 25, 2025 12:01 AM PDT (UTC-7) = October 25, 2025 07:01 AM UTC
1516
DEADLINE = datetime.datetime(2025, 10, 25, 7, 1, tzinfo=datetime.UTC)
@@ -28,6 +29,11 @@ def check_deadline(self):
2829
if datetime.datetime.now(datetime.UTC) < DEADLINE:
2930
self.show_banner = True
3031

32+
@rx.event
33+
def show_blog_banner(self):
34+
"""Show the on-premises blog banner."""
35+
self.show_banner = True
36+
3137
@rx.var
3238
def is_banner_visible(self) -> bool:
3339
return self.show_banner and not self.force_hide_banner
@@ -64,46 +70,35 @@ def hosting_banner() -> rx.Component:
6470
rx.box(
6571
# Header text with responsive spans
6672
rx.el.span(
67-
"Launch",
73+
"New",
6874
class_name="items-center font-medium px-1.5 h-5 rounded-md text-xs bg-violet-9 text-slate-1 z-[1] inline-flex",
6975
),
7076
rx.text(
7177
rx.el.span(
72-
"We're live on Product Hunt - ",
78+
"Reflex Build On-Prem - A secure builder running in your environment.",
7379
class_name="inline-block text-slate-12 font-semibold text-sm",
7480
),
75-
# Mobile CTA: inline on small, hidden on md+
76-
rx.el.span(
77-
" 50% ",
78-
class_name="text-slate-12 font-semibold text-sm underline decoration-slate-11",
79-
),
80-
rx.el.span(
81-
" launch",
82-
class_name="text-slate-12 font-semibold text-sm underline decoration-slate-11 hidden md:inline-block",
83-
),
84-
rx.el.span(
85-
" discount!",
86-
class_name="text-slate-12 font-semibold text-sm underline decoration-slate-11",
87-
),
8881
class_name="text-slate-12 font-semibold text-sm z-[1]",
8982
),
90-
# Standalone CTA button: hidden on small, inline on md+
91-
timer(),
83+
rx.el.span(
84+
"Learn more",
85+
class_name="text-slate-12 font-semibold text-sm underline decoration-slate-11",
86+
),
9287
class_name="flex items-center md:gap-3.5 gap-2",
9388
)
9489
),
9590
glow(),
96-
to=POST_LINK,
97-
target="_blank",
91+
to=BLOG_LINK,
92+
is_external=False,
9893
),
9994
rx.icon(
10095
"x",
10196
on_click=HostingBannerState.hide_banner,
10297
size=16,
103-
class_name="cursor-pointer hover:!text-slate-11 transition-color !text-slate-9 absolute right-4 z-10",
98+
class_name="cursor-pointer hover:!text-slate-11 transition-color !text-slate-9 absolute right-6 lg:right-4 z-10",
10499
),
105-
class_name="px-4 lg:px-6 w-screen h-[2rem] lg:h-[3.5rem] shadow-[inset_0_-1px_0_0_var(--c-slate-3)] flex items-center justify-between md:justify-center bg-slate-1 flex-row gap-4 overflow-hidden relative lg:py-0 py-2 max-w-full group",
100+
class_name="px-6 lg:px-6 w-screen min-h-[3rem] lg:h-[3.5rem] shadow-[inset_0_-1px_0_0_var(--c-slate-3)] flex items-center justify-between md:justify-center bg-slate-1 flex-row gap-4 overflow-hidden relative lg:py-0 py-3 max-w-full group",
106101
),
107102
),
108-
on_mount=HostingBannerState.check_deadline,
103+
on_mount=HostingBannerState.show_blog_banner,
109104
)

pcweb/meta/meta.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
from pcweb.constants import REFLEX_DOMAIN, REFLEX_DOMAIN_URL, TWITTER_CREATOR
44

5+
ONE_LINE_DESCRIPTION = (
6+
"The complete platform to build and scale enterprise apps - all in Python."
7+
)
8+
59
meta_tags = [
610
# HTML Meta Tags
711
{"name": "application-name", "content": "Reflex"},
@@ -11,15 +15,15 @@
1115
},
1216
{
1317
"name": "description",
14-
"content": "The open-source framework to build and deploy web apps using Python.",
18+
"content": ONE_LINE_DESCRIPTION,
1519
},
1620
# Facebook Meta Tags
1721
{"property": "og:url", "content": REFLEX_DOMAIN_URL},
1822
{"property": "og:type", "content": "website"},
1923
{"property": "og:title", "content": "Reflex · Web apps in Pure Python"},
2024
{
2125
"property": "og:description",
22-
"content": "The open-source framework to build and deploy web apps using Python.",
26+
"content": ONE_LINE_DESCRIPTION,
2327
},
2428
{"property": "og:image", "content": "/previews/index_preview.webp"},
2529
# Twitter Meta Tags
@@ -29,7 +33,7 @@
2933
{"name": "twitter:title", "content": "Reflex · Web apps in Pure Python"},
3034
{
3135
"name": "twitter:description",
32-
"content": "The open-source framework to build and deploy web apps using Python.",
36+
"content": ONE_LINE_DESCRIPTION,
3337
},
3438
{"name": "twitter:image", "content": "/previews/index_preview.webp"},
3539
{"name": "twitter:creator", "content": TWITTER_CREATOR},
@@ -44,15 +48,15 @@
4448
},
4549
{
4650
"name": "description",
47-
"content": "The open-source framework to build and deploy web apps using Python.",
51+
"content": ONE_LINE_DESCRIPTION,
4852
},
4953
# Facebook Meta Tags
5054
{"property": "og:url", "content": REFLEX_DOMAIN_URL},
5155
{"property": "og:type", "content": "website"},
5256
{"property": "og:title", "content": "Reflex · Web apps in Pure Python"},
5357
{
5458
"property": "og:description",
55-
"content": "The open-source framework to build and deploy web apps using Python.",
59+
"content": ONE_LINE_DESCRIPTION,
5660
},
5761
{"property": "og:image", "content": "/previews/hosting_preview.webp"},
5862
# Twitter Meta Tags
@@ -62,7 +66,7 @@
6266
{"name": "twitter:title", "content": "Reflex · Web apps in Pure Python"},
6367
{
6468
"name": "twitter:description",
65-
"content": "The open-source framework to build and deploy web apps using Python.",
69+
"content": ONE_LINE_DESCRIPTION,
6670
},
6771
{"name": "twitter:image", "content": "/previews/hosting_preview.webp"},
6872
{"name": "twitter:creator", "content": TWITTER_CREATOR},

pcweb/pages/blog/blog.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def first_post_card(meta: dict, path: str) -> rx.Component:
1818
alt="Image preview for blog post: " + str(meta["title"]),
1919
class_name="group-hover:scale-105 w-full h-full transition-transform duration-150 ease-out object-center object-cover",
2020
),
21-
class_name="relative flex-shrink-0 w-1/2 h-[18rem] overflow-hidden border-r border-solid border-slate-5",
21+
class_name="relative flex-shrink-0 w-2/5 h-[18rem] overflow-hidden border-r border-solid border-slate-5",
2222
),
2323
rx.box(
2424
rx.box(

pcweb/pages/blog/page.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def page(document, route) -> rx.Component:
9292
src=f"{meta['image']}",
9393
alt=f"Image for blog post: {meta['title']}",
9494
loading="lazy",
95-
class_name="rounded-[1.125rem] w-auto object-cover max-w-full max-h-[25rem] aspect-[2/1]",
95+
class_name="rounded-[1.125rem] w-auto object-contain max-w-full max-h-[40rem]",
9696
),
9797
rx.box(
9898
xd.render(document, document.filename),

0 commit comments

Comments
 (0)