OpenVibe.Shared releases

Release 4.228.0

12 Nov 2026 · pinned package [email protected]

4.228.0

  • A page's sections as tabs on a phone (the owner, 11-11: "consolidate these into tabs, self-contained tabs, so the page isn't so freaking huge … at least on mobile"). showcase.parts({ name, items: [{ id, label, count, html }], front }) shows one part at a time with a tab bar (its name and count) at 900 px and under, 600 for a front page; every part stays in the HTML (crawlers, AI readers); radios and :has(), no script; the arrow keys move between parts; wide screens and browsers without :has() stack them. ov-parts.css is the same look alone, for a page that does not load showcase.css (Live's home).
  • showcase.pick(): the pick block, once. Twenty-five sites kept a copy of a "pick block" (server/render/short.js) whose chips only jumped to a pane, so a phone still showed them all. pick({ key, label, head, panes, checked }) is that block on parts(): a heading, then tabs on a phone, every pane in the HTML with its id, ov-parts.css linked by its hash. parts() takes checked too, and a link to something inside a part opens it (CSS :target, no script).
  • Caption it with AI. A picture in any composer has ✨: one tap sends it, made small (JPEG, 768 px), to the Frame's /api/frame/caption on the person's own allowance; the caption fills an empty box (theirs to change) and ovc:caption carries the alt text. ctx.alt(file) and ctx.caption(file) for a page; data-ovc-caption="off" leaves it out.
  • OpenVibeNavbar.token() reads the person's Network token the site gave init(). Caption it sends it as the Bearer on any site (the Network's session cookie is not sent cross-site), and the composer's settings sync, which asked for it all along, now finds it.
  • A picture alone is a post. The menu's Feed composer no longer asks for a description of every picture: one left empty is written by AI as it posts, and a post goes without one if that cannot be done.

PagesThe menuThemesThe kit

All releases