ChaiBuilder Logo

chaipro v0.3.3

Released 2026-08-14. Upgrading from v0.3.2.

The largest release since the plugin architecture landed in v0.2.0, and ten days of work rather than the usual two. Three things carry it: repeater data becomes a real, declarative data source with filters and sorting, block variants and design tokens reach custom blocks, and a long run of SEO and JSON-LD regressions is repaired.

Read the breaking group before upgrading. Two feature flags are gone, one pipe is gone, and one theme property is gone.

Breaking

  • The bulkPublish and exportCode feature flags are removed. Both features are now client plugins, matching how every other optional surface is registered since v0.2.0. Delete the flags from your server config and register the bulk publish client plugin and the export code client plugin instead. An unchanged config leaves both features missing from the builder rather than failing loudly, so check the publish dropdown and the block action menu after upgrading.
  • The money pipe is removed. Use currency, which covers formatted amounts and takes a currency code. Any binding still calling money renders empty. See Pipes.
  • The logos property and its theme type are removed from the editor props. Logos were never read by the render path. Move them into your own site settings.

Added

  • Repeater data sources. A new repeaterData server config key replaces collections with a declarative definition: a source, the filters an editor may apply, the sort options, and a limit. The builder renders real filter and sort controls against that definition instead of the free text it used to accept, and filter values can themselves be data bindings, so a repeater can filter by something on the current page. The old collections key still works and is deprecated, including its two spellings of the collection type. See Data Providers.
  • A Collection Item block, for binding a single record rather than a list. The repeater covers many, this covers one.
  • Block variants. A registered block can declare component variants and style variants, so one block type offers several presets instead of shipping several near identical blocks. See Custom Blocks.
  • Design tokens in custom blocks. A custom block can read the site's design tokens at render time rather than hardcoding classes, and a theme preset can override individual design tokens. See Design Tokens.
  • Three new pipes: or falls back on any falsy value, where default only covers null, undefined and empty; notEmpty is the boolean inverse of empty, for conditional visibility; and telephone formats ten digit North American numbers and leaves anything else untouched.
  • A folder page type. A folder claims a URL segment for grouping without being a page itself. It requires a slug, it can never be the home page, and conversion runs one way: a folder can become a page, a page cannot become a folder.
  • Per image optimization quality. An optimization quality control on the Image block, on Box and EmptyBox backgrounds, and on the Video, Carousel and Gallery blocks, with an Auto default. Useful where the global setting is too aggressive for one hero image.
  • Streaming asset uploads. The editor streams uploads instead of base64 encoding them, reports real progress while they run, and shows where an asset is used. One upload client now serves every surface that uploads. Images can also be optimized on upload from a URL.
  • Search across the builder. Global search in the page manager, global block search in the add block panel, and finding where an image is used by its asset URL.
  • Render time cache tags for partials and data providers, with $cacheTags extended to page type data providers, so a page invalidates when the data behind it changes rather than on a timer. See Caching and Revalidation.
  • A site settings transform hook on the server config, giving an app the last say over the site settings row before it is cached and handed to renderers.
  • Keyboard commands in the outline. Copy, paste and delete work on a block selected in the outline, Escape deselects, and the keyboard help panel shows the right modifier keys on macOS under Chromium.
  • Asset listings can be ordered by name, type, size or creation date.
  • analyzeChaiBindings, suggestChaiBindingConversion and applyRepeaterQuery are exported for tooling that needs to inspect or migrate bindings.
  • The dynamic page type now shows in the builder address bar, so you can tell which page type a dynamic route resolved to.

Changed

  • The SEO panel autosaves no longer. It has an explicit save button, because autosave was overwriting concurrent AI edits and refetching over work in progress.
  • The data binding popup is unified into one editor across every field that accepts a binding, with a searchable path picker, a pipe pipeline editor and JSON editing in a rich text field. Binding options are no longer split across three different interfaces.
  • Undo now treats a block store action as one step, including property updates, rather than producing an undo entry per keystroke or per internal write.
  • The builder gets a new left panel layout, and the outline gains a persistent insertion placeholder that opens the add block modal where you point it.
  • The block library tab is renamed from Chai Library to Blocks Library.
  • Repeater filter bindings resolve on the client inside the builder, so editing a filter no longer waits on a server round trip.

Security

  • JSON-LD output escapes a closing script tag. Content containing </script> could break out of the JSON-LD block and inject markup into the page. All rendered JSON-LD is escaped now.
  • The pipe formatters were audited for injection safety, and the expression evaluation path they replaced is deleted rather than left dormant. Pipes accept only quoted strings, finite numbers, booleans and null, and their output is still escaped.

Fixed

The SEO and metadata cluster, all of which affected published pages:

  • Per page JSON-LD stopped rendering site wide after the metadata rework. It renders again, including page level structured data resolved from globals.
  • Per page metadata regressed by the same rework is restored.
  • Language variants point their canonical and their self referencing hreflang at their own URL rather than at the default language, and alternate language pages are labelled with the site fallback instead of the default state.
  • The fallback Open Graph image and the absolute canonical URL are both hardened against missing values.

Elsewhere:

  • The Image block no longer crashes the site when its source is empty. An unset image took the page down rather than rendering nothing.
  • Fonts no longer flash on every soft navigation. The font face style is hoistable now, so it survives a client side route change.
  • A page wins over a partial with the same slug during routing, instead of the partial shadowing it.
  • Page reference links resolve their slug in the current language.
  • Autosave no longer loops between browser tabs through the broadcast channel.
  • An unregistered pipe is skipped rather than blanking the whole binding, so one unknown pipe cannot empty a field.
  • Repeater data is available to conditional visibility, which it was not before.
  • Page manager pagination is capped at 999 pages rather than rendering an unusable count.
  • AI theme generation no longer fails when a generated class conflicts with a protected one, and the Design with AI modal respects the model you selected.
  • Light mode contrast and dark mode chrome in the builder, including invisible search text and the rich text editor in settings.
  • A long run of drag and drop repairs in the outline: drops into an empty root, full width drop markers, cleared highlights after a drop, preserved drag previews, and the outline staying visible after the first drop.
  • Partial rows in the outline show the partial's own name rather than a generic label.

Removed

  • The money pipe, the bulkPublish and exportCode feature flags, and the theme logos property. See Breaking above.
  • The page type filter in the page manager, replaced by global search.

Upgrade notes

  1. Register two plugins. Add the bulk publish and export code client plugins, then delete features.bulkPublish and features.exportCode from your server config.
  2. Search your content for the money pipe and replace it with currency. A binding calling a removed pipe renders empty, and nothing warns you in production.
  3. Move any logos value off the editor props and into your own site settings.
  4. collections still works. Migrating to repeaterData is worth doing for the filter and sort controls, but it is not required by this release.
  5. Check your SEO output after deploying. This release restores per page JSON-LD and per page metadata that had been dropped, so structured data you thought was gone will reappear, and canonical URLs on language variants change to point at themselves.

© ChaiBuilder. All rights reserved.