{"id":"pst_01M54Y8YMF8S26SQYTRXBJ23HC","url":"https://openvibe.blog/@openvibe/patch-notes-80-changes-across-29-sites-oct-17","blog":{"id":"blg_01M362MF0EDJ7QHQTRD8A3Q981","handle":"openvibe","title":"The OpenVibe blog","url":"https://openvibe.blog/"},"title":"Patch notes: 80 changes across 29 sites (Oct 17)","summary":"What shipped on OpenVibe on 2026-10-17: 80 changes to OpenVibe.Live, OpenVibe.Host, OpenVibe.Media, OpenVibe.MediaHub, OpenVibe.Network, OpenVibe.Billing and 23 more.","body_markdown":"What shipped on OpenVibe on 2026-10-17: 80 changes to OpenVibe.Live, OpenVibe.Host, OpenVibe.Media, OpenVibe.MediaHub, OpenVibe.Network, OpenVibe.Billing and 23 more. Every line below is a commit message from the OpenVibers repositories, linked to the change itself.\n\n## OpenVibe.Live\n\n[openvibe.live](https://openvibe.live) · [repository](https://github.com/OpenVibers/OpenVibe.Live)\n\n- Home money counts: billing-stats reads Billing through the client's api object (the module root has no stats(); the home showed the tiles empty) (#186) ([`64d2cc0`](https://github.com/OpenVibers/OpenVibe.Live/commit/64d2cc037d0be99aa643af35c87cbc8a0831dc24))\n- Thumbnails: Media's job failing (5xx) is 'no picture yet' (200, remembered 5 min), not Media's 500 in every visitor's console; Donate window skips the balance while signed out (a 401 in the console) (#187) ([`77d6446`](https://github.com/OpenVibers/OpenVibe.Live/commit/77d64461b597d1c74f4412b43ef57821f6d02c0e))\n- Home stats: an expired snapshot is answered at once and recomputed behind it, one recompute for everyone (the hero's p95 was 1 s: whoever came after each 30 s expiry waited for the COUNTs) (#189) ([`343708d`](https://github.com/OpenVibers/OpenVibe.Live/commit/343708d6f259f84e965fe37669bd77989f372ed7))\n- Channel weather: an expired forecast is answered at once and refreshed behind it (p95 was 2.4 s), one shared refresh, 5 s timeouts, error answers never cached, unknown zips remembered (#188) ([`2ac32f7`](https://github.com/OpenVibers/OpenVibe.Live/commit/2ac32f765bb977c5924fa9c4d8cd6481d85591e3))\n- Channel: the offline header shows the streamer's picture in a circle (it only ever got the first letter, unstyled); one DOM helper for both headers (#190) ([`382cde0`](https://github.com/OpenVibers/OpenVibe.Live/commit/382cde0d8b8130f1a672c7c716eb45c8ad6113d5))\n- Phone chat buttons: the DM label no longer ends off-screen (button at 20px like Global's), and the Global chat button says Global, not G (#191) ([`0727cb4`](https://github.com/OpenVibers/OpenVibe.Live/commit/0727cb47ff44dc6b4e2116605e00d146e902b697))\n- Channels: a name nobody has shows 'No channel called @name' at that address (it flashed a toast and dropped the visitor on the home page while the server said 404) (#192) ([`053060c`](https://github.com/OpenVibers/OpenVibe.Live/commit/053060c185ec31bb957f5ae9698aa52b4f6703d1))\n- VODs, clips and old stream links that are gone say so at their address (they flashed a toast and dropped the visitor on a list while the server said 404) (#193) ([`22a7c49`](https://github.com/OpenVibers/OpenVibe.Live/commit/22a7c49402730efd64a581b176eeb26d841613d3))\n- Browser smoke: a channel nobody has must show the not-found page; CHANNEL names a real channel when BASE is production (#194) ([`3da9269`](https://github.com/OpenVibers/OpenVibe.Live/commit/3da9269aca12059c94a6f9995a78cdd4d2e15f88))\n- Home hero: the AI copy rules live in one place (server/ai/hero-copy.js) and also refuse crude words, keyboard-mash names and viewer-count jokes ('testicle banter crew', 'qeqweqwe watchers', \"goosely's loyal 3 viewers\" were on the front… ([`eb0bc8f`](https://github.com/OpenVibers/OpenVibe.Live/commit/eb0bc8f4b4747fee95ba18770409fb2669fe0ef7))\n- Channel 'Most watched': its three Media reads in parallel and the answer kept a minute per channel (p95 was 0.77 s, sequential reads on every offline channel view) (#196) ([`9f04773`](https://github.com/OpenVibers/OpenVibe.Live/commit/9f0477376620909b3e45888286136d8b1313ed5c))\n- /live-notify.js: cached 5 minutes, then stale-while-revalidate (other sites load it at a fixed address on every page view; ~980 full downloads in 3 h at max-age=0) (#197) ([`a3e511c`](https://github.com/OpenVibers/OpenVibe.Live/commit/a3e511c6cf6428c48964948be171988fc87b2c54))\n- Thumbnails: an audio-only recording (Media's media.no_video) is asked about once a day, not hourly (three VODs cost Media a job an hour each) (#198) ([`09426db`](https://github.com/OpenVibers/OpenVibe.Live/commit/09426db920909fa5026ce98504a5fdd16836c3dd))\n- Not-found page: a long @name wraps (the full browser smoke saw /@no_such_channel_x9 overflow a 320px phone) (#199) ([`fce3696`](https://github.com/OpenVibers/OpenVibe.Live/commit/fce36962ad3a47a673e03a064bda6f598bc213f6))\n- API docs: payments go through OpenVibe.Billing (the page still described Live's own orders and webhooks, removed at the cutover) (#200) ([`cb98635`](https://github.com/OpenVibers/OpenVibe.Live/commit/cb986359d298c8fe5ce54714a141e1995bfeae29))\n- AI moments and auto clips: without an AI title, the stream's title and the time ('Fortnite! at 41:20'), not a frame caption's first words ('A Man With A Beard Is Speaking To') (#201) ([`c70583f`](https://github.com/OpenVibers/OpenVibe.Live/commit/c70583f96d954101ed26900cae87d8aacf8fd3c2))\n- Public AI text: no clothing, hair or face either; looks-titles fall back to stream title + time (#202) ([`681de23`](https://github.com/OpenVibers/OpenVibe.Live/commit/681de2389870f27c8f2ad889b75c560804289666))\n\n## OpenVibe.Host\n\n[openvibe.host](https://openvibe.host) · [repository](https://github.com/OpenVibers/OpenVibe.Host)\n\n- nginx: GET /auth/me on the API zone (it runs on every page load; the sign-in flow's 10/min showed a visitor opening a dozen pages as signed out, the browser check's 429s) (#124) ([`1b02baa`](https://github.com/OpenVibers/OpenVibe.Host/commit/1b02baa027d63daca0a66b8c80579ef4b1b6edbe))\n- nginx tenants: GET /auth/me on the API zone (the navbar's session read on every page load was held to the sign-in flow's 10/min) (#125) ([`626b04b`](https://github.com/OpenVibers/OpenVibe.Host/commit/626b04b493840e12deff6644297b5580e2c082b8))\n- deploy-proofs: socket handover for Network, Chat, the Tools gateway and Media (each answered every request through a restart) (#126) ([`fb35528`](https://github.com/OpenVibers/OpenVibe.Host/commit/fb355288a674934411bac72ec4ed64f1d62f03db))\n- Browser check: 320px wide by default too (six sites' home pages scrolled sideways on small phones without the check noticing) (#127) ([`c5f221b`](https://github.com/OpenVibers/OpenVibe.Host/commit/c5f221b467ec454efd8624a97e4fb4b8533227be))\n- openvibe-sdk v0.51.1 (was v0.50.1) (#128) ([`9ac53ae`](https://github.com/OpenVibers/OpenVibe.Host/commit/9ac53ae324224ff66d8eb85258a84bae44abbcdf))\n\n## OpenVibe.Media\n\n[openvibe.media](https://openvibe.media) · [repository](https://github.com/OpenVibers/OpenVibe.Media)\n\n- Thumbnails: a virtual clip takes its picture from its VOD at the clip's start (clips 450, 453-456 failed generate_failed on every page view; a clip whose VOD is gone is media_unavailable, 404) (#136) ([`e9ceac2`](https://github.com/OpenVibers/OpenVibe.Media/commit/e9ceac2e6a07294e895c3f8860779922f910f76f))\n- Zero-downtime restarts: systemd owns Media's listener (openvibe-media.socket); the process listens on fd 3 when handed it, as Live and Network (#137) ([`76fbc8f`](https://github.com/OpenVibers/OpenVibe.Media/commit/76fbc8f11e6c836e34e345be20956b487e35b4a2))\n- Readiness: virtual clips are not objects with no good copy (their bytes are their VOD's; five held /api/ready at degraded) (#138) ([`6b85ff4`](https://github.com/OpenVibers/OpenVibe.Media/commit/6b85ff43e1715486b6872f0b50ab04ce6cfd6931))\n- nginx: HSTS, nosniff and a referrer policy on openvibe.media (its pages sent no security headers) (#139) ([`ed5bef8`](https://github.com/OpenVibers/OpenVibe.Media/commit/ed5bef87785a154ba47ed012b906ee3e376a0c0a))\n- Not found: an unknown /api path answers JSON ({ error: 'Not found' }), as Media's API routes do, not the HTML page (#140) ([`868ca8c`](https://github.com/OpenVibers/OpenVibe.Media/commit/868ca8cfc023942b8a3df7e646dba2b5d7b0e23c))\n\n## OpenVibe.MediaHub\n\n[openvibe.video](https://openvibe.video) · [repository](https://github.com/OpenVibers/OpenVibe.MediaHub)\n\n- Video channel page: a name nobody has is a 404 (it was an empty 200 page linking to a Live channel that does not exist), and the header shows the person's picture over the letter (#89) ([`09245b6`](https://github.com/OpenVibers/OpenVibe.MediaHub/commit/09245b65d5cb9a7a2dd54c4f0f98a358673fd842))\n- Phone 320px: list grids with a 290-420px minimum column use minmax(min(N, 100%), 1fr), so a single column fits a 320px screen (#90) ([`ab50343`](https://github.com/OpenVibers/OpenVibe.MediaHub/commit/ab503437e87dc5b5b9eb756608aa67191e9ceee2))\n- Video watch pages: the byline shows the streamer's or uploader's picture over the letter, as the channel page does since #89 (#91) ([`0ed3ca2`](https://github.com/OpenVibers/OpenVibe.MediaHub/commit/0ed3ca204c536043285e4498ea21e51a47f2e588))\n- Video host: an unknown /api path is a JSON 404 problem, not the HTML not-found page (#92) ([`c11d362`](https://github.com/OpenVibers/OpenVibe.MediaHub/commit/c11d36258deb4177c39a628d9bbaafe891fbaf6b))\n- Video watch pages: the page title names the channel and the day ('Fortnite!' titled twelve different recordings' pages) (#93) ([`d0bb4ae`](https://github.com/OpenVibers/OpenVibe.MediaHub/commit/d0bb4ae62c9f9b40c9d7d7863227c0259190caca))\n\n## OpenVibe.Network\n\n[openvibe.network](https://openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.Network)\n\n- Zero-downtime restarts: systemd owns Network's listener (openvibe-network.socket); the process listens on fd 3 when handed it (each restart was ~7 s of 502s for every site's sign-in and navbar) (#267) ([`352fb81`](https://github.com/OpenVibers/OpenVibe.Network/commit/352fb810e1c5ab0bbdc18038952a05d70f48e53e))\n- Boot: log each seed step that takes 250 ms or more (the seed is ~5.7 s of a 7 s boot, and a restart's queued requests wait for it) (#268) ([`1248580`](https://github.com/OpenVibers/OpenVibe.Network/commit/124858021e2b7929bb3c7cd65407e4c052cf48f4))\n- Boot: seed the identity legacy map with one INSERT … SELECT per source (the per-row loop over 28k guests was 6.4 s of every boot) (#269) ([`e633dfa`](https://github.com/OpenVibers/OpenVibe.Network/commit/e633dfa92912fadfd69466c6a0d2a0aa6108d2b3))\n- CORS: first-party preflights are cached 10 minutes (Access-Control-Max-Age 600); the notification polls preflighted every 5 s, 22% of Network's requests (#270) ([`40c0806`](https://github.com/OpenVibers/OpenVibe.Network/commit/40c08062da8a6b2d09e2363844812c40993a7d21))\n- Phone 320px: the home hero's one-column grid is minmax(0, 1fr) (a 1fr column took its content's width and overflowed a 320px screen by 33px) (#271) ([`144634f`](https://github.com/OpenVibers/OpenVibe.Network/commit/144634fd06935cb901dc48f6aef3fe62fbec81ad))\n\n## OpenVibe.Billing\n\n[billing.openvibe.network](https://billing.openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.Billing)\n\n- Test: a delivery signed and wrapped as OpenVibe.Events sends it ({ event, seq }) reaches the account-data consumer through POST /internal/events (#80) ([`75d74a9`](https://github.com/OpenVibers/OpenVibe.Billing/commit/75d74a91818f049ab56cea9ebd6ef6000e7f6495))\n- stats: the comment said Live's imported Vibes count in bits_total; imports are 'import' transactions and count nowhere (#81) ([`058385b`](https://github.com/OpenVibers/OpenVibe.Billing/commit/058385b1fe8ab3618a5fd03d81de19ba211ad2df))\n- Phone 320px: list grids with a 290-420px minimum column use minmax(min(N, 100%), 1fr), so a single column fits a 320px screen (#82) ([`9574a28`](https://github.com/OpenVibers/OpenVibe.Billing/commit/9574a2877460250b04e0018915cd3cba651c4ec7))\n\n## OpenVibe.Chat\n\n[openvibe.chat](https://openvibe.chat) · [repository](https://github.com/OpenVibers/OpenVibe.Chat)\n\n- Zero-downtime restarts: systemd owns Chat's listener (openvibe-chat.socket); the process listens on fd 3 when handed it, as Live and Network (#114) ([`d78e1d4`](https://github.com/OpenVibers/OpenVibe.Chat/commit/d78e1d4fc095e651994853b7f26ade35ec1d6b90))\n- Chat: the IP-resolution diagnostic only with CHAT_LOG_IP_RESOLUTION=1 (it logged every connection's addresses: its 'first few' test never stopped) (#115) ([`81fdcf4`](https://github.com/OpenVibers/OpenVibe.Chat/commit/81fdcf45219bd71428f7af88007074dd05dd09f4))\n- openvibe.chat pages: a Content-Security-Policy with a per-response nonce (scripts only from the site, inline ones only with the nonce): Chat renders other people's words live and had none (#116) ([`14573f8`](https://github.com/OpenVibers/OpenVibe.Chat/commit/14573f89ef43c31bc11f17cc039f09a52489c134))\n\n## OpenVibe.Games\n\n[openvibe.games](https://openvibe.games) · [repository](https://github.com/OpenVibers/OpenVibe.Games)\n\n- Phone 320px: 'OpenVibe.Games' in the hero takes the width it fits in under 420px (at 42px it overflowed a 320px screen by 62px) (#97) ([`6271799`](https://github.com/OpenVibers/OpenVibe.Games/commit/627179994aea8110759e47b752f1bba653837e75))\n- gitleaks: the made-up session token's allowlist also covers its first-commit path (sqlite/sqliteStore.test.ts), so main's secrets scan is green again (#99) ([`c852268`](https://github.com/OpenVibers/OpenVibe.Games/commit/c8522681ed4b23b9639772341b0e4d1851a80334))\n- nginx: the repo vhost is production's again (www redirect, security.txt, /tos) plus /internal/ and /metrics closed at the edge and HSTS, nosniff and a referrer policy (#98) ([`96885a9`](https://github.com/OpenVibers/OpenVibe.Games/commit/96885a904345da4200eac18d49b9adad3825660a))\n\n## OpenVibe.Reviews\n\n[openvibe.reviews](https://openvibe.reviews) · [repository](https://github.com/OpenVibers/OpenVibe.Reviews)\n\n- nginx: GET /auth/me on the API zone (it runs on every page load; the sign-in flow's 10/min showed a visitor opening a dozen pages as signed out, the browser check's 429s) (#71) ([`a08cee1`](https://github.com/OpenVibers/OpenVibe.Reviews/commit/a08cee1bcd4a9ff65dd87f7637aa4661ea71b01f))\n- Phone 320px: the header search form can shrink (min-width 0), it overflowed a 320px screen by 33px (#72) ([`5eee6df`](https://github.com/OpenVibers/OpenVibe.Reviews/commit/5eee6df28a1f12be3c20390631a1f33df8cab6c2))\n- GET /auth/me signed out answers 200 { user: null } like Blog, Community and Wiki (a 401 showed in every signed-out visitor's console) (#73) ([`17cca32`](https://github.com/OpenVibers/OpenVibe.Reviews/commit/17cca328e1b8423ea638c53ef4616b27cea3589c))\n\n## OpenVibe.Tools\n\n[openvibe.tools](https://openvibe.tools) · [repository](https://github.com/OpenVibers/OpenVibe.Tools)\n\n- Gateway zero-downtime restarts: systemd owns the listener (openvibe-tools.socket); the process listens on fd 3 when handed it, as Live and Network (#76) ([`4b97024`](https://github.com/OpenVibers/OpenVibe.Tools/commit/4b97024e94cca7a223d3d4ea9b5e4b818f6ad911))\n- Phone 320px: list grids with a 290-420px minimum column use minmax(min(N, 100%), 1fr), so a single column fits a 320px screen (#77) ([`528d61f`](https://github.com/OpenVibers/OpenVibe.Tools/commit/528d61f13387ea384d9afa70fa637af25fa7fd5b))\n- GET /auth/me signed out answers 200 { user: null } like Blog, Community and Wiki (a 401 showed in every signed-out visitor's console) (#78) ([`0f2f698`](https://github.com/OpenVibers/OpenVibe.Tools/commit/0f2f69850b0aa0f348772f43137b72e25bb7c855))\n\n## OpenVibe.Bot\n\n[openvibe.bot](https://openvibe.bot) · [repository](https://github.com/OpenVibers/OpenVibe.Bot)\n\n- nginx: GET /auth/me on the API zone (it runs on every page load; the sign-in flow's 10/min showed a visitor opening a dozen pages as signed out, the browser check's 429s) (#136) ([`4190db8`](https://github.com/OpenVibers/OpenVibe.Bot/commit/4190db8147a4472b7bf9bef0be730baffacb20b8))\n- GET /auth/me signed out answers 200 { user: null } like Blog, Community and Wiki (a 401 showed in every signed-out visitor's console) (#137) ([`6f53fc4`](https://github.com/OpenVibers/OpenVibe.Bot/commit/6f53fc4f2fcf20bacbce9d16c6cc22ab281b0c37))\n\n## OpenVibe.Community\n\n[openvibe.community](https://openvibe.community) · [repository](https://github.com/OpenVibers/OpenVibe.Community)\n\n- Phone 320px: list grids with a 290-420px minimum column use minmax(min(N, 100%), 1fr), so a single column fits a 320px screen (#92) ([`e28ad14`](https://github.com/OpenVibers/OpenVibe.Community/commit/e28ad14900455d0c48466cc6f637904b1fe08b72))\n- Search: an untitled paste is named after its AI summary's first sentence or its first line (Search listed 'Untitled' as a result's title) (#93) ([`099e9b5`](https://github.com/OpenVibers/OpenVibe.Community/commit/099e9b59a186568dfe18efee488ed98ad0484080))\n\n## OpenVibe.Coupons\n\n[openvibe.coupons](https://openvibe.coupons) · [repository](https://github.com/OpenVibers/OpenVibe.Coupons)\n\n- nginx: GET /auth/me on the API zone (it runs on every page load; the sign-in flow's 10/min showed a visitor opening a dozen pages as signed out, the browser check's 429s) (#72) ([`67c7558`](https://github.com/OpenVibers/OpenVibe.Coupons/commit/67c75588c079c1a27d85a788ab3d03f95b6e7bec))\n- openvibe-sdk v0.51.1 (was v0.50.1) (#73) ([`7c70c1a`](https://github.com/OpenVibers/OpenVibe.Coupons/commit/7c70c1a1dcb5841303e2da230aa3a2de5fd27719))\n\n## OpenVibe.Deals\n\n[openvibe.deals](https://openvibe.deals) · [repository](https://github.com/OpenVibers/OpenVibe.Deals)\n\n- nginx: GET /auth/me on the API zone (it runs on every page load; the sign-in flow's 10/min showed a visitor opening a dozen pages as signed out, the browser check's 429s) (#69) ([`e8dbf05`](https://github.com/OpenVibers/OpenVibe.Deals/commit/e8dbf050ca4e05e591660c5c20a3cd991a01a423))\n- openvibe-sdk v0.51.1 (was v0.50.1) (#70) ([`28ae001`](https://github.com/OpenVibers/OpenVibe.Deals/commit/28ae00124276a6e470bdb2825e90ed118d814b9d))\n\n## OpenVibe.Help\n\n[openvibe.help](https://openvibe.help) · [repository](https://github.com/OpenVibers/OpenVibe.Help)\n\n- Phone 320px: the questions grid's 320px minimum column no longer overflows a 320px screen (minmax(min(320px, 100%), 1fr)) (#63) ([`705081e`](https://github.com/OpenVibers/OpenVibe.Help/commit/705081eeb92871afbe877c6256f851e9900b6fb8))\n- Help: a site's page is titled 'Help with <site>' (OpenVibe.Search's page was titled 'Search', like Help's own search page) (#64) ([`b7e3291`](https://github.com/OpenVibers/OpenVibe.Help/commit/b7e329197ab8c6a060e1ba290917fae775d1b102))\n\n## OpenVibe.News\n\n[openvibe.news](https://openvibe.news) · [repository](https://github.com/OpenVibers/OpenVibe.News)\n\n- nginx: GET /auth/me on the API zone (it runs on every page load; the sign-in flow's 10/min showed a visitor opening a dozen pages as signed out, the browser check's 429s) (#75) ([`685a20e`](https://github.com/OpenVibers/OpenVibe.News/commit/685a20eee35af503c31d21016bdf7c31fd3b1a10))\n- openvibe-sdk v0.51.1 (was v0.50.1) (#76) ([`bdce1d4`](https://github.com/OpenVibers/OpenVibe.News/commit/bdce1d45258c9d28ed3020c83442a211ef984559))\n\n## OpenVibe.Tips\n\n[openvibe.tips](https://openvibe.tips) · [repository](https://github.com/OpenVibers/OpenVibe.Tips)\n\n- nginx: GET /auth/me on the API zone (it runs on every page load; the sign-in flow's 10/min showed a visitor opening a dozen pages as signed out, the browser check's 429s) (#68) ([`390abf1`](https://github.com/OpenVibers/OpenVibe.Tips/commit/390abf1eb1a64697df51ca0f625a1f57ec456277))\n- GET /auth/me signed out answers 200 { user: null } like Blog, Community and Wiki (a 401 showed in every signed-out visitor's console) (#69) ([`c64ab90`](https://github.com/OpenVibers/OpenVibe.Tips/commit/c64ab905a311ec4f1114c6326b651d4eb1451a2b))\n\n## OpenVibe.Trade\n\n[openvibe.trade](https://openvibe.trade) · [repository](https://github.com/OpenVibers/OpenVibe.Trade)\n\n- nginx: GET /auth/me on the API zone (it runs on every page load; the sign-in flow's 10/min showed a visitor opening a dozen pages as signed out, the browser check's 429s) (#77) ([`2d1aaf7`](https://github.com/OpenVibers/OpenVibe.Trade/commit/2d1aaf7342876a5c7b41f3a190e912916a75c9c0))\n- openvibe-sdk v0.51.1 (was v0.50.1) (#78) ([`ca5960e`](https://github.com/OpenVibers/OpenVibe.Trade/commit/ca5960ebbc55c55e5791389ef4c5309da7486a71))\n\n## OpenVibe.VIP\n\n[openvibe.vip](https://openvibe.vip) · [repository](https://github.com/OpenVibers/OpenVibe.VIP)\n\n- nginx: GET /auth/me on the API zone (it runs on every page load; the sign-in flow's 10/min showed a visitor opening a dozen pages as signed out, the browser check's 429s) (#70) ([`614b0e6`](https://github.com/OpenVibers/OpenVibe.VIP/commit/614b0e6fa8e19da3feb701b01276de1dc118c052))\n- GET /auth/me signed out answers 200 { user: null } like Blog, Community and Wiki (a 401 showed in every signed-out visitor's console) (#71) ([`9dbf790`](https://github.com/OpenVibers/OpenVibe.VIP/commit/9dbf7900e794bc0bf6bedb347679a9e4c9644eec))\n\n## OpenVibe.AI\n\n[ai.openvibe.services](https://ai.openvibe.services) · [repository](https://github.com/OpenVibers/OpenVibe.AI)\n\n- live.hero.slogans: nothing crude or sexual and no keyboard-mash usernames on the front page ('testicle banter crew', 'qeqweqwe watchers' were written on 2026-10-17) (#118) ([`62709f8`](https://github.com/OpenVibers/OpenVibe.AI/commit/62709f85afe66a699204b763491d2e4b9b482bee))\n\n## OpenVibe.Blog\n\n[openvibe.blog](https://openvibe.blog) · [repository](https://github.com/OpenVibers/OpenVibe.Blog)\n\n- Patch notes: the day ends each title ('Patch notes: 80 changes across 36 sites' was three different posts' title) (#65) ([`8d08c2d`](https://github.com/OpenVibers/OpenVibe.Blog/commit/8d08c2da587672e4609ef571414741814aeb4410))\n\n## OpenVibe.Food\n\n[openvibe.food](https://openvibe.food) · [repository](https://github.com/OpenVibers/OpenVibe.Food)\n\n- Phone 320px: list grids with a 290-420px minimum column use minmax(min(N, 100%), 1fr), so a single column fits a 320px screen (#64) ([`a5ea8d9`](https://github.com/OpenVibers/OpenVibe.Food/commit/a5ea8d9fdc9b10988224b12aa610d59d5a8870c9))\n\n## OpenRestream\n\n[openre.stream](https://openre.stream) · [repository](https://github.com/OpenVibers/OpenRestream)\n\n- GET /auth/me signed out answers 200 { user: null } like Blog, Community and Wiki (a 401 showed in every signed-out visitor's console) (#86) ([`f1be993`](https://github.com/OpenVibers/OpenRestream/commit/f1be9931b9670ba45e3101e90c43f57c4a8d2835))\n\n## OpenVibe.Quest\n\n[openvibe.quest](https://openvibe.quest) · [repository](https://github.com/OpenVibers/OpenVibe.Quest)\n\n- Phone 320px: the quest grid's 320px minimum column no longer overflows a 320px screen (minmax(min(320px, 100%), 1fr)) (#63) ([`efa09f3`](https://github.com/OpenVibers/OpenVibe.Quest/commit/efa09f30b7dba4204b731002c90e1bbe0a5cdce3))\n\n## OpenVibe.Rent\n\n[openvibe.rent](https://openvibe.rent) · [repository](https://github.com/OpenVibers/OpenVibe.Rent)\n\n- Phone 320px: list grids with a 290-420px minimum column use minmax(min(N, 100%), 1fr), so a single column fits a 320px screen (#75) ([`3b01950`](https://github.com/OpenVibers/OpenVibe.Rent/commit/3b019509d2a7fc5914c6233205aab6e2ac8fed91))\n\n## OpenVibe.Space\n\n[openvibe.space](https://openvibe.space) · [repository](https://github.com/OpenVibers/OpenVibe.Space)\n\n- Phone 320px: list grids with a 290-420px minimum column use minmax(min(N, 100%), 1fr), so a single column fits a 320px screen (#70) ([`43d5835`](https://github.com/OpenVibers/OpenVibe.Space/commit/43d5835eda07fb0646a174afec55b1880b2bcd82))\n\n## OpenVibe.Watch\n\n[openvibe.watch](https://openvibe.watch) · [repository](https://github.com/OpenVibers/OpenVibe.Watch)\n\n- Phone 320px: list grids with a 290-420px minimum column use minmax(min(N, 100%), 1fr), so a single column fits a 320px screen (#78) ([`d251173`](https://github.com/OpenVibers/OpenVibe.Watch/commit/d251173f8f197aba3fe287c7949914e23dcf23cf))\n\n## OpenVibe.Wiki\n\n[openvibe.wiki](https://openvibe.wiki) · [repository](https://github.com/OpenVibers/OpenVibe.Wiki)\n\n- Phone 320px: the header search form can shrink (min-width 0), it overflowed a 320px screen by 33px (#77) ([`5547bb9`](https://github.com/OpenVibers/OpenVibe.Wiki/commit/5547bb9664c75837522e80cbf3a5ea41a231eb54))\n\n## OpenVibe.Work\n\n[openvibe.work](https://openvibe.work) · [repository](https://github.com/OpenVibers/OpenVibe.Work)\n\n- Phone 320px: list grids with a 290-420px minimum column use minmax(min(N, 100%), 1fr), so a single column fits a 320px screen (#53) ([`0a67ba6`](https://github.com/OpenVibers/OpenVibe.Work/commit/0a67ba61ac28318ead0417fd3e27fc7d38b2686f))\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-10-17T12:44:32.807Z","revised_at":"2026-10-17T12:44:32.791Z","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","host","media","media-hub","network","billing","chat","games","reviews","tools"],"categories":[],"series":{"title":"Patch notes","url":"https://openvibe.blog/@openvibe/series/patch-notes","position":null},"media":[],"citations":[],"indexability":{"indexable":true,"robots":"index, follow","reasons":[]}}