The big change I am excited about in this cycle is the cloud CLI access in agents: you can now give access to your cloud agents into your Bruin Cloud pipelines and let them debug. Tag your @Bruin agent under a pipeline notification and let it get to work! 🤖
Bruin CLI
New Features
- Cursor as an AI enhancement provider:
bruin ai enhancenow supports Cursor'scursor-agentCLI via a new--cursorflag, alongside the existing providers. - Snowflake query tag annotations: Queries executed against Snowflake now carry a
QUERY_TAGcontaining asset metadata (asset name, type, pipeline, user-defined tags, and meta fields), matching the annotation pattern already used for BigQuery. This makes it much easier to trace Bruin-run queries in Snowflake's query history. - Interactive ecommerce pipeline template: Run
bruin init ecommerceto launch a stack picker that lets you choose your warehouse (ClickHouse, BigQuery, or Snowflake), payments processor (Shopify Payments or Stripe), email marketing tool (Klaviyo or HubSpot), ad platforms (Facebook, Google, TikTok), and analytics source (GA4 or Mixpanel). It generates a complete pipeline with raw ingestr assets plus warehouse-specific staging SQL and report SQL for daily revenue, customer cohorts, product performance, marketing ROI, and daily KPIs. Connections merge into any existing.bruin.ymlrather than overwriting it.
Improvements
truncate+insertaccepted as an incremental strategy: The linter now recognizestruncate+insertas a validmaterialization.incremental_strategyfor ingestr assets, so pipelines using it no longer produce spurious lint errors.bruin cloud runs diagnoseauto-infers project: The--project-idflag is no longer required when your account has only one Bruin Cloud project; the command resolves it automatically.
Bug Fixes
- Mixpanel purchase counts in the ecommerce template's
stg_web_sessionsnow compute correctly; previously they always resolved to 0 and silently corrupted conversion rates and ROAS. - Warehouse-specific date casting in the ecommerce template now works on ClickHouse (
toDate()) and Snowflake (::DATE), so Facebook, Google, and TikTok spend rolls up correctly on every supported warehouse. - Snowflake
private_keyvalues are now serialized to.bruin.ymlusing YAML literal block style, preserving newlines in PEM-formatted keys. Single-line keys are normalized to proper PEM format. - The CLI no longer prints noisy "falling back to IMDSv1" warnings on local machines; the Snowflake driver's cloud metadata probing is disabled.
Bruin Cloud
Dashboards
- Dashboard sharing and per-user permissions: Dashboards can now be set to Private or Team visibility, with per-user access roles (viewer or editor) managed through a new Share modal. Viewers see only the published state, editors can modify content, and only creators and admins can change distribution settings. Private dashboards show a lock icon.
- Draft / publish workflow: Editors can now iterate freely on dashboards without affecting what viewers see. The agent always writes to a draft state, and a Publish or Discard control in the header commits or rolls back changes. Draft dashboards show amber borders and a warning protects unsaved work.
- File uploads and attachments in chat: Dashboard chat now accepts up to 5 files (100MB each) via a paperclip button. Output attachments on bot replies are rendered as downloadable links, and input attachment chips show on user messages.
- Chat history tabs: Your past dashboard threads appear as tabs above the chat composer. Clicking swaps the active conversation without a page reload, and a "+" button starts a new thread.
- Chart and widget enhancements: Charts now support color-split multi-series, stacked and normalized bars, and horizontal bars. Widgets gained a code inspector button, clicking a widget sets it as chat context, tables received pagination, column sorting, thousand-separator formatting, and sticky headers. Chart widgets can be exported as PNG, SVG, or CSV.
- Inline query error surfacing: Widget query failures now appear as a clickable inline popup with a help section instead of being silently swallowed. Dashboards without parameters can now refresh widgets.
- Rendered SQL in code sections: Dashboard code sections show the Jinja-resolved rendered SQL, formatting is applied only to SQL asset types, PostgreSQL syntax is used consistently, and blank lines between clauses are preserved.
- Parameterized
options_query:options_querySQL with Jinja placeholders like{{ start_date }}now receives dashboard parameters correctly, including on initial load and during polling. - Chat auto-scroll fix: The chat now only auto-scrolls when you are already at the bottom of the message list.
Agents
- Agent permissions: Agents gained per-user access control with Team or Private visibility. Operators and Catalog Users can now chat with agents. The "AI User" role was renamed to "AI Admin".
- Cloud CLI access per agent: A toggle in the agent create and edit modal provisions a scoped API token and adds a bruin connection to the agent's dev environment, giving each agent its own Cloud CLI credentials.
- Query results viewer: Query cards in agent logs now have a "View Results" button that opens a full-width modal with the formatted result table.
- Hidden internal log entries:
save_memorytool calls andMEMORY.mdwrites are hidden from the agent logs UI..bruin.ymlcontents are redacted and command strings with API keys are stripped from sandbox logs. - Sandbox reliability: We have now introduced an alternative sandbox provider to improve our reliability.
- Image and file support in chat: Agent and dashboard chat inputs accept pasted images, drag-and-drop files, and PPTX uploads. Image previews render immediately via local object URLs instead of waiting on the server.
- Agent picker for scheduled runs: Creating a scheduled agent now opens a picker modal to select the underlying agent. The agent name appears on scheduled run cards and detail pages.
Scheduled Agents
- Renamed from Scheduled Runs to Scheduled Agents: The UI navigation and page titles now read "Scheduled Agents" to match the agent-centric model.
- Manual trigger: A new UI control lets you manually trigger a scheduled run on demand.
Messaging Integrations
- Telegram bot integration: Agents can now receive and respond to Telegram messages, with Markdown rendering and file attachment support.
- Google Chat for scheduled runs: Scheduled runs can now send notifications via Google Chat. Space and user display names are captured.
- WhatsApp improvements: Scheduled agents can send messages via WhatsApp, contact names are now extracted from webhooks for friendlier display, and chart uploads are supported.
- Slack thread context: When you mention the bot in an existing thread, prior thread messages are fetched and included in the AI prompt, so the bot can reply with full context.
Pipelines and Runs
- Pipeline run export with asset-level details: Pipeline run exports now offer an option to include per-asset details in the CSV, producing more granular reports.
- Run list accuracy: The runs list now shows an accurate count of failed asset instances, task status no longer flickers back to "todo" during polling, and retried task states map cleanly to "queued" during rerun.
- Paused pipelines hide last run status: Paused pipelines no longer display a stale last-run status.
Navigation and UX
- Navigation reorganization: The nav collapses Assets, Lineage, and Glossary into dropdowns. "Dashboard" was renamed to "Overview" and "Catalogue" to "Catalog". The Cmd+K command palette now lists all nav pages and supports multi-word search.
- Asset list sorting: Project and pipeline columns in the asset list, and Name, Provider, and Region columns in company regions, now support sorting.
- Minimal onboarding header: Onboarding routes show a minimal header with a Log Out button instead of the full navbar.
ingestr
New Sources
- Reddit Ads, G2, and JobTread: Added three new sources. Reddit Ads (via the Reddit Ads API v3) supports entity tables (accounts, campaigns, ad groups, ads, posts, audiences, pixels, funding instruments) plus custom analytics reports with configurable levels, breakdowns, and metrics, and handles rate limits and microcurrency conversion automatically. G2 (peer-to-peer software review platform) supports products, reviews, competitors, buyer intent, discussions, downloads, integration reviews, questions, screenshots, videos, and more via the G2 API v2. JobTread (construction management platform) authenticates via grant key and organization ID.
New Features and Improvements
- LinkedIn Ads: demographic pivots, audiences, and insight tags: New tables
dmp_segments(matched and retargeting audience segments),insight_tags, andinsight_tag_domains, plus five new custom-report dimensions (member_job_title,member_seniority,member_industry,member_company_size,member_company) that can be combined withdateormonthto audit targeting quality. - Google Ads: OAuth2 authentication: The Google Ads source now supports OAuth2 credentials (
client_id,client_secret,refresh_token) in addition to the existing service-account method. Both paths still require a developer token. - HubSpot: property filtering on
property_history:*tables: You can now append a comma-separated allow-list of property names to HubSpot property history tables to restrict which properties are fetched, reducing payload size and API quota usage. Useproperty_history:<object>:<prop1>,<prop2>,...for built-in objects andproperty_history:custom:<object>:<prop1>,<prop2>,...for custom objects. - HubSpot: built-in
hs_properties included in CRM object tables: CRM object tables now include HubSpot's built-inhs_-prefixed properties alongside custom properties, so object tables contain the full set of columns HubSpot exposes. This is backwards compatible (new columns only). - HubSpot: documentation for property history tables:
property_history:<table>tables for all HubSpot CRM objects (contacts, companies, deals, tickets, products, quotes, calls, emails, line items, meetings, notes, tasks, carts, invoices, payments, taxes, and more) are now fully documented, including primary keys and incremental keys.
Bug Fixes
- HubSpot incremental loads no longer drop rows; an ascending row-order setting on incremental cursors was causing rows to be lost during ingestion.
- HubSpot ingestion now uses the search API for broader queries, avoiding query-parameter limits users hit when tenants had many properties.
- The CSV destination now handles rows with varying columns instead of crashing with a
ValueErrorwhen later rows contained fields not present in the first row. Rows are streamed to disk instead of buffered fully in memory, bounding memory usage on large exports.