# April 2026

{% updates format="full" %}
{% update date="2026-04-29" %}

## Steadier APIs, sturdier collections

This release standardizes 400 error responses across the API, hardens collection creation, smooths out drift detection enablement, and fixes several UI and deployment bugs.

### ⚡ Improvements

#### Unified 400 error response structure

We standardized the API error response format for all 400 errors. Previously, some endpoints returned a single error object while others returned an array. Now every 400 response follows the same structure across the platform.

**What does it mean for you?**\
If you're integrating with the Bluebricks API, error handling is simpler and more consistent. Heads-up: this is a breaking change, so any client code that parses 400 responses may need to be updated.

***

#### Smarter drift detection enablement

Enabling a drift detection job now auto-creates the job if it doesn't already exist, removing the previous create-then-enable two-step.

**What does it mean for you?**\
One less round-trip when turning on drift detection. Flip the switch and you're done.

***

#### Hardened collection creation

Collection creation now properly filters out deleted collections and generates unique slugs server-side, preventing duplicate-slug conflicts when recreating collections that previously existed.

**What does it mean for you?**\
You can recreate collections without running into name conflicts from old, deleted ones.

***

#### Clearer Environment TTL and drift detection toggles

We added clear ON/OFF state labels to the Environment TTL toggle to match other toggles in the app, renamed the drift detection tab for consistency, and fixed a bug where the drift detection label was showing the wrong state.

**What does it mean for you?**\
Toggle states are now unambiguous at a glance. What you see is what you get.

***

### 🐛 Bug fixes

* **Fixed chunk-load failures after deploys**: Users with stale cached chunks would hit "Failed to fetch dynamically imported module" errors after a deploy. The app now auto-reloads once on chunk-load failure, and falls back to a Sentry alert if the reload doesn't resolve it.
* **Fixed collections tabs resetting with a single collection**: Switching between Overview, Props, and Secrets tabs in an organization with only one collection kept resetting the view back to the collection list.
* **Fixed extra border on error pages**: "Page not found" and "No access" placeholder pages were rendering with a duplicate inner border.
* **Fixed secrets being escaped during YAML hydration**: Secrets used as props for child packages in blueprint YAML were treated as string literals during hydration, breaking deployments that referenced them.
  {% endupdate %}

{% update date="2026-04-24" %}

## Simpler invites, stronger guardrails

This release streamlines user onboarding with a unified invite flow, adds publish-time validation to catch misconfigured blueprints, and fixes several UI and CLI issues.

### 🚀 New features

**Unified user invite flow**

We unified the user invite experience across organization and collection levels. You can now invite a user and assign collection access in a single step, instead of first inviting to the org and then separately assigning collections.

<figure><img src="/files/YOgcEwH7bJ0jSqwsZxW6" alt=""><figcaption></figcaption></figure>

***

### ⚡ Improvements

**Blueprint publish validation for unreferenced child packages**

Publishing a blueprint now validates that every child package in the `packages[]` array is referenced by at least one output in the `outs` section. If any child package has no output reference, the publish is blocked with a clear error listing the unreferenced packages.

***

**Center-aligned toast notifications**

Toast notifications now appear at the center-bottom of the screen instead of the bottom-right corner.

***

**Updated terminology in collection users list**

The collection users list now shows "Members" as the section heading instead of the previous "Teammates" label, aligning with terminology used across the rest of the app.

***

### 🐛 Bug fixes

* **Fixed missing error message for unauthorized collection access**: Users without permissions to a collection saw a broken page with raw API errors instead of a clear access-denied message.
* **Fixed Bicep CLI fallback on compile errors**: When `bicep build` failed due to a compile error in user code, the CLI incorrectly fell back to regex parsing instead of surfacing the actual error. It now distinguishes between a missing binary and a source code error.
* **Fixed logs tray hiding account management**: The logs tray overlay was covering the account management section, making it inaccessible while logs were open.
* **Fixed agent interrupt message after repeated page reloads**: A spurious user interrupt message appeared in agent threads after reloading the page three times consecutively during an active conversation.
* **Fixed artifact re-publish with outputs failing validation**: Re-publishing a source-based artifact that now includes outputs failed validation because the parent blueprint still held a stale children array from the original publish.
* **Fixed missing discovery badge for new cloud accounts**: The discovery badge was not displaying for newly created cloud accounts that support both execution and discovery roles.
  {% endupdate %}

{% update date="2026-04-16" %}

## Polished UI, better visibility

This release focuses on performance and UI improvements, including a new side menu navigation and discovery support for self-hosted collections on the graph.

### ⚡ Improvements

**New side menu navigation**

We transitioned the app from a top header to a left-side navigation menu. Collections, packages, environments, graph, agent, and account settings pages are all accessible from a persistent sidebar. The sidebar can be collapsed with `cmd+.`, and on smaller screens it works as a slide-out drawer.

**What does it mean for you?**\
Navigation is faster and more intuitive. Everything you need is one click away in the sidebar, and the main content area gets more screen real estate.

***

**Self-hosted discovery on the graph**

Self-hosted collections on the graph now display orchestration (O) and discovery (D) badges, just like AWS and Azure collections. The Discover side panel is also available for self-hosted collections where discovery is enabled.

**What does it mean for you?**\
If you manage self-hosted infrastructure, you now get the same discovery visibility on the graph that cloud-native collections have always had. You can see at a glance which collections have orchestration, discovery, or both, and explore discovered resources directly from the graph.

***

**Multi-cloud discovery for self-hosted accounts**

Self-hosted cloud accounts can now leverage discovery from AWS, GCP, or Azure. When configuring discovery via the API (`/api/v1/cloud/{id}`), you specify which cloud provider to use in the `discovery` object, giving you the flexibility to discover resources across any supported cloud regardless of where your workloads run.

**What does it mean for you?**\
If you run self-hosted infrastructure, you can now set up discovery against any combination of AWS, GCP, and Azure directly from your self-hosted account. No need for separate cloud accounts just to get visibility into your cloud resources.

***

{% endupdate %}

{% update date="2026-04-09" %}

## Clearer errors, smoother integrations

This release improves the clarity of API error messages across the platform and fixes Slack integration issues in new workspaces, alongside several UI bug fixes.

### **⚡ Improvements**

**Agent-friendly API error messages**

We overhauled approximately 250 API error types to return structured, descriptive context and actionable mitigation steps. Every error now tells you (or your agent) what went wrong, why, and what to do next.

**What does it mean for you?**\
Agents can parse failures and self-correct autonomously. For you, generic error codes are replaced with plain-language explanations and suggested fixes.

***

**Slack bot identification by app ID**

The Slack integration now identifies the Bluebricks bot by app ID and link domain instead of per-workspace user IDs, fixing plan link unfurls in newly connected workspaces.

**What does it mean for you?**\
If you recently connected Bluebricks to a new Slack workspace, plan links now unfurl correctly without any extra configuration.

***

### **🐛 Bug fixes**

**Fixed blueprint path not shown in slim config view**

Source-based blueprints with a subdirectory path now correctly display the path in the code viewer's slim configuration.

***

**Fixed collections shown as "Not Connected" in $outs picker**

We fixed the `$outs` reference picker during redeployment incorrectly showing collections as "Not Connected" when they were actually connected.

***

{% endupdate %}

{% update date="2026-04-01" %}

## Tidier layouts, safer lifecycle actions

This release cleans up key UI surfaces with sticky headers, relocated panels, and consistent avatars, while improving collection management and fixing several edge cases in blueprints and deployments.

### **⚡ Improvements**

**Sticky headers for deployment list sections**

When scrolling long referencing-deployment lists, the "Current environment" and "Other environments" section headers now stick to the top of the viewport.

**What does it mean for you?**\
You always know which section you're looking at when scrolling through long environment lists, no more losing your place.

***

**Run history moved to right panel**

We relocated the run history dropdown from the header into the right panel, grouping it alongside blueprint metadata and freeing up header space.

**What does it mean for you?**\
Run history is now easier to find and visually grouped with related context, giving you a cleaner header and a more logical layout.

***

**Consistent user avatars on the plan page**

User representation on the plan page now always uses avatars instead of a mix of avatars and initials.

**What does it mean for you?**\
A more polished, consistent look when reviewing who's involved in a plan.

***

**GitHub and GitLab URLs replaced with icons**

Long repository URLs in environment and package views are now replaced with compact GitHub and GitLab icons, making repo names and paths easier to scan.

**What does it mean for you?**\
Less visual clutter when browsing environments and packages. You see the repo name at a glance instead of a wall of URL prefixes.

***

**Deleting collections with archived environments**

Collections that contain archived live environments can now be deleted. Previously, archived environments blocked deletion even though they were no longer active. Their footprint is also fully cleaned up.

**What does it mean for you?**\
You can now clean up unused collections without first having to deal with old archived environments that were getting in the way.

***

### **🐛 Bug fixes**

**Fixed required properties missing in slim blueprint view**

Required properties were not displayed when viewing a blueprint in slim/compact mode. They now show correctly.

***

**Fixed package URL missing subdirectory on publish**

When publishing a package via the "Create new environment" flow with a subdirectory set, the resulting package git link was missing the subdirectory path. It now includes the full path correctly.

***

**Fixed "Deployment undefined" error on stale approval**

Approving a deployment from a stale browser tab (where the deployment had already been approved elsewhere) showed a confusing "Deployment undefined" error. It now returns a clear, informative message.

***

**Fixed invalid output values crash on the plan page**

Complex output values (objects, arrays, sensitive markers) on the plan page's artifacts table could cause rendering issues. These are now safely handled.

***

**Fixed `bricks bp publish` failure on empty repo**

Publishing a blueprint from a git repository with zero commits failed with a "reference not found" error. This is now handled gracefully.
{% endupdate %}
{% endupdates %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bluebricks.co/docs/changelog/april-2026.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
