PageSourceSearch

https://getbruin.com/_nuxt/veY5KfZb.js

js getbruin.com collected 2026-10-03 22:04:52 UTC 21,049 bytes, 98 lines download raw bytes

1import{d as g,e as x,b as h,o as r,g as o,h as t,z as p,F as c,r as f,i,w as l,j as a,A as w,t as m}from"./1BEqaQKX.js";import{C as y}from"./GMO-5RRM.js";import{d as v}from"./DEJ_tTaM.js";const k={class:"isolate"},b={class:"bg-gray-50 py-16 sm:py-24"},_={class:"mx-auto max-w-7xl px-6 lg:px-8"},C={class:"overflow-x-auto"},A={class:"min-w-full bg-white overflow-hidden"},B={class:"divide-y divide-gray-200"},L={class:"px-6 py-4 text-sm font-medium text-gray-900"},S={class:"px-6 py-4 text-center"},M={key:0,class:"inline-flex items-center justify-center w-6 h-6 rounded-full bg-green-100 text-green-600"},E={key:1,class:"inline-flex items-center justify-center w-6 h-6 rounded-full bg-bruin-50 text-bruin-400"},j={key:2,class:"text-sm text-gray-600"},D={class:"px-6 py-4 text-center"},T={key:0,class:"inline-flex items-center justify-center w-6 h-6 rounded-full bg-green-100 text-green-600"},O={key:1,class:"inline-flex items-center justify-center w-6 h-6 rounded-full bg-bruin-50 text-bruin-400"},P={key:2,class:"text-sm text-gray-600"},N={class:"mt-8 text-center"},q={class:"bg-white py-16 sm:py-24"},z={class:"mx-auto max-w-7xl px-6 lg:px-8"},F={class:"mt-12 text-center"},G={class:"bg-gray-50 py-16 sm:py-24"},R={class:"mx-auto max-w-7xl px-6 lg:px-8"},Y={class:"grid grid-cols-1 lg:grid-cols-2 gap-8 max-w-6xl mx-auto"},H={class:"bg-white p-8 border border-gray-200"},I={class:"space-y-4"},Q={class:"bg-white p-6"},U={class:"bg-white p-6"},W={class:"mt-12 text-center"},V={class:"bg-gray-50 py-16 sm:py-24"},J={class:"mx-auto max-w-7xl px-6 lg:px-8"},K={class:"mt-12 text-center"},X={class:"bg-gray-50 border-t border-gray-100"},Z={class:"mx-auto max-w-7xl px-8 py-24 text-center"},$=`from airflow import DAG
2from airflow.providers.snowflake.operators.snowflake import SnowflakeOperator
3from datetime import datetime, timedelta
4
5default_args = {
6    'owner': 'data-team',
7    'depends_on_past': False,
8    'start_date': datetime(2024, 1, 1),
9    'email_on_failure': True,
10    'email_on_retry': False,
11    'retries': 2,
12    'retry_delay': timedelta(minutes=5),
13}
14
15dag = DAG(
16    'snowflake_orders_pipeline',
17    default_args=default_args,
18    description='Process orders in Snowflake',
19    schedule_interval='0 2 * * *',
20    catchup=False,
21)
22
23# First SQL query - staging
24staging_orders = SnowflakeOperator(
25    task_id='create_staging_orders',
26    snowflake_conn_id='snowflake_default',
27    sql="""
28        CREATE OR REPLACE TABLE staging.orders AS
29        SELECT
30            order_id,
31            customer_id,
32            order_date,
33            total_amount,
34            status
35        FROM raw.orders
36        WHERE order_date >= CURRENT_DATE - 7
37    """,
38    warehouse='COMPUTE_WH',
39    database='ANALYTICS',
40    schema='STAGING',
41    dag=dag,
42)
43
44# Second SQL query - analytics
45analytics_orders = SnowflakeOperator(
46    task_id='create_analytics_orders',
47    snowflake_conn_id='snowflake_default',
48    sql="""
49        CREATE OR REPLACE TABLE analytics.orders AS
50        SELECT
51            o.order_id,
52            o.customer_id,
53            o.order_date,
54            o.total_amount,
55            c.customer_name,
56            c.customer_email
57        FROM staging.orders o
58        LEFT JOIN raw.customers c
59            ON o.customer_id = c.customer_id
60    """,
61    warehouse='COMPUTE_WH',
62    database='ANALYTICS',
63    schema='ANALYTICS',
64    dag=dag,
65)
66
67# Set up dependencies
68staging_orders >> analytics_orders`,tt=`/* @bruin
69name: staging.orders
70materialization:
71  type: table
72@bruin */
73
74SELECT
75    order_id,
76    customer_id,
77    order_date,
78    total_amount,
79    status
80FROM raw.orders
81WHERE order_date >= CURRENT_DATE - 7`,et=`/* @bruin
82name: analytics.orders
83materialization:
84  type: table
85depends:
86  - staging.orders
87@bruin */
88
89SELECT
90    o.order_id,
91    o.customer_id,
92    o.order_date,
93    o.total_amount,
94    c.customer_name,
95    c.customer_email
96FROM staging.orders o
97LEFT JOIN raw.customers c
98    ON o.customer_id = c.customer_id`,nt=g({__name:"airflow-vs-bruin",setup(st){v({}),x({title:"Airflow vs Bruin: Complete Comparison | Bruin Data",description:"Compare Apache Airflow and Bruin for orchestration and complete data pipelines. Understand the differences in complexity and features.",ogTitle:"Airflow vs Bruin: Complete Comparison",ogDescription:"An honest comparison between Apache Airflow and Bruin for orchestration and complete data pipelines.",ogImage:"/img/og/comparisons-airflow.png",ogUrl:"https://getbruin.com/comparisons/airflow-vs-bruin/",ogType:"article",twitterCard:"summary_large_image",twitterTitle:"Airflow vs Bruin: Complete Comparison",twitterDescription:"Compare Apache Airflow and Bruin for orchestration and data pipelines. Complexity and features.",keywords:"airflow vs bruin, airflow alternative, apache airflow comparison, data orchestration tools, airflow competitors, bruin data",robots:"index, follow"}),h({link:[{rel:"canonical",href:"https://getbruin.com/comparisons/airflow-vs-bruin/"}],script:[{type:"application/ld+json",innerHTML:JSON.stringify({"@context":"https://schema.org","@type":"Article",headline:"Airflow vs Bruin: Complete Comparison",description:"Compare Apache Airflow and Bruin for orchestration and complete data pipelines. Differences in complexity and features.",author:{"@type":"Organization",name:"Bruin Data"},publisher:{"@type":"Organization",name:"Bruin Data",logo:{"@type":"ImageObject",url:"https://getbruin.com/BruinLogo-
98horizontal.svg"}},datePublished:new Date().toISOString()})}]});const u=[{name:"Orchestration",airflow:!0,bruin:!0},{name:"Data Ingestion",airflow:!1,bruin:!0},{name:"SQL Transformations",airflow:!1,bruin:!0},{name:"Python Support",airflow:"DAGs only",bruin:"Full support"},{name:"Data Quality Checks",airflow:!1,bruin:!0},{name:"Configuration",airflow:"Python DAGs",bruin:"YAML"},{name:"Learning Curve",airflow:"Steep",bruin:"Easy"},{name:"Setup Complexity",airflow:"Complex",bruin:"Simple"},{name:"Open Source",airflow:!0,bruin:!0},{name:"Managed Cloud Option",airflow:"Astronomer",bruin:!0},{name:"Infrastructure Costs",airflow:"High",bruin:"Low"},{name:"Deployment Options",airflow:"Self-hosted",bruin:"Anywhere"}];return(rt,e)=>{const n=w,d=y;return r(),o(c,null,[t("main",k,[e[18]||(e[18]=p('<div class="relative isolate bg-gray-50 border-b border-gray-100"><div class="mx-auto max-w-7xl px-6 pb-16 pt-10 sm:pb-16 sm:pt-32 lg:px-8"><div class="max-w-4xl"><h1 class="text-4xl font-light tracking-tight text-gray-900 sm:text-6xl leading-tight"> Airflow vs Bruin <br><span class="font-serif italic text-bruin-400">Complete Comparison</span></h1><p class="mt-6 text-lg font-light leading-relaxed text-gray-600 max-w-3xl"> An honest, in-depth comparison between Apache Airflow and Bruin. Understand the differences between a pure orchestrator and a complete data platform. </p></div></div></div>',1)),t("div",b,[t("div",_,[t("div",C,[t("table",A,[e[4]||(e[4]=t("thead",{class:"bg-gray-900 text-white"},[t("tr",null,[t("th",{class:"px-6 py-4 text-left text-sm font-semibold"},"Feature"),t("th",{class:"px-6 py-4 text-center text-sm font-semibold"},"Airflow"),t("th",{class:"px-6 py-4 text-center text-sm font-semibold"},"Bruin")])],-1)),t("tbody",B,[(r(),o(c,null,f(u,s=>t("tr",{key:s.name,class:"hover:bg-gray-50"},[t("td",L,m(s.name),1),t("td",S,[s.airflow===!0?(r(),o("span",M,[...e[0]||(e[0]=[t("svg",{"aria-hidden":"true",class:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})],-1),t("span",{class:"sr-only"},"Yes",-1)])])):s.airflow===!1?(r(),o("span",E,[...e[1]||(e[1]=[t("svg",{"aria-hidden":"true",class:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1),t("span",{class:"sr-only"},"No",-1)])])):(r(),o("span",j,m(s.airflow),1))]),t("td",D,[s.bruin===!0?(r(),o("span",T,[...e[2]||(e[2]=[t("svg",{"aria-hidden":"true",class:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})],-1),t("span",{class:"sr-only"},"Yes",-1)])])):s.bruin===!1?(r(),o("span",O,[...e[3]||(e[3]=[t("svg",{"aria-hidden":"true",class:"w-4 h-4",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1),t("span",{class:"sr-only"},"No",-1)])])):(r(),o("span",P,m(s.bruin),1))])])),64))])])]),t("div",N,[i(n,{href:"https://github.com/bruin-data/bruin",external:"",variant:"secondary",size:"sm"},{default:l(()=>[...e[5]||(e[5]=[a("Explore Bruin on GitHub",-1)])]),_:1})])])]),t("div",q,[t("div",z,[e[7]||(e[7]=p('<div class="mx-auto max-w-2xl lg:text-center mb-16"><h2 class="text-sm uppercase tracking-wide text-gray-500">Core Philosophy</h2><p class="mt-2 text-[40px] font-light text-gray-900">Orchestrator vs Complete Platform</p></div><div class="grid grid-cols-1 gap-8 lg:grid-cols-2"><div class="bg-gray-50 p-8"><h3 class="text-xl font-light text-gray-900 mb-6">Apache Airflow</h3><div class="space-y-4"><p class="text-gray-700"> Airflow is a <strong>pure workflow orchestrator</strong>, it schedules and monitors tasks but doesn&#39;t provide data ingestion, transformation, or quality features. </p><ul class="space-y-3 text-sm text-gray-700"><li class="flex items-start"><svg class="w-5 h-5 text-green-500 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg><span>Powerful orchestration capabilities</span></li><li class="flex items-start"><svg class="w-5 h-5 text-green-500 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg><span>Python-based DAG definitions</span></li><li class="flex items-start"><svg class="w-5 h-5 text-bruin-400 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg><span>Steep learning curve</span></li><li class="flex items-start"><svg class="w-5 h-5 text-bruin-400 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg><span>Complex setup and configuration</span></li><li class="flex items-start"><svg class="w-5 h-5 text-bruin-400 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg><span>No data ingestion built-in</span></li><li class="flex items-start"><svg class="w-5 h-5 text-bruin-400 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg><span>No transformation framework</span></li><li class="flex items-start"><svg class="w-5 h-5 text-bruin-400 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg><span>No built-in quality checks</span></li></ul><div class="bg-yellow-50 border border-yellow-200 rounded-sm p-4 mt-4"><p class="text-sm text-yellow-800"><strong>You need separate tools:</strong> Fivetran/Airbyte for ingestion, dbt for transformation, custom scripts for quality </p></div></div></div><div class="bg-white p-8 border-l border-gray-100"><h3 class="text-xl font-light text-gray-900 mb-6">Bruin</h3><div class="space-y-4"><p class="text-gray-700"> Bruin is a <strong>complete data platform</strong>, orchestration plus ingestion, transformation, and quality in one unified tool. <
98/p><ul class="space-y-3 text-sm text-gray-700"><li class="flex items-start"><svg class="w-5 h-5 text-green-500 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg><span><strong>Built-in orchestration</strong> with dependencies</span></li><li class="flex items-start"><svg class="w-5 h-5 text-green-500 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg><span><strong>Data ingestion</strong> from 100+ sources</span></li><li class="flex items-start"><svg class="w-5 h-5 text-green-500 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg><span><strong>SQL &amp; Python transformations</strong></span></li><li class="flex items-start"><svg class="w-5 h-5 text-green-500 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg><span><strong>Built-in quality checks</strong></span></li><li class="flex items-start"><svg class="w-5 h-5 text-green-500 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg><span>Simple YAML configs (no Python DAGs)</span></li><li class="flex items-start"><svg class="w-5 h-5 text-green-500 mr-2 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg><span>Easy to learn and set up</span></li></ul><div class="bg-blue-100 border border-blue-300 rounded-sm p-4 mt-4"><p class="text-sm text-blue-900"><strong>Everything in one:</strong> Replaces Airflow + Fivetran/Airbyte + dbt + quality tools </p></div></div></div></div>',2)),t("div",F,[i(n,{href:"https://github.com/bruin-data/bruin",external:"",variant:"secondary",size:"sm"},{default:l(()=>[...e[6]||(e[6]=[a("See how Bruin simplifies your data stack",-1)])]),_:1})])])]),t("div",G,[t("div",R,[e[15]||(e[15]=t("div",{class:"mx-auto max-w-2xl lg:text-center mb-16"},[t("h2",{class:"text-sm uppercase tracking-wide text-gray-500"},"Complexity"),t("p",{class:"mt-2 text-[40px] font-light text-gray-900"},"Python DAGs vs Simple SQL"),t("p",{class:"mt-6 text-lg leading-8 text-gray-600"}," Airflow requires writing complex Python DAGs to orchestrate SQL queries. Bruin lets you write simple SQL files with minimal metadata. ")],-1)),t("div",Y,[t("div",H,[e[8]||(e[8]=t("h3",{class:"text-xl font-light text-gray-900 mb-4"},"Airflow DAG",-1)),e[9]||(e[9]=t("p",{class:"text-sm text-gray-600 mb-4"},"Complex Python code to orchestrate 2 SQL queries:",-1)),i(d,{language:"python",code:$}),e[10]||(e[10]=t("p",{class:"text-sm text-gray-600 mt-4"}," 80+ lines of Python boilerplate, complex setup, requires understanding of Airflow operators, connections, and dependencies ",-1))]),t("div",I,[t("div",Q,[e[11]||(e[11]=t("p",{class:"text-sm text-gray-600 mb-3"},"Simple SQL file with minimal metadata:",-1)),i(d,{language:"sql",code:tt})]),t("div",U,[e[12]||(e[12]=t("p",{class:"text-sm text-gray-600 mb-3"},"Second asset with automatic dependency:",-1)),i(d,{language:"sql",code:et})]),e[13]||(e[13]=t("p",{class:"text-sm text-gray-700 bg-blue-100 border border-blue-300 rounded-sm p-4"},[t("strong",null,"Just SQL + simple metadata."),a(" No Python, no operators, no complex configuration. Dependencies are automatically inferred. ")],-1))])]),t("div",W,[i(n,{href:"https://github.com/bruin-data/bruin",external:"",variant:"secondary",size:"sm"},{default:l(()=>[...e[14]||(e[14]=[a("Experience Bruin's simplicity",-1)])]),_:1})])])]),t("div",V,[t("div",J,[e[17]||(e[17]=p('<div class="mx-auto max-w-2xl lg:text-center mb-16"><h2 class="text-sm uppercase tracking-wide text-gray-500">Decision Guide</h2><p class="mt-2 text-[40px] font-light text-gray-900">When to Choose Each Tool</p></div><div class="grid grid-cols-1 lg:grid-cols-2 gap-8"><div class="bg-white p-8"><h3 class="text-xl font-light text-gray-900 mb-6">Choose Airflow if...</h3><ul class="space-y-4"><li class="flex items-start"><svg class="w-6 h-6 text-blue-500 mr-3 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><p class="font-medium text-gray-900">You only need orchestration</p><p class="text-sm text-gray-600 mt-1"> Already have ingestion, transformation, and quality tools in place. </p></div></li><li class="flex items-start"><svg class="w-6 h-6 text-blue-500 mr-3 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><p class="font-medium text-gray-900">You have Python expertise</p><p class="text-sm text-gray-600 mt-1"> Comfortable writing and maintaining complex Python DAGs. </p></div></li><li class="flex items-start"><svg class="w-6 h-6 text-blue-500 mr-3 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><p class="font-medium text-gray-900">You&#39;re okay with complexity</p><p class="text-sm text-gray-600 mt-1">
98 Have resources to manage infrastructure and multiple tools. </p></div></li></ul></div><div class="bg-white p-8"><h3 class="text-xl font-light text-gray-900 mb-6">Choose Bruin if...</h3><ul class="space-y-4"><li class="flex items-start"><svg class="w-6 h-6 text-green-600 mr-3 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><p class="font-medium text-gray-900">You want a complete platform</p><p class="text-sm text-gray-600 mt-1"> Need ingestion + transformation + quality + orchestration in one unified tool. </p></div></li><li class="flex items-start"><svg class="w-6 h-6 text-green-600 mr-3 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><p class="font-medium text-gray-900">Simplicity matters</p><p class="text-sm text-gray-600 mt-1"> Prefer simple YAML configs over complex Python DAGs. </p></div></li><li class="flex items-start"><svg class="w-6 h-6 text-green-600 mr-3 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><p class="font-medium text-gray-900">Simplicity is important</p><p class="text-sm text-gray-600 mt-1"> Prefer a unified platform with simple configuration over managing multiple tool subscriptions. </p></div></li><li class="flex items-start"><svg class="w-6 h-6 text-green-600 mr-3 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><p class="font-medium text-gray-900">Faster time to value</p><p class="text-sm text-gray-600 mt-1"> Want to build and deploy pipelines quickly without weeks of setup. </p></div></li><li class="flex items-start"><svg class="w-6 h-6 text-green-600 mr-3 mt-0.5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><p class="font-medium text-gray-900">You want deployment flexibility</p><p class="text-sm text-gray-600 mt-1"> Deploy anywhere: local, GitHub Actions, EC2, or fully managed cloud. </p></div></li></ul></div></div>',2)),t("div",K,[i(n,{href:"https://github.com/bruin-data/bruin",external:"",variant:"primary",size:"lg"},{default:l(()=>[...e[16]||(e[16]=[a("Try Bruin today on GitHub",-1)])]),_:1})])])])]),t("div",X,[t("div",Z,[e[20]||(e[20]=t("h2",{class:"text-[40px] font-light text-gray-900 mb-6"}," Ready to Simplify Your Stack? ",-1)),e[21]||(e[21]=t("p",{class:"text-lg font-light text-gray-600 max-w-2xl mx-auto mb-10"}," Replace Airflow + Fivetran/Airbyte + dbt + quality tools with one unified platform. ",-1)),i(n,{href:"https://github.com/bruin-data/bruin",external:"",variant:"primary",size:"lg"},{default:l(()=>[...e[19]||(e[19]=[a(" View on GitHub ",-1)])]),_:1})])])],64)}}});export{nt as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.