[{"data":1,"prerenderedAt":6075},["ShallowReactive",2],{"blog-/blog/best-ai-data-analysts-saas-2026":3,"content-query-C93hSR5wpG":1281,"content-query-ASTe9AOaEn":2249,"content-query-22F3pkLU9M":3217},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"coverImage":10,"date":11,"readingTime":12,"category":13,"tags":14,"author":31,"body":35,"_type":1275,"_id":1276,"_source":1277,"_file":1278,"_stem":1279,"_extension":1280},"/blog/best-ai-data-analysts-saas-2026","blog",false,"","Best AI Data Analysts for SaaS Companies in 2026","An honest 2026 guide to the AI data analysts SaaS teams are evaluating. Bruin, ThoughtSpot, Hex, Dot, Seek AI, Defog, Power BI Copilot, and ChatGPT with MCP, with pros, cons, pricing, and when each one actually fits.","/img/blog/best-ai-data-analysts-saas/cover.png","2026-01-28",18,"Product Launch",[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],"ai data analyst","saas","comparison","business intelligence","slack","microsoft teams","conversational ai","thoughtspot","hex","dot ai","seek ai","defog","bruin","snowflake","bigquery","databricks",{"name":32,"role":33,"image":34},"Kateryna Kozachenko","Marketing & Growth","/img/blog/kate.jpeg",{"type":36,"children":37,"toc":1225},"root",[38,46,51,58,63,93,98,104,109,116,121,126,131,136,141,147,152,157,162,167,172,178,183,188,193,198,203,209,214,219,224,229,234,240,245,250,255,260,265,271,276,281,286,291,296,302,307,312,317,322,327,333,338,343,348,353,358,364,369,375,380,385,391,396,401,406,412,417,422,428,433,438,444,784,790,795,814,819,837,843,848,854,859,865,870,876,881,887,892,920,926,950,1000,1005,1011,1017,1022,1028,1033,1039,1052,1058,1063,1069,1074,1080,1085,1091,1096,1102,1107,1113,1118,1124,1129,1135,1140,1146,1159,1165,1170,1176,1181,1187,1192,1198,1203,1209,1214,1220],{"type":39,"tag":40,"props":41,"children":42},"element","p",{},[43],{"type":44,"value":45},"text","If you run a SaaS company in 2026, you already know the pattern. Data questions pile up, the analytics team becomes a ticket queue, stakeholders stop asking instead of getting answers, and another dashboard nobody opens gets published. The latest wave of AI data analyst tools is supposed to fix that, but the category has expanded from two or three players to more than a dozen, each with a slightly different theory of the job.",{"type":39,"tag":40,"props":47,"children":48},{},[49],{"type":44,"value":50},"We spend a lot of time talking to SaaS data leaders evaluating this space. Here is an honest rundown of the AI data analysts worth shortlisting in 2026, how they differ, and which one fits which kind of team.",{"type":39,"tag":52,"props":53,"children":55},"h2",{"id":54},"what-is-an-ai-data-analyst-exactly",[56],{"type":44,"value":57},"What is an AI data analyst, exactly?",{"type":39,"tag":40,"props":59,"children":60},{},[61],{"type":44,"value":62},"An AI data analyst is a tool that takes a natural-language question (\"What's our MRR by plan last month?\"), converts it into SQL against your data warehouse, runs the query, and returns a chart or narrative answer. The better ones also:",{"type":39,"tag":64,"props":65,"children":66},"ul",{},[67,73,78,83,88],{"type":39,"tag":68,"props":69,"children":70},"li",{},[71],{"type":44,"value":72},"Remember context from previous questions, so \"and now split by region\" works",{"type":39,"tag":68,"props":74,"children":75},{},[76],{"type":44,"value":77},"Use a governed semantic layer so different users get the same answer",{"type":39,"tag":68,"props":79,"children":80},{},[81],{"type":44,"value":82},"Live where your team already works: Slack, Microsoft Teams, Discord, WhatsApp, or a browser",{"type":39,"tag":68,"props":84,"children":85},{},[86],{"type":44,"value":87},"Connect to common SaaS data sources like Snowflake, BigQuery, Databricks, Redshift, Postgres, ClickHouse, and DuckDB, plus product sources like Stripe, HubSpot, Mixpanel, Amplitude, Segment, and Salesforce",{"type":39,"tag":68,"props":89,"children":90},{},[91],{"type":44,"value":92},"Offer API access for embedding answers into internal tools, customer-facing products, or automations",{"type":39,"tag":40,"props":94,"children":95},{},[96],{"type":44,"value":97},"This category is different from traditional BI (Tableau, Looker, Power BI without Copilot), where the user has to learn how to build a dashboard. It is also different from generic AI assistants like ChatGPT and Claude, which can chat with a CSV but do not understand your warehouse, governance, or metric definitions.",{"type":39,"tag":52,"props":99,"children":101},{"id":100},"the-shortlist-for-saas-teams-in-2026",[102],{"type":44,"value":103},"The shortlist for SaaS teams in 2026",{"type":39,"tag":40,"props":105,"children":106},{},[107],{"type":44,"value":108},"Here are the tools that keep coming up in SaaS evaluations. None of this is exhaustive. It is the honest shortlist, not a fifty-vendor listicle.",{"type":39,"tag":110,"props":111,"children":113},"h3",{"id":112},"_1-bruin",[114],{"type":44,"value":115},"1. Bruin",{"type":39,"tag":40,"props":117,"children":118},{},[119],{"type":44,"value":120},"What it is: a conversational AI data analyst that lives in Slack, Teams, Discord, WhatsApp, and the browser, plus a full data pipeline for ingestion (200+ connectors), SQL and Python transformations, quality checks, and column-level lineage.",{"type":39,"tag":40,"props":122,"children":123},{},[124],{"type":44,"value":125},"Why SaaS teams pick it: business teams get answers in Slack without filing a ticket, and data engineers get a unified pipeline instead of stitching Fivetran, dbt, Airflow, and Monte Carlo together. Open-source core (the CLI and ingestr), self-hostable, no per-seat pricing pressure. API access is available for embedded use cases.",{"type":39,"tag":40,"props":127,"children":128},{},[129],{"type":44,"value":130},"Watch-outs: teams deep into a legacy BI stack (for example, large Tableau or Looker deployments with hundreds of curated dashboards) will usually adopt Bruin alongside the existing tool first, then consolidate over time.",{"type":39,"tag":40,"props":132,"children":133},{},[134],{"type":44,"value":135},"Pricing feel: free open-source core, affordable cloud plans, enterprise pricing that does not punish viewers.",{"type":39,"tag":40,"props":137,"children":138},{},[139],{"type":44,"value":140},"Best for: SaaS companies with 20 to 500 employees who want business teams to self-serve in Slack and do not want to replace their whole BI stack to do it.",{"type":39,"tag":110,"props":142,"children":144},{"id":143},"_2-thoughtspot",[145],{"type":44,"value":146},"2. ThoughtSpot",{"type":39,"tag":40,"props":148,"children":149},{},[150],{"type":44,"value":151},"What it is: enterprise BI platform with AI-powered search via Spotter (AI Analyst, SpotterModel, SpotterViz, SpotterCode) and liveboards. The full-replacement-for-Tableau play, but AI-first.",{"type":39,"tag":40,"props":153,"children":154},{},[155],{"type":44,"value":156},"Why teams pick it: rich dashboards, embedded analytics SDK, enterprise governance, and direct Snowflake, BigQuery, Databricks, and Redshift integration.",{"type":39,"tag":40,"props":158,"children":159},{},[160],{"type":44,"value":161},"Watch-outs: standalone web app users need to log in to and be trained on. Best when you are genuinely replacing Tableau, not when you want a lightweight AI layer.",{"type":39,"tag":40,"props":163,"children":164},{},[165],{"type":44,"value":166},"Pricing feel: Essentials starts at $25/user/month, Pro at $50/user/month, Enterprise is custom. Larger enterprise deployments often land in the five- or six-figure annual range.",{"type":39,"tag":40,"props":168,"children":169},{},[170],{"type":44,"value":171},"Best for: mid-market and enterprise SaaS with a BI budget already earmarked for a traditional vendor replacement.",{"type":39,"tag":110,"props":173,"children":175},{"id":174},"_3-hex",[176],{"type":44,"value":177},"3. Hex",{"type":39,"tag":40,"props":179,"children":180},{},[181],{"type":44,"value":182},"What it is: a collaborative SQL and Python notebook platform with a Notebook Agent for analyst assistance, and the ability to publish notebooks as data apps.",{"type":39,"tag":40,"props":184,"children":185},{},[186],{"type":44,"value":187},"Why teams pick it: analysts love the notebook experience, and Hex apps are a nicer way to share an analysis than a static dashboard. The Notebook Agent helps analysts write queries faster.",{"type":39,"tag":40,"props":189,"children":190},{},[191],{"type":44,"value":192},"Watch-outs: the AI is aimed at analysts writing notebooks, not business users asking questions in Slack. Non-technical stakeholders consume published apps rather than asking ad-hoc questions, which means the data team is still on the hook for every new question.",{"type":39,"tag":40,"props":194,"children":195},{},[196],{"type":44,"value":197},"Pricing feel: per-editor SaaS with unlimited viewers on paid plans. Community tier is free (up to 5 notebooks). Professional is $36 per editor per month, Team is $75 per editor per month, Enterprise is custom.",{"type":39,"tag":40,"props":199,"children":200},{},[201],{"type":44,"value":202},"Best for: data teams that live in notebooks and want a modern replacement for Mode or Jupyter plus dashboards, where curated apps are the distribution model.",{"type":39,"tag":110,"props":204,"children":206},{"id":205},"_4-dot",[207],{"type":44,"value":208},"4. Dot",{"type":39,"tag":40,"props":210,"children":211},{},[212],{"type":44,"value":213},"What it is: a chat-first AI analyst focused on giving business teams fast answers inside Slack, Microsoft Teams, or email, layered on your warehouse.",{"type":39,"tag":40,"props":215,"children":216},{},[217],{"type":44,"value":218},"Why teams pick it: chat-native distribution is the right instinct for SaaS.",{"type":39,"tag":40,"props":220,"children":221},{},[222],{"type":44,"value":223},"Watch-outs: analyst-only product. It does not come with the ingestion, transformation, or quality layers you still need elsewhere. No WhatsApp native surface.",{"type":39,"tag":40,"props":225,"children":226},{},[227],{"type":44,"value":228},"Pricing feel: usage-based (credits) with unlimited users on paid tiers. Free tier available, Pro at $180 per month, Team at $720 per month, Enterprise is custom.",{"type":39,"tag":40,"props":230,"children":231},{},[232],{"type":44,"value":233},"Best for: teams that already have a mature pipeline (Fivetran plus dbt plus warehouse) and just want a good chat analyst on top.",{"type":39,"tag":110,"props":235,"children":237},{"id":236},"_5-seek-ai",[238],{"type":44,"value":239},"5. Seek AI",{"type":39,"tag":40,"props":241,"children":242},{},[243],{"type":44,"value":244},"What it is: enterprise-targeted natural-language analytics with strong emphasis on a governed semantic layer.",{"type":39,"tag":40,"props":246,"children":247},{},[248],{"type":44,"value":249},"Why teams pick it: enterprise sales controls, detailed governance, semantic-layer-first approach.",{"type":39,"tag":40,"props":251,"children":252},{},[253],{"type":44,"value":254},"Watch-outs: typically an enterprise contract, standalone app experience.",{"type":39,"tag":40,"props":256,"children":257},{},[258],{"type":44,"value":259},"Pricing feel: enterprise, annual contract.",{"type":39,"tag":40,"props":261,"children":262},{},[263],{"type":44,"value":264},"Best for: large organizations with dedicated data governance teams.",{"type":39,"tag":110,"props":266,"children":268},{"id":267},"_6-defogai",[269],{"type":44,"value":270},"6. Defog.ai",{"type":39,"tag":40,"props":272,"children":273},{},[274],{"type":44,"value":275},"What it is: open-source text-to-SQL models (SQLCoder) you can embed into your own product or internal tools.",{"type":39,"tag":40,"props":277,"children":278},{},[279],{"type":44,"value":280},"Why teams pick it: developer-friendly, open-source approach, good for embedding AI analytics in a customer-facing product.",{"type":39,"tag":40,"props":282,"children":283},{},[284],{"type":44,"value":285},"Watch-outs: it is a text-to-SQL engine, not a finished AI analyst. You still have to build the chat UI, context memory, governance, and distribution around it. Public project activity has been quiet since early 2024, so check the current state before betting on it.",{"type":39,"tag":40,"props":287,"children":288},{},[289],{"type":44,"value":290},"Pricing feel: open-source models available, plus paid enterprise tiers (hosted cloud around $5,000 per month, self-hosted annual custom).",{"type":39,"tag":40,"props":292,"children":293},{},[294],{"type":44,"value":295},"Best for: engineering teams building their own internal AI analyst and who want to keep full control of the stack.",{"type":39,"tag":110,"props":297,"children":299},{"id":298},"_7-power-bi-copilot",[300],{"type":44,"value":301},"7. Power BI Copilot",{"type":39,"tag":40,"props":303,"children":304},{},[305],{"type":44,"value":306},"What it is: Microsoft's prompt layer over Power BI semantic models, available in Microsoft Fabric.",{"type":39,"tag":40,"props":308,"children":309},{},[310],{"type":44,"value":311},"Why teams pick it: already using Power BI. The Copilot adds natural language on top of existing semantic models.",{"type":39,"tag":40,"props":313,"children":314},{},[315],{"type":44,"value":316},"Watch-outs: tied to the Microsoft stack and Power BI's existing complexity. The AI is only as good as the semantic model you have already built.",{"type":39,"tag":40,"props":318,"children":319},{},[320],{"type":44,"value":321},"Pricing feel: no separate Copilot SKU, but it requires paid Fabric capacity (F2 or higher) or Power BI Premium capacity (P1 or higher). Power BI Pro or PPU alone is not enough.",{"type":39,"tag":40,"props":323,"children":324},{},[325],{"type":44,"value":326},"Best for: enterprises already heavily invested in Power BI who want to extend it rather than replace it.",{"type":39,"tag":110,"props":328,"children":330},{"id":329},"_8-chatgpt-or-claude-with-your-data-via-mcp-or-connectors",[331],{"type":44,"value":332},"8. ChatGPT or Claude with your data (via MCP or connectors)",{"type":39,"tag":40,"props":334,"children":335},{},[336],{"type":44,"value":337},"What they are: general-purpose AI assistants with file upload, MCP connectors, or code interpreter.",{"type":39,"tag":40,"props":339,"children":340},{},[341],{"type":44,"value":342},"Why teams try them: already have the subscription. Fine for ad-hoc CSV analysis.",{"type":39,"tag":40,"props":344,"children":345},{},[346],{"type":44,"value":347},"Watch-outs: no persistent connection to your warehouse, no governance, no shared semantic definitions. Different users will get different answers to the same question, which in a SaaS context is how your board meeting goes sideways. Useful for one-off exploration, not for team-wide self-serve.",{"type":39,"tag":40,"props":349,"children":350},{},[351],{"type":44,"value":352},"Pricing feel: low per-seat if already subscribed. No enterprise governance included.",{"type":39,"tag":40,"props":354,"children":355},{},[356],{"type":44,"value":357},"Best for: individual ad-hoc analysis on small exports, not team-wide self-serve.",{"type":39,"tag":52,"props":359,"children":361},{"id":360},"how-to-compare-ai-data-analysts-for-saas",[362],{"type":44,"value":363},"How to compare AI data analysts for SaaS",{"type":39,"tag":40,"props":365,"children":366},{},[367],{"type":44,"value":368},"Every SaaS evaluation we see comes down to four questions. Answer these, and the shortlist collapses quickly.",{"type":39,"tag":110,"props":370,"children":372},{"id":371},"_1-where-does-the-conversation-happen",[373],{"type":44,"value":374},"1. Where does the conversation happen?",{"type":39,"tag":40,"props":376,"children":377},{},[378],{"type":44,"value":379},"If your team lives in Slack and Teams, an AI analyst that requires logging into a separate app is a permanent adoption drag. For SaaS companies under 500 people, Slack-native usually beats a standalone web app. This is where Bruin and Dot do well, and where Hex and ThoughtSpot are structurally weaker for everyday business questions.",{"type":39,"tag":40,"props":381,"children":382},{},[383],{"type":44,"value":384},"For field, sales, and partner teams, WhatsApp is increasingly a first-class surface. Bruin is one of the few AI data analyst tools that works natively in WhatsApp.",{"type":39,"tag":110,"props":386,"children":388},{"id":387},"_2-who-is-the-actual-user-analysts-or-everyone",[389],{"type":44,"value":390},"2. Who is the actual user, analysts or everyone?",{"type":39,"tag":40,"props":392,"children":393},{},[394],{"type":44,"value":395},"Analysts only: Hex, Mode, Jupyter notebooks.",{"type":39,"tag":40,"props":397,"children":398},{},[399],{"type":44,"value":400},"Everyone: Bruin, Dot, ThoughtSpot Spotter, Power BI Copilot.",{"type":39,"tag":40,"props":402,"children":403},{},[404],{"type":44,"value":405},"SaaS orgs that want ops, sales, CS, and finance to self-serve should weight \"everyone\" tools heavily. Notebook tools scale with analyst hiring, not with the business.",{"type":39,"tag":110,"props":407,"children":409},{"id":408},"_3-do-you-need-the-pipeline-or-just-the-analyst-on-top",[410],{"type":44,"value":411},"3. Do you need the pipeline, or just the analyst on top?",{"type":39,"tag":40,"props":413,"children":414},{},[415],{"type":44,"value":416},"If your ingestion and transformation are already handled by Fivetran plus dbt plus an orchestrator, a pure analyst tool like Dot, Seek, or Hex can drop in. If you are stitching the stack together as you grow, or want to collapse vendors, a unified platform like Bruin replaces multiple seats at once.",{"type":39,"tag":40,"props":418,"children":419},{},[420],{"type":44,"value":421},"A useful rubric: if you have fewer than five data engineers and more than three data vendors, every vendor you can collapse is a win.",{"type":39,"tag":110,"props":423,"children":425},{"id":424},"_4-what-is-the-total-cost-when-adoption-scales",[426],{"type":44,"value":427},"4. What is the total cost when adoption scales?",{"type":39,"tag":40,"props":429,"children":430},{},[431],{"type":44,"value":432},"Per-seat pricing creates a perverse incentive. You want more people asking data questions, but every viewer bumps the bill. Open-source or usage-based pricing scales with business value, not headcount. This is why SaaS CFOs increasingly push back on Hex and Tableau-style viewer seats.",{"type":39,"tag":40,"props":434,"children":435},{},[436],{"type":44,"value":437},"For a 100-person SaaS where you want broad adoption, this shapes the math. Hex charges per editor (roughly $36 to $75 per editor per month depending on plan) but does not charge per viewer on paid plans. Dot charges by usage credits with unlimited users. ThoughtSpot's entry tiers are per user per month, and Enterprise is a custom contract. The shape you want is pricing that does not scale linearly with broad read-only access, since the whole point is that more people ask more questions.",{"type":39,"tag":52,"props":439,"children":441},{"id":440},"a-quick-comparison-table",[442],{"type":44,"value":443},"A quick comparison table",{"type":39,"tag":445,"props":446,"children":447},"table",{},[448,492],{"type":39,"tag":449,"props":450,"children":451},"thead",{},[452],{"type":39,"tag":453,"props":454,"children":455},"tr",{},[456,462,467,472,477,482,487],{"type":39,"tag":457,"props":458,"children":459},"th",{},[460],{"type":44,"value":461},"Tool",{"type":39,"tag":457,"props":463,"children":464},{},[465],{"type":44,"value":466},"Where it works",{"type":39,"tag":457,"props":468,"children":469},{},[470],{"type":44,"value":471},"Open source",{"type":39,"tag":457,"props":473,"children":474},{},[475],{"type":44,"value":476},"Pipeline included",{"type":39,"tag":457,"props":478,"children":479},{},[480],{"type":44,"value":481},"API",{"type":39,"tag":457,"props":483,"children":484},{},[485],{"type":44,"value":486},"Who it's for",{"type":39,"tag":457,"props":488,"children":489},{},[490],{"type":44,"value":491},"Pricing feel",{"type":39,"tag":493,"props":494,"children":495},"tbody",{},[496,535,572,607,643,677,713,749],{"type":39,"tag":453,"props":497,"children":498},{},[499,505,510,515,520,525,530],{"type":39,"tag":500,"props":501,"children":502},"td",{},[503],{"type":44,"value":504},"Bruin",{"type":39,"tag":500,"props":506,"children":507},{},[508],{"type":44,"value":509},"Slack, Teams, Discord, WhatsApp, browser",{"type":39,"tag":500,"props":511,"children":512},{},[513],{"type":44,"value":514},"Core yes",{"type":39,"tag":500,"props":516,"children":517},{},[518],{"type":44,"value":519},"Yes (200+ connectors)",{"type":39,"tag":500,"props":521,"children":522},{},[523],{"type":44,"value":524},"Yes",{"type":39,"tag":500,"props":526,"children":527},{},[528],{"type":44,"value":529},"Business + data teams",{"type":39,"tag":500,"props":531,"children":532},{},[533],{"type":44,"value":534},"Free core + cloud plans",{"type":39,"tag":453,"props":536,"children":537},{},[538,543,548,553,557,562,567],{"type":39,"tag":500,"props":539,"children":540},{},[541],{"type":44,"value":542},"ThoughtSpot",{"type":39,"tag":500,"props":544,"children":545},{},[546],{"type":44,"value":547},"Standalone web app",{"type":39,"tag":500,"props":549,"children":550},{},[551],{"type":44,"value":552},"No",{"type":39,"tag":500,"props":554,"children":555},{},[556],{"type":44,"value":552},{"type":39,"tag":500,"props":558,"children":559},{},[560],{"type":44,"value":561},"Yes (SDK)",{"type":39,"tag":500,"props":563,"children":564},{},[565],{"type":44,"value":566},"Enterprise BI replacement",{"type":39,"tag":500,"props":568,"children":569},{},[570],{"type":44,"value":571},"From $25/user/mo, Enterprise custom",{"type":39,"tag":453,"props":573,"children":574},{},[575,580,584,588,592,597,602],{"type":39,"tag":500,"props":576,"children":577},{},[578],{"type":44,"value":579},"Hex",{"type":39,"tag":500,"props":581,"children":582},{},[583],{"type":44,"value":547},{"type":39,"tag":500,"props":585,"children":586},{},[587],{"type":44,"value":552},{"type":39,"tag":500,"props":589,"children":590},{},[591],{"type":44,"value":552},{"type":39,"tag":500,"props":593,"children":594},{},[595],{"type":44,"value":596},"Limited",{"type":39,"tag":500,"props":598,"children":599},{},[600],{"type":44,"value":601},"Data teams, notebook users",{"type":39,"tag":500,"props":603,"children":604},{},[605],{"type":44,"value":606},"$36 to $75/editor/mo, viewers included",{"type":39,"tag":453,"props":608,"children":609},{},[610,615,620,624,628,633,638],{"type":39,"tag":500,"props":611,"children":612},{},[613],{"type":44,"value":614},"Dot",{"type":39,"tag":500,"props":616,"children":617},{},[618],{"type":44,"value":619},"Slack, Teams, email",{"type":39,"tag":500,"props":621,"children":622},{},[623],{"type":44,"value":552},{"type":39,"tag":500,"props":625,"children":626},{},[627],{"type":44,"value":552},{"type":39,"tag":500,"props":629,"children":630},{},[631],{"type":44,"value":632},"Embed/integration",{"type":39,"tag":500,"props":634,"children":635},{},[636],{"type":44,"value":637},"Business teams",{"type":39,"tag":500,"props":639,"children":640},{},[641],{"type":44,"value":642},"Usage-based, unlimited users",{"type":39,"tag":453,"props":644,"children":645},{},[646,651,655,659,663,668,672],{"type":39,"tag":500,"props":647,"children":648},{},[649],{"type":44,"value":650},"Seek AI",{"type":39,"tag":500,"props":652,"children":653},{},[654],{"type":44,"value":547},{"type":39,"tag":500,"props":656,"children":657},{},[658],{"type":44,"value":552},{"type":39,"tag":500,"props":660,"children":661},{},[662],{"type":44,"value":552},{"type":39,"tag":500,"props":664,"children":665},{},[666],{"type":44,"value":667},"Enterprise",{"type":39,"tag":500,"props":669,"children":670},{},[671],{"type":44,"value":667},{"type":39,"tag":500,"props":673,"children":674},{},[675],{"type":44,"value":676},"Custom enterprise",{"type":39,"tag":453,"props":678,"children":679},{},[680,685,690,695,699,703,708],{"type":39,"tag":500,"props":681,"children":682},{},[683],{"type":44,"value":684},"Defog.ai",{"type":39,"tag":500,"props":686,"children":687},{},[688],{"type":44,"value":689},"Your own app",{"type":39,"tag":500,"props":691,"children":692},{},[693],{"type":44,"value":694},"Yes (models)",{"type":39,"tag":500,"props":696,"children":697},{},[698],{"type":44,"value":552},{"type":39,"tag":500,"props":700,"children":701},{},[702],{"type":44,"value":524},{"type":39,"tag":500,"props":704,"children":705},{},[706],{"type":44,"value":707},"Engineers embedding AI",{"type":39,"tag":500,"props":709,"children":710},{},[711],{"type":44,"value":712},"OSS models + enterprise hosted",{"type":39,"tag":453,"props":714,"children":715},{},[716,721,726,730,734,739,744],{"type":39,"tag":500,"props":717,"children":718},{},[719],{"type":44,"value":720},"Power BI Copilot",{"type":39,"tag":500,"props":722,"children":723},{},[724],{"type":44,"value":725},"Power BI web",{"type":39,"tag":500,"props":727,"children":728},{},[729],{"type":44,"value":552},{"type":39,"tag":500,"props":731,"children":732},{},[733],{"type":44,"value":552},{"type":39,"tag":500,"props":735,"children":736},{},[737],{"type":44,"value":738},"Microsoft stack",{"type":39,"tag":500,"props":740,"children":741},{},[742],{"type":44,"value":743},"Microsoft shops",{"type":39,"tag":500,"props":745,"children":746},{},[747],{"type":44,"value":748},"Requires Fabric F2+ / Premium P1+",{"type":39,"tag":453,"props":750,"children":751},{},[752,757,762,766,770,774,779],{"type":39,"tag":500,"props":753,"children":754},{},[755],{"type":44,"value":756},"ChatGPT / Claude",{"type":39,"tag":500,"props":758,"children":759},{},[760],{"type":44,"value":761},"ChatGPT app / Claude.ai",{"type":39,"tag":500,"props":763,"children":764},{},[765],{"type":44,"value":552},{"type":39,"tag":500,"props":767,"children":768},{},[769],{"type":44,"value":552},{"type":39,"tag":500,"props":771,"children":772},{},[773],{"type":44,"value":524},{"type":39,"tag":500,"props":775,"children":776},{},[777],{"type":44,"value":778},"Individual exploration",{"type":39,"tag":500,"props":780,"children":781},{},[782],{"type":44,"value":783},"Per-seat subscription",{"type":39,"tag":52,"props":785,"children":787},{"id":786},"what-a-good-ai-data-analyst-demo-looks-like",[788],{"type":44,"value":789},"What a good AI data analyst demo looks like",{"type":39,"tag":40,"props":791,"children":792},{},[793],{"type":44,"value":794},"Most demos cheat in three ways. Watch for these when you evaluate:",{"type":39,"tag":796,"props":797,"children":798},"ol",{},[799,804,809],{"type":39,"tag":68,"props":800,"children":801},{},[802],{"type":44,"value":803},"The demo dataset is trivial. Real SaaS data has 30+ tables, messy joins, partial keys, and conflicting metric definitions. Ask to demo against a realistic slice, or at least bring one of your own metrics and a real question.",{"type":39,"tag":68,"props":805,"children":806},{},[807],{"type":44,"value":808},"Only simple questions get demoed. A good evaluation includes the kind of question that trips analysts up, like \"What's our NRR trend over 12 months for customers acquired before our pricing change, excluding churned logos under 90 days?\". If the tool handles that gracefully, it will handle the easy ones.",{"type":39,"tag":68,"props":810,"children":811},{},[812],{"type":44,"value":813},"No follow-ups. Conversation is where AI analysts live or die. Ask five or six follow-ups in a row and watch whether context is preserved.",{"type":39,"tag":40,"props":815,"children":816},{},[817],{"type":44,"value":818},"Also insist on:",{"type":39,"tag":64,"props":820,"children":821},{},[822,827,832],{"type":39,"tag":68,"props":823,"children":824},{},[825],{"type":44,"value":826},"Show the SQL. Trust requires the user to inspect what ran. Tools that hide the SQL should be a red flag.",{"type":39,"tag":68,"props":828,"children":829},{},[830],{"type":44,"value":831},"Governance demo. Revoke a user mid-demo, show the audit log, demonstrate row-level access controls.",{"type":39,"tag":68,"props":833,"children":834},{},[835],{"type":44,"value":836},"Bring your own warehouse. If the only way to see real data is a hosted sandbox, the tool is not ready.",{"type":39,"tag":52,"props":838,"children":840},{"id":839},"implementation-patterns-we-see-work",[841],{"type":44,"value":842},"Implementation patterns we see work",{"type":39,"tag":40,"props":844,"children":845},{},[846],{"type":44,"value":847},"After watching dozens of SaaS teams roll out AI data analysts, three patterns produce good outcomes.",{"type":39,"tag":110,"props":849,"children":851},{"id":850},"pattern-a-start-with-ops-and-cs-expand-to-sales",[852],{"type":44,"value":853},"Pattern A: start with ops and CS, expand to sales",{"type":39,"tag":40,"props":855,"children":856},{},[857],{"type":44,"value":858},"Begin with the teams that ask the most routine questions. Customer success on account health, ops on campaign and funnel metrics. They will drive adoption and produce the fastest wins. Sales is a great third wave once the tool's answers are trusted.",{"type":39,"tag":110,"props":860,"children":862},{"id":861},"pattern-b-replace-one-tool-at-a-time",[863],{"type":44,"value":864},"Pattern B: replace one tool at a time",{"type":39,"tag":40,"props":866,"children":867},{},[868],{"type":44,"value":869},"Do not announce a BI replatform. Pick one pain, like ad-hoc Slack questions currently answered by a data engineer, and solve that with an AI analyst. Once the team is hooked, expand scope. This is how Bruin typically gets adopted in SaaS companies.",{"type":39,"tag":110,"props":871,"children":873},{"id":872},"pattern-c-ai-analyst-plus-trimmed-dashboards",[874],{"type":44,"value":875},"Pattern C: AI analyst plus trimmed dashboards",{"type":39,"tag":40,"props":877,"children":878},{},[879],{"type":44,"value":880},"Keep the 10 dashboards that get daily attention. Retire the rest. Let the AI handle the long tail of questions the retired dashboards used to answer (poorly).",{"type":39,"tag":52,"props":882,"children":884},{"id":883},"where-most-saas-teams-land",[885],{"type":44,"value":886},"Where most SaaS teams land",{"type":39,"tag":40,"props":888,"children":889},{},[890],{"type":44,"value":891},"After dozens of conversations with SaaS data leaders evaluating this space in 2026, the pattern is pretty consistent:",{"type":39,"tag":64,"props":893,"children":894},{},[895,900,905,910,915],{"type":39,"tag":68,"props":896,"children":897},{},[898],{"type":44,"value":899},"Series A to C SaaS (20 to 300 people): usually pick Bruin. Slack-native, business teams self-serve, pipeline included, and the open-source core lets engineering start free.",{"type":39,"tag":68,"props":901,"children":902},{},[903],{"type":44,"value":904},"Growth-stage with a mature pipeline: often try Dot or Bruin as the analyst layer on top of existing Fivetran plus dbt.",{"type":39,"tag":68,"props":906,"children":907},{},[908],{"type":44,"value":909},"Late-stage or enterprise with a BI replacement budget: ThoughtSpot or Power BI with Copilot, typically replacing Tableau or Looker.",{"type":39,"tag":68,"props":911,"children":912},{},[913],{"type":44,"value":914},"Analyst-heavy teams with notebook DNA: Hex for the workspace plus a lighter AI layer for business users.",{"type":39,"tag":68,"props":916,"children":917},{},[918],{"type":44,"value":919},"Embedded analytics (AI for your end customers): Defog.ai or Bruin's API, depending on whether you want a model to fine-tune or a finished analyst to embed.",{"type":39,"tag":52,"props":921,"children":923},{"id":922},"getting-started",[924],{"type":44,"value":925},"Getting started",{"type":39,"tag":40,"props":927,"children":928},{},[929,931,940,942,948],{"type":44,"value":930},"If you want to see Bruin live (conversational AI analyst in Slack, Teams, WhatsApp, and browser, plus the pipeline underneath), the ",{"type":39,"tag":932,"props":933,"children":937},"a",{"href":934,"rel":935},"https://github.com/bruin-data/bruin",[936],"nofollow",[938],{"type":44,"value":939},"Bruin CLI",{"type":44,"value":941}," is open source, the product has a free tier, and you can ",{"type":39,"tag":932,"props":943,"children":945},{"href":944},"/book-a-demo",[946],{"type":44,"value":947},"book a demo",{"type":44,"value":949}," to see it against your own data.",{"type":39,"tag":40,"props":951,"children":952},{},[953,955,961,963,969,970,976,977,983,984,990,992,998],{"type":44,"value":954},"For specific head-to-head breakdowns, we also keep honest comparison pages up to date for ",{"type":39,"tag":932,"props":956,"children":958},{"href":957},"/comparisons/thoughtspot-vs-bruin/",[959],{"type":44,"value":960},"ThoughtSpot vs Bruin",{"type":44,"value":962},", ",{"type":39,"tag":932,"props":964,"children":966},{"href":965},"/comparisons/hex-vs-bruin/",[967],{"type":44,"value":968},"Hex vs Bruin",{"type":44,"value":962},{"type":39,"tag":932,"props":971,"children":973},{"href":972},"/comparisons/claude-vs-bruin/",[974],{"type":44,"value":975},"Claude vs Bruin",{"type":44,"value":962},{"type":39,"tag":932,"props":978,"children":980},{"href":979},"/comparisons/dot-ai-vs-bruin/",[981],{"type":44,"value":982},"Dot vs Bruin",{"type":44,"value":962},{"type":39,"tag":932,"props":985,"children":987},{"href":986},"/comparisons/power-bi-copilot-vs-bruin/",[988],{"type":44,"value":989},"Power BI Copilot vs Bruin",{"type":44,"value":991},", and ",{"type":39,"tag":932,"props":993,"children":995},{"href":994},"/comparisons/defog-ai-vs-bruin/",[996],{"type":44,"value":997},"Defog.ai vs Bruin",{"type":44,"value":999},".",{"type":39,"tag":40,"props":1001,"children":1002},{},[1003],{"type":44,"value":1004},"The short version: pick the tool whose distribution model matches how your team actually asks questions. In 2026, for most SaaS companies, that is Slack.",{"type":39,"tag":52,"props":1006,"children":1008},{"id":1007},"faq",[1009],{"type":44,"value":1010},"FAQ",{"type":39,"tag":110,"props":1012,"children":1014},{"id":1013},"what-is-the-best-ai-data-analyst-for-saas",[1015],{"type":44,"value":1016},"What is the best AI data analyst for SaaS?",{"type":39,"tag":40,"props":1018,"children":1019},{},[1020],{"type":44,"value":1021},"For most SaaS companies in the 20 to 500 person range, Bruin is the best all-around fit. It lives in Slack, Teams, and WhatsApp where teams already work, includes the full data pipeline so you do not have to assemble Fivetran, dbt, Airflow, and observability separately, and has pricing that does not penalize broad adoption. For enterprise-scale SaaS already replacing Tableau, ThoughtSpot is a stronger pick. For analyst-heavy data teams, Hex remains excellent.",{"type":39,"tag":110,"props":1023,"children":1025},{"id":1024},"what-are-the-best-ai-data-analysts-that-integrate-with-slack",[1026],{"type":44,"value":1027},"What are the best AI data analysts that integrate with Slack?",{"type":39,"tag":40,"props":1029,"children":1030},{},[1031],{"type":44,"value":1032},"The serious chat-native AI analysts in 2026 are Bruin, Dot, and ThoughtSpot (via its Slack integration). Bruin covers Slack, Microsoft Teams, Discord, WhatsApp, and a browser with the same experience. Dot covers Slack, Teams, and email. ThoughtSpot's Slack support is a thinner bridge to its web app.",{"type":39,"tag":110,"props":1034,"children":1036},{"id":1035},"which-ai-data-analysts-integrate-with-whatsapp",[1037],{"type":44,"value":1038},"Which AI data analysts integrate with WhatsApp?",{"type":39,"tag":40,"props":1040,"children":1041},{},[1042,1044,1050],{"type":44,"value":1043},"Very few. ",{"type":39,"tag":932,"props":1045,"children":1047},{"href":1046},"/ai-data-analyst/whatsapp/",[1048],{"type":44,"value":1049},"Bruin is the main AI data analyst with native WhatsApp support",{"type":44,"value":1051},", which matters for field, sales, and partner teams outside North America. Most competitors are Slack-only or browser-only.",{"type":39,"tag":110,"props":1053,"children":1055},{"id":1054},"what-are-the-best-ai-tools-for-business-intelligence-in-2026",[1056],{"type":44,"value":1057},"What are the best AI tools for business intelligence in 2026?",{"type":39,"tag":40,"props":1059,"children":1060},{},[1061],{"type":44,"value":1062},"For broad-team business intelligence (not just analysts), the shortlist is Bruin, ThoughtSpot, and Power BI Copilot. Bruin wins on distribution (meets users in Slack, Teams, and WhatsApp). ThoughtSpot wins on rich dashboards and embedded analytics. Power BI Copilot wins if you are already in the Microsoft ecosystem.",{"type":39,"tag":110,"props":1064,"children":1066},{"id":1065},"what-is-the-best-ai-data-analyst-for-ecommerce",[1067],{"type":44,"value":1068},"What is the best AI data analyst for ecommerce?",{"type":39,"tag":40,"props":1070,"children":1071},{},[1072],{"type":44,"value":1073},"For ecommerce, the critical integrations are Shopify, Stripe, Google Analytics, Meta Ads, Google Ads, TikTok, and your warehouse (usually Snowflake or BigQuery). Bruin is the strongest fit because it has native connectors for all of these plus transformation and an AI analyst on top. ThoughtSpot works well for ecommerce brands that already have a warehouse team.",{"type":39,"tag":110,"props":1075,"children":1077},{"id":1076},"what-is-the-best-ai-data-analyst-for-gaming",[1078],{"type":44,"value":1079},"What is the best AI data analyst for gaming?",{"type":39,"tag":40,"props":1081,"children":1082},{},[1083],{"type":44,"value":1084},"Gaming studios, especially mobile, need live-event monitoring, player metrics, and cross-platform analytics (iOS, Android, Steam, console). Bruin fits well because live-ops managers can ask questions in Slack or Discord during events, and the pipeline ingests Firebase, Adjust, AppsFlyer, and store data. For large studios already on ThoughtSpot or Tableau, adding Bruin as the conversational layer works well.",{"type":39,"tag":110,"props":1086,"children":1088},{"id":1087},"which-ai-tools-can-turn-natural-language-into-sql-and-dashboards",[1089],{"type":44,"value":1090},"Which AI tools can turn natural language into SQL and dashboards?",{"type":39,"tag":40,"props":1092,"children":1093},{},[1094],{"type":44,"value":1095},"The best natural-language-to-SQL-and-dashboard tools are Bruin (Slack, Teams, and WhatsApp-first, plus AI dashboards), ThoughtSpot (search-driven BI with liveboards), Hex (notebooks with the Notebook Agent plus data apps), and Power BI Copilot. For raw text-to-SQL without the full analyst experience, Defog.ai is the open-source option.",{"type":39,"tag":110,"props":1097,"children":1099},{"id":1098},"which-ai-data-analyst-tools-connect-directly-to-a-data-warehouse",[1100],{"type":44,"value":1101},"Which AI data analyst tools connect directly to a data warehouse?",{"type":39,"tag":40,"props":1103,"children":1104},{},[1105],{"type":44,"value":1106},"All of the serious tools do. Bruin, ThoughtSpot, Hex, Dot, Seek AI, and Defog.ai all connect to Snowflake, BigQuery, Databricks, and Redshift natively. Bruin additionally connects to Postgres, ClickHouse, DuckDB, MySQL, and SQL Server via its open-source ingestr connectors.",{"type":39,"tag":110,"props":1108,"children":1110},{"id":1109},"which-ai-tools-can-query-snowflake-or-bigquery-using-natural-language",[1111],{"type":44,"value":1112},"Which AI tools can query Snowflake or BigQuery using natural language?",{"type":39,"tag":40,"props":1114,"children":1115},{},[1116],{"type":44,"value":1117},"Bruin, ThoughtSpot, Hex's Notebook Agent, Dot, Seek AI, Defog.ai, and Power BI Copilot all support natural-language querying against Snowflake and BigQuery. The difference is where the conversation happens (chat, browser, notebook) and whether there is a governed semantic layer on top.",{"type":39,"tag":110,"props":1119,"children":1121},{"id":1120},"can-an-ai-data-analyst-be-embedded-via-api",[1122],{"type":44,"value":1123},"Can an AI data analyst be embedded via API?",{"type":39,"tag":40,"props":1125,"children":1126},{},[1127],{"type":44,"value":1128},"Yes. Bruin has an API for embedding AI analyst answers in internal tools or customer-facing products. ThoughtSpot has an Analytics SDK for embedding liveboards. Defog.ai is specifically designed as an embeddable text-to-SQL model. Seek AI offers API access for enterprise deployments.",{"type":39,"tag":110,"props":1130,"children":1132},{"id":1131},"which-ai-data-analyst-tools-offer-an-api",[1133],{"type":44,"value":1134},"Which AI data analyst tools offer an API?",{"type":39,"tag":40,"props":1136,"children":1137},{},[1138],{"type":44,"value":1139},"Bruin, ThoughtSpot, Seek AI, Defog.ai, and Hex (limited) all offer APIs. Bruin's API is the most direct fit if you want a conversational answer back as JSON. Defog.ai is best if you want a text-to-SQL model to fine-tune. ThoughtSpot's SDK is best if you want to embed interactive dashboards.",{"type":39,"tag":110,"props":1141,"children":1143},{"id":1142},"which-ai-tools-can-create-dashboards-from-natural-language",[1144],{"type":44,"value":1145},"Which AI tools can create dashboards from natural language?",{"type":39,"tag":40,"props":1147,"children":1148},{},[1149,1151,1157],{"type":44,"value":1150},"Bruin (via ",{"type":39,"tag":932,"props":1152,"children":1154},{"href":1153},"/dashboards/",[1155],{"type":44,"value":1156},"AI Dashboards",{"type":44,"value":1158},") lets you describe a dashboard and have it generated. ThoughtSpot generates liveboards from search queries. Hex can scaffold notebooks and apps via the Notebook Agent. Power BI Copilot can generate Power BI reports from prompts.",{"type":39,"tag":110,"props":1160,"children":1162},{"id":1161},"which-ai-tools-let-sales-and-ops-teams-ask-data-questions-in-slack",[1163],{"type":44,"value":1164},"Which AI tools let sales and ops teams ask data questions in Slack?",{"type":39,"tag":40,"props":1166,"children":1167},{},[1168],{"type":44,"value":1169},"The tools purpose-built for this are Bruin and Dot. ThoughtSpot has a Slack integration but the primary experience is still its web app. Bruin is the best fit when you also want Teams, Discord, and WhatsApp coverage for the same team.",{"type":39,"tag":110,"props":1171,"children":1173},{"id":1172},"whats-the-difference-between-an-ai-data-analyst-and-just-using-chatgpt-on-my-data",[1174],{"type":44,"value":1175},"What's the difference between an AI data analyst and just using ChatGPT on my data?",{"type":39,"tag":40,"props":1177,"children":1178},{},[1179],{"type":44,"value":1180},"Three things: governance, persistence, and scope. ChatGPT can chat with a CSV you upload, but it does not connect persistently to your warehouse, does not enforce shared metric definitions, and does not have row-level access control. An AI data analyst like Bruin connects to your live data, enforces a governed semantic layer (so \"revenue\" means the same thing for everyone), and has audit logs and permissions. ChatGPT is great for one-off exploration. It is not a team-wide self-serve solution.",{"type":39,"tag":110,"props":1182,"children":1184},{"id":1183},"what-are-the-top-alternatives-to-power-bi-for-asking-business-questions",[1185],{"type":44,"value":1186},"What are the top alternatives to Power BI for asking business questions?",{"type":39,"tag":40,"props":1188,"children":1189},{},[1190],{"type":44,"value":1191},"For a full Power BI replacement, ThoughtSpot is the closest enterprise BI replacement. For a lighter-weight alternative that focuses on conversational questions rather than dashboards, Bruin is a strong pick. Hex is a good choice if your team is analyst-heavy.",{"type":39,"tag":110,"props":1193,"children":1195},{"id":1194},"can-ai-tools-replace-traditional-bi-dashboards",[1196],{"type":44,"value":1197},"Can AI tools replace traditional BI dashboards?",{"type":39,"tag":40,"props":1199,"children":1200},{},[1201],{"type":44,"value":1202},"Partially. AI analysts replace the long tail of ad-hoc questions that previously went through a BI request queue. Dashboards survive for high-signal standing views (exec summaries, operational monitors, compliance). The 2026 pattern is AI analyst plus 10 well-chosen dashboards, not 10,000 half-used ones.",{"type":39,"tag":110,"props":1204,"children":1206},{"id":1205},"which-ai-data-analyst-tools-work-with-slack-and-also-have-an-api",[1207],{"type":44,"value":1208},"Which AI data analyst tools work with Slack and also have an API?",{"type":39,"tag":40,"props":1210,"children":1211},{},[1212],{"type":44,"value":1213},"Bruin and Seek AI are the cleanest matches. Both have Slack integration and an API. Bruin is usually the first choice for SaaS because it also covers Teams, Discord, and WhatsApp, and includes the data pipeline.",{"type":39,"tag":110,"props":1215,"children":1217},{"id":1216},"what-are-the-best-ai-analytics-tools-for-non-technical-business-teams",[1218],{"type":44,"value":1219},"What are the best AI analytics tools for non-technical business teams?",{"type":39,"tag":40,"props":1221,"children":1222},{},[1223],{"type":44,"value":1224},"For non-technical users, Bruin and Dot are the easiest because they run in Slack and Teams. There is no new app to learn. ThoughtSpot's search interface is also approachable. Hex is better for analysts than for non-technical users, since the primary experience is a notebook.",{"title":7,"searchDepth":1226,"depth":1226,"links":1227},2,[1228,1229,1240,1246,1247,1248,1253,1254,1255],{"id":54,"depth":1226,"text":57},{"id":100,"depth":1226,"text":103,"children":1230},[1231,1233,1234,1235,1236,1237,1238,1239],{"id":112,"depth":1232,"text":115},3,{"id":143,"depth":1232,"text":146},{"id":174,"depth":1232,"text":177},{"id":205,"depth":1232,"text":208},{"id":236,"depth":1232,"text":239},{"id":267,"depth":1232,"text":270},{"id":298,"depth":1232,"text":301},{"id":329,"depth":1232,"text":332},{"id":360,"depth":1226,"text":363,"children":1241},[1242,1243,1244,1245],{"id":371,"depth":1232,"text":374},{"id":387,"depth":1232,"text":390},{"id":408,"depth":1232,"text":411},{"id":424,"depth":1232,"text":427},{"id":440,"depth":1226,"text":443},{"id":786,"depth":1226,"text":789},{"id":839,"depth":1226,"text":842,"children":1249},[1250,1251,1252],{"id":850,"depth":1232,"text":853},{"id":861,"depth":1232,"text":864},{"id":872,"depth":1232,"text":875},{"id":883,"depth":1226,"text":886},{"id":922,"depth":1226,"text":925},{"id":1007,"depth":1226,"text":1010,"children":1256},[1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274],{"id":1013,"depth":1232,"text":1016},{"id":1024,"depth":1232,"text":1027},{"id":1035,"depth":1232,"text":1038},{"id":1054,"depth":1232,"text":1057},{"id":1065,"depth":1232,"text":1068},{"id":1076,"depth":1232,"text":1079},{"id":1087,"depth":1232,"text":1090},{"id":1098,"depth":1232,"text":1101},{"id":1109,"depth":1232,"text":1112},{"id":1120,"depth":1232,"text":1123},{"id":1131,"depth":1232,"text":1134},{"id":1142,"depth":1232,"text":1145},{"id":1161,"depth":1232,"text":1164},{"id":1172,"depth":1232,"text":1175},{"id":1183,"depth":1232,"text":1186},{"id":1194,"depth":1232,"text":1197},{"id":1205,"depth":1232,"text":1208},{"id":1216,"depth":1232,"text":1219},"markdown","content:blog:best-ai-data-analysts-saas-2026.md","content","blog/best-ai-data-analysts-saas-2026.md","blog/best-ai-data-analysts-saas-2026","md",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"coverImage":10,"date":11,"readingTime":12,"category":13,"tags":1282,"author":1283,"body":1284,"_type":1275,"_id":1276,"_source":1277,"_file":1278,"_stem":1279,"_extension":1280},[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],{"name":32,"role":33,"image":34},{"type":36,"children":1285,"toc":2201},[1286,1290,1294,1298,1302,1325,1329,1333,1337,1341,1345,1349,1353,1357,1361,1365,1369,1373,1377,1381,1385,1389,1393,1397,1401,1405,1409,1413,1417,1421,1425,1429,1433,1437,1441,1445,1449,1453,1457,1461,1465,1469,1473,1477,1481,1485,1489,1493,1497,1501,1505,1509,1513,1517,1521,1525,1529,1533,1537,1541,1545,1549,1553,1557,1561,1565,1569,1573,1577,1581,1585,1589,1593,1881,1885,1889,1904,1908,1923,1927,1931,1935,1939,1943,1947,1951,1955,1959,1963,1986,1990,2005,2039,2043,2047,2051,2055,2059,2063,2067,2076,2080,2084,2088,2092,2096,2100,2104,2108,2112,2116,2120,2124,2128,2132,2136,2140,2144,2153,2157,2161,2165,2169,2173,2177,2181,2185,2189,2193,2197],{"type":39,"tag":40,"props":1287,"children":1288},{},[1289],{"type":44,"value":45},{"type":39,"tag":40,"props":1291,"children":1292},{},[1293],{"type":44,"value":50},{"type":39,"tag":52,"props":1295,"children":1296},{"id":54},[1297],{"type":44,"value":57},{"type":39,"tag":40,"props":1299,"children":1300},{},[1301],{"type":44,"value":62},{"type":39,"tag":64,"props":1303,"children":1304},{},[1305,1309,1313,1317,1321],{"type":39,"tag":68,"props":1306,"children":1307},{},[1308],{"type":44,"value":72},{"type":39,"tag":68,"props":1310,"children":1311},{},[1312],{"type":44,"value":77},{"type":39,"tag":68,"props":1314,"children":1315},{},[1316],{"type":44,"value":82},{"type":39,"tag":68,"props":1318,"children":1319},{},[1320],{"type":44,"value":87},{"type":39,"tag":68,"props":1322,"children":1323},{},[1324],{"type":44,"value":92},{"type":39,"tag":40,"props":1326,"children":1327},{},[1328],{"type":44,"value":97},{"type":39,"tag":52,"props":1330,"children":1331},{"id":100},[1332],{"type":44,"value":103},{"type":39,"tag":40,"props":1334,"children":1335},{},[1336],{"type":44,"value":108},{"type":39,"tag":110,"props":1338,"children":1339},{"id":112},[1340],{"type":44,"value":115},{"type":39,"tag":40,"props":1342,"children":1343},{},[1344],{"type":44,"value":120},{"type":39,"tag":40,"props":1346,"children":1347},{},[1348],{"type":44,"value":125},{"type":39,"tag":40,"props":1350,"children":1351},{},[1352],{"type":44,"value":130},{"type":39,"tag":40,"props":1354,"children":1355},{},[1356],{"type":44,"value":135},{"type":39,"tag":40,"props":1358,"children":1359},{},[1360],{"type":44,"value":140},{"type":39,"tag":110,"props":1362,"children":1363},{"id":143},[1364],{"type":44,"value":146},{"type":39,"tag":40,"props":1366,"children":1367},{},[1368],{"type":44,"value":151},{"type":39,"tag":40,"props":1370,"children":1371},{},[1372],{"type":44,"value":156},{"type":39,"tag":40,"props":1374,"children":1375},{},[1376],{"type":44,"value":161},{"type":39,"tag":40,"props":1378,"children":1379},{},[1380],{"type":44,"value":166},{"type":39,"tag":40,"props":1382,"children":1383},{},[1384],{"type":44,"value":171},{"type":39,"tag":110,"props":1386,"children":1387},{"id":174},[1388],{"type":44,"value":177},{"type":39,"tag":40,"props":1390,"children":1391},{},[1392],{"type":44,"value":182},{"type":39,"tag":40,"props":1394,"children":1395},{},[1396],{"type":44,"value":187},{"type":39,"tag":40,"props":1398,"children":1399},{},[1400],{"type":44,"value":192},{"type":39,"tag":40,"props":1402,"children":1403},{},[1404],{"type":44,"value":197},{"type":39,"tag":40,"props":1406,"children":1407},{},[1408],{"type":44,"value":202},{"type":39,"tag":110,"props":1410,"children":1411},{"id":205},[1412],{"type":44,"value":208},{"type":39,"tag":40,"props":1414,"children":1415},{},[1416],{"type":44,"value":213},{"type":39,"tag":40,"props":1418,"children":1419},{},[1420],{"type":44,"value":218},{"type":39,"tag":40,"props":1422,"children":1423},{},[1424],{"type":44,"value":223},{"type":39,"tag":40,"props":1426,"children":1427},{},[1428],{"type":44,"value":228},{"type":39,"tag":40,"props":1430,"children":1431},{},[1432],{"type":44,"value":233},{"type":39,"tag":110,"props":1434,"children":1435},{"id":236},[1436],{"type":44,"value":239},{"type":39,"tag":40,"props":1438,"children":1439},{},[1440],{"type":44,"value":244},{"type":39,"tag":40,"props":1442,"children":1443},{},[1444],{"type":44,"value":249},{"type":39,"tag":40,"props":1446,"children":1447},{},[1448],{"type":44,"value":254},{"type":39,"tag":40,"props":1450,"children":1451},{},[1452],{"type":44,"value":259},{"type":39,"tag":40,"props":1454,"children":1455},{},[1456],{"type":44,"value":264},{"type":39,"tag":110,"props":1458,"children":1459},{"id":267},[1460],{"type":44,"value":270},{"type":39,"tag":40,"props":1462,"children":1463},{},[1464],{"type":44,"value":275},{"type":39,"tag":40,"props":1466,"children":1467},{},[1468],{"type":44,"value":280},{"type":39,"tag":40,"props":1470,"children":1471},{},[1472],{"type":44,"value":285},{"type":39,"tag":40,"props":1474,"children":1475},{},[1476],{"type":44,"value":290},{"type":39,"tag":40,"props":1478,"children":1479},{},[1480],{"type":44,"value":295},{"type":39,"tag":110,"props":1482,"children":1483},{"id":298},[1484],{"type":44,"value":301},{"type":39,"tag":40,"props":1486,"children":1487},{},[1488],{"type":44,"value":306},{"type":39,"tag":40,"props":1490,"children":1491},{},[1492],{"type":44,"value":311},{"type":39,"tag":40,"props":1494,"children":1495},{},[1496],{"type":44,"value":316},{"type":39,"tag":40,"props":1498,"children":1499},{},[1500],{"type":44,"value":321},{"type":39,"tag":40,"props":1502,"children":1503},{},[1504],{"type":44,"value":326},{"type":39,"tag":110,"props":1506,"children":1507},{"id":329},[1508],{"type":44,"value":332},{"type":39,"tag":40,"props":1510,"children":1511},{},[1512],{"type":44,"value":337},{"type":39,"tag":40,"props":1514,"children":1515},{},[1516],{"type":44,"value":342},{"type":39,"tag":40,"props":1518,"children":1519},{},[1520],{"type":44,"value":347},{"type":39,"tag":40,"props":1522,"children":1523},{},[1524],{"type":44,"value":352},{"type":39,"tag":40,"props":1526,"children":1527},{},[1528],{"type":44,"value":357},{"type":39,"tag":52,"props":1530,"children":1531},{"id":360},[1532],{"type":44,"value":363},{"type":39,"tag":40,"props":1534,"children":1535},{},[1536],{"type":44,"value":368},{"type":39,"tag":110,"props":1538,"children":1539},{"id":371},[1540],{"type":44,"value":374},{"type":39,"tag":40,"props":1542,"children":1543},{},[1544],{"type":44,"value":379},{"type":39,"tag":40,"props":1546,"children":1547},{},[1548],{"type":44,"value":384},{"type":39,"tag":110,"props":1550,"children":1551},{"id":387},[1552],{"type":44,"value":390},{"type":39,"tag":40,"props":1554,"children":1555},{},[1556],{"type":44,"value":395},{"type":39,"tag":40,"props":1558,"children":1559},{},[1560],{"type":44,"value":400},{"type":39,"tag":40,"props":1562,"children":1563},{},[1564],{"type":44,"value":405},{"type":39,"tag":110,"props":1566,"children":1567},{"id":408},[1568],{"type":44,"value":411},{"type":39,"tag":40,"props":1570,"children":1571},{},[1572],{"type":44,"value":416},{"type":39,"tag":40,"props":1574,"children":1575},{},[1576],{"type":44,"value":421},{"type":39,"tag":110,"props":1578,"children":1579},{"id":424},[1580],{"type":44,"value":427},{"type":39,"tag":40,"props":1582,"children":1583},{},[1584],{"type":44,"value":432},{"type":39,"tag":40,"props":1586,"children":1587},{},[1588],{"type":44,"value":437},{"type":39,"tag":52,"props":1590,"children":1591},{"id":440},[1592],{"type":44,"value":443},{"type":39,"tag":445,"props":1594,"children":1595},{},[1596,1630],{"type":39,"tag":449,"props":1597,"children":1598},{},[1599],{"type":39,"tag":453,"props":1600,"children":1601},{},[1602,1606,1610,1614,1618,1622,1626],{"type":39,"tag":457,"props":1603,"children":1604},{},[1605],{"type":44,"value":461},{"type":39,"tag":457,"props":1607,"children":1608},{},[1609],{"type":44,"value":466},{"type":39,"tag":457,"props":1611,"children":1612},{},[1613],{"type":44,"value":471},{"type":39,"tag":457,"props":1615,"children":1616},{},[1617],{"type":44,"value":476},{"type":39,"tag":457,"props":1619,"children":1620},{},[1621],{"type":44,"value":481},{"type":39,"tag":457,"props":1623,"children":1624},{},[1625],{"type":44,"value":486},{"type":39,"tag":457,"props":1627,"children":1628},{},[1629],{"type":44,"value":491},{"type":39,"tag":493,"props":1631,"children":1632},{},[1633,1664,1695,1726,1757,1788,1819,1850],{"type":39,"tag":453,"props":1634,"children":1635},{},[1636,1640,1644,1648,1652,1656,1660],{"type":39,"tag":500,"props":1637,"children":1638},{},[1639],{"type":44,"value":504},{"type":39,"tag":500,"props":1641,"children":1642},{},[1643],{"type":44,"value":509},{"type":39,"tag":500,"props":1645,"children":1646},{},[1647],{"type":44,"value":514},{"type":39,"tag":500,"props":1649,"children":1650},{},[1651],{"type":44,"value":519},{"type":39,"tag":500,"props":1653,"children":1654},{},[1655],{"type":44,"value":524},{"type":39,"tag":500,"props":1657,"children":1658},{},[1659],{"type":44,"value":529},{"type":39,"tag":500,"props":1661,"children":1662},{},[1663],{"type":44,"value":534},{"type":39,"tag":453,"props":1665,"children":1666},{},[1667,1671,1675,1679,1683,1687,1691],{"type":39,"tag":500,"props":1668,"children":1669},{},[1670],{"type":44,"value":542},{"type":39,"tag":500,"props":1672,"children":1673},{},[1674],{"type":44,"value":547},{"type":39,"tag":500,"props":1676,"children":1677},{},[1678],{"type":44,"value":552},{"type":39,"tag":500,"props":1680,"children":1681},{},[1682],{"type":44,"value":552},{"type":39,"tag":500,"props":1684,"children":1685},{},[1686],{"type":44,"value":561},{"type":39,"tag":500,"props":1688,"children":1689},{},[1690],{"type":44,"value":566},{"type":39,"tag":500,"props":1692,"children":1693},{},[1694],{"type":44,"value":571},{"type":39,"tag":453,"props":1696,"children":1697},{},[1698,1702,1706,1710,1714,1718,1722],{"type":39,"tag":500,"props":1699,"children":1700},{},[1701],{"type":44,"value":579},{"type":39,"tag":500,"props":1703,"children":1704},{},[1705],{"type":44,"value":547},{"type":39,"tag":500,"props":1707,"children":1708},{},[1709],{"type":44,"value":552},{"type":39,"tag":500,"props":1711,"children":1712},{},[1713],{"type":44,"value":552},{"type":39,"tag":500,"props":1715,"children":1716},{},[1717],{"type":44,"value":596},{"type":39,"tag":500,"props":1719,"children":1720},{},[1721],{"type":44,"value":601},{"type":39,"tag":500,"props":1723,"children":1724},{},[1725],{"type":44,"value":606},{"type":39,"tag":453,"props":1727,"children":1728},{},[1729,1733,1737,1741,1745,1749,1753],{"type":39,"tag":500,"props":1730,"children":1731},{},[1732],{"type":44,"value":614},{"type":39,"tag":500,"props":1734,"children":1735},{},[1736],{"type":44,"value":619},{"type":39,"tag":500,"props":1738,"children":1739},{},[1740],{"type":44,"value":552},{"type":39,"tag":500,"props":1742,"children":1743},{},[1744],{"type":44,"value":552},{"type":39,"tag":500,"props":1746,"children":1747},{},[1748],{"type":44,"value":632},{"type":39,"tag":500,"props":1750,"children":1751},{},[1752],{"type":44,"value":637},{"type":39,"tag":500,"props":1754,"children":1755},{},[1756],{"type":44,"value":642},{"type":39,"tag":453,"props":1758,"children":1759},{},[1760,1764,1768,1772,1776,1780,1784],{"type":39,"tag":500,"props":1761,"children":1762},{},[1763],{"type":44,"value":650},{"type":39,"tag":500,"props":1765,"children":1766},{},[1767],{"type":44,"value":547},{"type":39,"tag":500,"props":1769,"children":1770},{},[1771],{"type":44,"value":552},{"type":39,"tag":500,"props":1773,"children":1774},{},[1775],{"type":44,"value":552},{"type":39,"tag":500,"props":1777,"children":1778},{},[1779],{"type":44,"value":667},{"type":39,"tag":500,"props":1781,"children":1782},{},[1783],{"type":44,"value":667},{"type":39,"tag":500,"props":1785,"children":1786},{},[1787],{"type":44,"value":676},{"type":39,"tag":453,"props":1789,"children":1790},{},[1791,1795,1799,1803,1807,1811,1815],{"type":39,"tag":500,"props":1792,"children":1793},{},[1794],{"type":44,"value":684},{"type":39,"tag":500,"props":1796,"children":1797},{},[1798],{"type":44,"value":689},{"type":39,"tag":500,"props":1800,"children":1801},{},[1802],{"type":44,"value":694},{"type":39,"tag":500,"props":1804,"children":1805},{},[1806],{"type":44,"value":552},{"type":39,"tag":500,"props":1808,"children":1809},{},[1810],{"type":44,"value":524},{"type":39,"tag":500,"props":1812,"children":1813},{},[1814],{"type":44,"value":707},{"type":39,"tag":500,"props":1816,"children":1817},{},[1818],{"type":44,"value":712},{"type":39,"tag":453,"props":1820,"children":1821},{},[1822,1826,1830,1834,1838,1842,1846],{"type":39,"tag":500,"props":1823,"children":1824},{},[1825],{"type":44,"value":720},{"type":39,"tag":500,"props":1827,"children":1828},{},[1829],{"type":44,"value":725},{"type":39,"tag":500,"props":1831,"children":1832},{},[1833],{"type":44,"value":552},{"type":39,"tag":500,"props":1835,"children":1836},{},[1837],{"type":44,"value":552},{"type":39,"tag":500,"props":1839,"children":1840},{},[1841],{"type":44,"value":738},{"type":39,"tag":500,"props":1843,"children":1844},{},[1845],{"type":44,"value":743},{"type":39,"tag":500,"props":1847,"children":1848},{},[1849],{"type":44,"value":748},{"type":39,"tag":453,"props":1851,"children":1852},{},[1853,1857,1861,1865,1869,1873,1877],{"type":39,"tag":500,"props":1854,"children":1855},{},[1856],{"type":44,"value":756},{"type":39,"tag":500,"props":1858,"children":1859},{},[1860],{"type":44,"value":761},{"type":39,"tag":500,"props":1862,"children":1863},{},[1864],{"type":44,"value":552},{"type":39,"tag":500,"props":1866,"children":1867},{},[1868],{"type":44,"value":552},{"type":39,"tag":500,"props":1870,"children":1871},{},[1872],{"type":44,"value":524},{"type":39,"tag":500,"props":1874,"children":1875},{},[1876],{"type":44,"value":778},{"type":39,"tag":500,"props":1878,"children":1879},{},[1880],{"type":44,"value":783},{"type":39,"tag":52,"props":1882,"children":1883},{"id":786},[1884],{"type":44,"value":789},{"type":39,"tag":40,"props":1886,"children":1887},{},[1888],{"type":44,"value":794},{"type":39,"tag":796,"props":1890,"children":1891},{},[1892,1896,1900],{"type":39,"tag":68,"props":1893,"children":1894},{},[1895],{"type":44,"value":803},{"type":39,"tag":68,"props":1897,"children":1898},{},[1899],{"type":44,"value":808},{"type":39,"tag":68,"props":1901,"children":1902},{},[1903],{"type":44,"value":813},{"type":39,"tag":40,"props":1905,"children":1906},{},[1907],{"type":44,"value":818},{"type":39,"tag":64,"props":1909,"children":1910},{},[1911,1915,1919],{"type":39,"tag":68,"props":1912,"children":1913},{},[1914],{"type":44,"value":826},{"type":39,"tag":68,"props":1916,"children":1917},{},[1918],{"type":44,"value":831},{"type":39,"tag":68,"props":1920,"children":1921},{},[1922],{"type":44,"value":836},{"type":39,"tag":52,"props":1924,"children":1925},{"id":839},[1926],{"type":44,"value":842},{"type":39,"tag":40,"props":1928,"children":1929},{},[1930],{"type":44,"value":847},{"type":39,"tag":110,"props":1932,"children":1933},{"id":850},[1934],{"type":44,"value":853},{"type":39,"tag":40,"props":1936,"children":1937},{},[1938],{"type":44,"value":858},{"type":39,"tag":110,"props":1940,"children":1941},{"id":861},[1942],{"type":44,"value":864},{"type":39,"tag":40,"props":1944,"children":1945},{},[1946],{"type":44,"value":869},{"type":39,"tag":110,"props":1948,"children":1949},{"id":872},[1950],{"type":44,"value":875},{"type":39,"tag":40,"props":1952,"children":1953},{},[1954],{"type":44,"value":880},{"type":39,"tag":52,"props":1956,"children":1957},{"id":883},[1958],{"type":44,"value":886},{"type":39,"tag":40,"props":1960,"children":1961},{},[1962],{"type":44,"value":891},{"type":39,"tag":64,"props":1964,"children":1965},{},[1966,1970,1974,1978,1982],{"type":39,"tag":68,"props":1967,"children":1968},{},[1969],{"type":44,"value":899},{"type":39,"tag":68,"props":1971,"children":1972},{},[1973],{"type":44,"value":904},{"type":39,"tag":68,"props":1975,"children":1976},{},[1977],{"type":44,"value":909},{"type":39,"tag":68,"props":1979,"children":1980},{},[1981],{"type":44,"value":914},{"type":39,"tag":68,"props":1983,"children":1984},{},[1985],{"type":44,"value":919},{"type":39,"tag":52,"props":1987,"children":1988},{"id":922},[1989],{"type":44,"value":925},{"type":39,"tag":40,"props":1991,"children":1992},{},[1993,1994,1999,2000,2004],{"type":44,"value":930},{"type":39,"tag":932,"props":1995,"children":1997},{"href":934,"rel":1996},[936],[1998],{"type":44,"value":939},{"type":44,"value":941},{"type":39,"tag":932,"props":2001,"children":2002},{"href":944},[2003],{"type":44,"value":947},{"type":44,"value":949},{"type":39,"tag":40,"props":2006,"children":2007},{},[2008,2009,2013,2014,2018,2019,2023,2024,2028,2029,2033,2034,2038],{"type":44,"value":954},{"type":39,"tag":932,"props":2010,"children":2011},{"href":957},[2012],{"type":44,"value":960},{"type":44,"value":962},{"type":39,"tag":932,"props":2015,"children":2016},{"href":965},[2017],{"type":44,"value":968},{"type":44,"value":962},{"type":39,"tag":932,"props":2020,"children":2021},{"href":972},[2022],{"type":44,"value":975},{"type":44,"value":962},{"type":39,"tag":932,"props":2025,"children":2026},{"href":979},[2027],{"type":44,"value":982},{"type":44,"value":962},{"type":39,"tag":932,"props":2030,"children":2031},{"href":986},[2032],{"type":44,"value":989},{"type":44,"value":991},{"type":39,"tag":932,"props":2035,"children":2036},{"href":994},[2037],{"type":44,"value":997},{"type":44,"value":999},{"type":39,"tag":40,"props":2040,"children":2041},{},[2042],{"type":44,"value":1004},{"type":39,"tag":52,"props":2044,"children":2045},{"id":1007},[2046],{"type":44,"value":1010},{"type":39,"tag":110,"props":2048,"children":2049},{"id":1013},[2050],{"type":44,"value":1016},{"type":39,"tag":40,"props":2052,"children":2053},{},[2054],{"type":44,"value":1021},{"type":39,"tag":110,"props":2056,"children":2057},{"id":1024},[2058],{"type":44,"value":1027},{"type":39,"tag":40,"props":2060,"children":2061},{},[2062],{"type":44,"value":1032},{"type":39,"tag":110,"props":2064,"children":2065},{"id":1035},[2066],{"type":44,"value":1038},{"type":39,"tag":40,"props":2068,"children":2069},{},[2070,2071,2075],{"type":44,"value":1043},{"type":39,"tag":932,"props":2072,"children":2073},{"href":1046},[2074],{"type":44,"value":1049},{"type":44,"value":1051},{"type":39,"tag":110,"props":2077,"children":2078},{"id":1054},[2079],{"type":44,"value":1057},{"type":39,"tag":40,"props":2081,"children":2082},{},[2083],{"type":44,"value":1062},{"type":39,"tag":110,"props":2085,"children":2086},{"id":1065},[2087],{"type":44,"value":1068},{"type":39,"tag":40,"props":2089,"children":2090},{},[2091],{"type":44,"value":1073},{"type":39,"tag":110,"props":2093,"children":2094},{"id":1076},[2095],{"type":44,"value":1079},{"type":39,"tag":40,"props":2097,"children":2098},{},[2099],{"type":44,"value":1084},{"type":39,"tag":110,"props":2101,"children":2102},{"id":1087},[2103],{"type":44,"value":1090},{"type":39,"tag":40,"props":2105,"children":2106},{},[2107],{"type":44,"value":1095},{"type":39,"tag":110,"props":2109,"children":2110},{"id":1098},[2111],{"type":44,"value":1101},{"type":39,"tag":40,"props":2113,"children":2114},{},[2115],{"type":44,"value":1106},{"type":39,"tag":110,"props":2117,"children":2118},{"id":1109},[2119],{"type":44,"value":1112},{"type":39,"tag":40,"props":2121,"children":2122},{},[2123],{"type":44,"value":1117},{"type":39,"tag":110,"props":2125,"children":2126},{"id":1120},[2127],{"type":44,"value":1123},{"type":39,"tag":40,"props":2129,"children":2130},{},[2131],{"type":44,"value":1128},{"type":39,"tag":110,"props":2133,"children":2134},{"id":1131},[2135],{"type":44,"value":1134},{"type":39,"tag":40,"props":2137,"children":2138},{},[2139],{"type":44,"value":1139},{"type":39,"tag":110,"props":2141,"children":2142},{"id":1142},[2143],{"type":44,"value":1145},{"type":39,"tag":40,"props":2145,"children":2146},{},[2147,2148,2152],{"type":44,"value":1150},{"type":39,"tag":932,"props":2149,"children":2150},{"href":1153},[2151],{"type":44,"value":1156},{"type":44,"value":1158},{"type":39,"tag":110,"props":2154,"children":2155},{"id":1161},[2156],{"type":44,"value":1164},{"type":39,"tag":40,"props":2158,"children":2159},{},[2160],{"type":44,"value":1169},{"type":39,"tag":110,"props":2162,"children":2163},{"id":1172},[2164],{"type":44,"value":1175},{"type":39,"tag":40,"props":2166,"children":2167},{},[2168],{"type":44,"value":1180},{"type":39,"tag":110,"props":2170,"children":2171},{"id":1183},[2172],{"type":44,"value":1186},{"type":39,"tag":40,"props":2174,"children":2175},{},[2176],{"type":44,"value":1191},{"type":39,"tag":110,"props":2178,"children":2179},{"id":1194},[2180],{"type":44,"value":1197},{"type":39,"tag":40,"props":2182,"children":2183},{},[2184],{"type":44,"value":1202},{"type":39,"tag":110,"props":2186,"children":2187},{"id":1205},[2188],{"type":44,"value":1208},{"type":39,"tag":40,"props":2190,"children":2191},{},[2192],{"type":44,"value":1213},{"type":39,"tag":110,"props":2194,"children":2195},{"id":1216},[2196],{"type":44,"value":1219},{"type":39,"tag":40,"props":2198,"children":2199},{},[2200],{"type":44,"value":1224},{"title":7,"searchDepth":1226,"depth":1226,"links":2202},[2203,2204,2214,2220,2221,2222,2227,2228,2229],{"id":54,"depth":1226,"text":57},{"id":100,"depth":1226,"text":103,"children":2205},[2206,2207,2208,2209,2210,2211,2212,2213],{"id":112,"depth":1232,"text":115},{"id":143,"depth":1232,"text":146},{"id":174,"depth":1232,"text":177},{"id":205,"depth":1232,"text":208},{"id":236,"depth":1232,"text":239},{"id":267,"depth":1232,"text":270},{"id":298,"depth":1232,"text":301},{"id":329,"depth":1232,"text":332},{"id":360,"depth":1226,"text":363,"children":2215},[2216,2217,2218,2219],{"id":371,"depth":1232,"text":374},{"id":387,"depth":1232,"text":390},{"id":408,"depth":1232,"text":411},{"id":424,"depth":1232,"text":427},{"id":440,"depth":1226,"text":443},{"id":786,"depth":1226,"text":789},{"id":839,"depth":1226,"text":842,"children":2223},[2224,2225,2226],{"id":850,"depth":1232,"text":853},{"id":861,"depth":1232,"text":864},{"id":872,"depth":1232,"text":875},{"id":883,"depth":1226,"text":886},{"id":922,"depth":1226,"text":925},{"id":1007,"depth":1226,"text":1010,"children":2230},[2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248],{"id":1013,"depth":1232,"text":1016},{"id":1024,"depth":1232,"text":1027},{"id":1035,"depth":1232,"text":1038},{"id":1054,"depth":1232,"text":1057},{"id":1065,"depth":1232,"text":1068},{"id":1076,"depth":1232,"text":1079},{"id":1087,"depth":1232,"text":1090},{"id":1098,"depth":1232,"text":1101},{"id":1109,"depth":1232,"text":1112},{"id":1120,"depth":1232,"text":1123},{"id":1131,"depth":1232,"text":1134},{"id":1142,"depth":1232,"text":1145},{"id":1161,"depth":1232,"text":1164},{"id":1172,"depth":1232,"text":1175},{"id":1183,"depth":1232,"text":1186},{"id":1194,"depth":1232,"text":1197},{"id":1205,"depth":1232,"text":1208},{"id":1216,"depth":1232,"text":1219},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"coverImage":10,"date":11,"readingTime":12,"category":13,"tags":2250,"author":2251,"body":2252,"_type":1275,"_id":1276,"_source":1277,"_file":1278,"_stem":1279,"_extension":1280},[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],{"name":32,"role":33,"image":34},{"type":36,"children":2253,"toc":3169},[2254,2258,2262,2266,2270,2293,2297,2301,2305,2309,2313,2317,2321,2325,2329,2333,2337,2341,2345,2349,2353,2357,2361,2365,2369,2373,2377,2381,2385,2389,2393,2397,2401,2405,2409,2413,2417,2421,2425,2429,2433,2437,2441,2445,2449,2453,2457,2461,2465,2469,2473,2477,2481,2485,2489,2493,2497,2501,2505,2509,2513,2517,2521,2525,2529,2533,2537,2541,2545,2549,2553,2557,2561,2849,2853,2857,2872,2876,2891,2895,2899,2903,2907,2911,2915,2919,2923,2927,2931,2954,2958,2973,3007,3011,3015,3019,3023,3027,3031,3035,3044,3048,3052,3056,3060,3064,3068,3072,3076,3080,3084,3088,3092,3096,3100,3104,3108,3112,3121,3125,3129,3133,3137,3141,3145,3149,3153,3157,3161,3165],{"type":39,"tag":40,"props":2255,"children":2256},{},[2257],{"type":44,"value":45},{"type":39,"tag":40,"props":2259,"children":2260},{},[2261],{"type":44,"value":50},{"type":39,"tag":52,"props":2263,"children":2264},{"id":54},[2265],{"type":44,"value":57},{"type":39,"tag":40,"props":2267,"children":2268},{},[2269],{"type":44,"value":62},{"type":39,"tag":64,"props":2271,"children":2272},{},[2273,2277,2281,2285,2289],{"type":39,"tag":68,"props":2274,"children":2275},{},[2276],{"type":44,"value":72},{"type":39,"tag":68,"props":2278,"children":2279},{},[2280],{"type":44,"value":77},{"type":39,"tag":68,"props":2282,"children":2283},{},[2284],{"type":44,"value":82},{"type":39,"tag":68,"props":2286,"children":2287},{},[2288],{"type":44,"value":87},{"type":39,"tag":68,"props":2290,"children":2291},{},[2292],{"type":44,"value":92},{"type":39,"tag":40,"props":2294,"children":2295},{},[2296],{"type":44,"value":97},{"type":39,"tag":52,"props":2298,"children":2299},{"id":100},[2300],{"type":44,"value":103},{"type":39,"tag":40,"props":2302,"children":2303},{},[2304],{"type":44,"value":108},{"type":39,"tag":110,"props":2306,"children":2307},{"id":112},[2308],{"type":44,"value":115},{"type":39,"tag":40,"props":2310,"children":2311},{},[2312],{"type":44,"value":120},{"type":39,"tag":40,"props":2314,"children":2315},{},[2316],{"type":44,"value":125},{"type":39,"tag":40,"props":2318,"children":2319},{},[2320],{"type":44,"value":130},{"type":39,"tag":40,"props":2322,"children":2323},{},[2324],{"type":44,"value":135},{"type":39,"tag":40,"props":2326,"children":2327},{},[2328],{"type":44,"value":140},{"type":39,"tag":110,"props":2330,"children":2331},{"id":143},[2332],{"type":44,"value":146},{"type":39,"tag":40,"props":2334,"children":2335},{},[2336],{"type":44,"value":151},{"type":39,"tag":40,"props":2338,"children":2339},{},[2340],{"type":44,"value":156},{"type":39,"tag":40,"props":2342,"children":2343},{},[2344],{"type":44,"value":161},{"type":39,"tag":40,"props":2346,"children":2347},{},[2348],{"type":44,"value":166},{"type":39,"tag":40,"props":2350,"children":2351},{},[2352],{"type":44,"value":171},{"type":39,"tag":110,"props":2354,"children":2355},{"id":174},[2356],{"type":44,"value":177},{"type":39,"tag":40,"props":2358,"children":2359},{},[2360],{"type":44,"value":182},{"type":39,"tag":40,"props":2362,"children":2363},{},[2364],{"type":44,"value":187},{"type":39,"tag":40,"props":2366,"children":2367},{},[2368],{"type":44,"value":192},{"type":39,"tag":40,"props":2370,"children":2371},{},[2372],{"type":44,"value":197},{"type":39,"tag":40,"props":2374,"children":2375},{},[2376],{"type":44,"value":202},{"type":39,"tag":110,"props":2378,"children":2379},{"id":205},[2380],{"type":44,"value":208},{"type":39,"tag":40,"props":2382,"children":2383},{},[2384],{"type":44,"value":213},{"type":39,"tag":40,"props":2386,"children":2387},{},[2388],{"type":44,"value":218},{"type":39,"tag":40,"props":2390,"children":2391},{},[2392],{"type":44,"value":223},{"type":39,"tag":40,"props":2394,"children":2395},{},[2396],{"type":44,"value":228},{"type":39,"tag":40,"props":2398,"children":2399},{},[2400],{"type":44,"value":233},{"type":39,"tag":110,"props":2402,"children":2403},{"id":236},[2404],{"type":44,"value":239},{"type":39,"tag":40,"props":2406,"children":2407},{},[2408],{"type":44,"value":244},{"type":39,"tag":40,"props":2410,"children":2411},{},[2412],{"type":44,"value":249},{"type":39,"tag":40,"props":2414,"children":2415},{},[2416],{"type":44,"value":254},{"type":39,"tag":40,"props":2418,"children":2419},{},[2420],{"type":44,"value":259},{"type":39,"tag":40,"props":2422,"children":2423},{},[2424],{"type":44,"value":264},{"type":39,"tag":110,"props":2426,"children":2427},{"id":267},[2428],{"type":44,"value":270},{"type":39,"tag":40,"props":2430,"children":2431},{},[2432],{"type":44,"value":275},{"type":39,"tag":40,"props":2434,"children":2435},{},[2436],{"type":44,"value":280},{"type":39,"tag":40,"props":2438,"children":2439},{},[2440],{"type":44,"value":285},{"type":39,"tag":40,"props":2442,"children":2443},{},[2444],{"type":44,"value":290},{"type":39,"tag":40,"props":2446,"children":2447},{},[2448],{"type":44,"value":295},{"type":39,"tag":110,"props":2450,"children":2451},{"id":298},[2452],{"type":44,"value":301},{"type":39,"tag":40,"props":2454,"children":2455},{},[2456],{"type":44,"value":306},{"type":39,"tag":40,"props":2458,"children":2459},{},[2460],{"type":44,"value":311},{"type":39,"tag":40,"props":2462,"children":2463},{},[2464],{"type":44,"value":316},{"type":39,"tag":40,"props":2466,"children":2467},{},[2468],{"type":44,"value":321},{"type":39,"tag":40,"props":2470,"children":2471},{},[2472],{"type":44,"value":326},{"type":39,"tag":110,"props":2474,"children":2475},{"id":329},[2476],{"type":44,"value":332},{"type":39,"tag":40,"props":2478,"children":2479},{},[2480],{"type":44,"value":337},{"type":39,"tag":40,"props":2482,"children":2483},{},[2484],{"type":44,"value":342},{"type":39,"tag":40,"props":2486,"children":2487},{},[2488],{"type":44,"value":347},{"type":39,"tag":40,"props":2490,"children":2491},{},[2492],{"type":44,"value":352},{"type":39,"tag":40,"props":2494,"children":2495},{},[2496],{"type":44,"value":357},{"type":39,"tag":52,"props":2498,"children":2499},{"id":360},[2500],{"type":44,"value":363},{"type":39,"tag":40,"props":2502,"children":2503},{},[2504],{"type":44,"value":368},{"type":39,"tag":110,"props":2506,"children":2507},{"id":371},[2508],{"type":44,"value":374},{"type":39,"tag":40,"props":2510,"children":2511},{},[2512],{"type":44,"value":379},{"type":39,"tag":40,"props":2514,"children":2515},{},[2516],{"type":44,"value":384},{"type":39,"tag":110,"props":2518,"children":2519},{"id":387},[2520],{"type":44,"value":390},{"type":39,"tag":40,"props":2522,"children":2523},{},[2524],{"type":44,"value":395},{"type":39,"tag":40,"props":2526,"children":2527},{},[2528],{"type":44,"value":400},{"type":39,"tag":40,"props":2530,"children":2531},{},[2532],{"type":44,"value":405},{"type":39,"tag":110,"props":2534,"children":2535},{"id":408},[2536],{"type":44,"value":411},{"type":39,"tag":40,"props":2538,"children":2539},{},[2540],{"type":44,"value":416},{"type":39,"tag":40,"props":2542,"children":2543},{},[2544],{"type":44,"value":421},{"type":39,"tag":110,"props":2546,"children":2547},{"id":424},[2548],{"type":44,"value":427},{"type":39,"tag":40,"props":2550,"children":2551},{},[2552],{"type":44,"value":432},{"type":39,"tag":40,"props":2554,"children":2555},{},[2556],{"type":44,"value":437},{"type":39,"tag":52,"props":2558,"children":2559},{"id":440},[2560],{"type":44,"value":443},{"type":39,"tag":445,"props":2562,"children":2563},{},[2564,2598],{"type":39,"tag":449,"props":2565,"children":2566},{},[2567],{"type":39,"tag":453,"props":2568,"children":2569},{},[2570,2574,2578,2582,2586,2590,2594],{"type":39,"tag":457,"props":2571,"children":2572},{},[2573],{"type":44,"value":461},{"type":39,"tag":457,"props":2575,"children":2576},{},[2577],{"type":44,"value":466},{"type":39,"tag":457,"props":2579,"children":2580},{},[2581],{"type":44,"value":471},{"type":39,"tag":457,"props":2583,"children":2584},{},[2585],{"type":44,"value":476},{"type":39,"tag":457,"props":2587,"children":2588},{},[2589],{"type":44,"value":481},{"type":39,"tag":457,"props":2591,"children":2592},{},[2593],{"type":44,"value":486},{"type":39,"tag":457,"props":2595,"children":2596},{},[2597],{"type":44,"value":491},{"type":39,"tag":493,"props":2599,"children":2600},{},[2601,2632,2663,2694,2725,2756,2787,2818],{"type":39,"tag":453,"props":2602,"children":2603},{},[2604,2608,2612,2616,2620,2624,2628],{"type":39,"tag":500,"props":2605,"children":2606},{},[2607],{"type":44,"value":504},{"type":39,"tag":500,"props":2609,"children":2610},{},[2611],{"type":44,"value":509},{"type":39,"tag":500,"props":2613,"children":2614},{},[2615],{"type":44,"value":514},{"type":39,"tag":500,"props":2617,"children":2618},{},[2619],{"type":44,"value":519},{"type":39,"tag":500,"props":2621,"children":2622},{},[2623],{"type":44,"value":524},{"type":39,"tag":500,"props":2625,"children":2626},{},[2627],{"type":44,"value":529},{"type":39,"tag":500,"props":2629,"children":2630},{},[2631],{"type":44,"value":534},{"type":39,"tag":453,"props":2633,"children":2634},{},[2635,2639,2643,2647,2651,2655,2659],{"type":39,"tag":500,"props":2636,"children":2637},{},[2638],{"type":44,"value":542},{"type":39,"tag":500,"props":2640,"children":2641},{},[2642],{"type":44,"value":547},{"type":39,"tag":500,"props":2644,"children":2645},{},[2646],{"type":44,"value":552},{"type":39,"tag":500,"props":2648,"children":2649},{},[2650],{"type":44,"value":552},{"type":39,"tag":500,"props":2652,"children":2653},{},[2654],{"type":44,"value":561},{"type":39,"tag":500,"props":2656,"children":2657},{},[2658],{"type":44,"value":566},{"type":39,"tag":500,"props":2660,"children":2661},{},[2662],{"type":44,"value":571},{"type":39,"tag":453,"props":2664,"children":2665},{},[2666,2670,2674,2678,2682,2686,2690],{"type":39,"tag":500,"props":2667,"children":2668},{},[2669],{"type":44,"value":579},{"type":39,"tag":500,"props":2671,"children":2672},{},[2673],{"type":44,"value":547},{"type":39,"tag":500,"props":2675,"children":2676},{},[2677],{"type":44,"value":552},{"type":39,"tag":500,"props":2679,"children":2680},{},[2681],{"type":44,"value":552},{"type":39,"tag":500,"props":2683,"children":2684},{},[2685],{"type":44,"value":596},{"type":39,"tag":500,"props":2687,"children":2688},{},[2689],{"type":44,"value":601},{"type":39,"tag":500,"props":2691,"children":2692},{},[2693],{"type":44,"value":606},{"type":39,"tag":453,"props":2695,"children":2696},{},[2697,2701,2705,2709,2713,2717,2721],{"type":39,"tag":500,"props":2698,"children":2699},{},[2700],{"type":44,"value":614},{"type":39,"tag":500,"props":2702,"children":2703},{},[2704],{"type":44,"value":619},{"type":39,"tag":500,"props":2706,"children":2707},{},[2708],{"type":44,"value":552},{"type":39,"tag":500,"props":2710,"children":2711},{},[2712],{"type":44,"value":552},{"type":39,"tag":500,"props":2714,"children":2715},{},[2716],{"type":44,"value":632},{"type":39,"tag":500,"props":2718,"children":2719},{},[2720],{"type":44,"value":637},{"type":39,"tag":500,"props":2722,"children":2723},{},[2724],{"type":44,"value":642},{"type":39,"tag":453,"props":2726,"children":2727},{},[2728,2732,2736,2740,2744,2748,2752],{"type":39,"tag":500,"props":2729,"children":2730},{},[2731],{"type":44,"value":650},{"type":39,"tag":500,"props":2733,"children":2734},{},[2735],{"type":44,"value":547},{"type":39,"tag":500,"props":2737,"children":2738},{},[2739],{"type":44,"value":552},{"type":39,"tag":500,"props":2741,"children":2742},{},[2743],{"type":44,"value":552},{"type":39,"tag":500,"props":2745,"children":2746},{},[2747],{"type":44,"value":667},{"type":39,"tag":500,"props":2749,"children":2750},{},[2751],{"type":44,"value":667},{"type":39,"tag":500,"props":2753,"children":2754},{},[2755],{"type":44,"value":676},{"type":39,"tag":453,"props":2757,"children":2758},{},[2759,2763,2767,2771,2775,2779,2783],{"type":39,"tag":500,"props":2760,"children":2761},{},[2762],{"type":44,"value":684},{"type":39,"tag":500,"props":2764,"children":2765},{},[2766],{"type":44,"value":689},{"type":39,"tag":500,"props":2768,"children":2769},{},[2770],{"type":44,"value":694},{"type":39,"tag":500,"props":2772,"children":2773},{},[2774],{"type":44,"value":552},{"type":39,"tag":500,"props":2776,"children":2777},{},[2778],{"type":44,"value":524},{"type":39,"tag":500,"props":2780,"children":2781},{},[2782],{"type":44,"value":707},{"type":39,"tag":500,"props":2784,"children":2785},{},[2786],{"type":44,"value":712},{"type":39,"tag":453,"props":2788,"children":2789},{},[2790,2794,2798,2802,2806,2810,2814],{"type":39,"tag":500,"props":2791,"children":2792},{},[2793],{"type":44,"value":720},{"type":39,"tag":500,"props":2795,"children":2796},{},[2797],{"type":44,"value":725},{"type":39,"tag":500,"props":2799,"children":2800},{},[2801],{"type":44,"value":552},{"type":39,"tag":500,"props":2803,"children":2804},{},[2805],{"type":44,"value":552},{"type":39,"tag":500,"props":2807,"children":2808},{},[2809],{"type":44,"value":738},{"type":39,"tag":500,"props":2811,"children":2812},{},[2813],{"type":44,"value":743},{"type":39,"tag":500,"props":2815,"children":2816},{},[2817],{"type":44,"value":748},{"type":39,"tag":453,"props":2819,"children":2820},{},[2821,2825,2829,2833,2837,2841,2845],{"type":39,"tag":500,"props":2822,"children":2823},{},[2824],{"type":44,"value":756},{"type":39,"tag":500,"props":2826,"children":2827},{},[2828],{"type":44,"value":761},{"type":39,"tag":500,"props":2830,"children":2831},{},[2832],{"type":44,"value":552},{"type":39,"tag":500,"props":2834,"children":2835},{},[2836],{"type":44,"value":552},{"type":39,"tag":500,"props":2838,"children":2839},{},[2840],{"type":44,"value":524},{"type":39,"tag":500,"props":2842,"children":2843},{},[2844],{"type":44,"value":778},{"type":39,"tag":500,"props":2846,"children":2847},{},[2848],{"type":44,"value":783},{"type":39,"tag":52,"props":2850,"children":2851},{"id":786},[2852],{"type":44,"value":789},{"type":39,"tag":40,"props":2854,"children":2855},{},[2856],{"type":44,"value":794},{"type":39,"tag":796,"props":2858,"children":2859},{},[2860,2864,2868],{"type":39,"tag":68,"props":2861,"children":2862},{},[2863],{"type":44,"value":803},{"type":39,"tag":68,"props":2865,"children":2866},{},[2867],{"type":44,"value":808},{"type":39,"tag":68,"props":2869,"children":2870},{},[2871],{"type":44,"value":813},{"type":39,"tag":40,"props":2873,"children":2874},{},[2875],{"type":44,"value":818},{"type":39,"tag":64,"props":2877,"children":2878},{},[2879,2883,2887],{"type":39,"tag":68,"props":2880,"children":2881},{},[2882],{"type":44,"value":826},{"type":39,"tag":68,"props":2884,"children":2885},{},[2886],{"type":44,"value":831},{"type":39,"tag":68,"props":2888,"children":2889},{},[2890],{"type":44,"value":836},{"type":39,"tag":52,"props":2892,"children":2893},{"id":839},[2894],{"type":44,"value":842},{"type":39,"tag":40,"props":2896,"children":2897},{},[2898],{"type":44,"value":847},{"type":39,"tag":110,"props":2900,"children":2901},{"id":850},[2902],{"type":44,"value":853},{"type":39,"tag":40,"props":2904,"children":2905},{},[2906],{"type":44,"value":858},{"type":39,"tag":110,"props":2908,"children":2909},{"id":861},[2910],{"type":44,"value":864},{"type":39,"tag":40,"props":2912,"children":2913},{},[2914],{"type":44,"value":869},{"type":39,"tag":110,"props":2916,"children":2917},{"id":872},[2918],{"type":44,"value":875},{"type":39,"tag":40,"props":2920,"children":2921},{},[2922],{"type":44,"value":880},{"type":39,"tag":52,"props":2924,"children":2925},{"id":883},[2926],{"type":44,"value":886},{"type":39,"tag":40,"props":2928,"children":2929},{},[2930],{"type":44,"value":891},{"type":39,"tag":64,"props":2932,"children":2933},{},[2934,2938,2942,2946,2950],{"type":39,"tag":68,"props":2935,"children":2936},{},[2937],{"type":44,"value":899},{"type":39,"tag":68,"props":2939,"children":2940},{},[2941],{"type":44,"value":904},{"type":39,"tag":68,"props":2943,"children":2944},{},[2945],{"type":44,"value":909},{"type":39,"tag":68,"props":2947,"children":2948},{},[2949],{"type":44,"value":914},{"type":39,"tag":68,"props":2951,"children":2952},{},[2953],{"type":44,"value":919},{"type":39,"tag":52,"props":2955,"children":2956},{"id":922},[2957],{"type":44,"value":925},{"type":39,"tag":40,"props":2959,"children":2960},{},[2961,2962,2967,2968,2972],{"type":44,"value":930},{"type":39,"tag":932,"props":2963,"children":2965},{"href":934,"rel":2964},[936],[2966],{"type":44,"value":939},{"type":44,"value":941},{"type":39,"tag":932,"props":2969,"children":2970},{"href":944},[2971],{"type":44,"value":947},{"type":44,"value":949},{"type":39,"tag":40,"props":2974,"children":2975},{},[2976,2977,2981,2982,2986,2987,2991,2992,2996,2997,3001,3002,3006],{"type":44,"value":954},{"type":39,"tag":932,"props":2978,"children":2979},{"href":957},[2980],{"type":44,"value":960},{"type":44,"value":962},{"type":39,"tag":932,"props":2983,"children":2984},{"href":965},[2985],{"type":44,"value":968},{"type":44,"value":962},{"type":39,"tag":932,"props":2988,"children":2989},{"href":972},[2990],{"type":44,"value":975},{"type":44,"value":962},{"type":39,"tag":932,"props":2993,"children":2994},{"href":979},[2995],{"type":44,"value":982},{"type":44,"value":962},{"type":39,"tag":932,"props":2998,"children":2999},{"href":986},[3000],{"type":44,"value":989},{"type":44,"value":991},{"type":39,"tag":932,"props":3003,"children":3004},{"href":994},[3005],{"type":44,"value":997},{"type":44,"value":999},{"type":39,"tag":40,"props":3008,"children":3009},{},[3010],{"type":44,"value":1004},{"type":39,"tag":52,"props":3012,"children":3013},{"id":1007},[3014],{"type":44,"value":1010},{"type":39,"tag":110,"props":3016,"children":3017},{"id":1013},[3018],{"type":44,"value":1016},{"type":39,"tag":40,"props":3020,"children":3021},{},[3022],{"type":44,"value":1021},{"type":39,"tag":110,"props":3024,"children":3025},{"id":1024},[3026],{"type":44,"value":1027},{"type":39,"tag":40,"props":3028,"children":3029},{},[3030],{"type":44,"value":1032},{"type":39,"tag":110,"props":3032,"children":3033},{"id":1035},[3034],{"type":44,"value":1038},{"type":39,"tag":40,"props":3036,"children":3037},{},[3038,3039,3043],{"type":44,"value":1043},{"type":39,"tag":932,"props":3040,"children":3041},{"href":1046},[3042],{"type":44,"value":1049},{"type":44,"value":1051},{"type":39,"tag":110,"props":3045,"children":3046},{"id":1054},[3047],{"type":44,"value":1057},{"type":39,"tag":40,"props":3049,"children":3050},{},[3051],{"type":44,"value":1062},{"type":39,"tag":110,"props":3053,"children":3054},{"id":1065},[3055],{"type":44,"value":1068},{"type":39,"tag":40,"props":3057,"children":3058},{},[3059],{"type":44,"value":1073},{"type":39,"tag":110,"props":3061,"children":3062},{"id":1076},[3063],{"type":44,"value":1079},{"type":39,"tag":40,"props":3065,"children":3066},{},[3067],{"type":44,"value":1084},{"type":39,"tag":110,"props":3069,"children":3070},{"id":1087},[3071],{"type":44,"value":1090},{"type":39,"tag":40,"props":3073,"children":3074},{},[3075],{"type":44,"value":1095},{"type":39,"tag":110,"props":3077,"children":3078},{"id":1098},[3079],{"type":44,"value":1101},{"type":39,"tag":40,"props":3081,"children":3082},{},[3083],{"type":44,"value":1106},{"type":39,"tag":110,"props":3085,"children":3086},{"id":1109},[3087],{"type":44,"value":1112},{"type":39,"tag":40,"props":3089,"children":3090},{},[3091],{"type":44,"value":1117},{"type":39,"tag":110,"props":3093,"children":3094},{"id":1120},[3095],{"type":44,"value":1123},{"type":39,"tag":40,"props":3097,"children":3098},{},[3099],{"type":44,"value":1128},{"type":39,"tag":110,"props":3101,"children":3102},{"id":1131},[3103],{"type":44,"value":1134},{"type":39,"tag":40,"props":3105,"children":3106},{},[3107],{"type":44,"value":1139},{"type":39,"tag":110,"props":3109,"children":3110},{"id":1142},[3111],{"type":44,"value":1145},{"type":39,"tag":40,"props":3113,"children":3114},{},[3115,3116,3120],{"type":44,"value":1150},{"type":39,"tag":932,"props":3117,"children":3118},{"href":1153},[3119],{"type":44,"value":1156},{"type":44,"value":1158},{"type":39,"tag":110,"props":3122,"children":3123},{"id":1161},[3124],{"type":44,"value":1164},{"type":39,"tag":40,"props":3126,"children":3127},{},[3128],{"type":44,"value":1169},{"type":39,"tag":110,"props":3130,"children":3131},{"id":1172},[3132],{"type":44,"value":1175},{"type":39,"tag":40,"props":3134,"children":3135},{},[3136],{"type":44,"value":1180},{"type":39,"tag":110,"props":3138,"children":3139},{"id":1183},[3140],{"type":44,"value":1186},{"type":39,"tag":40,"props":3142,"children":3143},{},[3144],{"type":44,"value":1191},{"type":39,"tag":110,"props":3146,"children":3147},{"id":1194},[3148],{"type":44,"value":1197},{"type":39,"tag":40,"props":3150,"children":3151},{},[3152],{"type":44,"value":1202},{"type":39,"tag":110,"props":3154,"children":3155},{"id":1205},[3156],{"type":44,"value":1208},{"type":39,"tag":40,"props":3158,"children":3159},{},[3160],{"type":44,"value":1213},{"type":39,"tag":110,"props":3162,"children":3163},{"id":1216},[3164],{"type":44,"value":1219},{"type":39,"tag":40,"props":3166,"children":3167},{},[3168],{"type":44,"value":1224},{"title":7,"searchDepth":1226,"depth":1226,"links":3170},[3171,3172,3182,3188,3189,3190,3195,3196,3197],{"id":54,"depth":1226,"text":57},{"id":100,"depth":1226,"text":103,"children":3173},[3174,3175,3176,3177,3178,3179,3180,3181],{"id":112,"depth":1232,"text":115},{"id":143,"depth":1232,"text":146},{"id":174,"depth":1232,"text":177},{"id":205,"depth":1232,"text":208},{"id":236,"depth":1232,"text":239},{"id":267,"depth":1232,"text":270},{"id":298,"depth":1232,"text":301},{"id":329,"depth":1232,"text":332},{"id":360,"depth":1226,"text":363,"children":3183},[3184,3185,3186,3187],{"id":371,"depth":1232,"text":374},{"id":387,"depth":1232,"text":390},{"id":408,"depth":1232,"text":411},{"id":424,"depth":1232,"text":427},{"id":440,"depth":1226,"text":443},{"id":786,"depth":1226,"text":789},{"id":839,"depth":1226,"text":842,"children":3191},[3192,3193,3194],{"id":850,"depth":1232,"text":853},{"id":861,"depth":1232,"text":864},{"id":872,"depth":1232,"text":875},{"id":883,"depth":1226,"text":886},{"id":922,"depth":1226,"text":925},{"id":1007,"depth":1226,"text":1010,"children":3198},[3199,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216],{"id":1013,"depth":1232,"text":1016},{"id":1024,"depth":1232,"text":1027},{"id":1035,"depth":1232,"text":1038},{"id":1054,"depth":1232,"text":1057},{"id":1065,"depth":1232,"text":1068},{"id":1076,"depth":1232,"text":1079},{"id":1087,"depth":1232,"text":1090},{"id":1098,"depth":1232,"text":1101},{"id":1109,"depth":1232,"text":1112},{"id":1120,"depth":1232,"text":1123},{"id":1131,"depth":1232,"text":1134},{"id":1142,"depth":1232,"text":1145},{"id":1161,"depth":1232,"text":1164},{"id":1172,"depth":1232,"text":1175},{"id":1183,"depth":1232,"text":1186},{"id":1194,"depth":1232,"text":1197},{"id":1205,"depth":1232,"text":1208},{"id":1216,"depth":1232,"text":1219},[3218,4026,5120],{"_path":3219,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3220,"description":3221,"coverImage":3222,"date":3223,"readingTime":3224,"category":13,"tags":3225,"author":3232,"body":3233,"_type":1275,"_id":4023,"_source":1277,"_file":4024,"_stem":4025,"_extension":1280},"/blog/ai-data-analyst-on-whatsapp","AI Data Analyst on WhatsApp: Why Field and Sales Teams Are Skipping Dashboards","Most AI data analysts live in Slack or a browser. Bruin runs in WhatsApp too. Here is why field, sales, and ops teams prefer asking their data questions there, what it takes to make it actually work, and how to roll it out safely.","/img/blog/ai-data-analyst-whatsapp/cover.png","2026-04-15",14,[3226,3227,15,3228,3229,3230,21,19,20,27,18,3231],"launch","whatsapp","mobile","sales","field teams","governance",{"name":32,"role":33,"image":34},{"type":36,"children":3234,"toc":3973},[3235,3240,3245,3250,3256,3262,3267,3272,3278,3283,3288,3294,3299,3305,3310,3316,3321,3327,3332,3338,3343,3349,3354,3360,3365,3371,3376,3381,3390,3395,3412,3417,3425,3429,3437,3441,3449,3453,3461,3466,3472,3482,3487,3510,3515,3521,3526,3532,3537,3543,3548,3554,3559,3565,3570,3576,3581,3587,3592,3598,3603,3609,3614,3620,3625,3631,3636,3642,3647,3680,3685,3691,3714,3720,3725,3758,3763,3769,3787,3792,3796,3802,3812,3818,3823,3829,3834,3840,3852,3858,3863,3869,3874,3880,3885,3891,3896,3902,3907,3913,3918,3924,3929,3935,3940,3946,3951,3957,3962,3968],{"type":39,"tag":40,"props":3236,"children":3237},{},[3238],{"type":44,"value":3239},"The default assumption when you hear \"AI data analyst\" is a desktop experience. A browser tab open next to Slack, maybe a Slack bot if the vendor is modern. That assumption breaks as soon as you talk to the actual users who make most of the operational decisions in a real company: the field sales rep between customer visits, the live-ops manager on call during an event, the account executive walking into a QBR.",{"type":39,"tag":40,"props":3241,"children":3242},{},[3243],{"type":44,"value":3244},"None of them are at a desk. All of them are on WhatsApp.",{"type":39,"tag":40,"props":3246,"children":3247},{},[3248],{"type":44,"value":3249},"In 2026, WhatsApp is the data interface nobody at the BI vendor booth is showing you. Here is why teams are putting their AI analyst there, what actually has to be true for it to work, and how to pilot it without creating a compliance headache.",{"type":39,"tag":52,"props":3251,"children":3253},{"id":3252},"why-whatsapp",[3254],{"type":44,"value":3255},"Why WhatsApp?",{"type":39,"tag":110,"props":3257,"children":3259},{"id":3258},"_1-it-is-already-where-the-work-happens",[3260],{"type":44,"value":3261},"1. It is already where the work happens",{"type":39,"tag":40,"props":3263,"children":3264},{},[3265],{"type":44,"value":3266},"For a big chunk of the world, including LatAm, EMEA, India, and most of APAC, WhatsApp is not a chat app. It is the operating system of business. Sales reps coordinate with customers there. Ops teams run group chats per region. Founders close deals in DMs. If you drop an AI data analyst into WhatsApp, you do not need to train anyone on a new interface.",{"type":39,"tag":40,"props":3268,"children":3269},{},[3270],{"type":44,"value":3271},"Even in North America, WhatsApp is the default chat app for remote-first teams with global contractors, partner-heavy supply chains, and mobile-heavy field operations.",{"type":39,"tag":110,"props":3273,"children":3275},{"id":3274},"_2-mobile-is-the-default-not-the-fallback",[3276],{"type":44,"value":3277},"2. Mobile is the default, not the fallback",{"type":39,"tag":40,"props":3279,"children":3280},{},[3281],{"type":44,"value":3282},"Dashboards assume a laptop. A field team rarely has one. A good AI data analyst on WhatsApp means someone can ask \"what's my pipeline for the San Francisco region this week?\" while walking between meetings and get a real answer in ten seconds.",{"type":39,"tag":40,"props":3284,"children":3285},{},[3286],{"type":44,"value":3287},"Compare that to the Tableau mobile app experience, which usually involves a long loading screen, a tiny version of a dashboard designed for 1920 x 1080, and a lot of pinching to zoom.",{"type":39,"tag":110,"props":3289,"children":3291},{"id":3290},"_3-zero-friction-distribution",[3292],{"type":44,"value":3293},"3. Zero-friction distribution",{"type":39,"tag":40,"props":3295,"children":3296},{},[3297],{"type":44,"value":3298},"WhatsApp does not require a seat license, a company SSO flow, or a new app install. You add a contact, you message it, you get an answer. For orgs with partners, franchisees, or contractors who need read-only access to specific metrics, this is a different order of magnitude easier than provisioning them in a BI tool.",{"type":39,"tag":110,"props":3300,"children":3302},{"id":3301},"_4-async-and-quiet-hours-friendly",[3303],{"type":44,"value":3304},"4. Async and quiet hours-friendly",{"type":39,"tag":40,"props":3306,"children":3307},{},[3308],{"type":44,"value":3309},"WhatsApp is built for async. A regional manager in Jakarta can message a question at 3am local time, and the answer is there when their team opens their phones at 8am. No VPN, no app, no laptop opened.",{"type":39,"tag":52,"props":3311,"children":3313},{"id":3312},"can-an-ai-data-analyst-actually-work-on-whatsapp",[3314],{"type":44,"value":3315},"Can an AI data analyst actually work on WhatsApp?",{"type":39,"tag":40,"props":3317,"children":3318},{},[3319],{"type":44,"value":3320},"Yes, but it takes more than a generic ChatGPT plugin. The real work is in four places.",{"type":39,"tag":110,"props":3322,"children":3324},{"id":3323},"natural-language-to-sql-that-respects-a-semantic-layer",[3325],{"type":44,"value":3326},"Natural-language to SQL that respects a semantic layer",{"type":39,"tag":40,"props":3328,"children":3329},{},[3330],{"type":44,"value":3331},"If you ask \"what was our revenue last week,\" you should get the same number as the CFO. That only happens if the AI has a governed definition of revenue pointing at the right column in the warehouse. WhatsApp does not change that. It just makes it more obvious when it is wrong, because the answer is in a customer-facing chat.",{"type":39,"tag":110,"props":3333,"children":3335},{"id":3334},"context-across-messages",[3336],{"type":44,"value":3337},"Context across messages",{"type":39,"tag":40,"props":3339,"children":3340},{},[3341],{"type":44,"value":3342},"Conversational data tools live or die on follow-ups. \"What was our MRR last month?\" then \"And by plan?\" then \"Just the Enterprise ones.\" On WhatsApp, each message is short, and the tool has to remember the thread. This is the single biggest quality bar for a mobile-first AI analyst.",{"type":39,"tag":110,"props":3344,"children":3346},{"id":3345},"rich-output-in-a-plain-text-channel",[3347],{"type":44,"value":3348},"Rich output in a plain-text channel",{"type":39,"tag":40,"props":3350,"children":3351},{},[3352],{"type":44,"value":3353},"WhatsApp supports images and PDFs but not rich interactive dashboards. That is actually a feature. It forces the tool to send a tight, quotable answer: a number, a short chart, a takeaway. Instead of dumping a liveboard. The best mobile answers look like this: \"Last week: $412K revenue, up 8% week over week. Mostly driven by the Enterprise plan, up 18%. Chart attached.\"",{"type":39,"tag":110,"props":3355,"children":3357},{"id":3356},"security-and-access-control",[3358],{"type":44,"value":3359},"Security and access control",{"type":39,"tag":40,"props":3361,"children":3362},{},[3363],{"type":44,"value":3364},"This is where most vendors fail. You cannot let your AI analyst leak PII into WhatsApp chats. That means row-level access controls, auditable logs, the ability to revoke a user with a single click, and clear data residency. If the tool does not have this, it is a toy.",{"type":39,"tag":52,"props":3366,"children":3368},{"id":3367},"what-does-a-whatsapp-conversation-with-an-ai-data-analyst-look-like",[3369],{"type":44,"value":3370},"What does a WhatsApp conversation with an AI data analyst look like?",{"type":39,"tag":40,"props":3372,"children":3373},{},[3374],{"type":44,"value":3375},"Here is an actual pattern from a customer, anonymized:",{"type":39,"tag":40,"props":3377,"children":3378},{},[3379],{"type":44,"value":3380},"Regional sales lead, 8:47am Monday, Lisbon:",{"type":39,"tag":3382,"props":3383,"children":3384},"blockquote",{},[3385],{"type":39,"tag":40,"props":3386,"children":3387},{},[3388],{"type":44,"value":3389},"Hi Bruin. How did the EMEA team close Q1 against plan?",{"type":39,"tag":40,"props":3391,"children":3392},{},[3393],{"type":44,"value":3394},"Bruin:",{"type":39,"tag":3382,"props":3396,"children":3397},{},[3398,3403],{"type":39,"tag":40,"props":3399,"children":3400},{},[3401],{"type":44,"value":3402},"EMEA Q1 closed at $2.14M (107% of plan, $2M target). Best rep was Maria Santos, who closed $340K across 11 deals. Biggest miss was Germany at 78% of plan.",{"type":39,"tag":40,"props":3404,"children":3405},{},[3406],{"type":39,"tag":3407,"props":3408,"children":3409},"span",{},[3410],{"type":44,"value":3411},"chart attached: bar chart of rep performance",{"type":39,"tag":40,"props":3413,"children":3414},{},[3415],{"type":44,"value":3416},"Regional sales lead:",{"type":39,"tag":3382,"props":3418,"children":3419},{},[3420],{"type":39,"tag":40,"props":3421,"children":3422},{},[3423],{"type":44,"value":3424},"What's my pipeline coverage for Q2?",{"type":39,"tag":40,"props":3426,"children":3427},{},[3428],{"type":44,"value":3394},{"type":39,"tag":3382,"props":3430,"children":3431},{},[3432],{"type":39,"tag":40,"props":3433,"children":3434},{},[3435],{"type":44,"value":3436},"Q2 pipeline coverage for EMEA is 3.2x, against a target of 3x. Stronger in UK (4.1x) and France (3.7x). Germany is under at 2.1x, driven by the three deals that slipped from Q1.",{"type":39,"tag":40,"props":3438,"children":3439},{},[3440],{"type":44,"value":3416},{"type":39,"tag":3382,"props":3442,"children":3443},{},[3444],{"type":39,"tag":40,"props":3445,"children":3446},{},[3447],{"type":44,"value":3448},"Can you pull a list of the German deals that slipped?",{"type":39,"tag":40,"props":3450,"children":3451},{},[3452],{"type":44,"value":3394},{"type":39,"tag":3382,"props":3454,"children":3455},{},[3456],{"type":39,"tag":40,"props":3457,"children":3458},{},[3459],{"type":44,"value":3460},"Three deals slipped from Q1 to Q2 in Germany: Mueller GmbH ($180K, now 60% committed), Siemens DACH unit ($95K, now 40% committed), Frankfurt Logistics AG ($120K, now 80% committed). Total $395K. Risk-weighted: $195K.",{"type":39,"tag":40,"props":3462,"children":3463},{},[3464],{"type":44,"value":3465},"The whole conversation took four minutes. No laptop. No dashboard. No data team.",{"type":39,"tag":52,"props":3467,"children":3469},{"id":3468},"how-bruin-does-it",[3470],{"type":44,"value":3471},"How Bruin does it",{"type":39,"tag":40,"props":3473,"children":3474},{},[3475,3480],{"type":39,"tag":932,"props":3476,"children":3477},{"href":1046},[3478],{"type":44,"value":3479},"Bruin on WhatsApp",{"type":44,"value":3481}," is the same AI data analyst our customers use in Slack and Teams. Same semantic layer, same governance, same connections to Snowflake, BigQuery, Databricks, Redshift, Postgres, Stripe, HubSpot, Salesforce, Mixpanel, and the rest of the stack. The only thing that changes is where the conversation lives.",{"type":39,"tag":40,"props":3483,"children":3484},{},[3485],{"type":44,"value":3486},"In practice:",{"type":39,"tag":796,"props":3488,"children":3489},{},[3490,3495,3500,3505],{"type":39,"tag":68,"props":3491,"children":3492},{},[3493],{"type":44,"value":3494},"You add Bruin as a WhatsApp contact.",{"type":39,"tag":68,"props":3496,"children":3497},{},[3498],{"type":44,"value":3499},"You message it like you would message a teammate: \"What's our CAC by channel in Q1?\"",{"type":39,"tag":68,"props":3501,"children":3502},{},[3503],{"type":44,"value":3504},"Bruin pulls from the governed definitions, runs the query, and replies with a concise answer plus a chart image.",{"type":39,"tag":68,"props":3506,"children":3507},{},[3508],{"type":44,"value":3509},"You can follow up in the same thread. Bruin remembers context.",{"type":39,"tag":40,"props":3511,"children":3512},{},[3513],{"type":44,"value":3514},"Access is controlled centrally. Revoking a user (say, a contractor whose project ended) takes one click in the admin panel. Every conversation is logged and auditable.",{"type":39,"tag":52,"props":3516,"children":3518},{"id":3517},"security-deep-dive",[3519],{"type":44,"value":3520},"Security deep dive",{"type":39,"tag":40,"props":3522,"children":3523},{},[3524],{"type":44,"value":3525},"Because this is the category-killer question for most enterprise buyers, here is how Bruin handles it on WhatsApp specifically.",{"type":39,"tag":110,"props":3527,"children":3529},{"id":3528},"identity-and-access-control",[3530],{"type":44,"value":3531},"Identity and access control",{"type":39,"tag":40,"props":3533,"children":3534},{},[3535],{"type":44,"value":3536},"Every WhatsApp user is mapped to an identity in Bruin's admin panel. That identity inherits the same role-based access control as the user's Slack, Teams, or browser session. If Maria can only see EMEA data in the Bruin web app, she can only see EMEA data on WhatsApp. There is no \"WhatsApp is a back door\" risk.",{"type":39,"tag":110,"props":3538,"children":3540},{"id":3539},"data-residency",[3541],{"type":44,"value":3542},"Data residency",{"type":39,"tag":40,"props":3544,"children":3545},{},[3546],{"type":44,"value":3547},"Answers are generated in the same region Bruin runs the rest of your tenant. If your tenant is EU-hosted, the AI query, the SQL execution, and the answer stay in the EU. WhatsApp's own transport is global (that is on Meta), but no customer data is persisted in a different region.",{"type":39,"tag":110,"props":3549,"children":3551},{"id":3550},"audit-logs",[3552],{"type":44,"value":3553},"Audit logs",{"type":39,"tag":40,"props":3555,"children":3556},{},[3557],{"type":44,"value":3558},"Every WhatsApp message sent to Bruin is logged with the user identity, the query asked, the SQL generated, the rows returned, and the response text. Admins can export these logs and feed them into their SIEM or compliance system.",{"type":39,"tag":110,"props":3560,"children":3562},{"id":3561},"revocation",[3563],{"type":44,"value":3564},"Revocation",{"type":39,"tag":40,"props":3566,"children":3567},{},[3568],{"type":44,"value":3569},"Single-click revocation from the admin panel removes a user's access across all surfaces, including WhatsApp. The next message they send returns a \"you no longer have access\" response, not data.",{"type":39,"tag":110,"props":3571,"children":3573},{"id":3572},"pii-handling",[3574],{"type":44,"value":3575},"PII handling",{"type":39,"tag":40,"props":3577,"children":3578},{},[3579],{"type":44,"value":3580},"Bruin can be configured to block specific columns (email addresses, phone numbers, payment details) from appearing in AI responses regardless of the user's underlying table-level permissions. Useful when you want a WhatsApp analyst to give a sales rep aggregate numbers but not individual customer PII that could leak into a client-facing chat.",{"type":39,"tag":52,"props":3582,"children":3584},{"id":3583},"regional-adoption-patterns",[3585],{"type":44,"value":3586},"Regional adoption patterns",{"type":39,"tag":40,"props":3588,"children":3589},{},[3590],{"type":44,"value":3591},"A few patterns we have seen in real deployments.",{"type":39,"tag":110,"props":3593,"children":3595},{"id":3594},"latam-sales-teams",[3596],{"type":44,"value":3597},"LatAm sales teams",{"type":39,"tag":40,"props":3599,"children":3600},{},[3601],{"type":44,"value":3602},"Typical rollout: start with the regional sales VP and their direct reports. Use it for pipeline questions and rep performance. Expand to the broader sales org once the VP is a convert. Often the first adoption channel before Slack, because Slack adoption in LatAm B2B is still catching up.",{"type":39,"tag":110,"props":3604,"children":3606},{"id":3605},"emea-field-operations",[3607],{"type":44,"value":3608},"EMEA field operations",{"type":39,"tag":40,"props":3610,"children":3611},{},[3612],{"type":44,"value":3613},"Typical rollout: operations managers and regional leads. Use it for live monitoring during campaigns, events, or supply-chain incidents. Particularly strong in Germany, France, and the UK for retail and logistics.",{"type":39,"tag":110,"props":3615,"children":3617},{"id":3616},"apac-partner-networks",[3618],{"type":44,"value":3619},"APAC partner networks",{"type":39,"tag":40,"props":3621,"children":3622},{},[3623],{"type":44,"value":3624},"Typical rollout: HQ shares a WhatsApp contact with channel partners. Partners message Bruin for read-only answers about their specific region, account, or SKU performance. Avoids provisioning dozens of partners in a full BI tool.",{"type":39,"tag":110,"props":3626,"children":3628},{"id":3627},"north-american-mobile-teams",[3629],{"type":44,"value":3630},"North American mobile teams",{"type":39,"tag":40,"props":3632,"children":3633},{},[3634],{"type":44,"value":3635},"Typical rollout: the founder, a few execs, and the field sales team. Often a third-wave channel, added after Slack and browser. Most useful during off-hours and travel.",{"type":39,"tag":52,"props":3637,"children":3639},{"id":3638},"who-this-matters-most-for",[3640],{"type":44,"value":3641},"Who this matters most for",{"type":39,"tag":40,"props":3643,"children":3644},{},[3645],{"type":44,"value":3646},"Mobile-first AI data analysts are not for every team. They are transformative for a few specific categories:",{"type":39,"tag":64,"props":3648,"children":3649},{},[3650,3655,3660,3665,3670,3675],{"type":39,"tag":68,"props":3651,"children":3652},{},[3653],{"type":44,"value":3654},"Field sales teams who need pipeline and account metrics on the go. No more waiting for a Monday sync to see a number.",{"type":39,"tag":68,"props":3656,"children":3657},{},[3658],{"type":44,"value":3659},"Live-ops managers in gaming and commerce who need to monitor events, campaigns, and anomalies without being tied to a dashboard.",{"type":39,"tag":68,"props":3661,"children":3662},{},[3663],{"type":44,"value":3664},"Regional and franchise ops teams where HQ cannot (and should not) provision every location in a full BI tool.",{"type":39,"tag":68,"props":3666,"children":3667},{},[3668],{"type":44,"value":3669},"Founders and execs in frequent travel who want a quick answer without opening a laptop.",{"type":39,"tag":68,"props":3671,"children":3672},{},[3673],{"type":44,"value":3674},"Partner and customer-facing roles where WhatsApp is already the working medium.",{"type":39,"tag":68,"props":3676,"children":3677},{},[3678],{"type":44,"value":3679},"Global support and incident response teams that need 24/7 coverage without on-call rotations watching dashboards.",{"type":39,"tag":40,"props":3681,"children":3682},{},[3683],{"type":44,"value":3684},"If your team lives in Slack and spends the day at a desk, WhatsApp is a nice-to-have. If your team is mobile, partner-heavy, or global south, WhatsApp is where the analyst should live by default.",{"type":39,"tag":52,"props":3686,"children":3688},{"id":3687},"the-honest-caveats",[3689],{"type":44,"value":3690},"The honest caveats",{"type":39,"tag":64,"props":3692,"children":3693},{},[3694,3699,3704,3709],{"type":39,"tag":68,"props":3695,"children":3696},{},[3697],{"type":44,"value":3698},"Rich exploration still belongs on a bigger screen. WhatsApp answers are great for \"what's the number\" and poor for \"let me slice this six ways.\" That is fine. The two modes coexist.",{"type":39,"tag":68,"props":3700,"children":3701},{},[3702],{"type":44,"value":3703},"WhatsApp Business API has rate limits. High-volume teams may want a hybrid deployment (Slack or Teams internally, WhatsApp for specific user groups). Bruin handles this the same way: one analyst, multiple surfaces.",{"type":39,"tag":68,"props":3705,"children":3706},{},[3707],{"type":44,"value":3708},"AI quality still beats channel. A great AI on WhatsApp is amazing. A bad AI on WhatsApp is worse than a dashboard, because the answers are shared in customer-visible chats.",{"type":39,"tag":68,"props":3710,"children":3711},{},[3712],{"type":44,"value":3713},"Not every org culture is ready. Some compliance or legal teams will push back on WhatsApp as a work surface, regardless of the technical controls. That is a conversation to have before piloting.",{"type":39,"tag":52,"props":3715,"children":3717},{"id":3716},"how-to-pilot-it",[3718],{"type":44,"value":3719},"How to pilot it",{"type":39,"tag":40,"props":3721,"children":3722},{},[3723],{"type":44,"value":3724},"A safe pilot looks like this:",{"type":39,"tag":796,"props":3726,"children":3727},{},[3728,3733,3738,3743,3748,3753],{"type":39,"tag":68,"props":3729,"children":3730},{},[3731],{"type":44,"value":3732},"Pick a single team (often regional sales or ops) with five to fifteen users.",{"type":39,"tag":68,"props":3734,"children":3735},{},[3736],{"type":44,"value":3737},"Define a short list of allowed questions (pipeline, rep performance, campaign metrics, account health). Do not start with everything.",{"type":39,"tag":68,"props":3739,"children":3740},{},[3741],{"type":44,"value":3742},"Deploy Bruin on WhatsApp for that team with explicit column-level restrictions on PII.",{"type":39,"tag":68,"props":3744,"children":3745},{},[3746],{"type":44,"value":3747},"Run for two weeks. Watch the audit logs daily for the first week.",{"type":39,"tag":68,"props":3749,"children":3750},{},[3751],{"type":44,"value":3752},"Review with the team and tune the semantic layer based on the questions that did not land.",{"type":39,"tag":68,"props":3754,"children":3755},{},[3756],{"type":44,"value":3757},"Expand to adjacent teams once the pilot team is confident.",{"type":39,"tag":40,"props":3759,"children":3760},{},[3761],{"type":44,"value":3762},"This keeps the blast radius small and gives compliance teams a clean object to review.",{"type":39,"tag":52,"props":3764,"children":3766},{"id":3765},"try-it",[3767],{"type":44,"value":3768},"Try it",{"type":39,"tag":40,"props":3770,"children":3771},{},[3772,3774,3779,3781,3785],{"type":44,"value":3773},"You can see the WhatsApp experience live on the ",{"type":39,"tag":932,"props":3775,"children":3776},{"href":1046},[3777],{"type":44,"value":3778},"Bruin WhatsApp page",{"type":44,"value":3780}," or ",{"type":39,"tag":932,"props":3782,"children":3783},{"href":944},[3784],{"type":44,"value":947},{"type":44,"value":3786}," and we will set up a test number for your team. It is genuinely the fastest way we have found to get ops, sales, and field teams asking data questions they would otherwise never ask.",{"type":39,"tag":40,"props":3788,"children":3789},{},[3790],{"type":44,"value":3791},"The BI industry has spent 20 years trying to get people to log into dashboards. Teams are voting with their thumbs: they would rather just message someone.",{"type":39,"tag":52,"props":3793,"children":3794},{"id":1007},[3795],{"type":44,"value":1010},{"type":39,"tag":110,"props":3797,"children":3799},{"id":3798},"which-ai-data-analyst-tools-integrate-with-whatsapp",[3800],{"type":44,"value":3801},"Which AI data analyst tools integrate with WhatsApp?",{"type":39,"tag":40,"props":3803,"children":3804},{},[3805,3806,3810],{"type":44,"value":1043},{"type":39,"tag":932,"props":3807,"children":3808},{"href":1046},[3809],{"type":44,"value":1049},{"type":44,"value":3811},". Most competitors are Slack-only, Teams-only, or browser-only. ChatGPT and Claude have mobile apps but no real persistent connection to your warehouse or governance.",{"type":39,"tag":110,"props":3813,"children":3815},{"id":3814},"can-i-ask-business-data-questions-in-whatsapp-with-an-ai-data-analyst",[3816],{"type":44,"value":3817},"Can I ask business data questions in WhatsApp with an AI data analyst?",{"type":39,"tag":40,"props":3819,"children":3820},{},[3821],{"type":44,"value":3822},"Yes, with Bruin. You add a WhatsApp contact, message it in natural language, and get answers from your governed company data. Questions can be about pipeline, revenue, customer accounts, campaigns, or any metric defined in your semantic layer.",{"type":39,"tag":110,"props":3824,"children":3826},{"id":3825},"is-whatsapp-safe-for-business-data",[3827],{"type":44,"value":3828},"Is WhatsApp safe for business data?",{"type":39,"tag":40,"props":3830,"children":3831},{},[3832],{"type":44,"value":3833},"It can be, if the tool handles identity, permissions, audit logs, and revocation correctly. Bruin maps every WhatsApp user to a Bruin identity with the same role-based access controls as the browser, Slack, and Teams experience. Messages are logged and auditable. Users can be revoked in one click.",{"type":39,"tag":110,"props":3835,"children":3837},{"id":3836},"what-data-sources-does-bruin-connect-to-from-whatsapp",[3838],{"type":44,"value":3839},"What data sources does Bruin connect to from WhatsApp?",{"type":39,"tag":40,"props":3841,"children":3842},{},[3843,3845,3851],{"type":44,"value":3844},"The same sources as every other Bruin surface: Snowflake, BigQuery, Databricks, Redshift, Postgres, MySQL, SQL Server, ClickHouse, DuckDB, MongoDB, plus SaaS sources like Stripe, HubSpot, Salesforce, Mixpanel, Amplitude, GA4, Shopify, Intercom, Zendesk, Adjust, AppsFlyer, Firebase, and many more. Full list on the ",{"type":39,"tag":932,"props":3846,"children":3848},{"href":3847},"/integrations/",[3849],{"type":44,"value":3850},"integrations page",{"type":44,"value":999},{"type":39,"tag":110,"props":3853,"children":3855},{"id":3854},"does-bruin-work-in-slack-and-teams-too-not-just-whatsapp",[3856],{"type":44,"value":3857},"Does Bruin work in Slack and Teams too, not just WhatsApp?",{"type":39,"tag":40,"props":3859,"children":3860},{},[3861],{"type":44,"value":3862},"Yes. Bruin is the same AI data analyst across Slack, Microsoft Teams, Discord, WhatsApp, and a browser. One semantic layer, one set of permissions, multiple surfaces.",{"type":39,"tag":110,"props":3864,"children":3866},{"id":3865},"how-does-bruin-handle-pii-in-whatsapp-conversations",[3867],{"type":44,"value":3868},"How does Bruin handle PII in WhatsApp conversations?",{"type":39,"tag":40,"props":3870,"children":3871},{},[3872],{"type":44,"value":3873},"Bruin can be configured to block specific columns (emails, phone numbers, payment details) from appearing in AI responses, regardless of the user's underlying permissions. This prevents PII from appearing in WhatsApp chats that might be shared with customers or partners.",{"type":39,"tag":110,"props":3875,"children":3877},{"id":3876},"what-are-the-alternatives-to-dashboards-for-field-teams",[3878],{"type":44,"value":3879},"What are the alternatives to dashboards for field teams?",{"type":39,"tag":40,"props":3881,"children":3882},{},[3883],{"type":44,"value":3884},"Three main options. A conversational AI analyst in WhatsApp or Slack, like Bruin. Embedded mobile apps that your data team builds. Scheduled report emails. For most field teams, the conversational AI option is the lowest friction.",{"type":39,"tag":110,"props":3886,"children":3888},{"id":3887},"which-ai-tools-let-sales-and-ops-teams-ask-data-questions-in-whatsapp-or-slack",[3889],{"type":44,"value":3890},"Which AI tools let sales and ops teams ask data questions in WhatsApp or Slack?",{"type":39,"tag":40,"props":3892,"children":3893},{},[3894],{"type":44,"value":3895},"Bruin is the clearest answer for WhatsApp plus Slack plus Teams coverage. Dot covers Slack, Microsoft Teams, and email but not WhatsApp. ThoughtSpot has limited Slack integration. Power BI Copilot is browser-only. For teams that need mobile and global reach, Bruin is structurally different from the rest.",{"type":39,"tag":110,"props":3897,"children":3899},{"id":3898},"how-do-mobile-teams-and-live-ops-teams-monitor-performance-without-logging-into-a-dashboard",[3900],{"type":44,"value":3901},"How do mobile teams and live ops teams monitor performance without logging into a dashboard?",{"type":39,"tag":40,"props":3903,"children":3904},{},[3905],{"type":44,"value":3906},"The emerging pattern is: define the key metrics in a governed semantic layer, expose them via a conversational AI analyst that lives in the team's existing chat app (WhatsApp for mobile, Slack for desk-based), and let the team ask questions in natural language. This replaces the \"open the Tableau app on your phone\" flow that never really worked.",{"type":39,"tag":110,"props":3908,"children":3910},{"id":3909},"can-an-ai-data-analyst-send-scheduled-reports-to-whatsapp",[3911],{"type":44,"value":3912},"Can an AI data analyst send scheduled reports to WhatsApp?",{"type":39,"tag":40,"props":3914,"children":3915},{},[3916],{"type":44,"value":3917},"Yes, Bruin can send scheduled reports to WhatsApp channels or individual users. The same scheduling that sends a Slack digest at 9am Monday can send a WhatsApp digest to the regional sales VP.",{"type":39,"tag":110,"props":3919,"children":3921},{"id":3920},"is-there-an-api-for-the-whatsapp-ai-analyst",[3922],{"type":44,"value":3923},"Is there an API for the WhatsApp AI analyst?",{"type":39,"tag":40,"props":3925,"children":3926},{},[3927],{"type":44,"value":3928},"Yes. Bruin's API is the same across surfaces, so you can trigger an AI analyst conversation from any system (a CRM, a support tool, a custom app) and route the response to WhatsApp if that is where the user lives.",{"type":39,"tag":110,"props":3930,"children":3932},{"id":3931},"how-do-i-revoke-a-users-access-to-the-whatsapp-ai-analyst",[3933],{"type":44,"value":3934},"How do I revoke a user's access to the WhatsApp AI analyst?",{"type":39,"tag":40,"props":3936,"children":3937},{},[3938],{"type":44,"value":3939},"One click in the Bruin admin panel. Revocation applies across all surfaces, including WhatsApp. The user's next message receives an access-denied response.",{"type":39,"tag":110,"props":3941,"children":3943},{"id":3942},"what-happens-when-a-user-asks-a-question-bruin-does-not-have-permission-to-answer",[3944],{"type":44,"value":3945},"What happens when a user asks a question Bruin does not have permission to answer?",{"type":39,"tag":40,"props":3947,"children":3948},{},[3949],{"type":44,"value":3950},"Bruin returns a clear message explaining that the user does not have access to the requested data, rather than leaking partial results. Admins can configure the exact wording.",{"type":39,"tag":110,"props":3952,"children":3954},{"id":3953},"can-partners-and-contractors-use-the-whatsapp-ai-analyst-without-a-full-bi-license",[3955],{"type":44,"value":3956},"Can partners and contractors use the WhatsApp AI analyst without a full BI license?",{"type":39,"tag":40,"props":3958,"children":3959},{},[3960],{"type":44,"value":3961},"Yes. Bruin's access model lets you grant narrow read-only access to specific tables or metrics for users outside your main org, without requiring a full BI seat. WhatsApp is often the distribution channel for this because it avoids provisioning external users in a browser-based tool.",{"type":39,"tag":110,"props":3963,"children":3965},{"id":3964},"does-bruin-work-with-whatsapp-business-api",[3966],{"type":44,"value":3967},"Does Bruin work with WhatsApp Business API?",{"type":39,"tag":40,"props":3969,"children":3970},{},[3971],{"type":44,"value":3972},"Yes. Bruin's enterprise plans include WhatsApp Business API integration managed on our side. Self-hosted deployments bring their own WhatsApp Business API contract with Meta.",{"title":7,"searchDepth":1226,"depth":1226,"links":3974},[3975,3981,3987,3988,3989,3996,4002,4003,4004,4005,4006],{"id":3252,"depth":1226,"text":3255,"children":3976},[3977,3978,3979,3980],{"id":3258,"depth":1232,"text":3261},{"id":3274,"depth":1232,"text":3277},{"id":3290,"depth":1232,"text":3293},{"id":3301,"depth":1232,"text":3304},{"id":3312,"depth":1226,"text":3315,"children":3982},[3983,3984,3985,3986],{"id":3323,"depth":1232,"text":3326},{"id":3334,"depth":1232,"text":3337},{"id":3345,"depth":1232,"text":3348},{"id":3356,"depth":1232,"text":3359},{"id":3367,"depth":1226,"text":3370},{"id":3468,"depth":1226,"text":3471},{"id":3517,"depth":1226,"text":3520,"children":3990},[3991,3992,3993,3994,3995],{"id":3528,"depth":1232,"text":3531},{"id":3539,"depth":1232,"text":3542},{"id":3550,"depth":1232,"text":3553},{"id":3561,"depth":1232,"text":3564},{"id":3572,"depth":1232,"text":3575},{"id":3583,"depth":1226,"text":3586,"children":3997},[3998,3999,4000,4001],{"id":3594,"depth":1232,"text":3597},{"id":3605,"depth":1232,"text":3608},{"id":3616,"depth":1232,"text":3619},{"id":3627,"depth":1232,"text":3630},{"id":3638,"depth":1226,"text":3641},{"id":3687,"depth":1226,"text":3690},{"id":3716,"depth":1226,"text":3719},{"id":3765,"depth":1226,"text":3768},{"id":1007,"depth":1226,"text":1010,"children":4007},[4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022],{"id":3798,"depth":1232,"text":3801},{"id":3814,"depth":1232,"text":3817},{"id":3825,"depth":1232,"text":3828},{"id":3836,"depth":1232,"text":3839},{"id":3854,"depth":1232,"text":3857},{"id":3865,"depth":1232,"text":3868},{"id":3876,"depth":1232,"text":3879},{"id":3887,"depth":1232,"text":3890},{"id":3898,"depth":1232,"text":3901},{"id":3909,"depth":1232,"text":3912},{"id":3920,"depth":1232,"text":3923},{"id":3931,"depth":1232,"text":3934},{"id":3942,"depth":1232,"text":3945},{"id":3953,"depth":1232,"text":3956},{"id":3964,"depth":1232,"text":3967},"content:blog:ai-data-analyst-on-whatsapp.md","blog/ai-data-analyst-on-whatsapp.md","blog/ai-data-analyst-on-whatsapp",{"_path":4027,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":4028,"description":4029,"coverImage":4030,"date":4031,"readingTime":4032,"category":13,"tags":4033,"author":4042,"body":4046,"_type":1275,"_id":5117,"_source":1277,"_file":5118,"_stem":5119,"_extension":1280},"/blog/bruin-mcp-launch","Introducing Bruin MCP: Your AI Agent's Data Toolkit","Bruin now supports the Model Context Protocol, letting AI agents in Cursor, Claude Code, and other editors query databases, ingest data, compare tables, and build pipelines—all through natural language.","/img/blog/covers/mcp-launch.png","2025-11-13",6,[4034,4035,4036,4037,4038,4039,4040,4041],"MCP","AI","Claude","Cursor","automation","developer tools","open source","data platform",{"name":4043,"role":4044,"image":4045},"Burak Karakan","Co-founder & CEO","/img/blog/burak.jpeg",{"type":36,"children":4047,"toc":5094},[4048,4060,4065,4077,4083,4097,4102,4125,4130,4136,4141,4169,4174,4179,4184,4227,4233,4238,4248,4253,4265,4271,4292,4297,4311,4317,4322,4358,4363,4368,4373,4379,4384,4390,4404,4412,4425,4431,4445,4453,4467,4473,4478,4486,4491,4497,4510,4518,4523,4529,4534,4542,4547,4553,4558,4566,4571,4577,4582,4593,4598,4642,4656,4662,4669,4713,4719,4731,4808,4814,4826,4859,4865,4870,4902,4907,4925,4939,4945,4950,5001,5007,5019,5069,5083,5088],{"type":39,"tag":40,"props":4049,"children":4050},{},[4051,4053,4058],{"type":44,"value":4052},"We're excited to announce that ",{"type":39,"tag":932,"props":4054,"children":4056},{"href":934,"rel":4055},[936],[4057],{"type":44,"value":939},{"type":44,"value":4059}," now supports the Model Context Protocol (MCP), bringing the full power of Bruin's data capabilities to your AI editor.",{"type":39,"tag":40,"props":4061,"children":4062},{},[4063],{"type":44,"value":4064},"With Bruin MCP, you can ask your AI agent to query databases, ingest data from dozens of sources, compare tables across environments, build complete pipelines, and more—all without leaving your editor.",{"type":39,"tag":4066,"props":4067,"children":4076},"iframe",{"width":4068,"height":4069,"src":4070,"title":4071,"frameBorder":4072,"allow":4073,"allowFullScreen":4074,"style":4075},"100%",400,"https://www.youtube.com/embed/604wuKeTP6U","Introducing Bruin MCP","0","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",true,"border-radius: 12px; margin: 1.5rem 0;",[],{"type":39,"tag":52,"props":4078,"children":4080},{"id":4079},"what-is-mcp",[4081],{"type":44,"value":4082},"What is MCP?",{"type":39,"tag":40,"props":4084,"children":4085},{},[4086,4088,4095],{"type":44,"value":4087},"The ",{"type":39,"tag":932,"props":4089,"children":4092},{"href":4090,"rel":4091},"https://modelcontextprotocol.io/",[936],[4093],{"type":44,"value":4094},"Model Context Protocol",{"type":44,"value":4096}," is an open standard that lets AI agents interact with external tools and data sources. Think of it as a universal adapter that connects AI models to real-world systems.",{"type":39,"tag":40,"props":4098,"children":4099},{},[4100],{"type":44,"value":4101},"Rather than just generating code suggestions, MCP-enabled AI agents can:",{"type":39,"tag":64,"props":4103,"children":4104},{},[4105,4110,4115,4120],{"type":39,"tag":68,"props":4106,"children":4107},{},[4108],{"type":44,"value":4109},"Execute commands and read their output",{"type":39,"tag":68,"props":4111,"children":4112},{},[4113],{"type":44,"value":4114},"Query databases and APIs",{"type":39,"tag":68,"props":4116,"children":4117},{},[4118],{"type":44,"value":4119},"Access documentation and tool capabilities",{"type":39,"tag":68,"props":4121,"children":4122},{},[4123],{"type":44,"value":4124},"Perform multi-step workflows",{"type":39,"tag":40,"props":4126,"children":4127},{},[4128],{"type":44,"value":4129},"In short, MCP transforms AI assistants from code generators into active participants in your workflow.",{"type":39,"tag":52,"props":4131,"children":4133},{"id":4132},"why-we-built-bruin-mcp",[4134],{"type":44,"value":4135},"Why we built Bruin MCP",{"type":39,"tag":40,"props":4137,"children":4138},{},[4139],{"type":44,"value":4140},"Bruin has been built with a few design decisions in mind:",{"type":39,"tag":64,"props":4142,"children":4143},{},[4144,4149,4154,4159,4164],{"type":39,"tag":68,"props":4145,"children":4146},{},[4147],{"type":44,"value":4148},"Bruin supports Eend-to-end data pipelines, from ingestion to transformation to quality checks",{"type":39,"tag":68,"props":4150,"children":4151},{},[4152],{"type":44,"value":4153},"All the steps of the pipeline are stored as text, and can be versioned and managed as code.",{"type":39,"tag":68,"props":4155,"children":4156},{},[4157],{"type":44,"value":4158},"No UI needed, just a simple CLI tool.",{"type":39,"tag":68,"props":4160,"children":4161},{},[4162],{"type":44,"value":4163},"The CLI can run across different query engines, databases, and environments.",{"type":39,"tag":68,"props":4165,"children":4166},{},[4167],{"type":44,"value":4168},"Everything runs locally",{"type":39,"tag":40,"props":4170,"children":4171},{},[4172],{"type":44,"value":4173},"These design decisions were made to make humans productive with data. All of our tooling, product decisions, and engineering efforts are focused on increasing productivity of data teams.",{"type":39,"tag":40,"props":4175,"children":4176},{},[4177],{"type":44,"value":4178},"When the AI agents came into our lives earlier this year, it became apparent to us that the investment we made in making humans productive would also benefit the AI agents. This was a fundamental shift in our thinking. The agents would soon become our partners in productivity, and data teams would need to benefit from this as well.",{"type":39,"tag":40,"props":4180,"children":4181},{},[4182],{"type":44,"value":4183},"The fact that we built everything as code, and as a CLI tool, made it easy to bring AI agents into the game. This is why we built Bruin MCP.",{"type":39,"tag":40,"props":4185,"children":4186},{},[4187,4189,4194,4196,4202,4203,4210,4211,4218,4220,4226],{"type":44,"value":4188},"By bridging ",{"type":39,"tag":932,"props":4190,"children":4192},{"href":934,"rel":4191},[936],[4193],{"type":44,"value":939},{"type":44,"value":4195}," with MCP-compatible editors like ",{"type":39,"tag":932,"props":4197,"children":4200},{"href":4198,"rel":4199},"https://cursor.sh/",[936],[4201],{"type":44,"value":4037},{"type":44,"value":962},{"type":39,"tag":932,"props":4204,"children":4207},{"href":4205,"rel":4206},"https://claude.ai/",[936],[4208],{"type":44,"value":4209},"Claude Code",{"type":44,"value":991},{"type":39,"tag":932,"props":4212,"children":4215},{"href":4213,"rel":4214},"https://codex.ai/",[936],[4216],{"type":44,"value":4217},"Codex",{"type":44,"value":4219},", we're enabling a fundamentally different way to work with data: ",{"type":39,"tag":4221,"props":4222,"children":4223},"strong",{},[4224],{"type":44,"value":4225},"conversational data engineering",{"type":44,"value":999},{"type":39,"tag":52,"props":4228,"children":4230},{"id":4229},"should-cli-tools-even-use-mcp",[4231],{"type":44,"value":4232},"Should CLI tools even use MCP?",{"type":39,"tag":40,"props":4234,"children":4235},{},[4236],{"type":44,"value":4237},"In its core, MCP is a simple protocol: it exposes tools, and AI agents call these tools. The idea is that external systems would have their own MCP servers, and the AI agents would interact with these systems without having to navigate UI, or learn new commands.",{"type":39,"tag":40,"props":4239,"children":4240},{},[4241,4243],{"type":44,"value":4242},"While this abstraction might work for some, we ran into a fundamental question: ",{"type":39,"tag":4221,"props":4244,"children":4245},{},[4246],{"type":44,"value":4247},"does MCP even make sense for CLI tools?",{"type":39,"tag":40,"props":4249,"children":4250},{},[4251],{"type":44,"value":4252},"Think about it for a minute: CLI tools are designed to be executed in a terminal, and the output is typically text. The AI agents are really good at understanding text, and executing shell commands. Why do we need MCP for CLI tools?",{"type":39,"tag":40,"props":4254,"children":4255},{},[4256,4258,4263],{"type":44,"value":4257},"There's another challenge: ",{"type":39,"tag":932,"props":4259,"children":4261},{"href":934,"rel":4260},[936],[4262],{"type":44,"value":939},{"type":44,"value":4264}," has quite a lot of functionality, which means that for all of our high-level commands, as well as their subcommands, we would need to implement separate tools. This would be a lot of work, and would also fill the context window of the AI agents quickly.",{"type":39,"tag":52,"props":4266,"children":4268},{"id":4267},"mcp-or-not-mcp",[4269],{"type":44,"value":4270},"MCP-or-not-MCP?",{"type":39,"tag":40,"props":4272,"children":4273},{},[4274,4276,4281,4283,4290],{"type":44,"value":4275},"Our first version of making AI agents use ",{"type":39,"tag":932,"props":4277,"children":4279},{"href":934,"rel":4278},[936],[4280],{"type":44,"value":939},{"type":44,"value":4282}," was to use the ",{"type":39,"tag":4284,"props":4285,"children":4287},"code",{"className":4286},[],[4288],{"type":44,"value":4289},"AGENTS.md",{"type":44,"value":4291}," files. In these files, we would manually describe a few Bruin CLI commands, and how to use them. This was a quick and dirty way to get started, which allowed us to bring AI into Bruin workflows quickly. While this worked nicely, this meant that every command would need to be manually described, and the AI agents would need to learn the syntax of the commands. This was not fit for going to production.",{"type":39,"tag":40,"props":4293,"children":4294},{},[4295],{"type":44,"value":4296},"While playing around with different AI agents, an idea popped into our heads: AI agents are really good at navigating files and directories, and executing commands in a terminal. Why not use this to our advantage?",{"type":39,"tag":40,"props":4298,"children":4299},{},[4300,4302,4309],{"type":44,"value":4301},"We have a ",{"type":39,"tag":932,"props":4303,"children":4306},{"href":4304,"rel":4305},"https://getbruin.com/docs/bruin/",[936],[4307],{"type":44,"value":4308},"decent documentation",{"type":44,"value":4310}," for our CLI, and the documentation is already in markdown format. Why not use this to our advantage? Could we make the MCP server read the documentation, and execute the commands based on the documentation?",{"type":39,"tag":52,"props":4312,"children":4314},{"id":4313},"a-creative-way-to-use-mcp",[4315],{"type":44,"value":4316},"A creative way to use MCP",{"type":39,"tag":40,"props":4318,"children":4319},{},[4320],{"type":44,"value":4321},"This thought process led us to the current design of Bruin MCP, which consists of 3 simple tools:",{"type":39,"tag":64,"props":4323,"children":4324},{},[4325,4336,4347],{"type":39,"tag":68,"props":4326,"children":4327},{},[4328,4334],{"type":39,"tag":4284,"props":4329,"children":4331},{"className":4330},[],[4332],{"type":44,"value":4333},"bruin_get_overview",{"type":44,"value":4335},": Tell the agent the basics of Bruin, what it does, and how to use it.",{"type":39,"tag":68,"props":4337,"children":4338},{},[4339,4345],{"type":39,"tag":4284,"props":4340,"children":4342},{"className":4341},[],[4343],{"type":44,"value":4344},"bruin_get_docs_tree",{"type":44,"value":4346},": Get the tree of the documentation, and the commands available.",{"type":39,"tag":68,"props":4348,"children":4349},{},[4350,4356],{"type":39,"tag":4284,"props":4351,"children":4353},{"className":4352},[],[4354],{"type":44,"value":4355},"bruin_get_doc_content",{"type":44,"value":4357},": Read the content of a specific documentation file.",{"type":39,"tag":40,"props":4359,"children":4360},{},[4361],{"type":44,"value":4362},"This means that the AI agent can navigate the documentation by itself, and execute the CLI commands based on the documentation using the shell.",{"type":39,"tag":40,"props":4364,"children":4365},{},[4366],{"type":44,"value":4367},"The beauty of this approach is that it is incredibly simple, flexible, and very easy to maintain. Every new feature we document is automatically available to the AI agent. Any agent that can call tools can immediately start using Bruin MCP. All without us having to maintain a separate tool for each command.",{"type":39,"tag":40,"props":4369,"children":4370},{},[4371],{"type":44,"value":4372},"This is more of an opinionated approach, and we're open to feedback on this. At this point, it feels like MCP servers does not really make much sense for CLI tools, other than just exposing documentation about the tool itself.",{"type":39,"tag":52,"props":4374,"children":4376},{"id":4375},"what-you-can-do-with-bruin-mcp",[4377],{"type":44,"value":4378},"What you can do with Bruin MCP",{"type":39,"tag":40,"props":4380,"children":4381},{},[4382],{"type":44,"value":4383},"Bruin allows you to build end-to-end pipelines, which means any data engineering task you have can be (partially?) automated with AI agents using Bruin MCP.",{"type":39,"tag":110,"props":4385,"children":4387},{"id":4386},"_1-query-any-database",[4388],{"type":44,"value":4389},"1. Query any database",{"type":39,"tag":40,"props":4391,"children":4392},{},[4393,4395,4402],{"type":44,"value":4394},"Ask your AI agent to run SQL queries across PostgreSQL, BigQuery, Snowflake, DuckDB, and ",{"type":39,"tag":932,"props":4396,"children":4399},{"href":4397,"rel":4398},"https://getbruin.com/docs/bruin/#supported-platforms",[936],[4400],{"type":44,"value":4401},"many more platforms",{"type":44,"value":4403},":",{"type":39,"tag":3382,"props":4405,"children":4406},{},[4407],{"type":39,"tag":40,"props":4408,"children":4409},{},[4410],{"type":44,"value":4411},"\"What's the total revenue by product category this quarter?\"",{"type":39,"tag":40,"props":4413,"children":4414},{},[4415,4417,4423],{"type":44,"value":4416},"Your AI agent connects to your configured databases, runs the query, and shows you the results—no context switching required. It uses ",{"type":39,"tag":4284,"props":4418,"children":4420},{"className":4419},[],[4421],{"type":44,"value":4422},"bruin query",{"type":44,"value":4424}," commands to run queries using the pre-configured connections you have defined.",{"type":39,"tag":110,"props":4426,"children":4428},{"id":4427},"_2-ingest-data-from-anywhere",[4429],{"type":44,"value":4430},"2. Ingest data from anywhere",{"type":39,"tag":40,"props":4432,"children":4433},{},[4434,4436,4443],{"type":44,"value":4435},"Bruin supports ",{"type":39,"tag":932,"props":4437,"children":4440},{"href":4438,"rel":4439},"https://getbruin.com/docs/bruin/ingestion/overview.html",[936],[4441],{"type":44,"value":4442},"60+ data sources",{"type":44,"value":4444}," through our open-source ingestion framework. With MCP, you can trigger ingestion with plain English:",{"type":39,"tag":3382,"props":4446,"children":4447},{},[4448],{"type":39,"tag":40,"props":4449,"children":4450},{},[4451],{"type":44,"value":4452},"\"Bring all my Shopify order data from last week into BigQuery.\"",{"type":39,"tag":40,"props":4454,"children":4455},{},[4456,4458,4465],{"type":44,"value":4457},"The AI agent writes the ingestion config, executes it, and confirms when the data is loaded. What used to take 30 minutes of reading docs and writing config now takes 30 seconds of typing a sentence. It uses ",{"type":39,"tag":932,"props":4459,"children":4462},{"href":4460,"rel":4461},"https://getbruin.com/docs/bruin/assets/ingestr.html#ingestr-assets",[936],[4463],{"type":44,"value":4464},"ingestr assets",{"type":44,"value":4466}," for Shopify, Stripe, Google Sheets, and many more sources.",{"type":39,"tag":110,"props":4468,"children":4470},{"id":4469},"_3-update-your-sql-data-assets",[4471],{"type":44,"value":4472},"3. Update your SQL data assets",{"type":39,"tag":40,"props":4474,"children":4475},{},[4476],{"type":44,"value":4477},"Bruin allows you to define your SQL data assets as code, and version them. With MCP, you can update the SQL data assets with plain English:",{"type":39,"tag":3382,"props":4479,"children":4480},{},[4481],{"type":39,"tag":40,"props":4482,"children":4483},{},[4484],{"type":44,"value":4485},"\"Update the users table to add a new column for the user's phone number, and set it to required.\"",{"type":39,"tag":40,"props":4487,"children":4488},{},[4489],{"type":44,"value":4490},"The AI agent updates the SQL data asset, and confirms when the data is loaded.",{"type":39,"tag":110,"props":4492,"children":4494},{"id":4493},"_4-compare-tables-across-environments",[4495],{"type":44,"value":4496},"4. Compare tables across environments",{"type":39,"tag":40,"props":4498,"children":4499},{},[4500,4502,4508],{"type":44,"value":4501},"One of the hardest parts of data pipeline development is validating that your changes produce the correct output. Bruin's built-in ",{"type":39,"tag":4284,"props":4503,"children":4505},{"className":4504},[],[4506],{"type":44,"value":4507},"data-diff",{"type":44,"value":4509}," command makes this easy, and MCP makes it trivial:",{"type":39,"tag":3382,"props":4511,"children":4512},{},[4513],{"type":39,"tag":40,"props":4514,"children":4515},{},[4516],{"type":44,"value":4517},"\"Compare the users table between dev and prod.\"",{"type":39,"tag":40,"props":4519,"children":4520},{},[4521],{"type":44,"value":4522},"The AI agent runs the comparison, highlights differences, and helps you diagnose discrepancies—all in a conversational thread.",{"type":39,"tag":110,"props":4524,"children":4526},{"id":4525},"_5-build-complete-pipelines",[4527],{"type":44,"value":4528},"5. Build complete pipelines",{"type":39,"tag":40,"props":4530,"children":4531},{},[4532],{"type":44,"value":4533},"Bruin MCP has access to up-to-date Bruin documentation, meaning your AI agent can scaffold entire pipelines based on best practices:",{"type":39,"tag":3382,"props":4535,"children":4536},{},[4537],{"type":39,"tag":40,"props":4538,"children":4539},{},[4540],{"type":44,"value":4541},"\"Create a pipeline that ingests Stripe data daily, calculates MRR by plan, and runs freshness checks.\"",{"type":39,"tag":40,"props":4543,"children":4544},{},[4545],{"type":44,"value":4546},"The agent creates the pipeline structure, writes SQL transformations, adds quality checks, and even suggests materialization strategies—then validates the pipeline before you run it.",{"type":39,"tag":110,"props":4548,"children":4550},{"id":4549},"_6-get-instant-documentation-help",[4551],{"type":44,"value":4552},"6. Get instant documentation help",{"type":39,"tag":40,"props":4554,"children":4555},{},[4556],{"type":44,"value":4557},"No more switching to a browser to search docs:",{"type":39,"tag":3382,"props":4559,"children":4560},{},[4561],{"type":39,"tag":40,"props":4562,"children":4563},{},[4564],{"type":44,"value":4565},"\"How do I set up a Snowflake connection in Bruin?\"",{"type":39,"tag":40,"props":4567,"children":4568},{},[4569],{"type":44,"value":4570},"The AI agent fetches the relevant documentation, shows you the configuration format, and can even add the connection for you if you provide credentials.",{"type":39,"tag":52,"props":4572,"children":4574},{"id":4573},"how-to-get-started",[4575],{"type":44,"value":4576},"How to get started",{"type":39,"tag":40,"props":4578,"children":4579},{},[4580],{"type":44,"value":4581},"Setting up Bruin MCP takes less than a minute.",{"type":39,"tag":110,"props":4583,"children":4585},{"id":4584},"step-1-install-bruin-cli",[4586,4588],{"type":44,"value":4587},"Step 1: Install ",{"type":39,"tag":932,"props":4589,"children":4591},{"href":934,"rel":4590},[936],[4592],{"type":44,"value":939},{"type":39,"tag":40,"props":4594,"children":4595},{},[4596],{"type":44,"value":4597},"If you haven't already:",{"type":39,"tag":4599,"props":4600,"children":4604},"pre",{"className":4601,"code":4602,"language":4603,"meta":7,"style":7},"language-bash shiki shiki-themes github-dark","curl -LsSf https://getbruin.com/install/cli | sh\n","bash",[4605],{"type":39,"tag":4284,"props":4606,"children":4607},{"__ignoreMap":7},[4608],{"type":39,"tag":3407,"props":4609,"children":4612},{"class":4610,"line":4611},"line",1,[4613,4619,4625,4631,4637],{"type":39,"tag":3407,"props":4614,"children":4616},{"style":4615},"--shiki-default:#B392F0",[4617],{"type":44,"value":4618},"curl",{"type":39,"tag":3407,"props":4620,"children":4622},{"style":4621},"--shiki-default:#79B8FF",[4623],{"type":44,"value":4624}," -LsSf",{"type":39,"tag":3407,"props":4626,"children":4628},{"style":4627},"--shiki-default:#9ECBFF",[4629],{"type":44,"value":4630}," https://getbruin.com/install/cli",{"type":39,"tag":3407,"props":4632,"children":4634},{"style":4633},"--shiki-default:#F97583",[4635],{"type":44,"value":4636}," |",{"type":39,"tag":3407,"props":4638,"children":4639},{"style":4615},[4640],{"type":44,"value":4641}," sh\n",{"type":39,"tag":40,"props":4643,"children":4644},{},[4645,4647,4654],{"type":44,"value":4646},"Or follow the ",{"type":39,"tag":932,"props":4648,"children":4651},{"href":4649,"rel":4650},"https://getbruin.com/docs/bruin/getting-started/introduction/installation.html",[936],[4652],{"type":44,"value":4653},"installation guide",{"type":44,"value":4655}," for other platforms.",{"type":39,"tag":110,"props":4657,"children":4659},{"id":4658},"step-2-configure-your-editor",[4660],{"type":44,"value":4661},"Step 2: Configure Your Editor",{"type":39,"tag":4663,"props":4664,"children":4666},"h4",{"id":4665},"for-claude-code",[4667],{"type":44,"value":4668},"For Claude Code:",{"type":39,"tag":4599,"props":4670,"children":4672},{"className":4601,"code":4671,"language":4603,"meta":7,"style":7},"claude mcp add bruin -- bruin mcp\n",[4673],{"type":39,"tag":4284,"props":4674,"children":4675},{"__ignoreMap":7},[4676],{"type":39,"tag":3407,"props":4677,"children":4678},{"class":4610,"line":4611},[4679,4684,4689,4694,4699,4704,4708],{"type":39,"tag":3407,"props":4680,"children":4681},{"style":4615},[4682],{"type":44,"value":4683},"claude",{"type":39,"tag":3407,"props":4685,"children":4686},{"style":4627},[4687],{"type":44,"value":4688}," mcp",{"type":39,"tag":3407,"props":4690,"children":4691},{"style":4627},[4692],{"type":44,"value":4693}," add",{"type":39,"tag":3407,"props":4695,"children":4696},{"style":4627},[4697],{"type":44,"value":4698}," bruin",{"type":39,"tag":3407,"props":4700,"children":4701},{"style":4621},[4702],{"type":44,"value":4703}," --",{"type":39,"tag":3407,"props":4705,"children":4706},{"style":4627},[4707],{"type":44,"value":4698},{"type":39,"tag":3407,"props":4709,"children":4710},{"style":4627},[4711],{"type":44,"value":4712}," mcp\n",{"type":39,"tag":4663,"props":4714,"children":4716},{"id":4715},"for-cursor-ide",[4717],{"type":44,"value":4718},"For Cursor IDE:",{"type":39,"tag":40,"props":4720,"children":4721},{},[4722,4724,4729],{"type":44,"value":4723},"Go to ",{"type":39,"tag":4221,"props":4725,"children":4726},{},[4727],{"type":44,"value":4728},"Settings → MCP & Integrations → Add Custom MCP",{"type":44,"value":4730}," and add:",{"type":39,"tag":4599,"props":4732,"children":4736},{"className":4733,"code":4734,"language":4735,"meta":7,"style":7},"language-json shiki shiki-themes github-dark","{\n  \"mcpServers\": {\n    \"bruin\": {\n      \"command\": \"bruin\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n","json",[4737],{"type":39,"tag":4284,"props":4738,"children":4739},{"__ignoreMap":7},[4740,4748,4756,4764,4773,4782,4790,4799],{"type":39,"tag":3407,"props":4741,"children":4742},{"class":4610,"line":4611},[4743],{"type":39,"tag":3407,"props":4744,"children":4745},{},[4746],{"type":44,"value":4747},"{\n",{"type":39,"tag":3407,"props":4749,"children":4750},{"class":4610,"line":1226},[4751],{"type":39,"tag":3407,"props":4752,"children":4753},{},[4754],{"type":44,"value":4755},"  \"mcpServers\": {\n",{"type":39,"tag":3407,"props":4757,"children":4758},{"class":4610,"line":1232},[4759],{"type":39,"tag":3407,"props":4760,"children":4761},{},[4762],{"type":44,"value":4763},"    \"bruin\": {\n",{"type":39,"tag":3407,"props":4765,"children":4767},{"class":4610,"line":4766},4,[4768],{"type":39,"tag":3407,"props":4769,"children":4770},{},[4771],{"type":44,"value":4772},"      \"command\": \"bruin\",\n",{"type":39,"tag":3407,"props":4774,"children":4776},{"class":4610,"line":4775},5,[4777],{"type":39,"tag":3407,"props":4778,"children":4779},{},[4780],{"type":44,"value":4781},"      \"args\": [\"mcp\"]\n",{"type":39,"tag":3407,"props":4783,"children":4784},{"class":4610,"line":4032},[4785],{"type":39,"tag":3407,"props":4786,"children":4787},{},[4788],{"type":44,"value":4789},"    }\n",{"type":39,"tag":3407,"props":4791,"children":4793},{"class":4610,"line":4792},7,[4794],{"type":39,"tag":3407,"props":4795,"children":4796},{},[4797],{"type":44,"value":4798},"  }\n",{"type":39,"tag":3407,"props":4800,"children":4802},{"class":4610,"line":4801},8,[4803],{"type":39,"tag":3407,"props":4804,"children":4805},{},[4806],{"type":44,"value":4807},"}\n",{"type":39,"tag":4663,"props":4809,"children":4811},{"id":4810},"for-codex-cli",[4812],{"type":44,"value":4813},"For Codex CLI:",{"type":39,"tag":40,"props":4815,"children":4816},{},[4817,4819,4825],{"type":44,"value":4818},"Add to ",{"type":39,"tag":4284,"props":4820,"children":4822},{"className":4821},[],[4823],{"type":44,"value":4824},"~/.codex/config.toml",{"type":44,"value":4403},{"type":39,"tag":4599,"props":4827,"children":4831},{"className":4828,"code":4829,"language":4830,"meta":7,"style":7},"language-toml shiki shiki-themes github-dark","[mcp_servers.bruin]\ncommand = \"bruin\"\nargs = [\"mcp\"]\n","toml",[4832],{"type":39,"tag":4284,"props":4833,"children":4834},{"__ignoreMap":7},[4835,4843,4851],{"type":39,"tag":3407,"props":4836,"children":4837},{"class":4610,"line":4611},[4838],{"type":39,"tag":3407,"props":4839,"children":4840},{},[4841],{"type":44,"value":4842},"[mcp_servers.bruin]\n",{"type":39,"tag":3407,"props":4844,"children":4845},{"class":4610,"line":1226},[4846],{"type":39,"tag":3407,"props":4847,"children":4848},{},[4849],{"type":44,"value":4850},"command = \"bruin\"\n",{"type":39,"tag":3407,"props":4852,"children":4853},{"class":4610,"line":1232},[4854],{"type":39,"tag":3407,"props":4855,"children":4856},{},[4857],{"type":44,"value":4858},"args = [\"mcp\"]\n",{"type":39,"tag":110,"props":4860,"children":4862},{"id":4861},"step-3-start-building",[4863],{"type":44,"value":4864},"Step 3: Start Building",{"type":39,"tag":40,"props":4866,"children":4867},{},[4868],{"type":44,"value":4869},"Initialize a Bruin project (or use an existing one):",{"type":39,"tag":4599,"props":4871,"children":4873},{"className":4601,"code":4872,"language":4603,"meta":7,"style":7},"bruin init\ncd my-project\n",[4874],{"type":39,"tag":4284,"props":4875,"children":4876},{"__ignoreMap":7},[4877,4889],{"type":39,"tag":3407,"props":4878,"children":4879},{"class":4610,"line":4611},[4880,4884],{"type":39,"tag":3407,"props":4881,"children":4882},{"style":4615},[4883],{"type":44,"value":27},{"type":39,"tag":3407,"props":4885,"children":4886},{"style":4627},[4887],{"type":44,"value":4888}," init\n",{"type":39,"tag":3407,"props":4890,"children":4891},{"class":4610,"line":1226},[4892,4897],{"type":39,"tag":3407,"props":4893,"children":4894},{"style":4621},[4895],{"type":44,"value":4896},"cd",{"type":39,"tag":3407,"props":4898,"children":4899},{"style":4627},[4900],{"type":44,"value":4901}," my-project\n",{"type":39,"tag":40,"props":4903,"children":4904},{},[4905],{"type":44,"value":4906},"Now you can ask your AI agent anything:",{"type":39,"tag":64,"props":4908,"children":4909},{},[4910,4915,4920],{"type":39,"tag":68,"props":4911,"children":4912},{},[4913],{"type":44,"value":4914},"\"Connect to my Postgres database and show me the schema.\"",{"type":39,"tag":68,"props":4916,"children":4917},{},[4918],{"type":44,"value":4919},"\"Ingest Firebase events into DuckDB.\"",{"type":39,"tag":68,"props":4921,"children":4922},{},[4923],{"type":44,"value":4924},"\"Build a pipeline that transforms this raw data into a clean users table.\"",{"type":39,"tag":40,"props":4926,"children":4927},{},[4928,4930,4937],{"type":44,"value":4929},"Check out the ",{"type":39,"tag":932,"props":4931,"children":4934},{"href":4932,"rel":4933},"https://getbruin.com/docs/bruin/getting-started/bruin-mcp.html",[936],[4935],{"type":44,"value":4936},"full documentation",{"type":44,"value":4938}," for more examples and setup details.",{"type":39,"tag":52,"props":4940,"children":4942},{"id":4941},"whats-next",[4943],{"type":44,"value":4944},"What's Next",{"type":39,"tag":40,"props":4946,"children":4947},{},[4948],{"type":44,"value":4949},"Bruin MCP is just the beginning. We're exploring:",{"type":39,"tag":64,"props":4951,"children":4952},{},[4953,4963,4991],{"type":39,"tag":68,"props":4954,"children":4955},{},[4956,4961],{"type":39,"tag":4221,"props":4957,"children":4958},{},[4959],{"type":44,"value":4960},"Background agents",{"type":44,"value":4962},": Agents that run in the background, and can be triggered by events, such as Slack messages.",{"type":39,"tag":68,"props":4964,"children":4965},{},[4966,4971,4973,4978,4979,4984,4985,4990],{"type":39,"tag":4221,"props":4967,"children":4968},{},[4969],{"type":44,"value":4970},"Better integration with AI agents",{"type":44,"value":4972},": We're working on better integration with AI agents, such as ",{"type":39,"tag":932,"props":4974,"children":4976},{"href":4198,"rel":4975},[936],[4977],{"type":44,"value":4037},{"type":44,"value":962},{"type":39,"tag":932,"props":4980,"children":4982},{"href":4205,"rel":4981},[936],[4983],{"type":44,"value":4209},{"type":44,"value":991},{"type":39,"tag":932,"props":4986,"children":4988},{"href":4213,"rel":4987},[936],[4989],{"type":44,"value":4217},{"type":44,"value":999},{"type":39,"tag":68,"props":4992,"children":4993},{},[4994,4999],{"type":39,"tag":4221,"props":4995,"children":4996},{},[4997],{"type":44,"value":4998},"Isolated development environments",{"type":44,"value":5000},": We're working on isolated development environments on your database that can be used to test and validate data pipelines in isolation. This way, you can run your AI agents in a safe environment, and not worry about breaking your production database.",{"type":39,"tag":52,"props":5002,"children":5004},{"id":5003},"try-it-today",[5005],{"type":44,"value":5006},"Try It Today",{"type":39,"tag":40,"props":5008,"children":5009},{},[5010,5012,5017],{"type":44,"value":5011},"Bruin MCP is available now, completely free and open source. Install ",{"type":39,"tag":932,"props":5013,"children":5015},{"href":934,"rel":5014},[936],[5016],{"type":44,"value":939},{"type":44,"value":5018},", configure your editor, and start building data workflows through conversation.",{"type":39,"tag":64,"props":5020,"children":5021},{},[5022,5038,5053],{"type":39,"tag":68,"props":5023,"children":5024},{},[5025,5030,5032],{"type":39,"tag":4221,"props":5026,"children":5027},{},[5028],{"type":44,"value":5029},"Documentation",{"type":44,"value":5031},": ",{"type":39,"tag":932,"props":5033,"children":5035},{"href":4932,"rel":5034},[936],[5036],{"type":44,"value":5037},"getbruin.com/docs/bruin/getting-started/bruin-mcp.html",{"type":39,"tag":68,"props":5039,"children":5040},{},[5041,5046,5047],{"type":39,"tag":4221,"props":5042,"children":5043},{},[5044],{"type":44,"value":5045},"GitHub",{"type":44,"value":5031},{"type":39,"tag":932,"props":5048,"children":5050},{"href":934,"rel":5049},[936],[5051],{"type":44,"value":5052},"github.com/bruin-data/bruin",{"type":39,"tag":68,"props":5054,"children":5055},{},[5056,5061,5062],{"type":39,"tag":4221,"props":5057,"children":5058},{},[5059],{"type":44,"value":5060},"Community",{"type":44,"value":5031},{"type":39,"tag":932,"props":5063,"children":5066},{"href":5064,"rel":5065},"https://join.slack.com/t/bruindatacommunity/shared_invite/zt-2dl2i8foy-bVsuMUauHeN9M2laVm3ZVg",[936],[5067],{"type":44,"value":5068},"Join our Slack",{"type":39,"tag":40,"props":5070,"children":5071},{},[5072,5074,5081],{"type":44,"value":5073},"We'd love to hear your feedback. What workflows do you want to automate? What could your AI agent do better? Let us know by ",{"type":39,"tag":932,"props":5075,"children":5078},{"href":5076,"rel":5077},"https://github.com/bruin-data/bruin/issues/new",[936],[5079],{"type":44,"value":5080},"opening an issue",{"type":44,"value":5082}," or joining the conversation in Slack.",{"type":39,"tag":40,"props":5084,"children":5085},{},[5086],{"type":44,"value":5087},"Happy building!",{"type":39,"tag":5089,"props":5090,"children":5091},"style",{},[5092],{"type":44,"value":5093},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":1226,"depth":1226,"links":5095},[5096,5097,5098,5099,5100,5101,5109,5115,5116],{"id":4079,"depth":1226,"text":4082},{"id":4132,"depth":1226,"text":4135},{"id":4229,"depth":1226,"text":4232},{"id":4267,"depth":1226,"text":4270},{"id":4313,"depth":1226,"text":4316},{"id":4375,"depth":1226,"text":4378,"children":5102},[5103,5104,5105,5106,5107,5108],{"id":4386,"depth":1232,"text":4389},{"id":4427,"depth":1232,"text":4430},{"id":4469,"depth":1232,"text":4472},{"id":4493,"depth":1232,"text":4496},{"id":4525,"depth":1232,"text":4528},{"id":4549,"depth":1232,"text":4552},{"id":4573,"depth":1226,"text":4576,"children":5110},[5111,5113,5114],{"id":4584,"depth":1232,"text":5112},"Step 1: Install Bruin CLI",{"id":4658,"depth":1232,"text":4661},{"id":4861,"depth":1232,"text":4864},{"id":4941,"depth":1226,"text":4944},{"id":5003,"depth":1226,"text":5006},"content:blog:bruin-mcp-launch.md","blog/bruin-mcp-launch.md","blog/bruin-mcp-launch",{"_path":5121,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":5122,"description":5123,"coverImage":5124,"date":5125,"readingTime":4032,"category":5126,"tags":5127,"author":5135,"body":5139,"_type":1275,"_id":6072,"_source":1277,"_file":6073,"_stem":6074,"_extension":1280},"/blog/bruin-vscode-extension-vue-webviews","Bruin VS Code Extension: The Architectural Challenge of Integrating Vue.js Webviews","How we built a rich, interactive VS Code extension using Vue.js webviews, bridging Node.js extension code with a modern frontend through message passing.","/img/blog/covers/vscode-extension.png","2026-01-12","Engineering",[5128,5129,5130,5131,5132,939,5133,4040,5134],"VS Code","Vue.js","architecture","webviews","extension","developer experience","IDE",{"name":5136,"role":5137,"image":5138},"Djamila Baroudi","Software Engineer","/img/blog/djamila.jpg",{"type":36,"children":5140,"toc":6053},[5141,5147,5152,5157,5162,5168,5173,5183,5194,5205,5211,5216,5222,5304,5310,5431,5437,5513,5519,5524,5639,5648,5654,5660,5670,5696,5735,5741,5750,5759,5795,5801,5810,5819,5860,5866,5875,5900,5906,5915,5920,6001,6007,6028,6034,6049],{"type":39,"tag":52,"props":5142,"children":5144},{"id":5143},"why-we-needed-a-ui-in-vs-code",[5145],{"type":44,"value":5146},"Why We Needed a UI in VS Code",{"type":39,"tag":40,"props":5148,"children":5149},{},[5150],{"type":44,"value":5151},"If you're a data engineer, your typical day involves constant context switching: writing code in VS Code, running pipelines from the terminal, checking logs in a CLI, and jumping to a browser to visualize lineage or job status. This fragmentation kills productivity and breaks your flow.",{"type":39,"tag":40,"props":5153,"children":5154},{},[5155],{"type":44,"value":5156},"Bruin was founded to solve exactly this problem. We believe data teams deserve the same seamless, unified experience that software engineers enjoy, one place to think, build, run, and debug. That's why we created the Bruin VS Code Extension, which brings the full power of the Bruin CLI (asset management, pipeline execution, quality checks) directly into your editor.",{"type":39,"tag":40,"props":5158,"children":5159},{},[5160],{"type":44,"value":5161},"Native VS Code UI components work fine for simple status bars or tree views. But for rich experiences like interactive data lineage graphs, live query previews, and asset editors, we needed more power. That's where Webviews powered by Vue.js come in.",{"type":39,"tag":52,"props":5163,"children":5165},{"id":5164},"the-architecture-two-worlds-connected-by-messages",[5166],{"type":44,"value":5167},"The Architecture: Two Worlds Connected by Messages",{"type":39,"tag":40,"props":5169,"children":5170},{},[5171],{"type":44,"value":5172},"A VS Code extension with Vue.js webviews means building two distinct applications that live side-by-side in one repository:",{"type":39,"tag":4599,"props":5174,"children":5178},{"className":5175,"code":5177,"language":44,"meta":7},[5176],"language-text","Node.js Extension              webview-ui (Vue App)\n├── extension.ts               ├── package.json\n├── commands/ (CLI bridge)     ├── vite.config.js\n└── panels/ (webview mgr)      └── src/\n                               ├── components/\n                               └── stores/\n",[5179],{"type":39,"tag":4284,"props":5180,"children":5181},{"__ignoreMap":7},[5182],{"type":44,"value":5177},{"type":39,"tag":40,"props":5184,"children":5185},{},[5186,5187,5192],{"type":44,"value":4087},{"type":39,"tag":4221,"props":5188,"children":5189},{},[5190],{"type":44,"value":5191},"Node.js extension",{"type":44,"value":5193}," runs in VS Code's host process. It handles workspace context, registers commands, manages panels, and acts as a secure bridge to the local Bruin CLI.",{"type":39,"tag":40,"props":5195,"children":5196},{},[5197,5198,5203],{"type":44,"value":4087},{"type":39,"tag":4221,"props":5199,"children":5200},{},[5201],{"type":44,"value":5202},"Vue app",{"type":44,"value":5204}," runs inside a sandboxed webview (essentially a browser iframe). It renders everything the user sees: lineage graphs, asset details, connections and databases, query results, etc. The app is built with modern tooling: Vue 3, TypeScript, Vite, Pinia, and compiles to static assets that the extension serves.",{"type":39,"tag":52,"props":5206,"children":5208},{"id":5207},"message-passing-how-they-talk",[5209],{"type":44,"value":5210},"Message Passing: How They Talk",{"type":39,"tag":40,"props":5212,"children":5213},{},[5214],{"type":44,"value":5215},"Since webviews can't directly access Node.js APIs, all communication happens through structured JSON messages using VS Code's postMessage API.",{"type":39,"tag":110,"props":5217,"children":5219},{"id":5218},"from-vue-to-extension-user-clicks-run-pipeline",[5220],{"type":44,"value":5221},"From Vue to Extension (User Clicks \"Run Pipeline\")",{"type":39,"tag":4599,"props":5223,"children":5227},{"className":5224,"code":5225,"language":5226,"meta":7,"style":7},"language-ts shiki shiki-themes github-dark","// Webview side - simple intent\nimport { vscode } from \"@/utilities/vscode\";\n\nconst runPipeline = () => {\n  vscode.postMessage({\n    command: \"runPipeline\",\n    payload: messagePayload \n  });\n};\n","ts",[5228],{"type":39,"tag":4284,"props":5229,"children":5230},{"__ignoreMap":7},[5231,5239,5247,5255,5263,5271,5279,5287,5295],{"type":39,"tag":3407,"props":5232,"children":5233},{"class":4610,"line":4611},[5234],{"type":39,"tag":3407,"props":5235,"children":5236},{},[5237],{"type":44,"value":5238},"// Webview side - simple intent\n",{"type":39,"tag":3407,"props":5240,"children":5241},{"class":4610,"line":1226},[5242],{"type":39,"tag":3407,"props":5243,"children":5244},{},[5245],{"type":44,"value":5246},"import { vscode } from \"@/utilities/vscode\";\n",{"type":39,"tag":3407,"props":5248,"children":5249},{"class":4610,"line":1232},[5250],{"type":39,"tag":3407,"props":5251,"children":5252},{"emptyLinePlaceholder":4074},[5253],{"type":44,"value":5254},"\n",{"type":39,"tag":3407,"props":5256,"children":5257},{"class":4610,"line":4766},[5258],{"type":39,"tag":3407,"props":5259,"children":5260},{},[5261],{"type":44,"value":5262},"const runPipeline = () => {\n",{"type":39,"tag":3407,"props":5264,"children":5265},{"class":4610,"line":4775},[5266],{"type":39,"tag":3407,"props":5267,"children":5268},{},[5269],{"type":44,"value":5270},"  vscode.postMessage({\n",{"type":39,"tag":3407,"props":5272,"children":5273},{"class":4610,"line":4032},[5274],{"type":39,"tag":3407,"props":5275,"children":5276},{},[5277],{"type":44,"value":5278},"    command: \"runPipeline\",\n",{"type":39,"tag":3407,"props":5280,"children":5281},{"class":4610,"line":4792},[5282],{"type":39,"tag":3407,"props":5283,"children":5284},{},[5285],{"type":44,"value":5286},"    payload: messagePayload \n",{"type":39,"tag":3407,"props":5288,"children":5289},{"class":4610,"line":4801},[5290],{"type":39,"tag":3407,"props":5291,"children":5292},{},[5293],{"type":44,"value":5294},"  });\n",{"type":39,"tag":3407,"props":5296,"children":5298},{"class":4610,"line":5297},9,[5299],{"type":39,"tag":3407,"props":5300,"children":5301},{},[5302],{"type":44,"value":5303},"};\n",{"type":39,"tag":110,"props":5305,"children":5307},{"id":5306},"extension-receives-and-acts",[5308],{"type":44,"value":5309},"Extension Receives and Acts",{"type":39,"tag":4599,"props":5311,"children":5313},{"className":5224,"code":5312,"language":5226,"meta":7,"style":7},"// Extension side - handles the real work\nwebview.onDidReceiveMessage(async (message) => {\n  if (message.command === \"runPipeline\") {\n    const payload = message.payload;\n    \n    // Execute Bruin CLI and send updates back to UI\n    const results = await executeBruinCLI(payload);\n    \n    webview.postMessage({\n      command: \"pipelineStatus\",\n      payload: results\n    });\n  }\n});\n",[5314],{"type":39,"tag":4284,"props":5315,"children":5316},{"__ignoreMap":7},[5317,5325,5333,5341,5349,5357,5365,5373,5380,5388,5397,5406,5415,5423],{"type":39,"tag":3407,"props":5318,"children":5319},{"class":4610,"line":4611},[5320],{"type":39,"tag":3407,"props":5321,"children":5322},{},[5323],{"type":44,"value":5324},"// Extension side - handles the real work\n",{"type":39,"tag":3407,"props":5326,"children":5327},{"class":4610,"line":1226},[5328],{"type":39,"tag":3407,"props":5329,"children":5330},{},[5331],{"type":44,"value":5332},"webview.onDidReceiveMessage(async (message) => {\n",{"type":39,"tag":3407,"props":5334,"children":5335},{"class":4610,"line":1232},[5336],{"type":39,"tag":3407,"props":5337,"children":5338},{},[5339],{"type":44,"value":5340},"  if (message.command === \"runPipeline\") {\n",{"type":39,"tag":3407,"props":5342,"children":5343},{"class":4610,"line":4766},[5344],{"type":39,"tag":3407,"props":5345,"children":5346},{},[5347],{"type":44,"value":5348},"    const payload = message.payload;\n",{"type":39,"tag":3407,"props":5350,"children":5351},{"class":4610,"line":4775},[5352],{"type":39,"tag":3407,"props":5353,"children":5354},{},[5355],{"type":44,"value":5356},"    \n",{"type":39,"tag":3407,"props":5358,"children":5359},{"class":4610,"line":4032},[5360],{"type":39,"tag":3407,"props":5361,"children":5362},{},[5363],{"type":44,"value":5364},"    // Execute Bruin CLI and send updates back to UI\n",{"type":39,"tag":3407,"props":5366,"children":5367},{"class":4610,"line":4792},[5368],{"type":39,"tag":3407,"props":5369,"children":5370},{},[5371],{"type":44,"value":5372},"    const results = await executeBruinCLI(payload);\n",{"type":39,"tag":3407,"props":5374,"children":5375},{"class":4610,"line":4801},[5376],{"type":39,"tag":3407,"props":5377,"children":5378},{},[5379],{"type":44,"value":5356},{"type":39,"tag":3407,"props":5381,"children":5382},{"class":4610,"line":5297},[5383],{"type":39,"tag":3407,"props":5384,"children":5385},{},[5386],{"type":44,"value":5387},"    webview.postMessage({\n",{"type":39,"tag":3407,"props":5389,"children":5391},{"class":4610,"line":5390},10,[5392],{"type":39,"tag":3407,"props":5393,"children":5394},{},[5395],{"type":44,"value":5396},"      command: \"pipelineStatus\",\n",{"type":39,"tag":3407,"props":5398,"children":5400},{"class":4610,"line":5399},11,[5401],{"type":39,"tag":3407,"props":5402,"children":5403},{},[5404],{"type":44,"value":5405},"      payload: results\n",{"type":39,"tag":3407,"props":5407,"children":5409},{"class":4610,"line":5408},12,[5410],{"type":39,"tag":3407,"props":5411,"children":5412},{},[5413],{"type":44,"value":5414},"    });\n",{"type":39,"tag":3407,"props":5416,"children":5418},{"class":4610,"line":5417},13,[5419],{"type":39,"tag":3407,"props":5420,"children":5421},{},[5422],{"type":44,"value":4798},{"type":39,"tag":3407,"props":5424,"children":5425},{"class":4610,"line":3224},[5426],{"type":39,"tag":3407,"props":5427,"children":5428},{},[5429],{"type":44,"value":5430},"});\n",{"type":39,"tag":110,"props":5432,"children":5434},{"id":5433},"vue-receives-live-updates",[5435],{"type":44,"value":5436},"Vue Receives Live Updates",{"type":39,"tag":4599,"props":5438,"children":5440},{"className":5224,"code":5439,"language":5226,"meta":7,"style":7},"// Vue handles responses reactively\nconst handleMessage = (event) => {\n  const message = event.data;\n  \n  if (message.command === \"pipelineStatus\") {\n    const payload = message.payload;\n    // Update the UI with the payload\n  }\n};\n\n",[5441],{"type":39,"tag":4284,"props":5442,"children":5443},{"__ignoreMap":7},[5444,5452,5460,5468,5476,5484,5491,5499,5506],{"type":39,"tag":3407,"props":5445,"children":5446},{"class":4610,"line":4611},[5447],{"type":39,"tag":3407,"props":5448,"children":5449},{},[5450],{"type":44,"value":5451},"// Vue handles responses reactively\n",{"type":39,"tag":3407,"props":5453,"children":5454},{"class":4610,"line":1226},[5455],{"type":39,"tag":3407,"props":5456,"children":5457},{},[5458],{"type":44,"value":5459},"const handleMessage = (event) => {\n",{"type":39,"tag":3407,"props":5461,"children":5462},{"class":4610,"line":1232},[5463],{"type":39,"tag":3407,"props":5464,"children":5465},{},[5466],{"type":44,"value":5467},"  const message = event.data;\n",{"type":39,"tag":3407,"props":5469,"children":5470},{"class":4610,"line":4766},[5471],{"type":39,"tag":3407,"props":5472,"children":5473},{},[5474],{"type":44,"value":5475},"  \n",{"type":39,"tag":3407,"props":5477,"children":5478},{"class":4610,"line":4775},[5479],{"type":39,"tag":3407,"props":5480,"children":5481},{},[5482],{"type":44,"value":5483},"  if (message.command === \"pipelineStatus\") {\n",{"type":39,"tag":3407,"props":5485,"children":5486},{"class":4610,"line":4032},[5487],{"type":39,"tag":3407,"props":5488,"children":5489},{},[5490],{"type":44,"value":5348},{"type":39,"tag":3407,"props":5492,"children":5493},{"class":4610,"line":4792},[5494],{"type":39,"tag":3407,"props":5495,"children":5496},{},[5497],{"type":44,"value":5498},"    // Update the UI with the payload\n",{"type":39,"tag":3407,"props":5500,"children":5501},{"class":4610,"line":4801},[5502],{"type":39,"tag":3407,"props":5503,"children":5504},{},[5505],{"type":44,"value":4798},{"type":39,"tag":3407,"props":5507,"children":5508},{"class":4610,"line":5297},[5509],{"type":39,"tag":3407,"props":5510,"children":5511},{},[5512],{"type":44,"value":5303},{"type":39,"tag":52,"props":5514,"children":5516},{"id":5515},"the-complete-workflow",[5517],{"type":44,"value":5518},"The Complete Workflow",{"type":39,"tag":40,"props":5520,"children":5521},{},[5522],{"type":44,"value":5523},"Here's the full round trip when you click \"Run Pipeline\":",{"type":39,"tag":796,"props":5525,"children":5526},{},[5527,5537,5552,5603,5613,5629],{"type":39,"tag":68,"props":5528,"children":5529},{},[5530,5535],{"type":39,"tag":4221,"props":5531,"children":5532},{},[5533],{"type":44,"value":5534},"User Action",{"type":44,"value":5536},": Click \"Run Pipeline\" button in Vue component",{"type":39,"tag":68,"props":5538,"children":5539},{},[5540,5545,5546],{"type":39,"tag":4221,"props":5541,"children":5542},{},[5543],{"type":44,"value":5544},"Vue → Extension",{"type":44,"value":5031},{"type":39,"tag":4284,"props":5547,"children":5549},{"className":5548},[],[5550],{"type":44,"value":5551},"vscode.postMessage({ command: \"bruin.runPipeline\", payload })",{"type":39,"tag":68,"props":5553,"children":5554},{},[5555,5560,5562],{"type":39,"tag":4221,"props":5556,"children":5557},{},[5558],{"type":44,"value":5559},"Extension Processing",{"type":44,"value":5561},":\n",{"type":39,"tag":64,"props":5563,"children":5564},{},[5565,5570,5590],{"type":39,"tag":68,"props":5566,"children":5567},{},[5568],{"type":44,"value":5569},"Resolves current pipeline path",{"type":39,"tag":68,"props":5571,"children":5572},{},[5573,5575,5581,5582,5588],{"type":44,"value":5574},"Builds CLI command with flags (",{"type":39,"tag":4284,"props":5576,"children":5578},{"className":5577},[],[5579],{"type":44,"value":5580},"--start-date",{"type":44,"value":962},{"type":39,"tag":4284,"props":5583,"children":5585},{"className":5584},[],[5586],{"type":44,"value":5587},"--end-date",{"type":44,"value":5589},", etc.)",{"type":39,"tag":68,"props":5591,"children":5592},{},[5593,5595,5601],{"type":44,"value":5594},"Executes ",{"type":39,"tag":4284,"props":5596,"children":5598},{"className":5597},[],[5599],{"type":44,"value":5600},"bruin run",{"type":44,"value":5602}," in VS Code's integrated terminal",{"type":39,"tag":68,"props":5604,"children":5605},{},[5606,5611],{"type":39,"tag":4221,"props":5607,"children":5608},{},[5609],{"type":44,"value":5610},"CLI Execution",{"type":44,"value":5612},": Bruin CLI runs the pipeline, streams output to terminal",{"type":39,"tag":68,"props":5614,"children":5615},{},[5616,5621,5623],{"type":39,"tag":4221,"props":5617,"children":5618},{},[5619],{"type":44,"value":5620},"Extension → Vue",{"type":44,"value":5622},": Sends status updates via ",{"type":39,"tag":4284,"props":5624,"children":5626},{"className":5625},[],[5627],{"type":44,"value":5628},"webview.postMessage()",{"type":39,"tag":68,"props":5630,"children":5631},{},[5632,5637],{"type":39,"tag":4221,"props":5633,"children":5634},{},[5635],{"type":44,"value":5636},"Vue Updates",{"type":44,"value":5638},": Reactive UI changes",{"type":39,"tag":40,"props":5640,"children":5641},{},[5642],{"type":39,"tag":5643,"props":5644,"children":5647},"img",{"alt":5645,"src":5646},"Architecture Diagram","/img/blog/vscode-extension-architecture/diagram.png",[],{"type":39,"tag":52,"props":5649,"children":5651},{"id":5650},"lessons-from-the-trenches",[5652],{"type":44,"value":5653},"Lessons from the Trenches",{"type":39,"tag":110,"props":5655,"children":5657},{"id":5656},"development-workflow",[5658],{"type":44,"value":5659},"Development Workflow",{"type":39,"tag":40,"props":5661,"children":5662},{},[5663,5668],{"type":39,"tag":4221,"props":5664,"children":5665},{},[5666],{"type":44,"value":5667},"Challenge",{"type":44,"value":5669},": Hot reloading during development requires careful setup.",{"type":39,"tag":40,"props":5671,"children":5672},{},[5673,5678,5680,5686,5688,5694],{"type":39,"tag":4221,"props":5674,"children":5675},{},[5676],{"type":44,"value":5677},"Solution",{"type":44,"value":5679},": We use Vite's dev server for the Vue app, but webviews need special handling. The extension serves built assets via ",{"type":39,"tag":4284,"props":5681,"children":5683},{"className":5682},[],[5684],{"type":44,"value":5685},"webview.asWebviewUri()",{"type":44,"value":5687},", so we run ",{"type":39,"tag":4284,"props":5689,"children":5691},{"className":5690},[],[5692],{"type":44,"value":5693},"vite build --watch",{"type":44,"value":5695}," during development and manually refresh the webview panel. (more details in the next blog post)",{"type":39,"tag":4599,"props":5697,"children":5699},{"className":4601,"code":5698,"language":4603,"meta":7,"style":7},"# Development workflow\nnpm run dev:watch  # Runs TypeScript compiler + Vite watch mode concurrently\n",[5700],{"type":39,"tag":4284,"props":5701,"children":5702},{"__ignoreMap":7},[5703,5712],{"type":39,"tag":3407,"props":5704,"children":5705},{"class":4610,"line":4611},[5706],{"type":39,"tag":3407,"props":5707,"children":5709},{"style":5708},"--shiki-default:#6A737D",[5710],{"type":44,"value":5711},"# Development workflow\n",{"type":39,"tag":3407,"props":5713,"children":5714},{"class":4610,"line":1226},[5715,5720,5725,5730],{"type":39,"tag":3407,"props":5716,"children":5717},{"style":4615},[5718],{"type":44,"value":5719},"npm",{"type":39,"tag":3407,"props":5721,"children":5722},{"style":4627},[5723],{"type":44,"value":5724}," run",{"type":39,"tag":3407,"props":5726,"children":5727},{"style":4627},[5728],{"type":44,"value":5729}," dev:watch",{"type":39,"tag":3407,"props":5731,"children":5732},{"style":5708},[5733],{"type":44,"value":5734},"  # Runs TypeScript compiler + Vite watch mode concurrently\n",{"type":39,"tag":110,"props":5736,"children":5738},{"id":5737},"debugging-messages",[5739],{"type":44,"value":5740},"Debugging Messages",{"type":39,"tag":40,"props":5742,"children":5743},{},[5744,5748],{"type":39,"tag":4221,"props":5745,"children":5746},{},[5747],{"type":44,"value":5667},{"type":44,"value":5749},": Debugging webview messages requires understanding where logs appear in each context.",{"type":39,"tag":40,"props":5751,"children":5752},{},[5753,5757],{"type":39,"tag":4221,"props":5754,"children":5755},{},[5756],{"type":44,"value":5677},{"type":44,"value":5758},": VS Code provides different debugging tools for each part:",{"type":39,"tag":64,"props":5760,"children":5761},{},[5762,5779],{"type":39,"tag":68,"props":5763,"children":5764},{},[5765,5770,5772,5777],{"type":39,"tag":4221,"props":5766,"children":5767},{},[5768],{"type":44,"value":5769},"Vue/webview",{"type":44,"value":5771},": Right-click the webview panel → ",{"type":39,"tag":4221,"props":5773,"children":5774},{},[5775],{"type":44,"value":5776},"\"Open Webview Developer Tools\"",{"type":44,"value":5778}," to see Vue console logs, inspect components, and debug message passing",{"type":39,"tag":68,"props":5780,"children":5781},{},[5782,5787,5789,5794],{"type":39,"tag":4221,"props":5783,"children":5784},{},[5785],{"type":44,"value":5786},"Extension/Node.js",{"type":44,"value":5788},": When debugging, logs appear in the ",{"type":39,"tag":4221,"props":5790,"children":5791},{},[5792],{"type":44,"value":5793},"Debug Console",{"type":44,"value":999},{"type":39,"tag":110,"props":5796,"children":5798},{"id":5797},"performance-optimization",[5799],{"type":44,"value":5800},"Performance Optimization",{"type":39,"tag":40,"props":5802,"children":5803},{},[5804,5808],{"type":39,"tag":4221,"props":5805,"children":5806},{},[5807],{"type":44,"value":5667},{"type":44,"value":5809},": Large message payloads make the UI feel laggy, and sending messages when webviews aren't ready wastes resources.",{"type":39,"tag":40,"props":5811,"children":5812},{},[5813,5817],{"type":39,"tag":4221,"props":5814,"children":5815},{},[5816],{"type":44,"value":5677},{"type":44,"value":5818},": Be mindful about when and how often you send messages:",{"type":39,"tag":64,"props":5820,"children":5821},{},[5822,5840,5850],{"type":39,"tag":68,"props":5823,"children":5824},{},[5825,5830,5832,5838],{"type":39,"tag":4221,"props":5826,"children":5827},{},[5828],{"type":44,"value":5829},"Check webview visibility",{"type":44,"value":5831},": Only send messages when the webview panel is visible (",{"type":39,"tag":4284,"props":5833,"children":5835},{"className":5834},[],[5836],{"type":44,"value":5837},"webview.visible",{"type":44,"value":5839},"). Don't send until components are mounted and ready to receive data",{"type":39,"tag":68,"props":5841,"children":5842},{},[5843,5848],{"type":39,"tag":4221,"props":5844,"children":5845},{},[5846],{"type":44,"value":5847},"Use debouncing",{"type":44,"value":5849},": Debounce rapid file changes (180ms for graph updates, 500ms for asset detection) to prevent message flooding",{"type":39,"tag":68,"props":5851,"children":5852},{},[5853,5858],{"type":39,"tag":4221,"props":5854,"children":5855},{},[5856],{"type":44,"value":5857},"Keep payloads small",{"type":44,"value":5859},": Aim for \u003C10KB when possible. For large data like lineage graphs, use duplicate detection on the client side to skip processing identical messages",{"type":39,"tag":110,"props":5861,"children":5863},{"id":5862},"state-management",[5864],{"type":44,"value":5865},"State Management",{"type":39,"tag":40,"props":5867,"children":5868},{},[5869,5873],{"type":39,"tag":4221,"props":5870,"children":5871},{},[5872],{"type":44,"value":5667},{"type":44,"value":5874},": Webview state is lost when panels are hidden or recreated.",{"type":39,"tag":40,"props":5876,"children":5877},{},[5878,5882,5884,5890,5892,5898],{"type":39,"tag":4221,"props":5879,"children":5880},{},[5881],{"type":44,"value":5677},{"type":44,"value":5883},": We use Pinia stores for reactive state, and VS Code's ",{"type":39,"tag":4284,"props":5885,"children":5887},{"className":5886},[],[5888],{"type":44,"value":5889},"webview.getState()",{"type":44,"value":5891}," / ",{"type":39,"tag":4284,"props":5893,"children":5895},{"className":5894},[],[5896],{"type":44,"value":5897},"setState()",{"type":44,"value":5899}," for persistence:",{"type":39,"tag":52,"props":5901,"children":5903},{"id":5902},"the-developer-experience-payoff",[5904],{"type":44,"value":5905},"The Developer Experience Payoff",{"type":39,"tag":4599,"props":5907,"children":5910},{"className":5908,"code":5909,"language":44,"meta":7},[5176],"✗ Before: VS Code → Terminal → Browser → Terminal → Browser...\n✅ After:  Everything happens inside VS Code\n",[5911],{"type":39,"tag":4284,"props":5912,"children":5913},{"__ignoreMap":7},[5914],{"type":44,"value":5909},{"type":39,"tag":40,"props":5916,"children":5917},{},[5918],{"type":44,"value":5919},"Data engineers can now:",{"type":39,"tag":64,"props":5921,"children":5922},{},[5923,5933,5943,5953,5963,5973,5983,5993],{"type":39,"tag":68,"props":5924,"children":5925},{},[5926,5931],{"type":39,"tag":4221,"props":5927,"children":5928},{},[5929],{"type":44,"value":5930},"Open a Bruin asset file",{"type":44,"value":5932}," and instantly see asset details, lineage graph, connections, metadata and more.",{"type":39,"tag":68,"props":5934,"children":5935},{},[5936,5941],{"type":39,"tag":4221,"props":5937,"children":5938},{},[5939],{"type":44,"value":5940},"Click \"Validate\" or \"Run\"",{"type":44,"value":5942}," and get the same reliable CLI behavior with a richer, more discoverable interface.",{"type":39,"tag":68,"props":5944,"children":5945},{},[5946,5951],{"type":39,"tag":4221,"props":5947,"children":5948},{},[5949],{"type":44,"value":5950},"Edit tags/metadata",{"type":44,"value":5952}," and validate with one click.",{"type":39,"tag":68,"props":5954,"children":5955},{},[5956,5961],{"type":39,"tag":4221,"props":5957,"children":5958},{},[5959],{"type":44,"value":5960},"Preview query results",{"type":44,"value":5962}," without opening another tool.",{"type":39,"tag":68,"props":5964,"children":5965},{},[5966,5971],{"type":39,"tag":4221,"props":5967,"children":5968},{},[5969],{"type":44,"value":5970},"Visualize data lineage",{"type":44,"value":5972}," interactively with expandable nodes.",{"type":39,"tag":68,"props":5974,"children":5975},{},[5976,5981],{"type":39,"tag":4221,"props":5977,"children":5978},{},[5979],{"type":44,"value":5980},"Manage connections",{"type":44,"value":5982}," directly from the UI.",{"type":39,"tag":68,"props":5984,"children":5985},{},[5986,5991],{"type":39,"tag":4221,"props":5987,"children":5988},{},[5989],{"type":44,"value":5990},"Format SQL assets",{"type":44,"value":5992}," with SQLFluff integration.",{"type":39,"tag":68,"props":5994,"children":5995},{},[5996],{"type":39,"tag":4221,"props":5997,"children":5998},{},[5999],{"type":44,"value":6000},"A lot more features to discover...",{"type":39,"tag":52,"props":6002,"children":6004},{"id":6003},"try-the-bruin-extension",[6005],{"type":44,"value":6006},"Try the Bruin Extension",{"type":39,"tag":40,"props":6008,"children":6009},{},[6010,6017,6021],{"type":39,"tag":932,"props":6011,"children":6014},{"href":6012,"rel":6013},"https://marketplace.visualstudio.com/items?itemName=bruin.bruin",[936],[6015],{"type":44,"value":6016},"Install from VS Code Marketplace",{"type":39,"tag":6018,"props":6019,"children":6020},"br",{},[],{"type":39,"tag":932,"props":6022,"children":6025},{"href":6023,"rel":6024},"https://open-vsx.org/extension/bruin/bruin",[936],[6026],{"type":44,"value":6027},"or from the Open VSX Marketplace",{"type":39,"tag":52,"props":6029,"children":6031},{"id":6030},"contribute-to-the-project",[6032],{"type":44,"value":6033},"Contribute to the Project",{"type":39,"tag":40,"props":6035,"children":6036},{},[6037,6039,6042],{"type":44,"value":6038},"We are open to contributions! Please feel free to open an issue or a pull request.",{"type":39,"tag":6018,"props":6040,"children":6041},{},[],{"type":39,"tag":932,"props":6043,"children":6046},{"href":6044,"rel":6045},"https://github.com/bruin-data/bruin-vscode",[936],[6047],{"type":44,"value":6048},"GitHub Repository",{"type":39,"tag":5089,"props":6050,"children":6051},{},[6052],{"type":44,"value":5093},{"title":7,"searchDepth":1226,"depth":1226,"links":6054},[6055,6056,6057,6062,6063,6069,6070,6071],{"id":5143,"depth":1226,"text":5146},{"id":5164,"depth":1226,"text":5167},{"id":5207,"depth":1226,"text":5210,"children":6058},[6059,6060,6061],{"id":5218,"depth":1232,"text":5221},{"id":5306,"depth":1232,"text":5309},{"id":5433,"depth":1232,"text":5436},{"id":5515,"depth":1226,"text":5518},{"id":5650,"depth":1226,"text":5653,"children":6064},[6065,6066,6067,6068],{"id":5656,"depth":1232,"text":5659},{"id":5737,"depth":1232,"text":5740},{"id":5797,"depth":1232,"text":5800},{"id":5862,"depth":1232,"text":5865},{"id":5902,"depth":1226,"text":5905},{"id":6003,"depth":1226,"text":6006},{"id":6030,"depth":1226,"text":6033},"content:blog:bruin-vscode-extension-vue-webviews.md","blog/bruin-vscode-extension-vue-webviews.md","blog/bruin-vscode-extension-vue-webviews",1776449351631]