lbreeze
Software

Zephyr

node.js hosting billing automation platform - replaces WHMCS, Hostbill etc

latest v1.316.3

Read the docs

Every release, newest first.

Zephyr 1.312.0

9/20/2026

Added

  • The catalogue is reachable from the agent endpoint. write_product creates or updates a product with its group, visibility and cycles; write_product_group creates or renames a group, including its slug, which is what moves a range of products off a bad shop URL; list_product_groups reads them back.

Prices stay explicit: a cycle carries an integer minor-unit amount and an ISO 4217 currency, so nothing here can quietly turn 1299 into £1299.

Why

An agent could write a product’s entire marketing page and could not create the product it described. A page went live for something nobody could buy, and a group slug carrying the date it was generated on stayed in every shop URL beneath it.

The safety boundary was never the missing tool. A key driving this endpoint acts as its owner and can never exceed them, and every tool declares a permission checked per call. Refusing to expose the catalogue at all protected nobody.

Zephyr 1.311.0

9/20/2026

Added

  • write_post — blog, changelog and news posts, upserted by slug.
  • write_kb_article — knowledge-base articles, filed under a category that is created if it does not exist.

Why

The page tools could build a marketing site and could not write a word of its blog or a line of its documentation — the two things a new install most needs and an operator least wants to hand-write.

Both surfaces already had full CRUD behind the admin. Neither was reachable from the tool registry, so an agent asked to "document this product" could only put documentation on a marketing page, where nothing searches it and the knowledge-base index cannot list it.

Zephyr 1.310.0

9/20/2026

Added

  • write_menu — replaces the navigation at a location. header is the one the marketing nav reads.
  • list_pages — every page with its slug, title and state.
  • retire_page — unpublish (reversible) or delete.

Why

The gap showed the first time the page tools were used in anger: six pages were written, published and correct, and not one was reachable. The marketing header reads its menu from the CMS and falls back to a shipped default when no menu row exists, so a site with no configured menu silently ignores everything written after it. showInNav on a page does not feed that header and never did, so the one field an agent could set looked like the answer and was not.

The same blind spot covered the other half of editing a site: no way to see what already existed, and no way to retire it. An agent could only ever add — which is how a new page ends up live beside the stale page it was meant to replace.

Zephyr 1.309.3

9/20/2026

Fixed

  • write_page refused a leading slash, which is the only form the CMS stores. Pages are served from a lookup key built as / plus the path segments, so every page the site can serve is keyed /home, /products/kstack and so on — and write_page could only ever address home.

The existence check therefore missed, the write fell through to the create branch, and the caller got a cheerful created: true for a second page at a slug the public router cannot build. Two silent failures, both of which looked like success:

  • editing a seeded page forked an orphan and left the live page untouched;
  • a page written from scratch 404’d for ever.

Slugs are now canonicalised to the leading-slash form, and a page stranded by the old behaviour is adopted and repaired rather than duplicated again. get_page accepts either form too.