Week of July 21 — quiet week
No shipped product changes to report this week. Nothing landed onmain for zenbu.js between July 17 and July 24.Catch up on the bidirectional events and blob endpoint improvements from earlier this month, or browse the core docs for the latest event API.Week of July 14 — quiet week
No shipped product changes to report this week. Nothing landed onmain for zenbu.js between July 10 and July 17.Catch up on the bidirectional events and blob endpoint improvements from earlier this month, or browse the core docs for the latest event API.Week of July 7 — quiet week
No shipped product changes to report this week. Work continued on open pull requests, but nothing landed onmain 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, or browse the core docs for the latest event API.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. - 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. - 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/subscribecode 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-Typeon blob responses. The blob endpoint now setsContent-Typefrom the stored blob type (falling back to the?type=query param, thenapplication/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.
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. CallingmakeCollection()without arguments now returns a stable, uniquecollectionIdinstead 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
zodis no longer re-exported from@zenbujs/core. Zod is a peer dependency, so it should be imported directly fromzodrather than from@zenbujs/core/db. If you were relying on the re-export, switch toimport { z } from "zod". See State for the updated pattern.
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 and 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.makeCollectionis now exported. The collection helper is part of the public API surface for building typed groups of records on top of 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 was simplified, paving the way for the enable/disable feature and reducing the work done on plugin load.

