> ## Documentation Index
> Fetch the complete documentation index at: https://zenbulabs.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> New features, updates, and fixes for Zenbu.js.

<Update label="July 24, 2026">
  ## Week of July 21 — quiet week

  No shipped product changes to report this week. Nothing landed on `main` for `zenbu.js` between July 17 and July 24.

  Catch up on the [bidirectional events and blob endpoint improvements](#week-of-june-30--bidirectional-events-and-blob-endpoint-improvements) from earlier this month, or browse the [core docs](/core/events) for the latest event API.
</Update>

<Update label="July 17, 2026">
  ## Week of July 14 — quiet week

  No shipped product changes to report this week. Nothing landed on `main` for `zenbu.js` between July 10 and July 17.

  Catch up on the [bidirectional events and blob endpoint improvements](#week-of-june-30--bidirectional-events-and-blob-endpoint-improvements) from earlier this month, or browse the [core docs](/core/events) for the latest event API.
</Update>

<Update label="July 10, 2026">
  ## Week of July 7 — quiet week

  No shipped product changes to report this week. Work continued on open pull requests, but nothing landed on `main` for `zenbu.js` between July 3 and July 10.

  Catch up on last week's bidirectional events and blob endpoint improvements in the [previous entry](#week-of-june-30--bidirectional-events-and-blob-endpoint-improvements), or browse the [core docs](/core/events) for the latest event API.
</Update>

<Update label="July 3, 2026">
  ## Week of June 30 — bidirectional events and blob endpoint improvements

  Events are no longer one-way: server-side code can now subscribe to events, and the renderer can emit events back to the main process. The blob HTTP endpoint also got a round of optimizations.

  ### New

  * **Server-side event subscriptions.** Services can now subscribe to events using `this.ctx.rpc.events.<name>.subscribe(cb)` in addition to emitting them. Useful when one service needs to react to events fired by another service — or by the renderer. See [Events](/core/events).
  * **Renderer can emit events to the main process.** `useEvents()` returns callable event nodes, so the renderer can fire events that reach both local (renderer-side) subscribers and the main process. Events emitted from a renderer are intentionally **not** re-broadcast to other clients. See [Events](/core/events).
  * **Backward-compatible unified event proxy.** Every event node is now both callable (emit) and subscribable, and the new type is assignable to the existing event proxy — existing `emit`/`subscribe` code keeps working without changes.

  ### Updates

  * **Faster blob endpoint.** Blob responses now stream from disk instead of buffering, so large blobs are served with lower memory use and faster time-to-first-byte.
  * **`Content-Type` on blob responses.** The blob endpoint now sets `Content-Type` from the stored blob type (falling back to the `?type=` query param, then `application/octet-stream`), so images, video, and other typed blobs render correctly when loaded directly by the browser.
  * **CORS on the blob endpoint.** Cross-origin requests to the blob endpoint are now allowed, so blobs can be fetched from plugin views and external tools that run on a different origin.
</Update>

<Update label="June 19, 2026">
  ## Week of June 16 — `@zenbujs/core` API cleanup

  A small but breaking week for the `@zenbujs/core` package: zod is no longer re-exported, and `makeCollection()` now returns a real collection ID by default.

  ### Updates

  * **`makeCollection()` auto-generates a collection ID.** Calling [`makeCollection()`](/core/state) without arguments now returns a stable, unique `collectionId` instead of an empty string. You no longer need to pass one in just to get a usable collection — useful when defining collections inline inside schema defaults.

  ### Fixes

  * **`zod` is no longer re-exported from `@zenbujs/core`.** Zod is a peer dependency, so it should be imported directly from `zod` rather than from `@zenbujs/core/db`. If you were relying on the re-export, switch to `import { z } from "zod"`. See [State](/core/state) for the updated pattern.
</Update>

<Update label="June 5, 2026">
  ## Week of June 2 — desktop app v0.0.10 and `@zenbujs/core` 0.4.3

  The Zenbu desktop app shipped five releases this week (v0.0.6 → v0.0.10, signed and notarized for macOS), along with `@zenbujs/core` 0.3.0 → 0.4.3, `create-zenbu-app` 0.0.36, and `create-desktop-app` 0.1.4.

  ### New

  * **Enable and disable plugins at runtime.** You can now turn plugins on and off without restarting the app. Injections hot-reload when a plugin's state changes, so views and patched behavior update in place. See [Plugins](/core/plugins) and [Injections](/core/injections).
  * **`relaunch()` bridge on the installing screen.** Plugin installation can trigger a clean app relaunch from the install flow, so first-run setup completes without a manual restart.
  * **`makeCollection` is now exported.** The collection helper is part of the public API surface for building typed groups of records on top of [state](/core/state).

  ### Updates

  * **Self-healing plugin clones.** If a plugin install is interrupted (network drop, force-quit, partial download), the next launch detects the broken state and finishes or re-clones the plugin automatically — no more stuck "installing" screens.
  * **Plugin service internals reworked.** The data structure backing [services](/core/services) was simplified, paving the way for the enable/disable feature and reducing the work done on plugin load.

  ### Fixes

  * **Proxy memory leak resolved.** Long-running sessions no longer accumulate memory through the RPC proxy layer used by [RPC](/core/rpc) and [advice](/core/advice).
  * **Garbage collection issues fixed.** Several plugin lifecycle objects were being retained after teardown; they are now released correctly, lowering steady-state memory use.
</Update>
