Skip to content
-
Cursor reads name what was deleted under the cursor (reconnect convergence, roadmap D22 and WS-I task 6): a reader that reconnects and reads ?after_id=<cursor> got only the newer rows, so a line deleted while it was away stayed on its screen for good (Live's floating widget, openvibe.chat's global feed). Every cursor read (global, channel and stream history) now carries deleted_ids: the ids at or under the cursor, among the room's newest 1000 rows, that a fresh page would no longer show (deleted, or past their auto-delete time). Ids only; an id the reader never had is a no-op. Bounded: an index scan of at most 1000 rows. openvibe.chat's feed drops them on reconnect; Live's widget (chat.js hydrateWidgetOnly) should do the same. Pages are unchanged. Test: rest (global, stream, stream scope and channel cursor reads; above the cursor and other channels are not reported)OpenVibers · 26 Sept 2026
c832274
-
Moderation found by the parity script (WS-I task 6): timeouts end on time, a ban holds from the moment the moderator is answered, the dashboard's range purge matches its range, and moderators are not slowed. (1) live-context.js read a ban's expires_at as TEXT against SQLite's 'YYYY-MM-DD HH:MM:SS', and /timeout stores ISO ('...T...Z', 'T' sorts after ' '), so a 60-second timeout lasted until midnight UTC; it is read as a UTC instant now (either format; a value that is not a date keeps the TEXT comparison). Live's own ban queries still compare TEXT. (2) The ban effect started the ban-cache refresh without waiting for it, and a refresh already in flight answered for it, so the target's next line could still go out; the refresh now finishes (a new read after any in-flight one) before /ban and /timeout answer. (3) The purge, its preview and the log filter compared the dashboard's ISO bounds with SQLite timestamps as TEXT: a same-day range matched nothing and a range ending on a day matched all of it; they use datetime(?). (4) Slow mode slowed moderators too, so one could not even turn it off inside the window; the room's moderators (broadcaster, channel mods, chat staff) keep the 1 s flood limit only. Tests: live-context (ISO and SQLite expiry, a ban in the cache when the effect answers with a refresh in flight), message-deleted (an ISO range: preview, logs, purge, a row outside it stays), ws-protocol (a viewer is slowed, the moderator turns it off 1.1 s in)OpenVibers · 26 Sept 2026
e26e063
-
Pins: openvibe-shared 1.16.0 -> 1.16.1 (the OV mark stops animating when idle, hidden or off-screen)OpenVibers · 26 Sept 2026
0fc8f2e
-
Unknown pages answer an HTML 404 page to a browser (browser check, WS-Q task 3: openvibe.chat answered every unknown path with JSON). A GET or HEAD that asks for text/html, outside /api/, /internal/ and /ws/, gets the site's own page inside the Frame: 404, noindex, the path escaped, links to global chat, rooms and messages. The API, those prefixes, other methods and clients not asking for HTML keep the JSON 404. Test: web.test.jsOpenVibers · 26 Sept 2026
f07cf8e
-
A guest's session probe answers 200, not 401 (browser check, WS-Q task 3): GET /auth/me with no ov_token cookie and no Authorization header answers { user: null }, which the shared navbar reads as signed out. It asks on every page view, and the 401 logged a console error on each. A credential that is present but invalid or expired still answers 401. Test: web.test.jsOpenVibers · 26 Sept 2026
cf3807a
-
Pins: openvibe-shared 1.13.0 -> 1.16.0OpenVibers · 26 Sept 2026
15b266b
-
nginx: every Chat location that sets its own proxy_set_header (Connection "" for upstream keepalive) repeats Host and the client address: /auth/me, /auth/, /api/ and / had lost the server-level ones, so REST requests reached Chat as 127.0.0.1 (per-IP limits and bans saw one address); the test fails a location without themOpenVibers · 26 Sept 2026
b2d329a
-
nginx: /auth/me, the session probe the shared navbar asks on every page view, gets its own location on the API zone (burst 30) instead of the sign-in zone (10 a minute, burst 10), and both answer 429 when limited instead of nginx's default 503. The browser check (Host scripts/browser-check.js, WS-Q task 3) saw /auth/me answer 503 after about ten quick page loads, which the navbar takes as signed out. test/nginx-auth-limit.test.js. Takes effect when the vhost is next installed (not deployed here)OpenVibers · 26 Sept 2026
d461fd4
-
Chat rooms on the realtime plane (WS-I task 9, contracts 0.57.0): a message in a public room is announced as chat.room.message.created (visibility public) in the transaction that stores it; deleting one, or turning the room private, announces chat.room.message.deleted with a redaction so it stops being replayable; private rooms and DMs never leave Chat. Pins: openvibe-contracts 0.49.0 -> 0.57.0OpenVibers · 26 Sept 2026
593513b
-
Online now (WS-F task 2, ADR-005 amendment 1): GET /api/chat/online?users=a,b answers online or offline for up to 50 usernames from Chat's open connections (global chat, rooms, DMs); nothing stored, no Events topic; someone hidden by chat.presence_prefs, or whose preference cannot be read within a second, reads offlineOpenVibers · 26 Sept 2026
0b68fb6
-
Staged tables move to Chat one table at a time (WS-I task 2, register C-04; Live d6480da): table_authority now says who writes channel_moderators, channel_moderation_settings, emotes, user_tags, chat_ai_summaries and chat_timeline_events, and a restart keeps what a table was handed. At 'live' Chat's copy follows Live's captured changes (bridge op stagedApply, rows REPLACEd, never mirrored back) and answers Live's dual read (stagedSlice: count and sha256 of a slice). setTableAuthority is Chat's half of Live's handoff: to 'chat' needs LIVE_MIRROR, back to 'live' sends the table's queued mirror rows first and refuses while any is left. At 'chat' the bridge takes Live's writers under Live's function names (addChannelModerator, removeChannelModerator, upsertChannelModerationSettings with Live's clamps, setChannelAlertSound, createEmote, updateEmote, deleteEmote, setEmoteMedia, grantUserTag, revokeUserTag, upsertChatAiSummary, addChatTimelineEvents), each refusing while its table is Live's and answering Live's return value plus the rows; the mirror triggers copy the table to Live; Chat's chat server reads moderators and settings in place and writes /slow and alert sounds itself. scripts/import-from-live.js is a dry run unless --apply (which backs chat.db up with VACUUM INTO first), makes a staged table at 'live' equal to Live's (refreshed, and pruned of rows Live removed, before inserting) and only compares one at 'chat'; --tables no longer crashes in the id-headroom step. scripts/parity-check.js --tables compares row counts and a content hash per staged table; scripts/table-authority.js shows both sides and sets Chat's side when Live cannot. /ready reports table_authority. Runbook with dates and rollback per step: docs/staged-tables-cutover.mdOpenVibers · 26 Sept 2026
e17dbbb
-
openvibe.chat buttons use the derived --accent-strong pair (4.5:1 in every theme) — WS-T task 3OpenVibers · 25 Sept 2026
858fd5a
-
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 reaches the style attribute — WS-T task 3OpenVibers · 25 Sept 2026
c16a83d
-
Pins: openvibe-shared 1.12.0 → 1.13.0, openvibe-sdk 0.9.1 → 0.11.0OpenVibers · 25 Sept 2026
a7cfa50
-
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 ways; scripts/migrate-dm-blocks-to-network.js exports dm_blocks as subject pairs for Network's import (dry run by default)OpenVibers · 25 Sept 2026
ea1770a
-
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=1OpenVibers · 25 Sept 2026
0fa122b
-
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 /internal/calls/stream-channel for Live's stream hooks (bridge service token, chat.live_bridge.write), and a calls table with the pending/ringing/active/ended/missed/declined/failed lifecycle; off until CHAT_CALLS=1 so nothing changes before the cutover in docs/calls-cutover.mdOpenVibers · 25 Sept 2026
603d0b4
-
openvibe.chat settings: download your chat history (JSON or CSV)OpenVibers · 25 Sept 2026
5c3ad43
-
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 → chat.moderation.action → the network audit log); your own lines and your own stream are not; GET /api/chat/me/export gives you every message you sent that is still visible, as JSON or CSV (up to 100,000 lines); CSV cells that look like formulas are kept as textOpenVibers · 25 Sept 2026
9dbf40b
-
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)OpenVibers · 25 Sept 2026
c09411e
-
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)OpenVibers · 25 Sept 2026
78ee215
-
Chat owns chat.tts_defaults, chat.dm_settings and chat.presence_prefs (Contracts 0.41.0, WS-B task 9): one module store per namespace (server/prefs/module-store.js), /api/chat/tts-settings, /dm-settings and /presence beside /preferences, openvibe.chat Settings edits all four; DMs honour new_conversations nobody (existing conversations stay open) and group_invites; user lists count, never name, someone hidden; network.module.updated refreshes themOpenVibers · 25 Sept 2026
2bdb0cf
-
Chat rooms (WS-I task 4, first release): anyone signed in starts a room (public or private, up to 10 each); members, mods and owner roles, invitations, blocking, slow mode, unread counts; history and posting over /api/chat/rooms and live over /ws/chat (join_room, room_message), delivered only to the room's sockets; site bans and chat staff apply everywhere and mod actions are logged to the moderation audit. openvibe.chat gets Rooms: the list, each room (readable without JavaScript, join/post/delete by form) and owner/mod settings; public rooms are in the sitemap. tests: rooms.test.js, web.test.jsOpenVibers · 25 Sept 2026
27852af
-
openvibe.chat: one navigation (the shared navbar carries Global chat, Messages and Settings; without JavaScript the Frame's noscript nav and a sign-in line)OpenVibers · 24 Sept 2026
eedd3d3
-
Contracts 0.40.0 (the chat manifest names openvibe.chat)OpenVibers · 24 Sept 2026
3c06399
-
deploy/nginx/openvibe.chat.conf: the reference vhost for openvibe.chat (everything to Chat on 4400, /ws/chat upgraded with long timeouts, sign-in/API/form posts rate-limited, /internal and /metrics 404, client address from the connection only)OpenVibers · 24 Sept 2026
e92a6ea
-
openvibe.chat, the site (WS-I task 8): global chat (server-rendered, live over /ws/chat), messages (inbox, conversations for participants only, start one by username) and settings (the chat.preferences record Live's chat reads), /updates, robots and sitemap, served by Chat itself so it works with Live down. Sign in with OpenVibe.Network (client chat, CHAT_WEB_URL/auth/callback); the Frame from this site's own /shared/ (openvibe-shared 1.12.0). Forms post without JavaScript through the same API handlers (one set of checks), only from this origin. test/web.test.jsOpenVibers · 24 Sept 2026
4937946
-
Revocation propagation (WS-B task 4, Contracts 0.39.0): Chat subscribes to network.user.token_valid_after, keeps the latest cutoff per subject, refuses Network tokens issued before it (locally and on the Live fallback) and closes the person's sockets opened with older tokens (4001, auth_revoked) within the event's delivery; bots' API-token sockets stay. test/revocation.test.jsOpenVibers · 24 Sept 2026
a2b12b5
-
?token= on /ws/chat is deprecated (C-05): still honoured for the bots that use it, counted in /metrics chat_ws_url_token_uses{kind}; bots authenticate the upgrade with an Authorization header (tested) and browsers with their first join message. POST /api/chat/send is the bots' global-chat API, no longer a browser fallback (C-06)OpenVibers · 24 Sept 2026
01081ad
-
GET /metrics: chat_auth_resolutions{via=local|live|rejected}, where sign-ins were decided since startOpenVibers · 24 Sept 2026
6b68f57
More commits