Skip to content
-
Soft 404s end: a page path that names nothing answers 404 with the SPA shell instead of 200 (requirement ledger D43-D46). The fallback in server/index.js is now server/web/page-status.js spaFallback, which asks statusFor(): / and /vods /clips /pastes /updates /documentation /settings /admin /themes (exact path), /dashboard/* /broadcast/* /chat/* /arena/* (any depth, they route sub-paths themselves), /@user and /@user/<slot> for a user that exists (the client's name rule, case-insensitive), /vod/:id and /clip/:id for a Media item this visitor may see (a private one is a 404 to everyone but its owners and staff, by the same rule in server/media-proxy/access.js that already answers the API), /p/:slug for a paste that exists, and /recap/:id and /stream/:id for a stream that exists stay 200; everything else is 404 (typos, /search, /login, /vods/extra, /@nobody, /vod/999, /p/missing, /wp-login.php). Server routes (API, docs, overlays, popouts, legal pages, static files, the SEO-rendered pages) answer before it and are unchanged; /api/* keeps its JSON 404. Cost: the fixed routes are a table lookup and never wait; users and streams are one SQLite read; Media and paste lookups are cached per id (a minute when found, 30 s when missing, 10 s after an upstream error), shared by concurrent requests, and wait at most 2.5 s; when Media or Community cannot answer the page is 200, never a false 404. The cache keeps only the fields the visibility rule reads. The SEO renderer now remembers a Media/Community 404 too, so a dead link is not a round trip per request. Client: an unknown path renders a Page not found view (showNotFound() in public/js/app.js, filling a new empty #page-not-found shell in index.html) with links home, to VODs, clips and chat, instead of silently showing the home page; an invalid /@name does the same. Links that pointed at pages that never existed: the pastes limit notice's Log in (navigate('/login')) now signs in, the IRL Pro tip names /overlay/chat/<username> instead of /embed/chat/<id>, and the home page's WebSite JSON-LD drops its SearchAction for a /search page that does not exist. docs/architecture.md (Unknown pages) and AGENTS.md (new top-level routes go in routeFromURL() and page-status.js) say so. Tests: test/page-status.test.js runs the SEO middleware and the real fallback over a temp database with Media and Community stubbed: every real route 200 with and without Accept: text/html, unknown paths 404, private VOD/clip 404 to strangers and 200 to owners and staff, the 404 body is the shell and carries no private title, HEAD matches GET, one Media fetch per id, the home page never waits on a lookup, Media down or slow gives 200 within the deadline, index.js mounts this fallback last, and every client route is known to the server. test/browser/smoke.js adds /no-such-page (renders page-not-found at every width). Size budgets unchanged in practice (eager JS 1108.6 / 1150 KB raw, 251.3 / 260 KB brotli)OpenVibers · 23 Sept 2026
39355a0c
-
AGENTS.md: the legacy vods/clips/pastes tables are never read or written (the test enforces both); Media outcomes arrive over EventsOpenVibers · 23 Sept 2026
0981a8a6
-
VOD and clip comments are OpenVibe.Community threads (Wave 5 exit: Live and a second product share one thread)OpenVibers · 23 Sept 2026
b8afb713
-
Billing client behind BILLING_AUTHORITY (default live: no behaviour change); owner-controlled money freeze; tripwire on Live's money columns under billing (Wave 8 cutover preparation)OpenVibers · 23 Sept 2026
c3847871
-
openvibe-shared is the pinned OpenVibe.Shared v1.0.0 release: /shared/* serves the package's own browser-file list (now with nav-icons.js and user-card.js) from node_modules, vendor/openvibe-shared is goneOpenVibers · 23 Sept 2026
c9af7800
-
Review pass: private calls survive list pushes, featured box boots once, short-lived TURN credentials for the SFU tooOpenVibers · 17 Sept 2026
17e27d0d
-
Stream keys no longer public; pages load only what their route needs; safe deploysOpenVibers · 17 Sept 2026
8fa04ccc
-
Arena: streamer-vs-streamer tab — ratings from analytics, AI personas + portraits, daily battles, crowd votesOpenVibers · 29 Aug 2026
bfea01cd
-
Docs served on-site at /docs/<name>; WHIP ingest host → ingest.openvibe.liveOpenVibers · 29 Aug 2026
ddb287ac
-
WHIP: open CORS so a backend-less web page can publish; docs/whip.md + browser publisherOpenVibers · 28 Aug 2026
d10a5cf3
-
Initial OpenVibe releaseOpenVibers · 17 Aug 2026
ac0d6a47