From 1d83c42facdc0b4292bf8d48fd76568ef55bc977 Mon Sep 17 00:00:00 2001 From: Tom Gotsman Date: Thu, 26 Mar 2026 18:28:18 -0700 Subject: [PATCH 1/4] fixes to blog jsonld and title --- pcweb/meta/meta.py | 7 +++++++ pcweb/pages/blog/page.py | 20 +++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/pcweb/meta/meta.py b/pcweb/meta/meta.py index 6e0870eb2..173d8a34f 100644 --- a/pcweb/meta/meta.py +++ b/pcweb/meta/meta.py @@ -139,6 +139,8 @@ def blog_jsonld( faq: list[dict[str, str]] | None = None, author_bio: str | None = None, updated_at: str | None = None, + word_count: int | None = None, + keywords: list[str] | None = None, ) -> rx.Component: """Create a single JSON-LD script tag with @graph for a blog post. @@ -155,10 +157,15 @@ def blog_jsonld( "description": description, "image": to_cdn_image_url(image), "datePublished": str(date), + "url": url, "author": author_node, } if updated_at: posting["dateModified"] = str(updated_at) + if word_count: + posting["wordCount"] = word_count + if keywords: + posting["keywords"] = keywords graph: list[dict] = [ { diff --git a/pcweb/pages/blog/page.py b/pcweb/pages/blog/page.py index 7bf3b99af..0e7654492 100644 --- a/pcweb/pages/blog/page.py +++ b/pcweb/pages/blog/page.py @@ -185,6 +185,22 @@ def page(document, route) -> rx.Component: toc = [(level, text) for level, text in toc if level <= 3] page_url = f"{REFLEX_URL.strip('/')}{route}" + # Extract keywords from meta tags list if present. + keywords_list = None + for tag in meta.get("meta", []): + if tag.get("name") == "keywords": + keywords_list = [ + k.strip() for k in tag.get("content", "").split(",") if k.strip() + ] + break + + # Compute word count from the document content. + word_count = ( + len(document.content.split()) + if hasattr(document, "content") and document.content + else None + ) + jsonld_script = blog_jsonld( title=meta["title"], description=meta["description"], @@ -195,6 +211,8 @@ def page(document, route) -> rx.Component: faq=meta.get("faq"), author_bio=meta.get("author_bio"), updated_at=str(meta["updated_at"]) if meta.get("updated_at") else None, + word_count=word_count, + keywords=keywords_list, ) return rx.el.section( @@ -234,7 +252,7 @@ def page(document, route) -> rx.Component: ), rx.el.header( rx.el.h1( - meta.get("title_tag") or meta["title"], + 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( From eba8b06a188e007a92efbc817dc8e8056ce776dd Mon Sep 17 00:00:00 2001 From: Tom Gotsman Date: Thu, 26 Mar 2026 19:04:39 -0700 Subject: [PATCH 2/4] updated enterprise ready ai app builder --- blog/enterprise-ready-ai-app-builder.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/blog/enterprise-ready-ai-app-builder.md b/blog/enterprise-ready-ai-app-builder.md index 5cc400b96..1c6956e17 100644 --- a/blog/enterprise-ready-ai-app-builder.md +++ b/blog/enterprise-ready-ai-app-builder.md @@ -1,17 +1,18 @@ --- author: Tom Gotsman date: 2026-03-26 -title: "Enterprise Ready AI App Builder: Security, Compliance, and Code You Can Actually Audit" -description: "Enterprise AI app builders must pass security questionnaires before demos. Learn why on-premises deployment, RBAC, and auditable Python code define enterprise readiness." +title: "What 'Enterprise-Ready' Really Means for AI App Builders in March 2026" +title_tag: "Enterprise-Ready AI App Builders in March 2026" +description: "Learn what 'enterprise-ready' actually means for AI app builders in March 2026: security, compliance, deployment options, RBAC, and maintainable code requirements." image: /blog/enterprise_ready_0.webp tag: Builder meta: [ - {"name": "keywords", "content": "enterprise ready AI app builder, enterprise AI security, on-premises AI deployment, RBAC AI applications, SOC 2 AI builder, HIPAA compliant AI, enterprise code maintainability, Python AI framework, VPC AI deployment, enterprise compliance AI, AI app builder RBAC, auditable AI code, enterprise governance AI"} + {"name": "keywords", "content": "enterprise ready AI app builder, enterprise AI platform requirements, ai builder enterprise features"} ] faq: [ {"question": "What deployment options does Reflex support for enterprise security requirements?", "answer": "Reflex supports on-premises deployment, VPC deployment on AWS or Azure, and Reflex Cloud hosting. Reflex's AI Builder can run entirely on-premises, generating Python applications without sending prompts or code to external services, which satisfies requirements for hedge funds, healthcare organizations, and government contractors that can't send proprietary data to external servers."}, {"question": "How does Reflex handle role-based access control in applications?", "answer": "Reflex applications implement RBAC using standard Python patterns where you define roles, assign users to those roles, and check permissions before displaying data or processing actions. Security teams can audit these access controls through the same code review processes they apply to other Python systems, and audit logs track who accessed what data and when for compliance monitoring."}, - {"question": "Why is Python code maintainability better than generated JavaScript for enterprises?", "answer": "Python applications in Reflex remain readable by domain experts who can inspect, modify, and debug production systems using the same skills they apply to data analysis, without source maps to reconstruct or compiled artifacts to reverse-engineer. Generated JavaScript creates maintenance costs up to 250,000 euros annually per system because engineers must reverse-engineer minified bundles and transpiled code during production incidents."}, + {"question": "Why is Python code maintainability better than generated JavaScript for enterprises?", "answer": "Python applications in Reflex remain readable by domain experts who can inspect, modify, and debug production systems using the same skills they apply to data analysis, without source maps to reconstruct or compiled artifacts to reverse-engineer. Generated JavaScript creates maintenance costs up to €250,000 annually per system because engineers must reverse-engineer minified bundles and transpiled code during production incidents."}, {"question": "Can non-technical business users build applications with Reflex?", "answer": "Business analysts and non-technical users can use Reflex's AI Builder to generate dashboards and workflows that automatically integrate with existing Python applications built by your technical team. Python developers review AI-generated code before deployment, maintaining governance while business users get self-service capabilities within guardrails set by the technical team."}, {"question": "What compliance certifications do enterprises typically require from AI app builders?", "answer": "Enterprises require SOC 2 Type II reports, ISO 27001 certification, and industry-specific compliance like HIPAA for healthcare, PCI DSS for payment data, GDPR for data residency, and FedRAMP for government contractors. Missing any single compliance requirement removes a tool from consideration regardless of its AI capabilities."} ] @@ -31,7 +32,7 @@ Security questionnaires arrive before you get technical demos. Your InfoSec team - RBAC prevents unauthorized data access and cuts insider threat risks by enforcing role-based permissions in code. -- Readable Python code reduces maintenance costs by up to 250,000 euros annually compared to generated JavaScript applications. +- Readable Python code reduces maintenance costs by up to €250,000 annually compared to generated JavaScript applications. - Framework-based approaches generate components that integrate with existing systems instead of standalone applications. @@ -49,7 +50,7 @@ Industry-specific regulations raise the bar further. [HIPAA demands protected he ## Deployment Flexibility: Why On-Premises and VPC Options Matter ```python eval -rx.el.div(image_zoom(rx.image(src=f"{REFLEX_ASSETS_CDN}blog/enterprise_ready_1.webp", border_radius="10px", alt="Modern technical diagram showing three deployment architecture options: on-premises, VPC cloud infrastructure, and public cloud environment.")), class_name="mb-4") +rx.el.div(image_zoom(rx.image(src=f"{REFLEX_ASSETS_CDN}blog/enterprise_ready_1.webp", border_radius="10px", alt="Modern technical diagram showing three deployment architecture options: on-premises servers in a data center with physical hardware and firewalls, VPC cloud infrastructure with isolated virtual networks and security boundaries, and public cloud environment.")), class_name="mb-4") ``` Cloud-only AI builders get ruled out immediately by organizations that can't send proprietary data to external servers: @@ -69,7 +70,7 @@ Reflex supports both. You can [deploy Reflex applications to your own servers](h ## Role-Based Access Control as the Foundation of Enterprise Governance ```python eval -rx.el.div(image_zoom(rx.image(src=f"{REFLEX_ASSETS_CDN}blog/enterprise_ready_2.webp", border_radius="10px", alt="Technical diagram showing role-based access control system with three distinct user tiers: analyst, data owner, and administrator.")), class_name="mb-4") +rx.el.div(image_zoom(rx.image(src=f"{REFLEX_ASSETS_CDN}blog/enterprise_ready_2.webp", border_radius="10px", alt="Modern technical diagram showing role-based access control system with three distinct user tiers: analyst viewing dashboard with read-only access, data owner with write permissions editing records, and administrator with full system access.")), class_name="mb-4") ``` Enterprise applications fail governance audits when everyone has admin access. A sales analyst shouldn't see payroll data. Marketing teams don't need write access to financial models. Contractors require time-limited permissions that expire when engagements end. RBAC turns these requirements from manual approval workflows into code-enforced policies. @@ -82,7 +83,7 @@ RBAC also solves the insider threat problem that compliance frameworks worry abo ## Code Maintainability and Long-Term Total Cost of Ownership -Poor code quality costs businesses [up to 250,000 euros annually in unnecessary maintenance](https://www.softwareimprovementgroup.com/blog/the-cost-of-poor-code-quality/) per system, climbing to 7 million euros for large enterprise applications. These costs accumulate through extended debugging sessions, specialist hiring requirements, and the compound effect of technical debt that makes each subsequent change more expensive than the last. +Poor code quality costs businesses [up to €250,000 annually in unnecessary maintenance](https://www.softwareimprovementgroup.com/blog/the-cost-of-poor-code-quality/) per system, climbing to €7 million for large enterprise applications. These costs accumulate through extended debugging sessions, specialist hiring requirements, and the compound effect of technical debt that makes each subsequent change more expensive than the last. JavaScript and TypeScript applications generated by AI tools create immediate readability problems. When production systems fail at 2 AM, engineers face minified bundles, transpiled code, and framework abstractions that obscure business logic. The ML engineer who wrote the Python models can't trace issues through generated frontend code, forcing organizations to maintain separate teams with specialized debugging skills. Pure Python frameworks eliminate this complexity entirely. From 51f18506ff3c32bdf92399aaa8440c9aa29aa4c1 Mon Sep 17 00:00:00 2001 From: Tom Gotsman Date: Thu, 26 Mar 2026 19:56:36 -0700 Subject: [PATCH 3/4] update integration test version --- .github/workflows/integration_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index d880f2620..7a11fa9e3 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -32,7 +32,7 @@ jobs: - name: Install the latest version of uv uses: astral-sh/setup-uv@v6 with: - python-version: "3.11" + python-version: "3.13" activate-environment: true - name: Install the project From 0f14a5f7386813d3afffd44974ed6dc9901b30e6 Mon Sep 17 00:00:00 2001 From: Tom Gotsman Date: Thu, 26 Mar 2026 20:05:12 -0700 Subject: [PATCH 4/4] unedit integration test --- .github/workflows/integration_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 7a11fa9e3..d880f2620 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -32,7 +32,7 @@ jobs: - name: Install the latest version of uv uses: astral-sh/setup-uv@v6 with: - python-version: "3.13" + python-version: "3.11" activate-environment: true - name: Install the project