OpenVibe.Shared

Every shared release, and where it shows

Every release of the shared package, newest first, in its changelog's words, with the screens it changed.

releases
375
with screenshots
6
pinned
4.235.0

4.235.0

The layers: what floats folds into a small handle and grows to the window, and what opens from a button is anchored to it (the owner's phone, watching a live stream, 11-13: "a small button that lets you pop it in and out", "doesn't allow it to be off screen", "I can't even resize it bigger", "the little three dots doesn't actually open a menu").

  • ov-float.js, tucked.
    • Thrown past a side (or T, or a tuck button), a box folds into a small handle at that edge: 30 × 64 px, 34 × 72 to a finger, set with --ov-float-tab-w/-h. It used to leave a strip as tall as itself hanging off the screen.
    • The fold is a clip animated with the Web Animations API, so nothing inside is squeezed, while the landing's spring moves it to the side.
    • The handle is a button that moves: a tap opens it, a drag up or down slides it along its side, and a pull sideways brings it out under the finger.
    • Tucked by hand, it opens again where it was (ux, kept in this browser only).
  • ov-float.js, size.
    • It grows to the whole width of the window: MAX_W is 1 (was 0.60).
    • Past what a docked frame holds (its width, or 85% of its height), a pinch, the corner or + lifts it over the page where it is, and it keeps growing, up to 92% of the window's height.
    • A double tap on a phone makes it the screen's width.
    • New f.sizeTo(px).
  • ov-float.js, the place.
    • This browser's place wins. The account's (/api/me/layout) fills a device that has none, so a phone and a desktop each keep their own.
    • The account and onChange get only the account's fields (placeOf), never the browser's extras.
    • A turn of the phone, the keyboard (the visual viewport), the address bar or a resize puts it back inside, once a frame.
    • While it moves, nothing in it is blurred: a backdrop blur repainted every frame made a phone's drag stutter.
  • surfaces.js, OVSurfaces.anchor(el, trigger, { place, gap, margin, sheet, animate }).
    • The element goes in the top layer (the Popover API; fixed without it). No overflow: hidden, mask or stacking context clips it.
    • It is placed beside its button: place is side-align. It flips to the side with room, shifts to stay inside the visual viewport, and is kept no taller than its side's room.
    • It is placed again on scroll, resize and size changes, and released when its button leaves the page.
    • sheet: 'phone' makes it a bottom sheet under 560 px.
    • data-ov-side says where it went, and the default entrance grows from the button.
    • OVSurfaces.popover({ …, pop, place, sheet }) anchors its menu while it is open.
  • kit-web.js. Every details.ovk-more menu is anchored, not only those inside a rail: a phone's clipped layout, a sheet or a rail no longer hides it.
  • Tests: ov-float-chrome (the handle's size and place, a slide, a pull, growing past the frame, a phone's double tap, this device's place, the account's fields) and surfaces-chrome (a clipped menu at a phone's bottom opens above, on top, inside the screen, and is released; placeBox).

PagesThe menuThe kitForms

Rules39 The account lives in the menu's You tab, not in a dropdown.

4.234.0

The bottom bar hides all the way, and the composer stops repeating itself (the owner's phone screenshots, 11-13).

  • The bottom bar (appbar.js). It stepped aside for a keyboard or an open panel with translateY(110%) while its lift above the visible viewport still applied, so above a keyboard, or with Android's toolbar gap, it stopped half on the screen. A hidden bar now drops the lift, sits fully below the screen, and is invisible and not clickable until it comes back.
  • The + sheet. It no longer repeats a tool the row already shows; the emoji button and an "Emoji" tile side by side were the same thing twice. The sheet holds what a narrow row hides, and the extras (Timer, GitHub).
  • The GitHub picker:
    • each row's mark is its owner's initial on a colour of the name; GitHub's own pictures were blocked by most sites' image policy, so every row showed a broken picture, and each one asked GitHub;
    • the same words are answered from the page's cache for ten minutes;
    • a new search cancels the one still running;
    • it waits a third of a second after the last key;
    • the list scrolls inside its panel and no longer runs over the box.
  • Tests composer-v2-chrome (nothing repeated, the initial, the cache) and navbar-appbar (hidden is all the way).

PagesThe navbarThe kit

Rules41 The site's name in the bar opens that site's pages, Home first.96 The Pair is the only mark, and it does the waiting.31 One navbar per page, owned by the shared Frame.

4.233.0

ov-metrics.js on a phone, and prices under a dollar.

  • A narrow table is cards (OVMetrics.table):
    • in a box under 520 px wide (a container query, so a side column counts too), each row is a card: its name on top and each value under its label;
    • the column heads become a row of sort buttons, and the one in use is outlined;
    • nothing scrolls sideways;
    • the table, its rows, cells and heads carry their roles, so a screen reader still reads a table whatever the display.
  • format.usd keeps two significant digits under a dollar: $0.0118 is $0.012, not $0.01; $0.25 stays $0.25. A per-call price no longer rounds away.
  • Test ov-metrics-chrome: the card form at 390 px, the labels, the roles, no sideways scroll, and the new prices.

4.232.0

ov-metrics.js: the network's one way to show numbers (ai-metrics.md). Report, Exchange, Compare and the admin panel draw their AI and usage numbers with it, and nobody draws a chart of their own. The look is the theme's (tokens only). Every piece works at 390 px and in both themes, and stays still with motion off.

  • OVMetrics.tiles(): label, value, unit, a delta that knows whether up is good, a sub-line and a trend.
  • .spark(): a trend line with its last point.
  • .bars(): a ranked bar list.
  • .percentiles(): p50, p90 and p95 on one scale, with a spoken summary.
  • .split(): one bar in parts, with a legend.
  • .table(): sortable on a click, with aria-sort, numeric columns and an optional in-cell bar.
  • OVMetrics.format: the same words everywhere, and servers get them from require('openvibe-shared/ov-metrics'):
    • ms (540 ms · 1.3 s · 1 min 38 s), usd ($0.0042 · $61.20), count (18k · 9.1M), tokens, rate (99.4%);
    • tps (86.0 tok/s), bytes, delta (+12%);
    • unknown is a dash, never 0.
  • Test ov-metrics-chrome.

PagesMotionThemes

Rules4 Calm makes motion smaller and slower. Only Off removes it.31 One navbar per page, owned by the shared Frame.

4.231.0

OpenVibe's own icons, and no Font Awesome drawing left (the owner, 11-12: "make sure no remnants of font awesome or other libraries are still being used rather than our openvibe.design systems").

  • The ring icons' solids are the glyphs' own. Nine product icons (Network, Live, Tools, Media, Games, Community, Chat, Domains, Bench) drew Font Awesome outlines as their solid twin. Each is now the solid drawing of the glyph that stands for it, on the same 24-unit grid as the line drawings. Exchange keeps its line drawing until swap has a solid. scripts/build-navbar-icons.js writes them from glyphs.js and refuses any drawing that is not a glyph.
  • The generator that read Font Awesome's font is gone (scripts/build-nav-icons.py; npm run build:icons is build-navbar-icons.js). The bar's dead 512-grid path in navbar.js went with it.
  • OpenVibe's own markup:
    • <i data-ov-icon="eye"> names any glyph and <i data-ov-brand="github"> any logo, drawn by ov-glyphs.js;
    • classes ovg-xs … ovg-3x, ovg-fw, ovg-rotate-*, ovg-flip-h/-v and ovg-fill (what fa-solid did);
    • OVGlyphs.icon(), .html() and .has() in a page, and glyphs.markup() on a server;
    • the drop-in now carries every glyph (287), and the navbar loads it for this markup too.
  • The bar draws glyph names: a name the bar's set lacks is drawn as <i data-ov-icon>, never as Font Awesome.
  • scripts/fa-to-ov.js rewrites a repository's static Font Awesome markup into data-ov-icon / data-ov-brand. It keeps each attribute's own quote, and running it twice changes nothing. It lists what a person has to decide (names built at run time, JS class strings, CSS rules, animations, unknown names). glyphs.fromFaClasses() is its mapping.
  • Names that drew nothing now draw their glyph: arrow-rotate-left, chart-pie, book-skull, crosshairs, location-crosshairs, satellite, globe-americas, street-view, magnifying-glass-location, apple-whole, backpack, shield-heart, openstreetmap; and the logos reddit-alien and kickstarter-k.
  • Test fa-to-ov.

PagesThe bar’s brandThe navbarIconsRules

Rules92 The menu's places: Here, Feed, Chat, Vibe, You; Vibe holds Chat and Agents.2 An icon name is checked against the set that draws it.31 One navbar per page, owned by the shared Frame.

4.230.0

  • OpenVibe's own controls on every site (the owner, 11-12: "improve the selection boxes to use a more customized look integrated into openvibe.design and themed better with animations and effects for all inputs and buttons"). ov-forms.css now draws every checkbox and radio: a rounded box whose check pops in, and a ring whose dot grows. The mark is the box's own ::before (a clip-path check, scaled), so no picture is fetched. Both lift their border on hover, squeeze on a press and glow with focus; the mixed state is a bar; disabled is faded. A switch (role="switch") glows when on, its knob squeezes when pressed, and it has a focus ring. Buttons answer a press, and text fields, text areas and selects glow in the accent with focus. Everything is :where(), so a site's own rule wins; data-ov-native keeps the browser's control; motion follows the person (Calm slower, Off moves nothing).
  • The bar loads ov-forms.css on any page with a text field, a text area or a button. The select kit's script still waits for a select, a box or a file input.

PagesThe navbarMotionThemesThe kit

Rules94 A site's name opens its pages, and a way to every site.4 Calm makes motion smaller and slower. Only Off removes it.10 A change is New, Improved or Fixed, and says so with a small mark.

4.229.0

  • Back brings you back to the menu (the owner, 11-12: "fix the history back button so it properly brings you back to this GUI rather than the page behind it"). Leaving through a link in the menu marks where it was on its history entry (its place, its door, its scroll); Back to that page opens the menu again there, whether the page comes back from the browser's cache, loads again, or a site swaps it in place (Boost). It reuses that entry, so Forward still works, and closing it then leaves the page as it was. Only for a Back or Forward within half an hour.
  • Links are on their way before the click: anywhere on the page (the bar, the menu, a footer, a card), a finger landing on or a pointer resting on a link to another OpenVibe site opens its connection at once; this site's pages were already prefetched by the bar's speculation rules.
  • All apps has one search (the owner, 11-12: "confusing"): no second box under the menu's pill. The pill reads "Find among 64 apps" and filters the apps in place; the view's head is its name, its count and a hint, coming in with the view. Back on Home, the pill searches OpenVibe again.
  • The close x has no white ring: the ring that leaves it as the menu opens is invisible at rest, so where animations are off (a phone's "Remove animations") it no longer stays as a white circle.
  • The Feed never shows a card twice: a card id already on the list is skipped (Network names a Deals burst once, as of its #887).
  • Feed cards with no person wear their site's app icon (design rule 142), 40 px beside 40 px faces, the glyph filling the square (the owner, 11-12: "icons to increase size").
  • Any button can open a place in the menu (the owner, 11-12: "other tools and buttons can open specific areas of the menu"). A menu address is a place, or place/part: you/notifications, you/apps (All apps), you/recent, feed, here/live, or a door (vibe, chats, agent, code, tasks). Any element with data-ov-menu="you/notifications" opens it on a click, on any page with the bar; a link with an address still opens elsewhere with a modifier key. A page address ending #ov-menu=you/notifications opens it as the page loads (on any OpenVibe site), and a same-page link to it works too; the hash leaves the address. OpenVibeNavbar.openMenu(address) and OpenVibeNavbar.menuAddress(address) take the same addresses; OpenVibeHome's show('drawer') opens All apps.
  • One search field for every site: ov-searchbox.js (the owner, 11-12: "improve the search field … autocomplete, dropdown, animated effects … a shared, universal, reusable search input component"). <input name="q" data-ov-searchbox="/api/…/suggest" data-ov-examples="streams|clips"> in a form becomes a pill: the search mark, the field, a clear button and a "/" key hint on a computer; its edge glows with focus. The placeholder walks through the examples while idle (Calm slower, Off never). Suggestions come from the source in OVCombo's shape, with icons (search, recent, page, person, live, video, place) or a small picture; while empty, the person's recent searches here. The first suggestion that starts with the typed words shows the rest as a ghost: Tab or → takes it. Enter searches the typed words (the form's action) or the chosen row's page; "/" anywhere puts the cursor in it; Escape closes, then clears. OVSearchBox.mount(input, { source, examples, scope, recent, onSearch }); a cancelable ov-search event lets a page search in place.
  • OVCombo grows hooks for anything that is not a value picker: pick, enter, onRows, selectFirst: false, none, limit, cacheMs, anchor; rows take icon or image; the skeleton no longer flashes over rows already showing while a quick answer comes.
  • The navbar's budget is 52 KB brotli (51.6 KB with the menu addresses).

PagesThe search pillThe menuThe footerThe navbar

Rules92 The menu's places: Here, Feed, Chat, Vibe, You; Vibe holds Chat and Agents.94 A site's name opens its pages, and a way to every site.36 The menu button opens on the site you are on.

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

4.227.0

  • One app icon, drawn on the server too (design rule 142). OpenVibeIcons.appHtml(site, { size, label, hue }) returns the app icon as markup (no DOM needed): its hue and size inline and its glyph already drawn, so ov-icons.js finds nothing to fill and nothing moves when it arrives. OpenVibeIcons.APP_CSS is the app icon's own rules, sizes 20 · 26 · 32 · 44 · 56 · 64 included: a server-drawn page puts it in its stylesheet once and its icons are whole before any script runs.
  • Every site's "More on OpenVibe", app launcher and next steps draw sites as their app icons (showcase network(), apps(), the next-step list), whole on the server and the same as the menu's: 44 px in a row, 56 px as a launcher tile on a phone. A non-OpenVibe glyph (fa-…) keeps its tile.
  • The square keeps its size before ov-icons.js: the navbar's early rules hold every .ov-appicon at its data-size, so a page's app icons no longer pop in.
  • The menu's "Across OpenVibe" sites and a quest's steps wear their app icons instead of a small glyph in a ring.
  • The Feed's chips name the one feed's new kinds: Rundown, Jobs, Deals and Stats, beside the media kinds.
  • A release reaches a returning visitor within minutes: an unversioned asset (cache-policy assetHeaders) keeps five minutes of stale-while-revalidate, not a day. Sites load navbar.js without ?v=, so the first visit to each site after a release ran the old menu.
  • /updates passes its contrast check again: a filter chip's count no longer fades to 70% (axe color-contrast, serious, on every site's /updates; the release browser check had paged as critical).

PagesThe quest cardThe menuThe navbarIcon ink

Rules94 A site's name opens its pages, and a way to every site.31 One navbar per page, owned by the shared Frame.90 Assets are addressed by their content, so people always get the current one.

4.226.0

  • The menu's feed draws the one feed's new kinds (feed.item@1) (the one-feed job's finding: they fell through to a bare card):
    • A report is its number, large, with which way it moved and from what (▲ 12%, was 1,075).
    • A folded run (new jobs, new deals) lists its first three, each with its picture where there is one, rows lined up, then "and 11 more".
    • What a count means is said: "14 jobs", "41 voted"; counts.watchers reads "watched".
    • The Rundown is about its actor (feed.item@1's subject is a person's id, so the old reading found nothing).
    • A card without a person no longer says its text twice.
    • menu-feed-v2-chrome checks each.

PagesThe menu

4.225.0

The menu's Vibe is one place: All · Chats · Tasks · Code, no switch (the owner, 11-12, crossing out the Chat · Code · Agents switch: "one new unified agent … a shared UI").

  • Vibe opens on All: every run from the Frame (Vibe chats, tasks, coding runs) in one list (ov-run.js, 4.224.0).
    • The Action Center's waiting and running work from every product (Network /api/v1/me/actions) joins it, unless a run already shows it. What needs you comes first, approved or declined in place; the rest open their own pages.
    • Above the list: the Dock's Now and timeline, your Actor and your agent's live view (lent with OpenVibeDock.mountInto(el, { tab: 'agent', part: 'top' })).
    • Vibe's six starters sit above the box; a press starts that run. Enter in the menu's field starts a run too.
  • Chats, Tasks and Code are the Dock's own panels, lent whole (Vibe's conversations with voice, undo and the timer; Agents with its history, skills and filters; Code with its repos). They move into the one view when it does all they do, so nothing is lost on the way.
  • The Dock's places open their filter: OpenVibeDock.open({ tab: 'vibe' }) opens Chats, 'agent' Tasks, 'code' Code. The status on the menu button still opens what needs you. OpenVibeNavbar.openMenu() also takes 'code' and 'tasks'.
  • ov-run.js gains:
    • o.starters;
    • o.actions: { base }, the Action Center's work in the list;
    • o.top(el), the host's slot above the list on All;
    • o.panes: { chat, task, code }, filters the host draws itself;
    • o.onPlace;
    • view.prefill(text), words in the box, unsent.
  • A system light theme darkens the agents' glyphs.
  • The menu scrolls on a phone wherever the swipe begins (the owner, 11-12: "scrolling is very buggy … on mobile … especially in notifications").
    • Inside the menu, the notifications list was a scroll box of its own that held its overscroll. It never overflowed there, so a swipe that began on a notice moved nothing.
    • Inside the menu it is now part of the menu's one scroller (one scroller per layer).
    • Measured with real touches at 390 px, and checked on every tab: nothing else nests a scroll box like it.
    • New test notifications-menu-scroll-chrome (it fails without the fix).
    • notification-ui.js's brotli budget grows from 25.9 to 26.1 KB for it.
  • The composer's + has GitHub.
    • It searches repositories through OpenVibe Exchange's code search (the Frame's /api/frame/code/search, Network #878) a quarter second after the last key.
    • Each row shows the owner's picture (GitHub's avatar host only), the name, the description, the language, stars and the licence, all as text. Enter or a press puts the repository's address in the box, where every site draws it as a card.
    • A box may point it at another Network with data-ovc-frame. composer-v2-chrome checks it.
  • One app icon for every site: .ov-appicon and OpenVibeIcons.app(site, { size, label }) (design rule 142).
    • It is the menu's and Home's own icon: the app's steady hue on a rounded square, with its glyph drawn over it.
    • Use it from markup (<span class="ov-appicon" data-icon="live" data-size="64">) or from script. Markup added later, or an app that changes, is drawn again.
    • With a label it is an image with a name; otherwise it is decoration. OpenVibeIcons.hue(id) is the shared hue. ov-appicon-chrome checks it.
  • Home on a phone: a long press then a move keeps the app under the finger.
    • Entering Edit repaints the grid, so the tile under the finger left the page, and the grid's touch guard no longer heard that touch: the first move scrolled the menu and cancelled the press.
    • The guard now rides on the pressed tile itself until the finger lifts.
    • menu-home-screen-chrome drags with a real touch (it fails without the fix).
  • The menu reads runs and the Action Center from the Dock's Network base (runsBase).
  • Tests:
    • dock-chrome gains the All view at 390 px: the four filters on All; a run and the Action Center's work in one order; the Dock's top lent without its list; the starters; Tasks as the Agents panel, remembered by the Network; approve in place from All. Every Dock check before it still passes unchanged.
    • run-thread-chrome gains the starters, the Action Center's rows (nothing twice), the host's slot, the place and prefill.
    • menu-places-chrome and menu-home-screen-chrome follow the filters in place of the switch.

PagesThe avatarThe menuThe DockIcon ink

Rules92 The menu's places: Here, Feed, Chat, Vibe, You; Vibe holds Chat and Agents.94 A site's name opens its pages, and a way to every site.41 The site's name in the bar opens that site's pages, Home first.

4.224.0

One thread view for every run: chats, tasks and code (the owner, 11-12, crossing out the menu's Chat · Code · Agents switch: "one new unified agent … a shared UI … a full conversation with rich embedding").

  • New module ov-run.js (OpenVibeRun) draws any run from the Frame's Run API (Network /api/frame/runs; Contracts agents.run@1, agents.step@1), on every site:
    • OpenVibeRun.mount(host, { base, token, me, sibling, examples, start, filter, open }) returns { list(filter), open(ref), start(text), destroy() }.
    • OpenVibeRun.card(type, render) adds a rich card for a step's ui.type; built in: results, table, link, code. A card it does not know shows the step's words.
  • The list:
    • Filters: All · Chats · Tasks · Code.
    • Order: what needs you first, then newest.
    • Each run shows its agent's face (its picture, or its glyph on its own hue, with a badge saying what it is doing), its title in the brand face, its last line and when.
    • Pills say "Needs you", "Working" and "Did not finish". A product that did not answer is named under the list.
    • A run that asks before it acts is answered from the list: Approve or Not now, in place.
    • A filter reloads only the rows, so the words you are typing stay.
  • The thread:
    • Your words on the right. The agent's on the left: paragraphs, lists, bold, inline code, links, and numbered sources whose [n] marks link to them.
    • Thinking is folded. Each tool is one quiet row (it opens to its output).
    • An approval is a card with its answers. Child runs are rows that open them; files are chips or pictures.
    • It follows the run live: server-sent events read with fetch, so the bearer goes along, resuming after the last step it has.
    • The composer underneath says the next thing. A new run starts from the list's box, sent once with an idempotency key.
    • Page text is never markup, and only https links are drawn.
  • The menu keeps the Dock's panels for now. Its Vibe moves to this view (and the switch goes) once the view does everything those panels do:
    • the Action Center's items from every product, approved in place;
    • the live agent view (Pause, Curtain, Mute, End);
    • Vibe's starters and voice;
    • "Ask your agent" from a page;
    • the place the Network remembers.
  • Arrange: Stop is an ordinary optional part; it docks right like any other (#501).
  • ov-run.js and ov-composer.js have content hashes in SIBLING_REV, ready for the menu. Every site serves ov-run.js (files.js), and the package exports openvibe-shared/ov-run.
  • Tests:
    • New run-thread-chrome (390 and 1280 px): the list and filters; approve in place; every kind of step; the live stream and where it resumes; approvals, messages and a new run reaching the API with the person's token; no markup from page text; no overflow.

PagesThe bar’s brandThe menuThe DockIcons

Rules92 The menu's places: Here, Feed, Chat, Vibe, You; Vibe holds Chat and Agents.94 A site's name opens its pages, and a way to every site.90 Assets are addressed by their content, so people always get the current one.

Nov 2026179 releases
4.223.1What went wrong:2026-11-124.223.0You:2026-11-124.222.0The wallet:2026-11-124.221.0No broken icon anywhere.2026-11-124.220.0One UI: the floating Dock is gone; the menu holds Chat and Vibe on every screen2026-11-124.219.0Radios and checkboxes are drawn2026-11-124.218.0Post · Ask · Do2026-11-124.217.0A camera in the box2026-11-124.216.0`ov-capture.js`: `window.OVCapture`, one way to open a camera, a microphone or a screen, take a photo and record a clip2026-11-124.215.0`OpenVibeComposer.mount(host, options)`2026-11-124.214.0The Arrange editor: a person's own controls, on the real parts.2026-11-114.213.0The menu button's flight, polished2026-11-114.212.0A carried Live player can play on any OpenVibe page that permits Network frames.2026-11-114.211.0The menu's You tab leads with you (ask 158b, "the You tab still sucks").2026-11-114.210.0A page's title and its line wrap before they are cut (kit.css `.ovk-head`).2026-11-114.209.0The Quest guide on any page, and the current Live step in the Dock's agent view.2026-11-114.208.0One move engine for every floating thing: the picture-in-picture's drag, flick, tuck, pinch, corner and place, now shared and adopted by the window.2026-11-114.206.0The menu keeps a stream playing, the Feed in the menu is searchable with the one composer at its top, and a Code task opens in the Dock's step card.2026-11-114.205.0Agents show their work everywhere: the one step view reads AG-UI, compact like the portal, with the one composer to talk to the run; and every site's first HTML is crawlable.2026-11-114.204.0Buttons that show their state, windows that resize, the one composer everywhere, players that start sooner, and one place for the network's CSP.2026-11-114.203.0Dock conversations update edited messages and link cards live; authors can edit their own messages.2026-11-114.202.0One field dropdown, one window for small interfaces, one user card, a measured page end, eight site groups, and the reveal remade.2026-11-114.201.0Notifications move into the one menu; the mark and the name are one button; one composer and Code on every site.2026-11-104.200.0The button becomes its tab; Vibe holds Chat and Agents; every site from the site's name.2026-11-104.199.0Every page downloads about 56 KB less: the shared files are served minified.2026-11-104.198.0On a phone the menu is one sheet: Messages and AI open inside it.2026-11-104.197.0The footer says "3 online", and the tooltip part works anywhere.2026-11-104.196.0Your Actor in the Dock, redrawn: one row and one line to type in. And a tone is a lean and a glow, never a bar.2026-11-104.195.0The You tab gets a row of its own, and the menu grows out of the button that was pressed.2026-11-104.194.0One row of places in the menu, a wallet that is there at once, and a Sign in that says so.2026-11-104.193.0The bar's right end, one tooltip, and one frame for mail.2026-11-104.192.0The video that comes with you.2026-11-104.191.0A guest's page view counts at once again.2026-11-104.190.0The one dropdown, the wallet in colour, who is online, and five smaller things.2026-11-104.189.0The balances are one pill, the menu and the Dock lead to each other, and the menu opens where you are.2026-11-104.188.0The account's things are in the menu.2026-11-104.187.0The bar the owner chose.2026-11-104.186.0The mark at work is a ring of dots, and thinking is a state of its own.2026-11-104.185.0The You tab: your home first, a shorter bar, Most used as shortcuts.2026-11-104.184.0Server-rendered navbar links.2026-11-104.183.0Motion: Calm reduces, only Off removes.2026-11-104.181.0The Dock's agent view, timeline and Actor go through Network's frame relay.2026-11-104.180.0A demo scope for motion: `data-fx-demo`2026-11-104.179.0Share to OpenVibe Community.2026-11-094.178.0What's new reads like news (plan §9).2026-11-094.177.0`openvibe-shared/offer-card`: one offer from the network's shops2026-11-094.176.0The model chip and its choice sheet2026-11-094.175.0OpenVibe Link2026-11-094.174.0Home fills its width2026-11-094.173.0The wallet works on sites that keep the access cookie from page scripts2026-11-094.172.0Notices read as what happened2026-11-094.171.0The page head's icon and actions sit on the title's first line2026-11-094.170.0The wallet, one sheet on every site2026-11-094.169.0kit.switchRow, redrawn2026-11-094.168.0The Dock's Agents tab, content-aware2026-11-094.167.0The Feed, everything on the network, day by day2026-11-094.166.0The Feed on every site2026-11-094.165.0Faster between pages and sites2026-11-094.164.0Chat's two views2026-11-094.163.0You, redone2026-11-094.162.0The menu's You tab is a home screen2026-11-094.161.0Menus open from where you tapped2026-11-094.160.0Feed v2: the menu's Feed is a real feed2026-11-094.159.0Homes v2: `openvibe-shared/showcase-stage`2026-11-094.158.0The menu's Home.2026-11-094.157.0Every shell page has a tab icon.2026-11-094.156.0Locker unlocks with a passkey on this device.2026-11-084.155.0The menu names each site by a short product name2026-11-084.154.0Float your agent's screen2026-11-084.153.0Signed in to the network, signed in here — on phones too2026-11-084.152.0Floating cards that follow you across OpenVibe2026-11-084.151.0The menu marks the page you are on2026-11-084.150.0The menu's button turns into its close, on top of the menu2026-11-084.149.0The menu has tabs at the top2026-11-084.148.0On a phone the menu button is the orb, in the burger's place2026-11-084.147.0A link in a Dock message shows its card.2026-11-084.146.0On a phone, a home's words and its main action come first.2026-11-084.145.1The Dock stays open when a tap on the page opens it, on a phone.2026-11-084.145.0ov-canvas.js: an agent's live panel, drawn the same on every site2026-11-084.144.0Send it on OpenVibe.2026-11-084.143.0Add `ov-sync.js` (seven domains plan B4): `OVSync.attach(mediaEl, { room, socket })` follows a `common.sync-clock@1` timeline over Chat's room socket.2026-11-074.142.0The menu has a close button on a phone2026-11-074.141.0The forms kit loads when a form control is drawn, not merely present2026-11-074.140.0Native: no more Material lavender.2026-11-074.139.0The menu's feed rows lead with their picture.2026-11-074.138.038 KB off most first visits2026-11-074.137.0Releases reach phones at once.2026-11-074.136.0One Computer in the Dock2026-11-074.135.0Ask your agent, from any page2026-11-074.134.0Fixed: the Dock's Agent panel could not read the timeline.2026-11-074.133.0The menu's network cards draw an entry's picture when the site sent one (`frame.menu-card@1`'s optional item `image`, openvibe-contracts 0.320.0): a 64×36 rounded thumbnail, `object-fit: cover`, `loading="lazy"`, `decoding="async"`, empty alt, before the title and after the site's icon.2026-11-074.132.0Your feeds in the menu2026-11-074.131.0Your online status, on every site2026-11-074.130.0Your things on every site2026-11-074.129.0One menu2026-11-074.128.0The menu, rethought around real use2026-11-074.127.0The Dock's Agent panel2026-11-074.126.0Audio description in the player (X1)2026-11-074.125.0The owner's Setup page and clear settings2026-11-074.124.0The Dock's agent view gets the four controls2026-11-074.123.0The "not on the list" gate from markup2026-11-064.122.0A thread start page (`page({ center })`) keeps its head at the top on wide screens: only the welcome and the composer are centred, by auto margins.2026-11-064.121.0The Dock's agent view works in the window too2026-11-064.120.0The Dock's agent view2026-11-064.119.0A featured link keeps a place on the phone's bar: where the links row folds into the menu, the featured link (4.117.0) also shows as one tinted icon button beside Sign In or the avatar (38 px, 34 px under 400 px, a 44 px hit area on the element), named by its label for screen readers.2026-11-064.118.0Locker reset and unlock errors requiring fresh authentication now link to Network’s password reauthentication with the complete current page as the return destination, including `locker.proof_required`.2026-11-064.117.0A navbar link can be the site's one featured piece2026-11-064.116.1A transfer of a people-locked item carries the recipient's slot.2026-11-064.116.0The Share sheet's Locked part2026-11-064.115.1Share sheet:2026-11-064.115.0Locker in the browser2026-11-064.114.0One Share sheet on every site2026-11-064.113.0Bot API calls can be counted at ingest, not stored row by row.2026-11-064.112.1The shared chrome meets the phone minimums2026-11-054.112.0`openvibe-shared/config`: `x-unit: "seconds"` is an owner-setting unit.2026-11-054.111.1The tab icon is the Pair on every site.2026-11-054.111.0`openvibe-shared/vibes-pay` (`vibes-pay.js`): Vibes Pay for any page2026-11-044.110.0`openvibe-shared/config`: sealed secrets, write-only secret routes, env pins and the owner settings' schema (D11 S2).2026-11-044.109.2A select inside a modal dialog or a fullscreen player opens over it.2026-11-034.109.1`data-ov-select="bare"`: a select inside a chip or a toolbar keeps that look.2026-11-034.109.0OpenVibe's own select and form controls, on every site (`ov-forms.js`, `ov-forms.css`, docs/forms.md).2026-11-034.108.1A page named after a domain keeps its Markdown twin in llms.txt.2026-11-034.108.0llms.txt can link a site's own pages at their Markdown twins, and only those2026-11-034.107.4The profile panel and the user card give a lookup eight seconds, and a failed one is not kept.2026-11-034.107.3On a phone, a site's own room picture sits below the hero, not behind its text.2026-11-034.107.2The last small touch targets in the shared bar and footer reach 44px.2026-11-034.107.1Legal pages draw the brand in its own font on every site.2026-11-034.107.0Two legal profiles for sites the old ones did not fit.2026-11-034.106.3A site on its own open.<tld> domain is named for it.2026-11-024.106.2The site's name reads whole on a signed-in phone.2026-11-024.106.1The OpenVibe mark opens the site switcher again, on every site.2026-11-024.106.0The ghost cursor2026-11-024.105.1OpenVibe Connect draws the plug in the launcher2026-11-024.105.0Eight more solid drawings2026-11-024.104.0Eight more solid drawings2026-11-024.103.0Eight more solid drawings2026-11-024.102.0A sidebar row with two lines2026-11-024.101.0A puzzle glyph2026-11-024.100.2The page prefetch runs under a nonce policy.2026-11-024.100.1The browser harness counts a counted fold's text as on the page.2026-11-024.100.0A card's day as its cover.2026-11-024.99.1The conversation's head follows the navbar on a phone.2026-11-024.99.0The conversation UI shows several agents, approvals and what the work produced2026-11-024.98.0Solid drawings for ten more glyphs (plan L49/L50).2026-11-024.97.0The conversation UI uses the network's one sidebar.2026-11-024.96.0One conversation UI for the network2026-11-024.95.0A box that scrolls can be scrolled from a keyboard2026-11-024.94.0A labelled thing's poster may be named by username2026-11-024.93.2A folded footer column says how many links it holds2026-11-024.93.1An `ov:` icon the ring set lacks draws as its glyph2026-11-024.93.0Content labels, each viewer's own choice2026-11-024.92.0The page starts the footer it renders2026-11-024.91.1A numbers strip can be reached by keyboard2026-11-014.91.0Buttons say they are working, then done or failed, with the mark2026-11-014.90.0An audio-only recording shows the streamer, not a black box2026-11-014.89.0A card with no picture but a person shows their face2026-11-014.88.1An aborted view transition is silent on the account hub.2026-11-014.88.0Name effects read on light themes.2026-11-014.87.0Share cards for a service's other domains.2026-11-014.86.0Status colour names every site can use.2026-11-014.85.0Share cards for fourteen more sites.2026-11-014.84.0A page with no stylesheet of its own reads in the network's type.2026-11-014.83.0Status words read on light themes.2026-11-014.82.0The motion tokens are on every page, and Reduced motion reaches every token-timed transition2026-11-014.81.0Shape and elevation are tokens, and a look has a shape2026-11-014.80.033 more glyphs have a solid drawing for small sizes2026-11-014.79.0What Vibe did, as chips you can undo2026-11-014.78.0`kit-layout.css`: the fluid scale, the layout primitives and a classless base2026-11-014.77.1Tabs below the fold no longer scroll the page to themselves.2026-11-014.77.0Talk to Vibe in any browser2026-11-014.76.0A timer in the Dock, on every site2026-11-014.75.0The Dock keeps the Vibe tab across sites.2026-11-014.74.0Vibe in the Dock, on every site2026-11-014.73.0Solid drawings for the most-used shapes2026-11-014.72.0Brand logos without Font Awesome2026-11-014.71.0One hand in the bar2026-11-014.70.0Line or solid, on purpose2026-11-014.69.0Icons that read at every size2026-11-014.68.083 more glyphs, 446 Font Awesome names2026-11-01
Oct 2026137 releases
4.67.0Share this look2026-10-314.66.0`ov-fx.js`, the network's effects in one kit2026-10-314.65.0The mark, with depth and motion2026-10-314.64.0One look, everywhere, with no flash2026-10-314.63.037 more glyphs, for the Font Awesome names the network still used most2026-10-314.62.0Font Awesome's features, kept, on the glyphs2026-10-314.61.0The network's own icons: `openvibe-shared/glyphs` and `ov-glyphs.js`2026-10-314.60.0One left sidebar for every product: `kit.sidebar`2026-10-314.59.0The OpenVibe mark is the Pair2026-10-314.58.0The OpenVibe mark is the Loop2026-10-314.57.2One page is marked in the navbar after a boost page move.2026-10-314.57.1A tool's terms line wraps cleanly.2026-10-314.57.0The Dock can use a refreshing token and a read-only scope set2026-10-304.56.0A tool states its terms.2026-10-304.55.0The tool frame: one order for every tool page2026-10-304.54.0The Dock pops out into a window of its own2026-10-304.53.1The patch-notes link under "Recently shipped" wraps on a narrow screen.2026-10-304.53.0The full footer folds on phones2026-10-304.52.0The Dock's Chats tab2026-10-304.51.0The Dock2026-10-304.50.1The seasonal fall lands on the bar.2026-10-304.50.0Rich embeds in the agent session.2026-10-304.49.0Shared motion tokens for production patterns.2026-10-304.48.0The OpenVibe mark opens a site switcher.2026-10-304.47.3A tap on the logo no longer opens the menu.2026-10-304.47.2The updates log reads as changes, not commits.2026-10-304.47.1No page is wider than a phone.2026-10-304.47.0The kit renders natively, on Android and iOS.2026-10-294.46.1`showcase.apps`: a set of six or nine is three a row (`sc-apps--c3`), on a phone and from 600 px.2026-10-294.46.0Touch targets from the fleet audit2026-10-294.45.1The generated native code is compiled now, not just read.2026-10-294.45.0Comfort settings beside the theme.2026-10-294.44.0`showcase.fold({ id, title, hint, html, open })`2026-10-294.43.0A theme for one site.2026-10-294.42.0OpenVibe components (`openvibe-shared/components`, also `/shared/components.js` as `window.OpenVibeComponents`).2026-10-294.41.0Try a theme on any OpenVibe page: `?ov-try=<theme>`2026-10-294.40.0OpenVibe Tokens (`openvibe-shared/tokens`, also `/shared/tokens.js` as `window.OpenVibeTokens`).2026-10-294.39.1room.css stands on its own.2026-10-294.39.0`kit.rail({ wrap: true })`2026-10-294.38.0`showcase.apps`: a launcher.2026-10-294.37.0Kit 2 has its own files: `kit-data.css` and `kit-data-web.js`.2026-10-294.36.2kit-web.js on boosted sites:2026-10-294.36.1Kit 2 charts:2026-10-294.36.0Kit 2:2026-10-294.35.0Showcase:2026-10-294.34.0Agent discovery:2026-10-294.33.0Navbar icons:2026-10-284.32.0The session view2026-10-284.31.0The Action Center2026-10-284.30.0The bell center2026-10-284.29.2`sc.room()`'s look moves to `room.css`2026-10-284.29.1`room.css`2026-10-284.29.0Every result, in the OpenVibe menu2026-10-284.28.0The room kit2026-10-284.27.0Notifications 2.02026-10-284.26.1No site name twice:2026-10-284.26.0Every showcase hero gets a visual2026-10-284.25.0A new mark: the open loop2026-10-284.24.4`agent-session.js`: no made-up run time.2026-10-284.24.3`agent-session.js`: web steps read as lookups.2026-10-284.24.2`agent-session.js` takes `link(url)`2026-10-284.24.1`agent-session.js` reads OpenVibe.Actor's task events2026-10-284.24.0`agent-session.js`: a coding agent's session, as people read it.2026-10-284.23.0One OpenVibe menu2026-10-284.22.2In-page links scroll instead of reloading2026-10-284.22.1Search suggestions reach every site.2026-10-284.22.0A tidier navbar2026-10-284.21.0Search on every site2026-10-284.20.1The kit's behaviour is its own small file, `kit-web.js`2026-10-284.20.0The OpenVibe Kit2026-10-284.19.0Footer `variant: 'auto'`2026-10-284.18.0The account menu, reviewed2026-10-284.17.0`wallet: true`: OpenCoins and Vibes in the bar on any site2026-10-274.16.0Balance chips fold into one on a phone2026-10-274.15.2Showcase sections no longer fade in2026-10-274.15.1The compact footer is one line again2026-10-274.15.0The footer adapts to what the page is doing, opens up from compact, and shows the network right now2026-10-274.14.0The navbar's brand is big enough for a finger2026-10-264.13.0Switching accounts works on every site2026-10-264.12.0Avatars show the picture the account has now.2026-10-254.11.0Seasonal themes.2026-10-254.10.0items.css draws `name-fx-twofat`, "2fat Bass Drop"2026-10-244.9.0Status colours that read as text2026-10-234.8.0Text reads at 4.5:1 in every light theme2026-10-224.7.0The video player2026-10-204.6.0Page cards.2026-10-204.5.0Video sitemaps.2026-10-204.4.0Every site in the launcher, in groups.2026-10-174.3.0Vibes in the account menu on every site.2026-10-174.2.2IndexNow sends 100 URLs a request.2026-10-164.2.1A showcase table that scrolls is a focusable region.2026-10-154.2.0"Ask Actor" in the account menu.2026-10-154.1.9Avatars are asked for in the size they are shown.2026-10-154.1.8Four showcase steps sit two by two below four columns.2026-10-154.1.7`shell.page()` removes the browser's body margin.2026-10-154.1.6Play and Inventory show their own "Recently shipped".2026-10-154.1.5Steps line up.2026-10-154.1.4A `play` glyph for OpenVibe.Play.2026-10-144.1.3`shell.page()` holds the navbar's place.2026-10-124.1.2"Recently shipped" tells visitors what changed, not which library was bumped.2026-10-124.1.1`release.js` reads the commit time on release-layout services.2026-10-124.1.0Every `shell.page()` site is an installable web app, with no per-site code.2026-10-124.0.3Share cards: `run` (openvibe.run has a site block since openvibe-contracts 0.141.0) and a redrawn `host` (its tagline is now "Hosting, compared honestly").2026-10-114.0.2`shell.page()` finds the site's share card from `navbar.service` or `footer.service` when the page itself names no `service` (most sites set it only there), so their pages get `og:image` too.2026-10-114.0.1Tagged in error on the 4.0.0 commit: identical to 4.0.0.2026-10-114.0.0Share cards for every site2026-10-113.0.1`notification-live.js` (the bell's realtime feed) resumes from Events' opaque cursor: `last_event_id` is the last SSE id Events sent, handed back as it came, never a number it read from the message.2026-10-103.0.0Removed the SQLite configuration store.2026-10-102.21.2`release-watch.js` reopens its release-notification stream with `last_event_id` set to the last SSE id Events sent (its opaque cursor, ADR-042), not the numeric seq it computed from the message.2026-10-102.21.1The last fallback "V"s go.2026-10-102.21.0Every product has its own ring icon.2026-10-102.20.4Ring icons (`ov-icons.js`, `showcase.css`) no longer put a CSS transform on any element inside the SVG.2026-10-102.20.3Filled controls use the theme's readable pair, `--accent-strong` with `--on-accent-strong`, instead of `--accent` with white.2026-10-102.20.2On a phone (≤ 420 px) the compact navbar keeps a joined brand whole: openre.stream shows "OpenRestream", not "stream" (other sites still shrink "OpenVibe.Live" to "Live").2026-10-092.20.1The OpenRestream brand on openre.stream reads as one word: "OpenRe" and "stream" touch, with no padding between the two links (`.openvibe-navbar-brand.joined`).2026-10-092.20.0OpenRestream2026-10-092.19.0community badges2026-10-092.18.0Hats2026-10-092.17.0`items.js` + `items.css`: what people wear in OpenVibe.Inventory, on any site (plan T21 "equip everywhere").2026-10-092.16.0My Profile2026-10-092.15.0The navbar fades into the page at the very top (no background or border) and brings its frosted bar back with a smooth transition as you scroll; it keeps that state itself (`.ovnav-top`) on every render and scroll, so a page no longer has to.2026-10-082.14.1shipped.js names every site (Space, Services, Actor, Run, Watch, Download and the rest): the update log showed "space", "services" and "actor" in lowercase next to "Host" and "Community".2026-10-082.14.0A boost page move no longer keeps the old navbar.2026-10-082.13.3The navbar removes the document listeners of its previous render (the outside-click closers of the launcher, the dropdowns, the drawer and the account menu) with an AbortController per render.2026-10-082.13.2The navbar loads `ov-mark.js` only when no `<script src=".../ov-mark.js">` is on the page yet: a page carrying its own async tag that had not run when the navbar rendered got a second copy (ovhost browser-check "script requested twice" on openvibe.coupons, .reviews, .services, .vip and openre.stream, 2026-10-08).2026-10-082.13.1`showcase` code samples are a focus stop with a name (`<pre tabindex="0" aria-label="…">`): a sample that scrolls sideways could not be reached from the keyboard (axe `scrollable-region-focusable`, serious; ovhost browser-check on ai.openvibe.services and openvibe.events, 2026-10-08).2026-10-082.13.0`release-watch` now connects to `https://openvibe.events` by default; the notification bell follows the stream URL in Network's ticket.2026-10-072.12.0`showcase`: the sections (`.sc-hero`, `.sc-sec`, `.sc-cta`) set their own font stack (`--ov-font`, else Inter and the system sans-serif fonts).2026-10-072.11.0`ov-icons`: a `bot` glyph (a robot head with its antenna, eyes and side lights, in the family's 24-unit stroke style), centred by hand (`OFFSETS.bot` `[0, 0.75]`: its bounds run from y 3.5 to 19) so no other icon's measured offset moves.2026-10-072.10.1`openvibe-shared/shipped`: OpenVibe.Bot is a known site (`bot` → "Bot"), so its changelog lines and filter chip read "Bot" rather than the raw id, and `?site=bot` / `openvibe.bot` resolve to it.2026-10-052.10.0`openvibe-shared/showcase`: `nextSteps({ id, title, lede, items })` renders up to four next steps on other OpenVibe products (Shared ADR 0002, plan D94, `docs/adr/0002-traffic-between-products.md`).2026-10-052.9.0off by default2026-10-042.8.0`openvibe-shared/test-runner`: `parallel: 'auto'` resolves to `max(1, min(8, cpus - 1))` (before, any non-number made the runner start nothing); a numeric pin works as before and no option keeps the `min(4, cpus - 1)` default.2026-10-042.7.0`openvibe-shared/notifications`: a new `CONFIRMATION_REQUESTED` type (category `system`, priority `high`, icon 🔑, title "Approval needed").2026-10-042.6.0`openvibe-shared/shell` (new): `page(o)` composes a whole server-rendered document — the doctype and `<head>` from `seo.headTags` (plus `seo.pageSummary` when `summary` is given), the theme-loader before the first paint, `web-runtime.js`/`navbar.js`/`footer.js` deferred through `serve.url`, the no-JavaScript nav from `frame.noscriptNav`, the body and `frame.footer`.2026-10-032.5.0`seo.feedXml(feed, { format })` takes items as `{ title, link, guid?, description?, content?, author?, published, updated?2026-10-022.4.0The SEO kit adds `llmsFull` for full-text AI maps, `pageSummary` for escaped page summaries and WebPage data, `feedXml` for RSS 2.0 and Atom 1.0, and `feedLinkTags`.2026-10-02
Sep 202647 releases
2.3.1`showcase.css` is served at `/shared/showcase.css` (files.js `STYLES`, text/css): the showcase sections and the ring icons' CSS as one cacheable stylesheet, so a product home links it instead of inlining ~10 KB of CSS in every page (and boost loads it styles-first on a swap).2026-09-292.3.0`openvibe-shared/showcase` (plan T11, D92): the sections a product's home page is built from — `hero`, `features`, `steps`, `code`, `demo`, `compare`, `pricing`, `limits` (pricing that equals the API's limits, citing its source), `stories`, `cta` — rendered on the server as plain HTML with inline `CSS` on the theme tokens.2026-09-292.2.0Boost on real sites (plan T11): - `boost.js` starts itself from its script tag: `<script src="/shared/boost.js" data-main="#main" defer>` (optional `data-prefix`, `data-exclude="/a/,/b/"`); the controller is `OVBoost.controller`.2026-09-292.1.0Three new modules for plan T11, plus `serve.js` now taking its cache headers from the shared policy (its own headers are unchanged): - `openvibe-shared/cache-policy` — `isHashed(path)`, `assetHeaders(path, { hashed })` (immutable for a content-addressed asset, otherwise `public, max-age=300, stale-while-revalidate=86400`), `htmlHeaders({ private, maxAge, swr })` and an `applyHtml()` middleware, so "hashed asset = immutable, HTML = stale-while-revalidate" is one rule instead of one per site.2026-09-292.0.0X-Internal-Key is gone from the shared package2026-09-291.30.1Page moves, measured on Live with a 400 ms network: the bar runs from the click, "Loading Content…" appears at 150 ms and follows the phase ("starting up"), the styled page fades in, and nothing shows unstyled in between.2026-09-281.30.0Pages never show unstyled, and moving between them looks finished.2026-09-281.29.2Navbar dropdowns open again.2026-09-281.29.1Themes repaint the whole page and keep button text readable.2026-09-281.29.0`openvibe-shared/analytics/pg`: request analytics on PostgreSQL2026-09-281.28.1Account panel:2026-09-281.28.0`openvibe-shared/config` on PostgreSQL2026-09-281.27.0`openvibe-shared/express-async`: an async handler's rejection no longer ends the process.2026-09-281.26.0Async gauges2026-09-281.25.0`openvibe-shared/test-runner`: no fake green in `npm test`2026-09-281.24.0No fake green in readiness2026-09-281.23.1Two release-watch fixes found by the release-lifecycle acceptance scenarios2026-09-271.23.0Web runtime2026-09-271.22.0The notification bell in realtime2026-09-261.21.0Browser harness: an unreachable host2026-09-261.20.0Release manifest 1.2.02026-09-261.19.0The update matrix, complete2026-09-261.18.0Update telemetry2026-09-261.17.1Fix: `release-watch.js` acts on a `host.release.published` event only when its `origin` (when present) is the page's own.2026-09-261.17.0Release notifications in `release-watch.js`2026-09-261.16.1OV mark2026-09-261.16.0`openvibe-shared/browser-harness`2026-09-261.15.0`openvibe-shared/perf-budget`2026-09-261.14.0`openvibe-shared/config`, the configuration model2026-09-261.13.0Sign In2026-09-251.12.0`openvibe-shared/serve`: a site serves its own pinned copy of the shared browser files.2026-09-241.11.1Fix: the footer's "shipped X ago" line uses the footer's own `service` (`live`, `wiki`, …).2026-09-241.11.0The OpenVibe Frame.2026-09-241.10.0`openvibe-shared/chrome-ssr` gains the server-side pieces of the shared update system, so every site renders the same markup instead of its own copy: - `shipped({ service, updates, title, limit })`: the home page block (the pill and the recent changes), with a plain link without JavaScript.2026-09-241.9.0One "shipped" and update-log system for every site2026-09-241.8.0`shipped.js` (browser file, also `openvibe-shared/shipped`): "Recently shipped" for any OpenVibe site.2026-09-241.7.0`openvibe-shared/trace` (Track O): one W3C trace across the services a request touches.2026-09-241.6.0`openvibe-shared/egress`: the one rule for connecting to an address someone else chose.2026-09-241.5.1Touch and keyboard feedback in the shared chrome (owner feedback: phones flashed a theme-blind blue box over anything tapped).2026-09-231.5.0`/release.json` carries the registry.release-manifest 1.1.0 fields2026-09-231.4.0Same API, ADR-021 behaviour.2026-09-231.3.0Observability and readiness (roadmap Track O, §15.19).2026-09-231.2.1`release-watch.js` never reloads a tab that is playing `<video>`/`<audio>` or holds a live camera/microphone stream (viewers look idle while watching; broadcasters must never be cut).2026-09-231.2.0`navbar.js` loads `release-watch.js` (from the same place it was loaded from) four seconds after `init()`, so every site on the shared navbar gets release prompts once it serves `/release.json`.2026-09-231.1.1`release-watch.js` works without the `<meta name="ov-release">` tag: the release `/release.json` reports when the script loads becomes the page's baseline, and a site that serves no `/release.json` is asked once and left alone.2026-09-231.1.0Active-client update safety (ADR-016, contract `registry.release-manifest@1`).2026-09-231.0.0navbar.js no longer ships every glyph.2026-09-22