{"id":"pst_01M3DC9Z9EBX17Y6MKDQVRPWE6","url":"https://openvibe.blog/@openvibe/patch-notes-object-first-writes","blog":{"id":"blg_01M362MF0EDJ7QHQTRD8A3Q981","handle":"openvibe","title":"The OpenVibe blog","url":"https://openvibe.blog/"},"title":"Patch notes: Object-first writes","summary":"What shipped on OpenVibe on 2026-09-25: 105 changes to OpenVibe.Live, OpenVibe.Network, OpenVibe.Chat, OpenVibe.Community, OpenVibe.Media, OpenVibe.Host and 18 more.","body_markdown":"What shipped on OpenVibe on 2026-09-25: 105 changes to OpenVibe.Live, OpenVibe.Network, OpenVibe.Chat, OpenVibe.Community, OpenVibe.Media, OpenVibe.Host and 18 more. Every line below is a commit message from the OpenVibers repositories, linked to the change itself.\n\n## Highlights\n\n- **OpenVibe.Media:** Object-first writes (WS-G task 1, first stage of retiring C-75): every write to a vods/clips/files/pastes row now creates or updates its media_object in the same SQLite transaction (model.withObject; inside announce() for vod/clip… ([`e9a0f3a`](https://github.com/OpenVibers/OpenVibe.Media/commit/e9a0f3a50c113a099a8862dd60a8ff70c03c1c16))\n- **OpenVibe.Chat:** Calls can run in Chat (WS-I task 1): Live's call server moved to server/calls/ with the same /ws/call protocol and limits, Live's voice-channel and /api/streams/:id/call routes on the same paths and shapes, loopback… ([`603d0b4`](https://github.com/OpenVibers/OpenVibe.Chat/commit/603d0b482d15c7d9c25a1d9310f2886297972886))\n\n## OpenVibe.Live\n\n[openvibe.live](https://openvibe.live) · [repository](https://github.com/OpenVibers/OpenVibe.Live)\n\n- Channels in OpenVibe.Search (WS-O task 10, Contracts 0.44.0): each streamer's channel is a Search document sent through the outbox as live.index_document.upserted (name, bio, recent stream titles, category, live, followers; NSFW channels… ([`80a6b5a`](https://github.com/OpenVibers/OpenVibe.Live/commit/80a6b5a62ad110dc4366089310cf6be32f82ba06))\n- Channel search documents go out with priority low (the envelope allows critical, important or low; 'normal' made Events refuse them with 422); the test's stub Events now validates envelopes as Events does ([`278a498`](https://github.com/OpenVibers/OpenVibe.Live/commit/278a4981730c9266f57332f3d1aecd86e3a0ab5b))\n- Projection role rules match Live's roles: 'streamer' is Live's own (a channel), so a Network event never lowers it; staff roles follow an explicit Network role change both ways, and someone who has streamed keeps streamer when Network… ([`5bb4f8f`](https://github.com/OpenVibers/OpenVibe.Live/commit/5bb4f8f3d4e8353395a912d7c44a0139e2be2128))\n- Projection: Network's display name is taken only when it re-cases the username, as Live's own profile route allows ([`31aa74b`](https://github.com/OpenVibers/OpenVibe.Live/commit/31aa74b9523c45a32e0b7dd4bbf82c28b950db97))\n- VODs and clips in OpenVibe.Search (WS-O task 10, Contracts 0.45.0): Live owns their canonical /vod and /clip pages, so it sends live.index_document type vod and clip (title, channel, category, Live's AI overview and transcript), read from… ([`90641f5`](https://github.com/OpenVibers/OpenVibe.Live/commit/90641f593ae9bd145a8770c12e398a9696dcfd0f))\n- Search page (WS-O task 10: product search boxes use the query API): /search finds Live's channels, VODs and clips through OpenVibe.Search (GET /api/search asks anonymously for owner=live at Search's internal origin and returns only public… ([`ace5823`](https://github.com/OpenVibers/OpenVibe.Live/commit/ace582336bc28b1e061fec90755373d45e1a8d7b))\n- Live's staff actions reach the network moderation audit log (ADR-022, WS-D task 1, Contracts 0.46.0): logModerationAction writes live.moderation.action to the outbox in the same transaction as the row (actor = the staff member's subject… ([`cf3e516`](https://github.com/OpenVibers/OpenVibe.Live/commit/cf3e516be252e55e479318954c8c3d294eaf8724))\n- Backfill script for the moderation audit log: Live's actions logged before live.moderation.action go to Network with their original time (same rule as logModerationAction), once each (moderation_events_backfill), only before a required… ([`29a0970`](https://github.com/OpenVibers/OpenVibe.Live/commit/29a0970da8c17a3a11bc6151cf325d86b1b4862a))\n- Home live grid on Events realtime (WS-F task 1): public live.stream.started/ended from events.openvibe.network/realtime/stream refresh the grid the moment a stream starts or ends; the 12 s poll stays as the fallback and, while realtime is… ([`6b2f7c4`](https://github.com/OpenVibers/OpenVibe.Live/commit/6b2f7c47573e211056e1ebcdec0a6bd1cd547942))\n- CALLS_AUTHORITY flag (WS-I task 1): with CALLS_AUTHORITY=chat the go-live, stream-end, WHIP teardown and admin force-end hooks create and remove stream voice channels in OpenVibe.Chat (POST/DELETE /internal/calls/stream-channel with the… ([`5abf2b1`](https://github.com/OpenVibers/OpenVibe.Live/commit/5abf2b133be929e7217eed22d97733530dd8dec9))\n- nginx template: openvibe.live includes the platform's /.well-known/security.txt, as production does (WS-R task 7) ([`897cebc`](https://github.com/OpenVibers/OpenVibe.Live/commit/897cebcbce06af51366f4fc2a475ae488ee5cb49))\n- Home: no requests for the Games leaderboards and pixel canvas until OpenVibe.Games serves them (they 404 and every first visit logged CORS errors for sections that stay hidden); one switch, GAMES_HOME_WIDGETS, turns them back on (WS-M task… ([`b801679`](https://github.com/OpenVibers/OpenVibe.Live/commit/b8016797130114feadf9b36ae55f5bfd068a32c0))\n- Internal-key retirement (WS-B task 3, C-54): the URL-registry refresh and the chat server's anon resolution ask Network with a service token (identity.subject.resolve), the key only as the fallback when no token can be had — they were the… ([`1f0bb98`](https://github.com/OpenVibers/OpenVibe.Live/commit/1f0bb9882b27790a32361b52ceed1aeae8043253))\n- Accessibility (WS-T task 3): the browser smoke's --a11y runs axe-core (WCAG 2.1 A/AA) on every route and fails on serious or critical violations; fixed what it found — the decorative hero collage's links are not focusable, the key-sequence… ([`400c95c`](https://github.com/OpenVibers/OpenVibe.Live/commit/400c95c9c28a65f24cb6d6fccfd6200998889deb))\n- Arena: the avatar link beside each mic moment is named (the fighter), found by the browser smoke's --a11y ([`3c7e891`](https://github.com/OpenVibers/OpenVibe.Live/commit/3c7e8915613d2a0fa23e920c6f11375cb5f9864a))\n- Arena: the other avatar-only fighter links (battle sides, fighter cards) are named too ([`b349af7`](https://github.com/OpenVibers/OpenVibe.Live/commit/b349af76fbfb298f0cabca99d26d600441f4e6b5))\n- Bulk notification push: a sender without a Network id is sent as no sender, never as the raw Live id (Network now drops notifications from people the recipient blocked, so a Live id read as a Network id could hide the wrong ones) ([`91e62b7`](https://github.com/OpenVibers/OpenVibe.Live/commit/91e62b728b59f5bfc10325345a1804c876183ad1))\n- Pins: openvibe-contracts 0.46.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`ddb620d`](https://github.com/OpenVibers/OpenVibe.Live/commit/ddb620d7e67fdfb4456895cd219a681026b1ebb4))\n\n## OpenVibe.Network\n\n[openvibe.network](https://openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.Network)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0, openvibe-sdk 0.5.0 → 0.9.1; test/registry-topics.test.js expects the live manifest's two new topics (live.index_document.upserted|deleted, Contracts 0.44.0); CI runs the pin-drift check ([`7c4b37b`](https://github.com/OpenVibers/OpenVibe.Network/commit/7c4b37b6f786c1392a911f9b451789af21ba3e36))\n- network.user.updated (WS-B task 2, Contracts 0.43.0): triggers on users record every username, display name, picture, colour, role and ban change in its own transaction, whatever code made it; a relay turns them into one event per person… ([`4a6f310`](https://github.com/OpenVibers/OpenVibe.Network/commit/4a6f310ad95b2a517792e58b4dd41db5951f1de4))\n- Moderation audit log (WS-D task 1): records live.moderation.action (Contracts 0.46.0; Live's staff actions outside chat) as service live; filters by action and a since/until range beside service, actor and target; format=csv exports up to… ([`d3c370e`](https://github.com/OpenVibers/OpenVibe.Network/commit/d3c370ec3bf7e557c64cb481d7437522d62f257c))\n- Audited service grants and staff APIs (WS-D tasks 3 and 4, Contracts 0.48.0): the owner grants, changes or revokes a service principal's capability at /api/admin/grants (and the admin Service grants tab), always with a reason and… ([`8b48007`](https://github.com/OpenVibers/OpenVibe.Network/commit/8b48007729c3bded4dbc93d72393dc9d3fff475f))\n- Event deliveries in admin (WS-F task 3): the owner sees OpenVibe.Events' dead, failing and pending deliveries and replays them (one, or all shown for a subscription) through Events' operator API with a self-signed 5-minute… ([`eff91e6`](https://github.com/OpenVibers/OpenVibe.Network/commit/eff91e6d15d5e0e37da11becb2ec684fde8ea0dd))\n- CI on the shared test and security workflows (WS-Q task 1, OpenVibe.Shared 66b76f8): install, node --check, tests, contract and pin-drift checks from one definition; this repository's own steps kept as inputs and extra steps ([`621fb9d`](https://github.com/OpenVibers/OpenVibe.Network/commit/621fb9d051fbc8c55193371244d2b3ad64ab952a))\n- nginx generator: generated vhosts include the platform's /.well-known/security.txt (WS-R task 7) ([`6a0023a`](https://github.com/OpenVibers/OpenVibe.Network/commit/6a0023ab0ff48f7f3c4d127b0bdc3058240c9b7a))\n- Production drift (WS-S task 7): hourly, each running service's deployed commit is compared with its repository's main on GitHub (current, behind by N commits since the oldest undeployed one, diverged, unknown); shown under each release on… ([`4a9f889`](https://github.com/OpenVibers/OpenVibe.Network/commit/4a9f88901e5f1eaa20b7c5d84e100ae05a8d8631))\n- Production drift: the registry exposes releases() (the drift checks called it and failed silently), and a failed refresh is logged ([`a93b7d1`](https://github.com/OpenVibers/OpenVibe.Network/commit/a93b7d1c0be4e79996ce8abc78d2df83c410d676))\n- Production drift: a deployed build with commits main lacks is diverged whatever main has (GitHub's compare status first, the counts as a fallback) ([`bca5d3f`](https://github.com/OpenVibers/OpenVibe.Network/commit/bca5d3fea50739d50ca62b0e3593c3df52faa2ae))\n- Platform blocks (WS-E task 5, Contracts 0.49.0): user_blocks by subject with a per-pair revision, /api/v1/me/blocks to list, block and unblock (never yourself or a guest; staff blockable, staff actions never hidden), network.block.changed… ([`ccbffa7`](https://github.com/OpenVibers/OpenVibe.Network/commit/ccbffa75deea4a5cb02b34d29f50f0ca8c38044e))\n- Pins: openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`ca7b6f0`](https://github.com/OpenVibers/OpenVibe.Network/commit/ca7b6f0de46d209aa1090dcbe71266210946a430))\n- Registration (WS-B task 10): /register and /signup open the create-account view; the form is username, optional email and password — the claim code for a reserved name appears only when the chosen name is reserved (it was an always-visible… ([`186b7fc`](https://github.com/OpenVibers/OpenVibe.Network/commit/186b7fc76685bb0a39b9d415859c54ed15dd544a))\n\n## OpenVibe.Chat\n\n[openvibe.chat](https://openvibe.chat) · [repository](https://github.com/OpenVibers/OpenVibe.Chat)\n\n- Pins: openvibe-contracts 0.41.0 → 0.42.0, openvibe-sdk 0.7.0 → 0.9.1; CI runs the pin-drift check (shared test and security workflows at 423fe51) ([`78ee215`](https://github.com/OpenVibers/OpenVibe.Chat/commit/78ee2154e3d10c7f6d9f08aa4989bd631d8763d7))\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`c09411e`](https://github.com/OpenVibers/OpenVibe.Chat/commit/c09411eb63fe1cae52a17f5b69f52556bedd1013))\n- Chat logs, exported and audited (WS-I task 7): a staff member searching, viewing (first page) or exporting someone else's chat logs is recorded as a moderation action (chat_log_search, chat_log_view, chat_log_export →… ([`9dbf40b`](https://github.com/OpenVibers/OpenVibe.Chat/commit/9dbf40be709b4eada6da8d88a0f31034b684bf58))\n- openvibe.chat settings: download your chat history (JSON or CSV) ([`5c3ad43`](https://github.com/OpenVibers/OpenVibe.Chat/commit/5c3ad43ce1c8bc6aa03123c3bf0e11b397ffde32))\n- Calls can run in Chat (WS-I task 1): Live's call server moved to server/calls/ with the same /ws/call protocol and limits, Live's voice-channel and /api/streams/:id/call routes on the same paths and shapes, loopback… ([`603d0b4`](https://github.com/OpenVibers/OpenVibe.Chat/commit/603d0b482d15c7d9c25a1d9310f2886297972886))\n- nginx (openvibe.chat): /ws/chat sets the client address from the connection again (a location's proxy_set_header replaces the server-level ones, so it could be forged); /ws/call for call signalling, refused by Chat until CHAT_CALLS=1 ([`0fa122b`](https://github.com/OpenVibers/OpenVibe.Chat/commit/0fa122bcfde321a11eae203e5155dd9547ece1f6))\n- Platform blocks (WS-E task 5, Contracts 0.49.0): Chat consumes network.block.changed into a newest-revision projection, and a network block counts like dm_blocks for new DMs, 1:1 messages, group invites, calls and the DM user search, both… ([`ea1770a`](https://github.com/OpenVibers/OpenVibe.Chat/commit/ea1770a04be8562333b7e4ba695e47559cf61b19))\n- Pins: openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`a7cfa50`](https://github.com/OpenVibers/OpenVibe.Chat/commit/a7cfa50af01b69d185acaa8f8eb6d4fa25fb5bb5))\n- openvibe.chat names: a person's colour is mixed half-and-half with the theme's text colour so it reads on any background (raw colours were below 4.5:1 on the dark panel), and a room line's colour is checked as a hex colour before it… ([`c16a83d`](https://github.com/OpenVibers/OpenVibe.Chat/commit/c16a83d99f02c971f2e991e92eb888fbca1fa4cd))\n- openvibe.chat buttons use the derived --accent-strong pair (4.5:1 in every theme) — WS-T task 3 ([`858fd5a`](https://github.com/OpenVibers/OpenVibe.Chat/commit/858fd5adf5e4bc35ad60959e9e2260064e8b0257))\n\n## OpenVibe.Community\n\n[openvibe.community](https://openvibe.community) · [repository](https://github.com/OpenVibers/OpenVibe.Community)\n\n- Pins: openvibe-contracts 0.41.0 → 0.44.0; CI runs the pin-drift check (shared test and security workflows at 423fe51) ([`adbfd8b`](https://github.com/OpenVibers/OpenVibe.Community/commit/adbfd8bdf574000c366add997107cae7879c3d1a))\n- Threads and pastes in OpenVibe.Search (WS-O task 10, Contracts 0.44.0): each public thread (public, open space; open thread) and public paste is a community.index_document.upserted through the outbox, sent only when it changed with a… ([`6b608f3`](https://github.com/OpenVibers/OpenVibe.Community/commit/6b608f379e2e273a7e0b52e3bbbee72ca64a53e4))\n- Search: a paste whose slug starts with '-' or '_' is indexed as paste_<row id> (a Search document id starts with a letter or digit; Search refused -wgXuYn0); the refused id is forgotten, with no tombstone ([`0fe3c07`](https://github.com/OpenVibers/OpenVibe.Community/commit/0fe3c076203603d026379b147cd4593b4a329917))\n- Search page (WS-O task 10: product search boxes use the query API): /search finds public threads and pastes through OpenVibe.Search (anonymous, owner=community, at its internal origin), with type filter and cursor paging; snippets keep… ([`49282fc`](https://github.com/OpenVibers/OpenVibe.Community/commit/49282fc25310cc35d22cf67a3eadda8592cc5869))\n- Pulse on Events realtime (WS-F task 1): on the first page, public activity from here and the other sites (new pastes, threads, replies, go-lives, blog, wiki and news posts) arrives over events.openvibe.network/realtime/stream and a bar… ([`d401ef4`](https://github.com/OpenVibers/OpenVibe.Community/commit/d401ef42c32a98b723af8ef6d9b5b1c388ca310a))\n- Platform blocks (WS-E task 5, Contracts 0.49.0): Community consumes network.block.changed into a newest-revision projection and refuses (403 community.blocked, plain message on the no-JS forms) a reply in a thread whose author blocked you… ([`0cce476`](https://github.com/OpenVibers/OpenVibe.Community/commit/0cce47618995c3b896bfc401e519818424042cd6))\n- Pins: openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`077d7be`](https://github.com/OpenVibers/OpenVibe.Community/commit/077d7be9041ea9c442488b29fd4f6b9d8c070eba))\n- Community: primary buttons use the derived --accent-strong pair (4.5:1 in every theme) and links in running text are underlined (colour alone did not mark them) — WS-T task 3 ([`4132923`](https://github.com/OpenVibers/OpenVibe.Community/commit/4132923130866d4553868b6e4afd128f656a817b))\n\n## OpenVibe.Media\n\n[openvibe.media](https://openvibe.media) · [repository](https://github.com/OpenVibers/OpenVibe.Media)\n\n- Pins: openvibe-contracts 0.33.0 → 0.44.0; CI runs the pin-drift check (shared test and security workflows at 423fe51) ([`30dc5eb`](https://github.com/OpenVibers/OpenVibe.Media/commit/30dc5eb457e824ceae150e1b86d0d834827ac14a))\n- Media's own watch pages in OpenVibe.Search (WS-O task 10, Contracts 0.45.0): media.index_document.upserted for exactly the pages the sitemap lists (one WATCH_WHERE rule shared by both: public, finished, playable, made by a person, not… ([`bc7b1a5`](https://github.com/OpenVibers/OpenVibe.Media/commit/bc7b1a50fd67447d6f487a27d738d80dbd4f45be))\n- Object-first writes (WS-G task 1, first stage of retiring C-75): every write to a vods/clips/files/pastes row now creates or updates its media_object in the same SQLite transaction (model.withObject; inside announce() for vod/clip… ([`e9a0f3a`](https://github.com/OpenVibers/OpenVibe.Media/commit/e9a0f3a50c113a099a8862dd60a8ff70c03c1c16))\n- Footer: Media's own links as the shared footer's { name, url } items (label/href rendered four empty links; found by an axe survey, WS-T task 3) ([`43a051e`](https://github.com/OpenVibers/OpenVibe.Media/commit/43a051e1c8cf212397afd6ead9804bd78ec41a46))\n- Pins: openvibe-contracts 0.45.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`91520ee`](https://github.com/OpenVibers/OpenVibe.Media/commit/91520ee67315e68ed5389feb165ed6306a26f019))\n- Media index: the selected tab uses the derived --accent-strong/--on-accent-strong pair (Shared 1.13.0), 4.5:1 in every theme; white on the accent was below it (WS-T task 3) ([`ab8cc62`](https://github.com/OpenVibers/OpenVibe.Media/commit/ab8cc62cb455be234106880c381354488ee82254))\n- Media index: the selected tab's count is not dimmed (3.3:1), and a pager arrow that goes nowhere says it is disabled — WS-T task 3 ([`81ccb68`](https://github.com/OpenVibers/OpenVibe.Media/commit/81ccb687667d347f0433061d0e8f51dbca6d4e23))\n\n## OpenVibe.Host\n\n[openvibe.host](https://openvibe.host) · [repository](https://github.com/OpenVibers/OpenVibe.Host)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`3613a1d`](https://github.com/OpenVibers/OpenVibe.Host/commit/3613a1d7b1d759f923801bdc3211aab85bb16f8c))\n- Backup alerts (WS-S task 3): ovhost backup --all (and offsite push) writes the run's outcome to node_exporter's textfile collector (last run, ok, last success, per-status counts, off-site ok); ovhost backup-metrics rewrites it from a… ([`eab60f6`](https://github.com/OpenVibers/OpenVibe.Host/commit/eab60f606d8f9b84aa22dfdc9c30c03fc9a66357))\n- Nightly backups: runuser by absolute path, and /usr/sbin on the backup unit's PATH — the scheduled runs of 2026-09-24 and 2026-09-25 failed for every database with 'spawn runuser ENOENT' (manual runs under sudo worked); found by the new… ([`40a25fe`](https://github.com/OpenVibers/OpenVibe.Host/commit/40a25fec7b5299bcda72ccdfb20402786b624b7b))\n- nginx templates: the platform's /.well-known/security.txt (snippets/security-txt.conf) on every service vhost ovhost renders and on the Host dashboard; tenants' custom domains keep their own (WS-R task 7) ([`fba26c9`](https://github.com/OpenVibers/OpenVibe.Host/commit/fba26c9fc507a2bfdacc97c13e1ed6847a4abdd5))\n- Prometheus: OpenVibeDeployDrift — a service whose main has had undeployed commits for more than a day (WS-S task 7) ([`0e3a7ea`](https://github.com/OpenVibers/OpenVibe.Host/commit/0e3a7ea294ddd9827d30fb2a57617634a96cea6e))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`577e8c3`](https://github.com/OpenVibers/OpenVibe.Host/commit/577e8c3ad65c208d8d01f4b7bd13f67485362f31))\n\n## OpenVibe.Tools\n\n[openvibe.tools](https://openvibe.tools) · [repository](https://github.com/OpenVibers/OpenVibe.Tools)\n\n- Pins (every apps/* package): openvibe-contracts 0.33.1 → 0.44.0 (audio, docs, gateway, img), openvibe-sdk 0.4.0 → 0.9.1 (audio, docs, img; gateway already 0.9.1), openvibe-shared 1.11.1 → 1.12.0 (audio, docs, food, img, maps, text, yt… ([`4bbfd62`](https://github.com/OpenVibers/OpenVibe.Tools/commit/4bbfd62bd12de978b1735f49f8dd812587d0e345))\n- CI on the shared test and security workflows (WS-Q task 1, OpenVibe.Shared 66b76f8): install, node --check, tests, contract and pin-drift checks from one definition; this repository's own steps kept as inputs and extra steps ([`c73d4dc`](https://github.com/OpenVibers/OpenVibe.Tools/commit/c73d4dc574d17d76fdffccf30ce1cd4b91cd752d))\n- CI: no npm cache at the root (there is no root lockfile; each app installs its own) ([`db31b43`](https://github.com/OpenVibers/OpenVibe.Tools/commit/db31b43ac99c649de404240216fe2f49968f1dc1))\n- nginx: every Tools vhost includes the platform's /.well-known/security.txt in its serving block, as production already does (WS-R task 7); the SDK client test compares versions numerically (0.11.0 is later than 0.6.0) ([`cca0d82`](https://github.com/OpenVibers/OpenVibe.Tools/commit/cca0d8256e22f1f66c5115b3c93b9e65f84d2aa2))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`9d3b267`](https://github.com/OpenVibers/OpenVibe.Tools/commit/9d3b267a167d7d2458626c844a6867217f50a005))\n- Tools home: the search button uses the derived --accent-strong pair (4.5:1 in every theme), and planned tiles dim their icon instead of their text (the tagline read at 3.2:1) — WS-T task 3 ([`0b14739`](https://github.com/OpenVibers/OpenVibe.Tools/commit/0b14739c33bc00980d95d76c3ae67599483822fa))\n\n## OpenVibe.Games\n\n[openvibe.games](https://openvibe.games) · [repository](https://github.com/OpenVibers/OpenVibe.Games)\n\n- Pins: openvibe-contracts 0.39.0 → 0.44.0 (apps/server; openvibe-sdk already 0.9.1); CI runs the pin-drift check ([`4d91de9`](https://github.com/OpenVibers/OpenVibe.Games/commit/4d91de9d9c58c930524140d11976f673f182e30a))\n- CI on the shared test and security workflows (WS-Q task 1, OpenVibe.Shared 66b76f8): install, node --check, tests, contract and pin-drift checks from one definition; this repository's own steps kept as inputs and extra steps ([`e27e161`](https://github.com/OpenVibers/OpenVibe.Games/commit/e27e161002ff37492a4ced9f3c41b6a30ebc53e0))\n- Footer: the Games and Account columns as the shared footer's { name, url } items (label/href rendered six empty links; found by an axe survey, WS-T task 3) ([`9901bed`](https://github.com/OpenVibers/OpenVibe.Games/commit/9901bed915dc9f5fd82d8ab0377100d21882c724))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-sdk 0.9.1 → 0.11.0 ([`19108de`](https://github.com/OpenVibers/OpenVibe.Games/commit/19108de7bf5ccd9b0dcf14535ab758753c6233f0))\n\n## OpenVibe.Blog\n\n[openvibe.blog](https://openvibe.blog) · [repository](https://github.com/OpenVibers/OpenVibe.Blog)\n\n- Pins: openvibe-contracts 0.38.0 → 0.42.0, openvibe-sdk 0.7.0 → 0.9.1; CI runs the pin-drift check (shared test and security workflows at 423fe51) ([`f235c8b`](https://github.com/OpenVibers/OpenVibe.Blog/commit/f235c8b447b321813d81b0622d5518b34b001eab))\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`6905891`](https://github.com/OpenVibers/OpenVibe.Blog/commit/6905891798dd0ca3792be1b7dfe98bb96b8b9ea1))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`ffc1357`](https://github.com/OpenVibers/OpenVibe.Blog/commit/ffc1357352aff1fde95721063ceddeb980b73760))\n\n## OpenVibe.Search\n\n[search.openvibe.network](https://search.openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.Search)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`ff202c7`](https://github.com/OpenVibers/OpenVibe.Search/commit/ff202c7c9c6284307676b5ea60c1d068dbd3c36a))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0 ([`b70f275`](https://github.com/OpenVibers/OpenVibe.Search/commit/b70f275ae439028e21158d9bc62bed89e1549a61))\n- Search page: the button uses the derived --accent-strong pair (4.5:1 in every theme; white on the accent was 3.67:1) — WS-T task 3 ([`162a9f0`](https://github.com/OpenVibers/OpenVibe.Search/commit/162a9f0d847a3b085952a5cd4db227e83fbefa92))\n\n## OpenVibe.AI\n\n[ai.openvibe.network](https://ai.openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.AI)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`bc5b78d`](https://github.com/OpenVibers/OpenVibe.AI/commit/bc5b78de82690d3bed88e73db55cbae861805eac))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`8038305`](https://github.com/OpenVibers/OpenVibe.AI/commit/8038305834a81319ec00476186750fa62be392e4))\n\n## OpenVibe.Billing\n\n[billing.openvibe.network](https://billing.openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.Billing)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`6c00c55`](https://github.com/OpenVibers/OpenVibe.Billing/commit/6c00c558a5af4cd3508d69af0743999797e07859))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0 ([`2db6158`](https://github.com/OpenVibers/OpenVibe.Billing/commit/2db6158f2990f1517b5df683633dabaf00889c60))\n\n## OpenVibe.Codes\n\n[openvibe.codes](https://openvibe.codes) · [repository](https://github.com/OpenVibers/OpenVibe.Codes)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit); test/docs.test.js expects v0.44.0 ([`bdb28de`](https://github.com/OpenVibers/OpenVibe.Codes/commit/bdb28deab25b0b7b450a7035fa32a34ad32d08ae))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`de62855`](https://github.com/OpenVibers/OpenVibe.Codes/commit/de6285563af5056cdacae5723b24c242de81fc42))\n\n## OpenVibe.Coupons\n\n[openvibe.coupons](https://openvibe.coupons) · [repository](https://github.com/OpenVibers/OpenVibe.Coupons)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`11f6641`](https://github.com/OpenVibers/OpenVibe.Coupons/commit/11f6641634f67c43889ac9d6c7bd1466bb3ec0e7))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`e19cc3a`](https://github.com/OpenVibers/OpenVibe.Coupons/commit/e19cc3a1dd299f64783ac1eb69cb44f5aea198d9))\n\n## OpenVibe.Deals\n\n[openvibe.deals](https://openvibe.deals) · [repository](https://github.com/OpenVibers/OpenVibe.Deals)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`294f7b5`](https://github.com/OpenVibers/OpenVibe.Deals/commit/294f7b54aac54ffcd862bc64d839d611e463c2f1))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`e422232`](https://github.com/OpenVibers/OpenVibe.Deals/commit/e4222327c71348144677f8f82f86e8c9af04bc1f))\n\n## OpenVibe.Events\n\n[events.openvibe.network](https://events.openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.Events)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`4a83adc`](https://github.com/OpenVibers/OpenVibe.Events/commit/4a83adc90d0fb63c603f1f97b5d22a5eddff00a2))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0 ([`e2cb9ea`](https://github.com/OpenVibers/OpenVibe.Events/commit/e2cb9ea328d1880c5deda4fcd0ed8b312f94f37f))\n\n## OpenVibe.News\n\n[openvibe.news](https://openvibe.news) · [repository](https://github.com/OpenVibers/OpenVibe.News)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`9f027d3`](https://github.com/OpenVibers/OpenVibe.News/commit/9f027d3d3a3eb4ebbf51281fcdfcac287231d3af))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`8246a22`](https://github.com/OpenVibers/OpenVibe.News/commit/8246a22ff6a21f567c7dd6be3943f7726f4f92d7))\n\n## OpenVibe.Reviews\n\n[openvibe.reviews](https://openvibe.reviews) · [repository](https://github.com/OpenVibers/OpenVibe.Reviews)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`3aa08bb`](https://github.com/OpenVibers/OpenVibe.Reviews/commit/3aa08bb805ac90e03c132cbfc7828206c68dbe29))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`42dbc0c`](https://github.com/OpenVibers/OpenVibe.Reviews/commit/42dbc0c5c4dc8993e2f6b8eea56ad193d13d8bea))\n\n## OpenVibe.Sources\n\n[sources.openvibe.network](https://sources.openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.Sources)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`520e12c`](https://github.com/OpenVibers/OpenVibe.Sources/commit/520e12ca5c7c7a48dc9def41fe5c17ea6d1f733c))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0 ([`85fd578`](https://github.com/OpenVibers/OpenVibe.Sources/commit/85fd578cdbae9ec331fff77297e3a728564c888c))\n\n## OpenVibe.Tips\n\n[openvibe.tips](https://openvibe.tips) · [repository](https://github.com/OpenVibers/OpenVibe.Tips)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`2e0bb45`](https://github.com/OpenVibers/OpenVibe.Tips/commit/2e0bb45d2f17d187052a4191cfe3488e2215d4f8))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`56f8579`](https://github.com/OpenVibers/OpenVibe.Tips/commit/56f85795154282a800a6dda3effa2910878a5869))\n\n## OpenVibe.Trade\n\n[openvibe.trade](https://openvibe.trade) · [repository](https://github.com/OpenVibers/OpenVibe.Trade)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`8996959`](https://github.com/OpenVibers/OpenVibe.Trade/commit/8996959a5cf4b2286ccc289bb043a9daa5c4c581))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`9bb7f93`](https://github.com/OpenVibers/OpenVibe.Trade/commit/9bb7f93443999534e4d41d6051893f2dddd9f9eb))\n\n## OpenVibe.VIP\n\n[openvibe.vip](https://openvibe.vip) · [repository](https://github.com/OpenVibers/OpenVibe.VIP)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`1c9a995`](https://github.com/OpenVibers/OpenVibe.VIP/commit/1c9a995f3c54b26021ab117414922123bd08aca1))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`f7a3315`](https://github.com/OpenVibers/OpenVibe.VIP/commit/f7a3315a2250a17029ddd01e68a61894239b3bcd))\n\n## OpenVibe.Wiki\n\n[openvibe.wiki](https://openvibe.wiki) · [repository](https://github.com/OpenVibers/OpenVibe.Wiki)\n\n- Pins: openvibe-contracts 0.42.0 → 0.44.0 (Contracts 0.43.0 and 0.44.0 were released after the previous pin commit, leaving 0.42.0 two minors behind the pin-drift limit) ([`588f2e5`](https://github.com/OpenVibers/OpenVibe.Wiki/commit/588f2e5331e9edf9c5468b4c71c2a5ccc0091298))\n- Pins: openvibe-contracts 0.44.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0 ([`2aa7301`](https://github.com/OpenVibers/OpenVibe.Wiki/commit/2aa73010584d0a1a0372b38c10ddd1ac38e0d6cd))\n\n## OpenRe.Stream\n\n[openre.stream](https://openre.stream) · [repository](https://github.com/OpenVibers/OpenRe.Stream)\n\n- Pins: openvibe-contracts 0.33.0 → 0.49.0, openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.5.0 → 0.11.0 ([`0284216`](https://github.com/OpenVibers/OpenRe.Stream/commit/028421684d04ca0aab1c38a10c54fd622ad1b908))\n\n---\n\nPatch notes are put together automatically when enough changes have shipped, or when a large feature lands. See every site's own updates page for the live list.","revision":1,"state":"published","visibility":"public","published_at":"2026-09-25T22:52:18.101Z","revised_at":"2026-09-25T22:52:18.097Z","author":{"subject":"usr_01KKT9AC60KM7CRTB3WN1Z8P56","name":"goosely","username":"goosely"},"authorship":{"mode":"imported","workflow":null,"reviewed":false,"disclosure":{"mode":"imported","short":"Imported","long":"Imported from Commit messages from the OpenVibers repositories on GitHub; originally by OpenVibers."}},"tags":["patch-notes","live","network","chat","community","media","host","tools","games","blog","search"],"categories":[],"series":{"title":"Patch notes","url":"https://openvibe.blog/@openvibe/series/patch-notes","position":null},"media":[],"citations":[],"indexability":{"indexable":true,"robots":"index, follow","reasons":[]}}