openvibers/openvibe.sites Commits

Placeholders for openvibe.website, openvibe.help and openvibe.bot (zones on Cloudflare and wildcard certificates issued 2026-09-28): the AI-assisted website and small-app builder with real files and network features, the help and support center with one ticket conversation on the web and by email, and shareable robots and devices with pairing, control leases and safety on the device. OpenVibe.AI's public home moves to ai.openvibe.services (the AI gateway: providers, routing and fallback, templates and workflows, runs, keys and budgets); ai.openvibe.network becomes a moved notice (kind: moved, noindex, no sitemap) until every client has moved, then it redirects. openvibe.services describes the gateway into everything programmable: Discover, Build, Operate, Learn. npm test: 30 pages (27 placeholders, 3 notices) current, honest and complete.

OP OpenVibers committed 28 Sept 2026 · 6b289db3df · 107 files, +3771 −136


Changes

ddiff --git a/README.md b/README.md
iindex 8d25f73..7bb0dc4 100644
---- a/README.md
++++ b/README.md
@@@ -6,11 +6,12 @@ Static front pages for the OpenVibe domains that are not public applications yet
2026-09-24 (`sites.json`; production ran `18166b1` when this was written): `openvibe.news`,
`.reviews`, `.tips`, `.vip`, `.trade`, `.host`, `.deals`, `.coupons`, `openre.stream`, the planned products added
2026-09-28 whose repositories do not exist yet (`noRepo`: `openvibe.pics`, `.download`, `.space`, `.food`, `.quest`,
--`.rent`, `.homes`, `.services`, `.run`, `.video`), and `auth`,
--`api`, `admin`, `themes` and `ai` under `openvibe.network`. Most of these already run on the host
++`.rent`, `.homes`, `.services`, `.run`, `.video`, `.website`, `.help`, `.bot`), `ai.openvibe.services` (OpenVibe.AI's
++public home), and `auth`, `api`, `admin` and `themes` under `openvibe.network`. Most of these already run on the host
behind loopback (News, Reviews, Tips, VIP, Trade, Host, Deals, Coupons, OpenRe.Stream, AI); the page stays until the service launches publicly on its domain, and says
--so (see facts below). Two more are notices, not placeholders (`kind` in `sites.json`: noindex, no
--sitemap, not listed as opening): `realtime.openvibe.network` says OpenVibe.Realtime is closed (ADR-005:
++so (see facts below). Three more are notices, not placeholders (`kind` in `sites.json`: noindex, no
++sitemap, not listed as opening): `ai.openvibe.network` says OpenVibe.AI moved to `ai.openvibe.services` (it redirects once
++every client has moved), `realtime.openvibe.network` says OpenVibe.Realtime is closed (ADR-005:
realtime delivery is part of OpenVibe.Events), and `status.openvibe.network` points at the status
Network publishes (`openvibe.network/status`), with a live summary read in the browser from the
CORS-open `/api/v1/registry/health`.
ddiff --git a/STATUS.json b/STATUS.json
iindex dc585bd..004740d 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -22,12 +22,16 @@
"openvibe.services",
"openvibe.run",
"openvibe.video",
++ "openvibe.website",
++ "openvibe.help",
++ "openvibe.bot",
"openre.stream",
"auth.openvibe.network",
"api.openvibe.network",
"admin.openvibe.network",
"themes.openvibe.network",
-- "ai.openvibe.network",
++ "ai.openvibe.services",
++ "ai.openvibe.network (moved notice)",
"realtime.openvibe.network (closed notice)",
"status.openvibe.network (status notice)"
],
ddiff --git a/build.js b/build.js
iindex 567d4fc..c6863fc 100644
---- a/build.js
++++ b/build.js
@@@ -82,6 +82,8 @@ function statusText(site) {
// A product planned before its repository exists names itself, never another repository.
const repo = site.plannedRepo ? repoLink(site.plannedRepo) : site.noRepo ? `<strong>${esc(site.name)}</strong>` : '<code>OpenVibe.Network</code>';
const waits = site.launch ? ` The public launch is waiting for ${esc(site.launch)}.` : '';
++ // A product that moved to another address (site.kind: moved): the first link is where it went.
++ if (site.kind === 'moved') return `${repo} moved to <a href="${esc(site.links[0][1])}">${esc(site.links[0][1].replace(/^https?:\/\/|\/$/g, ''))}</a>; this address serves only this notice.`;
if (k === 'running') return `${repo} is built and its service runs on the network's host, but it is not public yet: ${MARKER}.${waits}`;
if (k === 'code') return `${repo} has code, but nothing is deployed yet: ${MARKER}.${waits}`;
if (k === 'surface') {
@@@ -117,7 +119,7 @@ function page(site) {
const title = `${site.name} — ${site.tagline}`;
const ogImage = `${NET.networkUrl}/assets/logo-512.png`;
const others = NET.liveSites.filter(s => s.url !== url.slice(0, -1));
-- // A notice (site.kind: closed) is not a placeholder for a product: it says where the work went, is not
++ // A notice (site.kind: closed or moved) is not a placeholder for a product: it says where the work went, is not
// indexed and is not listed among the domains still to open.
const notice = !!site.kind;
const siblings = catalog.sites.filter(s => s.domain !== site.domain && !s.kind);
ddiff --git a/deploy/nginx/ai.openvibe.services.conf b/deploy/nginx/ai.openvibe.services.conf
nnew file mode 100644
iindex 0000000..c2840a1
---- /dev/null
++++ b/deploy/nginx/ai.openvibe.services.conf
@@@ -0,0 +1,101 @@
++# ai.openvibe.services — static front page (OpenVibe.Sites). Generated by build.js; edit sites.json, not this.
++server {
++ listen 80;
++ listen [::]:80;
++ server_name ai.openvibe.services;
++ return 301 https://ai.openvibe.services$request_uri;
++}
++
++server {
++ listen 443 ssl;
++ listen [::]:443 ssl;
++ http2 on;
++ server_name ai.openvibe.services;
++ include snippets/security-txt.conf; # /.well-known/security.txt (host file; SECURITY.md in every repo)
++
++ ssl_certificate /etc/letsencrypt/live/openvibe.services/fullchain.pem;
++ ssl_certificate_key /etc/letsencrypt/live/openvibe.services/privkey.pem;
++
++ root /opt/openvibe.sites/dist/ai.openvibe.services;
++ index index.html;
++
++ access_log /var/log/nginx/ai.openvibe.services.access.log;
++ error_log /var/log/nginx/ai.openvibe.services.error.log;
++
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++
++ gzip on;
++ gzip_types text/html text/plain text/css application/json application/javascript application/xml image/svg+xml application/manifest+json;
++
++ # An add_header inside a location replaces the server's list (nginx does not merge them), so every
++ # location that sets its own header repeats the security headers.
++ location = /robots.txt {
++ add_header Cache-Control "public, max-age=3600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /sitemap.xml {
++ types { application/xml xml; }
++ add_header Cache-Control "public, max-age=3600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /manifest.webmanifest {
++ types { application/manifest+json webmanifest; }
++ add_header Cache-Control "public, max-age=86400";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /status.json {
++ add_header Cache-Control "public, max-age=600";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /release.json {
++ add_header Cache-Control "no-cache";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ # This repository's pinned shared browser files (navbar, footer, theme loader…), one copy for every Sites
++ # vhost. Pages ask for them content-addressed (?v=); the few loaded without it (navbar's companions) get
++ # the same hour.
++ location ^~ /shared/ {
++ alias /opt/openvibe.sites/dist/_shared/;
++ add_header Cache-Control "public, max-age=3600";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++
++ # Only the files in dist/ exist; anything else is a real 404 with a page, never the front page.
++ error_page 404 /404.html;
++ location = /404.html { internal; }
++
++ location / {
++ add_header Cache-Control "public, max-age=600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ try_files $uri $uri.html $uri/ =404;
++ }
++
++ location ~ /\.(?!well-known) { deny all; }
++}
ddiff --git a/deploy/nginx/openvibe.bot.conf b/deploy/nginx/openvibe.bot.conf
nnew file mode 100644
iindex 0000000..1a9ad89
---- /dev/null
++++ b/deploy/nginx/openvibe.bot.conf
@@@ -0,0 +1,111 @@
++# openvibe.bot — static front page (OpenVibe.Sites). Generated by build.js; edit sites.json, not this.
++server {
++ listen 80;
++ listen [::]:80;
++ server_name openvibe.bot www.openvibe.bot;
++ return 301 https://openvibe.bot$request_uri;
++}
++
++server {
++ listen 443 ssl;
++ listen [::]:443 ssl;
++ http2 on;
++ server_name www.openvibe.bot;
++ ssl_certificate /etc/letsencrypt/live/openvibe.bot/fullchain.pem;
++ ssl_certificate_key /etc/letsencrypt/live/openvibe.bot/privkey.pem;
++ return 301 https://openvibe.bot$request_uri;
++}
++
++server {
++ listen 443 ssl;
++ listen [::]:443 ssl;
++ http2 on;
++ server_name openvibe.bot;
++ include snippets/security-txt.conf; # /.well-known/security.txt (host file; SECURITY.md in every repo)
++
++ ssl_certificate /etc/letsencrypt/live/openvibe.bot/fullchain.pem;
++ ssl_certificate_key /etc/letsencrypt/live/openvibe.bot/privkey.pem;
++
++ root /opt/openvibe.sites/dist/openvibe.bot;
++ index index.html;
++
++ access_log /var/log/nginx/openvibe.bot.access.log;
++ error_log /var/log/nginx/openvibe.bot.error.log;
++
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++
++ gzip on;
++ gzip_types text/html text/plain text/css application/json application/javascript application/xml image/svg+xml application/manifest+json;
++
++ # An add_header inside a location replaces the server's list (nginx does not merge them), so every
++ # location that sets its own header repeats the security headers.
++ location = /robots.txt {
++ add_header Cache-Control "public, max-age=3600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /sitemap.xml {
++ types { application/xml xml; }
++ add_header Cache-Control "public, max-age=3600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /manifest.webmanifest {
++ types { application/manifest+json webmanifest; }
++ add_header Cache-Control "public, max-age=86400";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /status.json {
++ add_header Cache-Control "public, max-age=600";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /release.json {
++ add_header Cache-Control "no-cache";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ # This repository's pinned shared browser files (navbar, footer, theme loader…), one copy for every Sites
++ # vhost. Pages ask for them content-addressed (?v=); the few loaded without it (navbar's companions) get
++ # the same hour.
++ location ^~ /shared/ {
++ alias /opt/openvibe.sites/dist/_shared/;
++ add_header Cache-Control "public, max-age=3600";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++
++ # Only the files in dist/ exist; anything else is a real 404 with a page, never the front page.
++ error_page 404 /404.html;
++ location = /404.html { internal; }
++
++ location / {
++ add_header Cache-Control "public, max-age=600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ try_files $uri $uri.html $uri/ =404;
++ }
++
++ location ~ /\.(?!well-known) { deny all; }
++}
ddiff --git a/deploy/nginx/openvibe.help.conf b/deploy/nginx/openvibe.help.conf
nnew file mode 100644
iindex 0000000..f31dd7a
---- /dev/null
++++ b/deploy/nginx/openvibe.help.conf
@@@ -0,0 +1,111 @@
++# openvibe.help — static front page (OpenVibe.Sites). Generated by build.js; edit sites.json, not this.
++server {
++ listen 80;
++ listen [::]:80;
++ server_name openvibe.help www.openvibe.help;
++ return 301 https://openvibe.help$request_uri;
++}
++
++server {
++ listen 443 ssl;
++ listen [::]:443 ssl;
++ http2 on;
++ server_name www.openvibe.help;
++ ssl_certificate /etc/letsencrypt/live/openvibe.help/fullchain.pem;
++ ssl_certificate_key /etc/letsencrypt/live/openvibe.help/privkey.pem;
++ return 301 https://openvibe.help$request_uri;
++}
++
++server {
++ listen 443 ssl;
++ listen [::]:443 ssl;
++ http2 on;
++ server_name openvibe.help;
++ include snippets/security-txt.conf; # /.well-known/security.txt (host file; SECURITY.md in every repo)
++
++ ssl_certificate /etc/letsencrypt/live/openvibe.help/fullchain.pem;
++ ssl_certificate_key /etc/letsencrypt/live/openvibe.help/privkey.pem;
++
++ root /opt/openvibe.sites/dist/openvibe.help;
++ index index.html;
++
++ access_log /var/log/nginx/openvibe.help.access.log;
++ error_log /var/log/nginx/openvibe.help.error.log;
++
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++
++ gzip on;
++ gzip_types text/html text/plain text/css application/json application/javascript application/xml image/svg+xml application/manifest+json;
++
++ # An add_header inside a location replaces the server's list (nginx does not merge them), so every
++ # location that sets its own header repeats the security headers.
++ location = /robots.txt {
++ add_header Cache-Control "public, max-age=3600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /sitemap.xml {
++ types { application/xml xml; }
++ add_header Cache-Control "public, max-age=3600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /manifest.webmanifest {
++ types { application/manifest+json webmanifest; }
++ add_header Cache-Control "public, max-age=86400";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /status.json {
++ add_header Cache-Control "public, max-age=600";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /release.json {
++ add_header Cache-Control "no-cache";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ # This repository's pinned shared browser files (navbar, footer, theme loader…), one copy for every Sites
++ # vhost. Pages ask for them content-addressed (?v=); the few loaded without it (navbar's companions) get
++ # the same hour.
++ location ^~ /shared/ {
++ alias /opt/openvibe.sites/dist/_shared/;
++ add_header Cache-Control "public, max-age=3600";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++
++ # Only the files in dist/ exist; anything else is a real 404 with a page, never the front page.
++ error_page 404 /404.html;
++ location = /404.html { internal; }
++
++ location / {
++ add_header Cache-Control "public, max-age=600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ try_files $uri $uri.html $uri/ =404;
++ }
++
++ location ~ /\.(?!well-known) { deny all; }
++}
ddiff --git a/deploy/nginx/openvibe.website.conf b/deploy/nginx/openvibe.website.conf
nnew file mode 100644
iindex 0000000..f1e0b8d
---- /dev/null
++++ b/deploy/nginx/openvibe.website.conf
@@@ -0,0 +1,111 @@
++# openvibe.website — static front page (OpenVibe.Sites). Generated by build.js; edit sites.json, not this.
++server {
++ listen 80;
++ listen [::]:80;
++ server_name openvibe.website www.openvibe.website;
++ return 301 https://openvibe.website$request_uri;
++}
++
++server {
++ listen 443 ssl;
++ listen [::]:443 ssl;
++ http2 on;
++ server_name www.openvibe.website;
++ ssl_certificate /etc/letsencrypt/live/openvibe.website/fullchain.pem;
++ ssl_certificate_key /etc/letsencrypt/live/openvibe.website/privkey.pem;
++ return 301 https://openvibe.website$request_uri;
++}
++
++server {
++ listen 443 ssl;
++ listen [::]:443 ssl;
++ http2 on;
++ server_name openvibe.website;
++ include snippets/security-txt.conf; # /.well-known/security.txt (host file; SECURITY.md in every repo)
++
++ ssl_certificate /etc/letsencrypt/live/openvibe.website/fullchain.pem;
++ ssl_certificate_key /etc/letsencrypt/live/openvibe.website/privkey.pem;
++
++ root /opt/openvibe.sites/dist/openvibe.website;
++ index index.html;
++
++ access_log /var/log/nginx/openvibe.website.access.log;
++ error_log /var/log/nginx/openvibe.website.error.log;
++
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++
++ gzip on;
++ gzip_types text/html text/plain text/css application/json application/javascript application/xml image/svg+xml application/manifest+json;
++
++ # An add_header inside a location replaces the server's list (nginx does not merge them), so every
++ # location that sets its own header repeats the security headers.
++ location = /robots.txt {
++ add_header Cache-Control "public, max-age=3600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /sitemap.xml {
++ types { application/xml xml; }
++ add_header Cache-Control "public, max-age=3600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /manifest.webmanifest {
++ types { application/manifest+json webmanifest; }
++ add_header Cache-Control "public, max-age=86400";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /status.json {
++ add_header Cache-Control "public, max-age=600";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ location = /release.json {
++ add_header Cache-Control "no-cache";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++ # This repository's pinned shared browser files (navbar, footer, theme loader…), one copy for every Sites
++ # vhost. Pages ask for them content-addressed (?v=); the few loaded without it (navbar's companions) get
++ # the same hour.
++ location ^~ /shared/ {
++ alias /opt/openvibe.sites/dist/_shared/;
++ add_header Cache-Control "public, max-age=3600";
++ add_header Access-Control-Allow-Origin "*";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ }
++
++ # Only the files in dist/ exist; anything else is a real 404 with a page, never the front page.
++ error_page 404 /404.html;
++ location = /404.html { internal; }
++
++ location / {
++ add_header Cache-Control "public, max-age=600";
++ add_header X-Content-Type-Options nosniff always;
++ add_header X-Frame-Options SAMEORIGIN always;
++ add_header Referrer-Policy strict-origin-when-cross-origin always;
++ add_header Strict-Transport-Security "max-age=31536000" always;
++ try_files $uri $uri.html $uri/ =404;
++ }
++
++ location ~ /\.(?!well-known) { deny all; }
++}
ddiff --git a/dist/admin.openvibe.network/index.html b/dist/admin.openvibe.network/index.html
iindex 4d8593f..75eefc2 100644
---- a/dist/admin.openvibe.network/index.html
++++ b/dist/admin.openvibe.network/index.html
@@@ -155,7 +155,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://auth.openvibe.network/"><i class="fa-solid fa-key" aria-hidden="true"></i>auth.openvibe.network</a>
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/admin.openvibe.network/release.json b/dist/admin.openvibe.network/release.json
iindex 7524e1d..7dc7f08 100644
---- a/dist/admin.openvibe.network/release.json
++++ b/dist/admin.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "admin",
-- "release": "1ecb9d28ff46",
++ "release": "8d71abfa3466",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/ai.openvibe.network/index.html b/dist/ai.openvibe.network/index.html
iindex 54a9127..22ef451 100644
---- a/dist/ai.openvibe.network/index.html
++++ b/dist/ai.openvibe.network/index.html
@@@ -3,10 +3,10 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
--<title>ai.openvibe.network — AI as a service, for every OpenVibe product.</title>
--<meta name="description" content="OpenVibe.AI is the shared AI layer of the OpenVibe network: providers and models, routing, prompt templates, workflows, runs and quotas, so each product stops wiring its own. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; ai.openvibe.network has no public page or API yet.">
++<title>ai.openvibe.network — Moved: OpenVibe.AI&#39;s public home is ai.openvibe.services.</title>
++<meta name="description" content="OpenVibe.AI&#39;s public address is now ai.openvibe.services, next to the rest of the network&#39;s programmable services on OpenVibe.Services. This address serves only this notice until every client has moved; then it redirects.">
<meta name="keywords" content="openvibe ai, openvibe network ai, openvibe platform">
--<meta name="robots" content="index, follow, max-image-preview:large">
++<meta name="robots" content="noindex, follow">
<meta name="theme-color" content="#c084fc">
<link rel="canonical" href="https://ai.openvibe.network/">
<link rel="icon" type="image/svg+xml" data-ov-icon="network" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
@@@ -16,15 +16,15 @@
<meta property="og:type" content="website">
<meta property="og:site_name" content="ai.openvibe.network">
<meta property="og:url" content="https://ai.openvibe.network/">
--<meta property="og:title" content="ai.openvibe.network — AI as a service, for every OpenVibe product.">
--<meta property="og:description" content="OpenVibe.AI is the shared AI layer of the OpenVibe network: providers and models, routing, prompt templates, workflows, runs and quotas, so each product stops wiring its own. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; ai.openvibe.network has no public page or API yet.">
++<meta property="og:title" content="ai.openvibe.network — Moved: OpenVibe.AI&#39;s public home is ai.openvibe.services.">
++<meta property="og:description" content="OpenVibe.AI&#39;s public address is now ai.openvibe.services, next to the rest of the network&#39;s programmable services on OpenVibe.Services. This address serves only this notice until every client has moved; then it redirects.">
<meta property="og:image" content="https://openvibe.network/assets/logo-512.png">
<meta property="og:image:alt" content="OpenVibe">
<meta name="twitter:card" content="summary">
--<meta name="twitter:title" content="ai.openvibe.network — AI as a service, for every OpenVibe product.">
--<meta name="twitter:description" content="OpenVibe.AI is the shared AI layer of the OpenVibe network: providers and models, routing, prompt templates, workflows, runs and quotas, so each product stops wiring its own. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; ai.openvibe.network has no public page or API yet.">
++<meta name="twitter:title" content="ai.openvibe.network — Moved: OpenVibe.AI&#39;s public home is ai.openvibe.services.">
++<meta name="twitter:description" content="OpenVibe.AI&#39;s public address is now ai.openvibe.services, next to the rest of the network&#39;s programmable services on OpenVibe.Services. This address serves only this notice until every client has moved; then it redirects.">
<meta name="twitter:image" content="https://openvibe.network/assets/logo-512.png">
--<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://ai.openvibe.network/#site","url":"https://ai.openvibe.network/","name":"ai.openvibe.network","description":"OpenVibe.AI is the shared AI layer of the OpenVibe network: providers and models, routing, prompt templates, workflows, runs and quotas, so each product stops wiring its own. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; ai.openvibe.network has no public page or API yet.","inLanguage":"en","publisher":{"@type":"Organization","@id":"https://openvibe.network/#org","name":"OpenVibe","url":"https://openvibe.network/","logo":"https://openvibe.network/assets/logo-512.png","sameAs":["https://github.com/OpenVibers","https://discord.gg/M6MuRUaeJj"]},"isPartOf":{"@type":"WebSite","@id":"https://openvibe.network/#site","name":"OpenVibe.Network","url":"https://openvibe.network/"}},{"@type":"WebPage","@id":"https://ai.openvibe.network/#page","url":"https://ai.openvibe.network/","name":"ai.openvibe.network — AI as a service, for every OpenVibe product.","description":"OpenVibe.AI is the shared AI layer of the OpenVibe network: providers and models, routing, prompt templates, workflows, runs and quotas, so each product stops wiring its own. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; ai.openvibe.network has no public page or API yet.","isPartOf":{"@id":"https://ai.openvibe.network/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-28","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"OpenVibe","item":"https://openvibe.network/"},{"@type":"ListItem","position":2,"name":"ai.openvibe.network","item":"https://ai.openvibe.network/"}]}}]}</script>
++<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://ai.openvibe.network/#site","url":"https://ai.openvibe.network/","name":"ai.openvibe.network","description":"OpenVibe.AI's public address is now ai.openvibe.services, next to the rest of the network's programmable services on OpenVibe.Services. This address serves only this notice until every client has moved; then it redirects.","inLanguage":"en","publisher":{"@type":"Organization","@id":"https://openvibe.network/#org","name":"OpenVibe","url":"https://openvibe.network/","logo":"https://openvibe.network/assets/logo-512.png","sameAs":["https://github.com/OpenVibers","https://discord.gg/M6MuRUaeJj"]},"isPartOf":{"@type":"WebSite","@id":"https://openvibe.network/#site","name":"OpenVibe.Network","url":"https://openvibe.network/"}},{"@type":"WebPage","@id":"https://ai.openvibe.network/#page","url":"https://ai.openvibe.network/","name":"ai.openvibe.network — Moved: OpenVibe.AI's public home is ai.openvibe.services.","description":"OpenVibe.AI's public address is now ai.openvibe.services, next to the rest of the network's programmable services on OpenVibe.Services. This address serves only this notice until every client has moved; then it redirects.","isPartOf":{"@id":"https://ai.openvibe.network/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-28","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"OpenVibe","item":"https://openvibe.network/"},{"@type":"ListItem","position":2,"name":"ai.openvibe.network","item":"https://ai.openvibe.network/"}]}}]}</script>
<script>(function(){try{var raw=localStorage.getItem('ov_theme');if(!raw)return;var t=JSON.parse(raw),v=t&&t.variables;if(!v)return;var el=document.documentElement;for(var k in v)if(k.charAt(0)==='-')el.style.setProperty(k,v[k]);if(t.id)el.setAttribute('data-theme',t.id);}catch(_){}})();</script>
<script src="/shared/theme-loader.js?v=d9b9af081efe" defer></script>
<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
@@@ -99,37 +99,26 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<div class="mark"><i class="fa-solid fa-robot" aria-hidden="true"></i></div>
<div class="badge"><span class="ov-mark" data-size="16" data-variant="ai"></span> Part of the OpenVibe network · <b>in development</b></div>
<h1><span class="d">ai</span><span class="tld">.openvibe.network</span></h1>
-- <div class="tag">AI as a service, for every OpenVibe product.</div>
-- <p class="lead">OpenVibe.AI is the shared AI layer of the OpenVibe network: providers and models, routing, prompt templates, workflows, runs and quotas, so each product stops wiring its own. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; ai.openvibe.network has no public page or API yet.</p>
++ <div class="tag">Moved: OpenVibe.AI&#39;s public home is ai.openvibe.services.</div>
++ <p class="lead">OpenVibe.AI&#39;s public address is now ai.openvibe.services, next to the rest of the network&#39;s programmable services on OpenVibe.Services. This address serves only this notice until every client has moved; then it redirects.</p>
<div class="ctas">
-- <a class="btn btn-primary" href="https://openvibe.network/login?return=https%3A%2F%2Fai.openvibe.network%2F"><i class="fa-solid fa-right-to-bracket"></i> Sign in with OpenVibe</a>
++ <a class="btn btn-primary" href="https://ai.openvibe.services/"><i class="fa-solid fa-arrow-right"></i> ai.openvibe.services</a>
<a class="btn" href="https://openvibe.network/#network"><i class="fa-solid fa-circle-nodes"></i> The whole network</a>
<a class="btn" href="https://discord.gg/M6MuRUaeJj" rel="noopener"><i class="fa-brands fa-discord"></i> Follow the build</a>
</div>
-- <p class="status"><i class="fa-solid fa-clock" aria-hidden="true"></i> Status: <b>in development</b> · <a href="https://github.com/OpenVibers/OpenVibe.AI" rel="noopener"><code>OpenVibers/OpenVibe.AI</code></a> is built and its service runs on the network's host, but it is not public yet: this page is a placeholder, nothing here is live yet. The public launch is waiting for a public API with its own access rules; today only other OpenVibe services call it. · as of 2026-09-24 · <a href="/status.json">status.json</a></p>
++ <p class="status"><i class="fa-solid fa-clock" aria-hidden="true"></i> Status: <b>in development</b> · <a href="https://github.com/OpenVibers/OpenVibe.AI" rel="noopener"><code>OpenVibers/OpenVibe.AI</code></a> moved to <a href="https://ai.openvibe.services/">ai.openvibe.services</a>; this address serves only this notice. · as of 2026-09-24 · <a href="/status.json">status.json</a></p>
</header>
-- <section id="what">
-- <h2>What ai.openvibe.network will be</h2>
-- <p class="lead2">Same account, same themes, same navbar as every other OpenVibe site — built in the open, run by its community.</p>
++ <section id="what" class="meanwhile">
++ <h2>Where to go</h2>
++ <p class="lead2">OpenVibe.AI lives on OpenVibe.Services now.</p>
<div class="grid">
-- <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Providers &amp; routing</b><span>Primary and fallback models per workflow, local or hosted.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Workflows</b><span>Versioned, schema-checked jobs with citations.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Quotas &amp; cost</b><span>Budgets per service, app and user.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Provenance</b><span>Every output remembers its sources and model.</span></div>
++ <a class="card" href="https://ai.openvibe.services/"><div class="ic"><i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i></div><b>ai.openvibe.services</b><span>OpenVibe.AI: the gateway, templates, workflows and runs.</span><span class="go">ai.openvibe.services →</span></a>
++ <a class="card" href="https://openvibe.services/"><div class="ic"><i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i></div><b>OpenVibe.Services</b><span>Every programmable OpenVibe service in one place.</span><span class="go">openvibe.services →</span></a>
</div>
</section>
-- <section class="meanwhile">
-- <h2>Meanwhile, on the network</h2>
-- <p class="lead2">Most of this already exists somewhere on OpenVibe — start there today.</p>
-- <div class="grid">
-- <a class="card" href="https://openvibe.live"><div class="ic"><i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i></div><b>AI on OpenVibe.Live</b><span>Live&#39;s AI moments, recaps, summaries and translations run through OpenVibe.AI; captions still run inside Live.</span><span class="go">openvibe.live →</span></a>
-- </div>
-- </section>
--
--
<section class="net">
<h2>The OpenVibe network</h2>
<p class="lead2">One account for all of it. Sign in once and every site signs you in.</p>
@@@ -156,6 +145,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +156,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
@@@ -272,7 +265,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<script src="/shared/footer.js?v=b99e512398d5"></script>
<script>
(function () {
-- if (window.OpenVibeNavbar) { try { OpenVibeNavbar.init({ service: 'ai', apiBase: 'https://openvibe.network', links: [{ label: 'What it will be', href: '#what' }, { label: 'The network', href: 'https://openvibe.network/#network', external: false }], history: { type: 'page', title: 'ai.openvibe.network' } }); } catch (e) {} }
++ if (window.OpenVibeNavbar) { try { OpenVibeNavbar.init({ service: 'ai', apiBase: 'https://openvibe.network', links: [{ label: 'Where to go', href: '#what' }, { label: 'The network', href: 'https://openvibe.network/#network', external: false }], history: { type: 'page', title: 'ai.openvibe.network' } }); } catch (e) {} }
if (window.OpenVibeFooter) { try { OpenVibeFooter.init({ service: 'ai', variant: 'full', links: [{ heading: 'ai.openvibe.network', items: [{ name: 'Sign in', url: 'https://openvibe.network/login?return=https%3A%2F%2Fai.openvibe.network%2F' }, { name: 'The network', url: 'https://openvibe.network/#network' }, { name: 'Discord', url: 'https://discord.gg/M6MuRUaeJj' }] }] }); } catch (e) {} }
})();
</script>
ddiff --git a/dist/ai.openvibe.network/manifest.webmanifest b/dist/ai.openvibe.network/manifest.webmanifest
iindex c920667..90d904f 100644
---- a/dist/ai.openvibe.network/manifest.webmanifest
++++ b/dist/ai.openvibe.network/manifest.webmanifest
@@@ -1,7 +1,7 @@
{
"name": "ai.openvibe.network",
"short_name": "network",
-- "description": "AI as a service, for every OpenVibe product.",
++ "description": "Moved: OpenVibe.AI's public home is ai.openvibe.services.",
"start_url": "/",
"scope": "/",
"display": "standalone",
ddiff --git a/dist/ai.openvibe.network/release.json b/dist/ai.openvibe.network/release.json
iindex ae49d1d..08fdc2e 100644
---- a/dist/ai.openvibe.network/release.json
++++ b/dist/ai.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "ai",
-- "release": "018cc11f76d1",
++ "release": "5d5c9bcab8bf",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/ai.openvibe.network/robots.txt b/dist/ai.openvibe.network/robots.txt
iindex 3a0e672..07b86e6 100644
---- a/dist/ai.openvibe.network/robots.txt
++++ b/dist/ai.openvibe.network/robots.txt
@@@ -1,4 +1,3 @@
User-agent: *
Allow: /
Disallow: /auth/
--Sitemap: https://ai.openvibe.network/sitemap.xml
ddiff --git a/dist/ai.openvibe.network/sitemap.xml b/dist/ai.openvibe.network/sitemap.xml
ddeleted file mode 100644
iindex d227c50..0000000
---- a/dist/ai.openvibe.network/sitemap.xml
++++ /dev/null
@@@ -1,4 +0,0 @@
--<?xml version="1.0" encoding="UTF-8"?>
--<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
-- <url><loc>https://ai.openvibe.network/</loc><lastmod>2026-09-28</lastmod><changefreq>weekly</changefreq><priority>1.0</priority></url>
--</urlset>
ddiff --git a/dist/ai.openvibe.network/status.json b/dist/ai.openvibe.network/status.json
iindex 1ddd13a..c97208a 100644
---- a/dist/ai.openvibe.network/status.json
++++ b/dist/ai.openvibe.network/status.json
@@@ -1,7 +1,7 @@
{
"domain": "ai.openvibe.network",
"name": "ai.openvibe.network",
-- "stage": "placeholder",
++ "stage": "moved",
"live": false,
"plannedRepo": "OpenVibers/OpenVibe.AI",
"repoUrl": "https://github.com/OpenVibers/OpenVibe.AI",
@@@ -15,7 +15,7 @@
"exposure": "internal",
"publicOrigin": null
},
-- "launchWaitsFor": "a public API with its own access rules; today only other OpenVibe services call it",
++ "launchWaitsFor": null,
"factsAsOf": "2026-09-24",
"network": "https://openvibe.network",
"updated": "2026-09-28",
ddiff --git a/dist/ai.openvibe.services/404.html b/dist/ai.openvibe.services/404.html
nnew file mode 100644
iindex 0000000..1722291
---- /dev/null
++++ b/dist/ai.openvibe.services/404.html
@@@ -0,0 +1,35 @@
++<!DOCTYPE html>
++<html lang="en">
++<head>
++<meta charset="utf-8">
++<meta name="viewport" content="width=device-width, initial-scale=1">
++<title>Not found · ai.openvibe.services</title>
++<meta name="robots" content="noindex">
++<meta name="theme-color" content="#c084fc">
++<link rel="icon" type="image/svg+xml" data-ov-icon="network" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<style>
++*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
++:root{--bg-primary:#0a0f1c;--bg-secondary:#101828;--border:#1f2d47;--text-primary:#e6edf7;--text-secondary:#96a7c2;--site:#c084fc}
++body{background:var(--bg-primary);color:var(--text-primary);font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;min-height:100vh;display:grid;place-items:center;padding:24px 16px}
++main{max-width:560px;text-align:center}
++.code{font-size:14px;font-weight:700;letter-spacing:.2em;color:var(--site)}
++h1{font-size:clamp(28px,5vw,40px);font-weight:800;letter-spacing:-.8px;margin:10px 0 12px}
++p{color:var(--text-secondary);font-size:15px;line-height:1.65}
++.links{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:24px}
++a{display:inline-block;padding:11px 18px;border-radius:12px;font-size:14px;font-weight:600;text-decoration:none;border:1px solid var(--border);color:var(--text-primary);background:var(--bg-secondary)}
++a:first-child{background:var(--site);border-color:var(--site);color:#0b0d10}
++</style>
++</head>
++<body>
++<main>
++ <p class="code">404</p>
++ <h1>This page does not exist</h1>
++ <p>ai.openvibe.services has only its front page and legal pages for now. The address you followed is not one of them.</p>
++ <div class="links">
++ <a href="https://ai.openvibe.services/">ai.openvibe.services</a>
++ <a href="https://openvibe.network/">OpenVibe.Network</a>
++ </div>
++</main>
++</body>
++</html>
ddiff --git a/dist/ai.openvibe.services/dmca.html b/dist/ai.openvibe.services/dmca.html
nnew file mode 100644
iindex 0000000..6d08e54
---- /dev/null
++++ b/dist/ai.openvibe.services/dmca.html
@@@ -0,0 +1,109 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>DMCA &amp; Copyright — ai.openvibe.services</title>
++<meta name="description" content="How to report copyright infringement on ai.openvibe.services, and how to respond to a report.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://ai.openvibe.services/dmca">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="ai.openvibe.services">
++<meta property="og:title" content="DMCA &amp; Copyright — ai.openvibe.services">
++<meta property="og:description" content="How to report copyright infringement on ai.openvibe.services, and how to respond to a report.">
++<meta property="og:url" content="https://ai.openvibe.services/dmca">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="DMCA &amp; Copyright — ai.openvibe.services">
++<meta name="twitter:description" content="How to report copyright infringement on ai.openvibe.services, and how to respond to a report.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="ai" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">ai.openvibe.services</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">ai.openvibe.services</p><h1>DMCA &amp; Copyright</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">Our position</a></li><li><a href="#s2">Before you send a notice</a></li><li><a href="#s3">Send a takedown notice</a></li><li><a href="#s4">What happens next</a></li><li><a href="#s5">Repeat infringers and false claims</a></li><li><a href="#s6">Other complaints</a></li></ol></nav>
++<section><h2 id="s1">Our position</h2><p>ai.openvibe.services respects copyright and responds to clear notices of alleged infringement under the Digital Millennium Copyright Act (17 U.S.C. § 512). ai.openvibe.services currently publishes only its own material and does not host uploads from the public.</p></section>
++<section><h2 id="s2">Before you send a notice</h2><p>Consider whether the use is permitted, for example as fair use, commentary, criticism, or under a licence. Notices must come from the copyright owner or someone authorised to act for them. Misrepresentations in a notice carry legal liability.</p></section>
++<section><h2 id="s3">Send a takedown notice</h2><p>Email <a href="mailto:[email protected]">[email protected]</a> with all of the following:</p><ol><li>Your name, postal address, phone number and email address, and whom you represent.</li><li>The copyrighted work you say was infringed, or a representative list if there are several.</li><li>The exact URL on ai.openvibe.services of each item you want removed. General descriptions, search results and channel links are not enough to find it.</li><li>A statement that you have a good-faith belief the use is not authorised by the copyright owner, its agent or the law.</li><li>A statement, under penalty of perjury, that the information is accurate and that you are the owner or authorised to act for the owner.</li><li>Your physical or electronic signature.</li></ol></section>
++<section><h2 id="s4">What happens next</h2><p>We remove or disable access to the material, tell the person who posted it, and give them a copy of your notice, including your contact details. We act on complete notices as quickly as we can, normally within a few business days. Incomplete notices get a reply saying what is missing.</p></section>
++<section><h2 id="s5">Repeat infringers and false claims</h2><p>Accounts that receive repeated valid notices lose the ability to post and, in appropriate circumstances, are terminated across the network. Knowingly false notices and counter-notices carry liability under § 512(f); we refuse notices that are clearly abusive or automated without review.</p></section>
++<section><h2 id="s6">Other complaints</h2><p>Trademark, privacy, impersonation, harassment and other non-copyright complaints go to the same address; say which kind of complaint it is and give the exact URL. Content that sexually exploits children should be reported to us immediately and to the <a href="https://report.cybertip.org/" rel="noopener">NCMEC CyberTipline</a> or your national hotline; we remove it and report it to the authorities.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/terms">Terms of Service</a><a href="/privacy">Privacy Policy</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/ai.openvibe.services/index.html b/dist/ai.openvibe.services/index.html
nnew file mode 100644
iindex 0000000..3b6a1dd
---- /dev/null
++++ b/dist/ai.openvibe.services/index.html
@@@ -0,0 +1,283 @@
++<!DOCTYPE html>
++<html lang="en">
++<head>
++<meta charset="utf-8">
++<meta name="viewport" content="width=device-width, initial-scale=1">
++<title>ai.openvibe.services — One AI gateway for every model you choose.</title>
++<meta name="description" content="OpenVibe.AI is the network&#39;s AI gateway: OpenAI-compatible providers, Anthropic, local and open models behind one API, with routing for cost, speed, quality or privacy, provider fallback, versioned prompt templates and typed workflows, durable runs, structured output, embeddings, speech to text and media analysis, budgets and your own provider keys. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; its public API and playground open here.">
++<meta name="keywords" content="ai gateway, open source ai api, llm router, model routing, prompt templates, ai workflows, speech to text api, openvibe ai">
++<meta name="robots" content="index, follow, max-image-preview:large">
++<meta name="theme-color" content="#c084fc">
++<link rel="canonical" href="https://ai.openvibe.services/">
++<link rel="icon" type="image/svg+xml" data-ov-icon="network" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<link rel="manifest" href="/manifest.webmanifest">
++<link rel="alternate" type="text/html" hreflang="en" href="https://ai.openvibe.services/">
++<meta property="og:type" content="website">
++<meta property="og:site_name" content="ai.openvibe.services">
++<meta property="og:url" content="https://ai.openvibe.services/">
++<meta property="og:title" content="ai.openvibe.services — One AI gateway for every model you choose.">
++<meta property="og:description" content="OpenVibe.AI is the network&#39;s AI gateway: OpenAI-compatible providers, Anthropic, local and open models behind one API, with routing for cost, speed, quality or privacy, provider fallback, versioned prompt templates and typed workflows, durable runs, structured output, embeddings, speech to text and media analysis, budgets and your own provider keys. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; its public API and playground open here.">
++<meta property="og:image" content="https://openvibe.network/assets/logo-512.png">
++<meta property="og:image:alt" content="OpenVibe">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="ai.openvibe.services — One AI gateway for every model you choose.">
++<meta name="twitter:description" content="OpenVibe.AI is the network&#39;s AI gateway: OpenAI-compatible providers, Anthropic, local and open models behind one API, with routing for cost, speed, quality or privacy, provider fallback, versioned prompt templates and typed workflows, durable runs, structured output, embeddings, speech to text and media analysis, budgets and your own provider keys. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; its public API and playground open here.">
++<meta name="twitter:image" content="https://openvibe.network/assets/logo-512.png">
++<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://ai.openvibe.services/#site","url":"https://ai.openvibe.services/","name":"ai.openvibe.services","description":"OpenVibe.AI is the network's AI gateway: OpenAI-compatible providers, Anthropic, local and open models behind one API, with routing for cost, speed, quality or privacy, provider fallback, versioned prompt templates and typed workflows, durable runs, structured output, embeddings, speech to text and media analysis, budgets and your own provider keys. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; its public API and playground open here.","inLanguage":"en","publisher":{"@type":"Organization","@id":"https://openvibe.network/#org","name":"OpenVibe","url":"https://openvibe.network/","logo":"https://openvibe.network/assets/logo-512.png","sameAs":["https://github.com/OpenVibers","https://discord.gg/M6MuRUaeJj"]},"isPartOf":{"@type":"WebSite","@id":"https://openvibe.network/#site","name":"OpenVibe.Network","url":"https://openvibe.network/"}},{"@type":"WebPage","@id":"https://ai.openvibe.services/#page","url":"https://ai.openvibe.services/","name":"ai.openvibe.services — One AI gateway for every model you choose.","description":"OpenVibe.AI is the network's AI gateway: OpenAI-compatible providers, Anthropic, local and open models behind one API, with routing for cost, speed, quality or privacy, provider fallback, versioned prompt templates and typed workflows, durable runs, structured output, embeddings, speech to text and media analysis, budgets and your own provider keys. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; its public API and playground open here.","isPartOf":{"@id":"https://ai.openvibe.services/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-28","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"OpenVibe","item":"https://openvibe.network/"},{"@type":"ListItem","position":2,"name":"ai.openvibe.services","item":"https://ai.openvibe.services/"}]}}]}</script>
++<script>(function(){try{var raw=localStorage.getItem('ov_theme');if(!raw)return;var t=JSON.parse(raw),v=t&&t.variables;if(!v)return;var el=document.documentElement;for(var k in v)if(k.charAt(0)==='-')el.style.setProperty(k,v[k]);if(t.id)el.setAttribute('data-theme',t.id);}catch(_){}})();</script>
++<script src="/shared/theme-loader.js?v=d9b9af081efe" defer></script>
++<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
++<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" media="print" onload="this.media='all'">
++<noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"></noscript>
++<style>
++*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
++:root{--bg-primary:#0a0f1c;--bg-secondary:#101828;--bg-card:#131c2e;--bg-hover:#1c2a44;--border:#1f2d47;--text-primary:#e6edf7;--text-secondary:#96a7c2;--text-muted:#7386a3;--accent:#3b82f6;--accent-light:#60a5fa;--accent-rgb:59,130,246;--on-accent:#fff;--site:#c084fc;--site-rgb:192,132,252}
++html{scroll-behavior:smooth}
++body{background:var(--bg-primary);color:var(--text-primary);font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;min-height:100vh;display:flex;flex-direction:column;overflow-x:hidden}
++main{flex:1;position:relative}
++.orbs{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
++.orbs i{position:absolute;border-radius:50%;filter:blur(90px);opacity:.16;animation:drift 26s ease-in-out infinite alternate}
++.orbs i:nth-child(1){width:420px;height:420px;background:var(--site);top:-140px;left:-120px}
++.orbs i:nth-child(2){width:360px;height:360px;background:var(--accent);top:40%;right:-140px;animation-delay:-9s}
++.orbs i:nth-child(3){width:300px;height:300px;background:var(--site);bottom:-120px;left:38%;animation-delay:-17s}
++@keyframes drift{0%{transform:translate(0,0) scale(1)}50%{transform:translate(-26px,36px) scale(1.07)}100%{transform:translate(34px,-28px) scale(.95)}}
++.wrap{position:relative;z-index:1;max-width:1040px;margin:0 auto;padding:0 20px}
++.hero{padding:84px 0 44px;text-align:center}
++.hero .mark{display:inline-grid;place-items:center;width:84px;height:84px;border-radius:24px;background:rgba(var(--site-rgb),.12);border:1px solid rgba(var(--site-rgb),.35);color:var(--site);font-size:34px;margin-bottom:22px;box-shadow:0 20px 60px rgba(var(--site-rgb),.18);animation:rise .6s cubic-bezier(.2,.8,.2,1) both}
++.hero .badge{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;border-radius:999px;border:1px solid var(--border);background:var(--bg-secondary);font-size:12px;font-weight:600;color:var(--text-secondary);letter-spacing:.3px;margin-bottom:22px;animation:rise .6s .05s cubic-bezier(.2,.8,.2,1) both}
++.hero .badge b{color:var(--site)}
++.hero h1{font-size:clamp(34px,6vw,58px);font-weight:800;letter-spacing:-1.4px;line-height:1.08;animation:rise .6s .1s cubic-bezier(.2,.8,.2,1) both}
++.hero h1 .d{color:var(--site)}
++.hero h1 .tld{color:var(--text-secondary)}
++.hero .tag{font-size:clamp(18px,2.6vw,24px);font-weight:600;color:var(--text-primary);margin:18px 0 10px;animation:rise .6s .16s cubic-bezier(.2,.8,.2,1) both}
++.hero p.lead{color:var(--text-secondary);font-size:16px;line-height:1.65;max-width:680px;margin:0 auto;animation:rise .6s .22s cubic-bezier(.2,.8,.2,1) both}
++.ctas{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:30px;animation:rise .6s .3s cubic-bezier(.2,.8,.2,1) both}
++.hero .status{margin:22px auto 0;max-width:720px;font-size:12.5px;line-height:1.7;color:var(--text-muted);border:1px dashed var(--border);border-radius:12px;padding:10px 14px;background:rgba(0,0,0,.15)}
++.hero .status b{color:var(--site)}
++.hero .status code{font-size:12px;color:var(--text-secondary);background:var(--bg-secondary);padding:1px 6px;border-radius:6px}
++.hero .status a{color:var(--text-secondary)}
++.btn{display:inline-flex;align-items:center;gap:9px;padding:12px 20px;border-radius:12px;font-size:14px;font-weight:600;text-decoration:none;border:1px solid var(--border);color:var(--text-primary);background:var(--bg-secondary);transition:transform .15s,border-color .15s,box-shadow .15s}
++.btn:hover{transform:translateY(-1px);border-color:var(--site);box-shadow:0 10px 30px rgba(var(--site-rgb),.15)}
++.btn-primary{background:var(--site);border-color:var(--site);color:#0b0d10}
++.btn-primary:hover{filter:brightness(1.08)}
++@keyframes rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
++section{padding:36px 0}
++h2{font-size:22px;font-weight:700;letter-spacing:-.3px;margin-bottom:6px}
++.lead2{color:var(--text-secondary);font-size:14px;margin-bottom:20px}
++.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px}
++.card{background:var(--bg-card);border:1px solid var(--border);border-radius:16px;padding:20px;transition:transform .2s,border-color .2s,box-shadow .2s;text-decoration:none;color:inherit;display:flex;flex-direction:column;gap:8px}
++a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);box-shadow:0 16px 40px rgba(0,0,0,.35)}
++.card .ic{width:40px;height:40px;border-radius:11px;display:grid;place-items:center;background:rgba(var(--site-rgb),.12);color:var(--site);font-size:17px}
++.card b{font-size:15px}
++.card span{font-size:13px;color:var(--text-secondary);line-height:1.55}
++.card .go{margin-top:auto;font-size:12.5px;font-weight:600;color:var(--site)}
++.highlight .hl-card{border:1px solid rgba(var(--accent-rgb),.45);background:rgba(var(--accent-rgb),.10);border-radius:18px;padding:22px 22px 18px}
++.highlight h2{margin:0 0 8px}.highlight h2 i{color:var(--accent-light)}.highlight p{margin:0 0 10px}
++.highlight ul{margin:0 0 14px;padding-left:20px}.highlight li{margin:4px 0}
++.faq details{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:12px 14px;margin:8px 0}
++.faq summary{cursor:pointer;font-weight:600}.faq details p{margin:8px 0 0;opacity:.85}
++.meanwhile .card .ic{background:rgba(var(--accent-rgb),.12);color:var(--accent-light)}
++.net .card .ic{background:var(--bg-hover);color:var(--text-primary)}
++.rooms{display:flex;flex-wrap:wrap;gap:8px}
++.rooms a{font-size:12.5px;padding:7px 12px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary);text-decoration:none;transition:all .15s;background:var(--bg-secondary)}
++.rooms a:hover{color:var(--text-primary);border-color:var(--site)}
++.rooms a i{margin-right:6px;opacity:.8}
++.strip{border:1px solid var(--border);border-radius:18px;background:var(--bg-secondary);padding:30px 26px;text-align:center;margin:10px 0 50px}
++.strip h3{font-size:19px;font-weight:700;margin:12px 0 8px}
++.strip p{font-size:14px;color:var(--text-secondary);max-width:600px;margin:0 auto 18px;line-height:1.6}
++.strip .ov-mark{width:44px;height:44px}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}}
++@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
++</style>
++</head>
++<body>
++<div class="orbs"><i></i><i></i><i></i></div>
++<div id="navbar-mount"></div>
++<main class="wrap">
++ <header class="hero">
++ <div class="mark"><i class="fa-solid fa-robot" aria-hidden="true"></i></div>
++ <div class="badge"><span class="ov-mark" data-size="16" data-variant="ai"></span> Part of the OpenVibe network · <b>in development</b></div>
++ <h1><span class="d">ai</span><span class="tld">.openvibe.services</span></h1>
++ <div class="tag">One AI gateway for every model you choose.</div>
++ <p class="lead">OpenVibe.AI is the network&#39;s AI gateway: OpenAI-compatible providers, Anthropic, local and open models behind one API, with routing for cost, speed, quality or privacy, provider fallback, versioned prompt templates and typed workflows, durable runs, structured output, embeddings, speech to text and media analysis, budgets and your own provider keys. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; its public API and playground open here.</p>
++ <div class="ctas">
++ <a class="btn btn-primary" href="https://openvibe.network/login?return=https%3A%2F%2Fai.openvibe.services%2F"><i class="fa-solid fa-right-to-bracket"></i> Sign in with OpenVibe</a>
++ <a class="btn" href="https://openvibe.network/#network"><i class="fa-solid fa-circle-nodes"></i> The whole network</a>
++ <a class="btn" href="https://discord.gg/M6MuRUaeJj" rel="noopener"><i class="fa-brands fa-discord"></i> Follow the build</a>
++ </div>
++ <p class="status"><i class="fa-solid fa-clock" aria-hidden="true"></i> Status: <b>in development</b> · <a href="https://github.com/OpenVibers/OpenVibe.AI" rel="noopener"><code>OpenVibers/OpenVibe.AI</code></a> is built and its service runs on the network's host, but it is not public yet: this page is a placeholder, nothing here is live yet. The public launch is waiting for a public API with its own keys, quotas and playground; today only other OpenVibe services call it. · as of 2026-09-24 · <a href="/status.json">status.json</a></p>
++ </header>
++
++
++ <section id="what">
++ <h2>What ai.openvibe.services will be</h2>
++ <p class="lead2">Same account, same themes, same navbar as every other OpenVibe site — built in the open, run by its community.</p>
++ <div class="grid">
++ <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Any provider</b><span>OpenAI-compatible, Anthropic, local llama.cpp and open models, one API.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Routing &amp; fallback</b><span>Cheap, fast, best or private: routes choose, and fall back when a provider fails.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Templates &amp; workflows</b><span>Versioned prompts and typed workflows with durable, resumable runs.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Your keys, your budget</b><span>Bring your own provider keys; quotas and budgets per project.</span></div>
++ </div>
++ </section>
++
++ <section class="meanwhile">
++ <h2>Meanwhile, on the network</h2>
++ <p class="lead2">Most of this already exists somewhere on OpenVibe — start there today.</p>
++ <div class="grid">
++ <a class="card" href="https://openvibe.live"><div class="ic"><i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i></div><b>AI on OpenVibe.Live</b><span>Live&#39;s AI moments, recaps, summaries and translations run through OpenVibe.AI; captions still run inside Live.</span><span class="go">openvibe.live →</span></a>
++ </div>
++ </section>
++
++
++ <section class="net">
++ <h2>The OpenVibe network</h2>
++ <p class="lead2">One account for all of it. Sign in once and every site signs you in.</p>
++ <div class="grid">
++ <a class="card" href="https://openvibe.live"><div class="ic"><i class="fa-solid fa-tower-broadcast" aria-hidden="true"></i></div><b>OpenVibe.Live</b><span>Go live, chat, clip, restream</span><span class="go">openvibe.live →</span></a>
++ <a class="card" href="https://openvibe.tools"><div class="ic"><i class="fa-solid fa-screwdriver-wrench" aria-hidden="true"></i></div><b>OpenVibe.Tools</b><span>Hundreds of online tools</span><span class="go">openvibe.tools →</span></a>
++ <a class="card" href="https://openvibe.community"><div class="ic"><i class="fa-solid fa-people-group" aria-hidden="true"></i></div><b>OpenVibe.Community</b><span>Pastes, posts, people</span><span class="go">openvibe.community →</span></a>
++ <a class="card" href="https://openvibe.games"><div class="ic"><i class="fa-solid fa-gamepad" aria-hidden="true"></i></div><b>OpenVibe.Games</b><span>Scraplandia and browser games</span><span class="go">openvibe.games →</span></a>
++ <a class="card" href="https://openvibe.media"><div class="ic"><i class="fa-solid fa-photo-film" aria-hidden="true"></i></div><b>OpenVibe.Media</b><span>VODs, clips and files</span><span class="go">openvibe.media →</span></a>
++ <a class="card" href="https://openvibe.network"><div class="ic"><i class="fa-solid fa-circle-nodes" aria-hidden="true"></i></div><b>OpenVibe.Network</b><span>One account, every site</span><span class="go">openvibe.network →</span></a>
++ </div>
++ <h2 style="margin-top:28px;font-size:16px">Other OpenVibe domains, not open yet</h2>
++ <div class="rooms" style="margin-top:8px">
++ <a href="https://openvibe.news/"><i class="fa-solid fa-newspaper" aria-hidden="true"></i>OpenVibe.News</a>
++ <a href="https://openvibe.reviews/"><i class="fa-solid fa-star-half-stroke" aria-hidden="true"></i>OpenVibe.Reviews</a>
++ <a href="https://openvibe.tips/"><i class="fa-solid fa-hand-holding-heart" aria-hidden="true"></i>OpenVibe.Tips</a>
++ <a href="https://openvibe.vip/"><i class="fa-solid fa-crown" aria-hidden="true"></i>OpenVibe.VIP</a>
++ <a href="https://openvibe.trade/"><i class="fa-solid fa-chart-line" aria-hidden="true"></i>OpenVibe.Trade</a>
++ <a href="https://openvibe.host/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Host</a>
++ <a href="https://openvibe.deals/"><i class="fa-solid fa-tags" aria-hidden="true"></i>OpenVibe.Deals</a>
++ <a href="https://openvibe.coupons/"><i class="fa-solid fa-ticket" aria-hidden="true"></i>OpenVibe.Coupons</a>
++ <a href="https://openre.stream/"><i class="fa-solid fa-satellite-dish" aria-hidden="true"></i>OpenRe.Stream</a>
++ <a href="https://auth.openvibe.network/"><i class="fa-solid fa-key" aria-hidden="true"></i>auth.openvibe.network</a>
++ <a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
++ <a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
++ <a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
++ <a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
++ <a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
++ <a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
++ <a href="https://openvibe.food/"><i class="fa-solid fa-utensils" aria-hidden="true"></i>OpenVibe.Food</a>
++ <a href="https://openvibe.quest/"><i class="fa-solid fa-map" aria-hidden="true"></i>OpenVibe.Quest</a>
++ <a href="https://openvibe.rent/"><i class="fa-solid fa-key" aria-hidden="true"></i>OpenVibe.Rent</a>
++ <a href="https://openvibe.homes/"><i class="fa-solid fa-house" aria-hidden="true"></i>OpenVibe.Homes</a>
++ <a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
++ <a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
++ <a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
++ </div>
++ </section>
++
++ <div class="strip">
++ <span class="ov-mark" data-size="44" data-variant="ai"></span>
++ <h3>Open source. Community run.</h3>
++ <p>Every OpenVibe site is built in the open by the people using it — free speech within the rules, no gatekeeping, one identity that follows you everywhere.</p>
++ <a class="btn" href="https://github.com/OpenVibers" rel="noopener"><i class="fa-brands fa-github"></i> OpenVibers on GitHub</a>
++ </div>
++</main>
++<style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="full"><div class="ovf-inner">
++ <div class="ovf-cols">
++ <div class="ovf-col ovf-col--brand">
++ <a class="ovf-brand" href="/"><span class="ov-mark" data-size="26"></span><span>OpenVibe</span></a>
++ <p class="ovf-tagline">Open source and community run. Built in the open by the people using it.</p>
++ <div class="ovf-social">
++ <a href="https://github.com/OpenVibers" target="_blank" rel="noopener" aria-label="GitHub" title="GitHub"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path fill="currentColor" stroke="none" d="M12 2.2a9.8 9.8 0 0 0-3.1 19.1c.5.1.7-.2.7-.5v-1.7c-2.7.6-3.3-1.2-3.3-1.2-.4-1.1-1.1-1.4-1.1-1.4-.9-.6.1-.6.1-.6 1 .1 1.5 1 1.5 1 .9 1.5 2.3 1.1 2.9.8.1-.6.3-1.1.6-1.3-2.2-.2-4.5-1.1-4.5-4.8 0-1.1.4-1.9 1-2.6-.1-.2-.4-1.2.1-2.6 0 0 .8-.3 2.7 1a9.3 9.3 0 0 1 4.9 0c1.9-1.3 2.7-1 2.7-1 .5 1.4.2 2.4.1 2.6.6.7 1 1.5 1 2.6 0 3.7-2.3 4.6-4.5 4.8.4.3.7.9.7 1.800v2.700c0 .3.2.6.7.5A9.8 9.8 0 0 0 12 2.200z"/></svg></a><a href="https://discord.gg/M6MuRUaeJj" target="_blank" rel="noopener" aria-label="Discord" title="Discord"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path fill="currentColor" stroke="none" d="M19.3 5.300a16.5 16.5 0 0 0-4.1-1.300l-.5 1a15.3 15.3 0 0 0-5.4 0l-.5-1a16.5 16.5 0 0 0-4.1 1.300C2.1 9.2 1.4 13 1.7 16.700a16.6 16.6 0 0 0 5.1 2.600l1.1-1.800c-.6-.2-1.2-.5-1.7-.8l.4-.3a11.8 11.8 0 0 0 10.8 0l.4.3c-.5.3-1.1.6-1.7.8l1.1 1.800a16.6 16.6 0 0 0 5.1-2.600c.4-4.3-.7-8.1-3-11.400zM8.7 14.400c-1 0-1.8-.9-1.8-2.100s.8-2.1 1.8-2.1 1.9 1 1.8 2.100c0 1.2-.8 2.1-1.8 2.100zm6.6 0c-1 0-1.8-.9-1.8-2.100s.8-2.1 1.8-2.1 1.9 1 1.8 2.100c0 1.2-.8 2.1-1.8 2.100z"/></svg></a>
++ <a href="/sitemap.xml" aria-label="Sitemap" title="Sitemap"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="9" y="3.5" width="6" height="4.5" rx="1"/><rect x="3" y="16" width="6" height="4.5" rx="1"/><rect x="15" y="16" width="6" height="4.5" rx="1"/><path d="M12 8v4M6 16v-2.500h12V16"/></svg></a>
++ </div>
++ </div>
++
++ <nav class="ovf-col" aria-label="The OpenVibe network">
++ <h3>Network</h3>
++ <a href="https://openvibe.live" title="Go live, restream and clip">Live streaming</a><a href="https://openvibe.tools" title="The whole toolbox">Online tools</a><a href="https://dev.openvibe.tools" title="Formatters, encoders, validators">Developer tools</a><a href="https://net.openvibe.tools" title="Ping, DNS, Whois, SSL">Network diagnostics</a><a href="https://img.openvibe.tools" title="Convert, resize, compress">Image converter</a><a href="https://audio.openvibe.tools" title="Convert, trim, pitch-shift">Audio converter</a>
++ <a class="ovf-more" href="https://openvibe.network" target="_blank" rel="noopener">Everything else <svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
++ </nav>
++
++ <nav class="ovf-col" aria-label="Legal">
++ <h3>Legal</h3>
++ <a href="https://openvibe.live/tos">Terms of Service</a><a href="https://openvibe.live/privacy">Privacy Policy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ </div>
++ <div class="ovf-account" id="ovf-account" hidden></div>
++ <div class="ovf-bar">
++ <span class="ovf-copy">Open source &amp; community driven · built in the open</span>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="ai" href="https://openvibe.network/updates?site=ai" hidden></a>
++ <span class="ovf-legal-inline">
++ <a href="https://openvibe.network/updates?site=ai">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </span>
++ </div>
++ </div></footer>
++<script src="/shared/ov-mark.js?v=96079ebf2943" async></script>
++<script src="/shared/navbar.js?v=b50d9f47fc34"></script>
++<script src="/shared/footer.js?v=b99e512398d5"></script>
++<script>
++(function () {
++ if (window.OpenVibeNavbar) { try { OpenVibeNavbar.init({ service: 'ai', apiBase: 'https://openvibe.network', links: [{ label: 'What it will be', href: '#what' }, { label: 'The network', href: 'https://openvibe.network/#network', external: false }], history: { type: 'page', title: 'ai.openvibe.services' } }); } catch (e) {} }
++ if (window.OpenVibeFooter) { try { OpenVibeFooter.init({ service: 'ai', variant: 'full', links: [{ heading: 'ai.openvibe.services', items: [{ name: 'Sign in', url: 'https://openvibe.network/login?return=https%3A%2F%2Fai.openvibe.services%2F' }, { name: 'The network', url: 'https://openvibe.network/#network' }, { name: 'Discord', url: 'https://discord.gg/M6MuRUaeJj' }] }] }); } catch (e) {} }
++})();
++</script>
++</body>
++</html>
ddiff --git a/dist/ai.openvibe.services/manifest.webmanifest b/dist/ai.openvibe.services/manifest.webmanifest
nnew file mode 100644
iindex 0000000..23acdca
---- /dev/null
++++ b/dist/ai.openvibe.services/manifest.webmanifest
@@@ -0,0 +1,48 @@
++{
++ "name": "ai.openvibe.services",
++ "short_name": "services",
++ "description": "One AI gateway for every model you choose.",
++ "start_url": "/",
++ "scope": "/",
++ "display": "standalone",
++ "background_color": "#0a0f1c",
++ "theme_color": "#3b82f6",
++ "icons": [
++ {
++ "src": "https://openvibe.network/assets/logo-72.png",
++ "sizes": "72x72",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-192.png",
++ "sizes": "192x192",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-512.png",
++ "sizes": "512x512",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-maskable-192.png",
++ "sizes": "192x192",
++ "type": "image/png",
++ "purpose": "maskable"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-maskable-512.png",
++ "sizes": "512x512",
++ "type": "image/png",
++ "purpose": "maskable"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo.svg",
++ "sizes": "any",
++ "type": "image/svg+xml",
++ "purpose": "any"
++ }
++ ]
++}
ddiff --git a/dist/ai.openvibe.services/privacy.html b/dist/ai.openvibe.services/privacy.html
nnew file mode 100644
iindex 0000000..7950184
---- /dev/null
++++ b/dist/ai.openvibe.services/privacy.html
@@@ -0,0 +1,115 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>Privacy Policy — ai.openvibe.services</title>
++<meta name="description" content="What ai.openvibe.services collects, why, and the choices you have.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://ai.openvibe.services/privacy">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="ai.openvibe.services">
++<meta property="og:title" content="Privacy Policy — ai.openvibe.services">
++<meta property="og:description" content="What ai.openvibe.services collects, why, and the choices you have.">
++<meta property="og:url" content="https://ai.openvibe.services/privacy">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="Privacy Policy — ai.openvibe.services">
++<meta name="twitter:description" content="What ai.openvibe.services collects, why, and the choices you have.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="ai" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">ai.openvibe.services</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">ai.openvibe.services</p><h1>Privacy Policy</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">The short version</a></li><li><a href="#s2">What we collect</a></li><li><a href="#s3">Why we use it</a></li><li><a href="#s4">Cookies and storage in your browser</a></li><li><a href="#s5">Across OpenVibe sites</a></li><li><a href="#s6">Who we share with</a></li><li><a href="#s7">How long we keep things</a></li><li><a href="#s8">Where your data is</a></li><li><a href="#s9">Security</a></li><li><a href="#s10">Your choices and rights</a></li><li><a href="#s11">Children</a></li><li><a href="#s12">Changes and contact</a></li></ol></nav>
++<section><h2 id="s1">The short version</h2><p>ai.openvibe.services collects what it needs to work and to keep abuse out, and no more. We do not sell or rent personal information, we do not share it for advertising, and we do not run advertising trackers. Most of ai.openvibe.services works without an account.</p></section>
++<section><h2 id="s2">What we collect</h2><ul><li><b>Request logs.</b> Like every web server, ours record your IP address, browser type, the address requested and the time. We use them for security, rate limiting, debugging and aggregate traffic statistics.</li><li><b>Usage statistics.</b> First-party page views with a random session identifier, kept on our own servers, so we can see which parts of the network are used.</li><li><b>An anonymous page count.</b> The shared navigation bar reports one count per page load containing only the site's hostname and the day. No user, IP address or page is stored with it. It decides the order of sites in our menus. It is skipped when your browser sends Global Privacy Control or Do Not Track.</li></ul></section>
++<section><h2 id="s3">Why we use it</h2><ul><li>To provide the service you asked for and keep you signed in (performance of our agreement with you).</li><li>To keep the service secure, prevent abuse and understand usage in aggregate (our legitimate interests).</li><li>To send account email such as verification and password resets, and notifications you switched on (agreement and consent).</li><li>To comply with the law.</li></ul></section>
++<section><h2 id="s4">Cookies and storage in your browser</h2><p>We use a small number of first-party cookies: a sign-in token (<code>ov_token</code>), a refresh token limited to the sign-in paths, a short-lived state cookie during sign-in, and a hint (<code>ov_sso_hint</code>) that remembers whether you were signed in. openvibe.network also keeps a sign-in cookie that lets other OpenVibe sites check, in a hidden frame or through your browser's built-in federated sign-in, whether to sign you in quietly. It is never used for anything except that check.</p><p>Your theme, display settings (text size, reduced motion), recent pages, a cached copy of the navigation and similar conveniences are kept in your browser's local storage. There are no third-party advertising or social cookies. Our sites sit behind Cloudflare, which may set its own security cookies and measure performance.</p></section>
++<section><h2 id="s5">Across OpenVibe sites</h2><p>OpenVibe sites share one account. When you are signed in, the site you visit learns who you are from openvibe.network. While cross-site history is switched on, the pages and tools you open while signed in are listed for you, and only you, at <a href="https://openvibe.network/history">openvibe.network/history</a>, where you can clear the list or pause it.</p></section>
++<section><h2 id="s6">Who we share with</h2><p>Only the services needed to run the network: hosting (OVH, servers in the United States), network security and delivery (Cloudflare), object storage for media (Backblaze B2 or Cloudflare R2), and email delivery for account messages. They process data on our instructions. We disclose information when the law requires it, and we tell the person affected when we are allowed to. If OpenVibe is ever reorganised or handed to new maintainers, the data moves under the same promises.</p></section>
++<section><h2 id="s7">How long we keep things</h2><ul><li>Request logs and raw usage events: a limited rolling period, then totals only.</li><li>The anonymous page count: totals per site and day, nothing personal to delete.</li></ul></section>
++<section><h2 id="s8">Where your data is</h2><p>Our servers are in the United States. If you use OpenVibe from elsewhere, your information is transferred to and processed in the United States, which may have different data protection rules from your country.</p></section>
++<section><h2 id="s9">Security</h2><p>Traffic is encrypted in transit. Passwords are stored as salted hashes, sign-in tokens are signed and short-lived, and internal service routes are not reachable from the internet. No system is perfectly secure; if a breach affects your personal information we will tell you and the relevant authorities as the law requires.</p></section>
++<section><h2 id="s10">Your choices and rights</h2><p>You can use most of ai.openvibe.services without an account, block cookies, and switch on Global Privacy Control to skip the anonymous page count. With an account you can view, correct, export and delete your data from your account settings, or ask us to do it.</p><p>Depending on where you live, including the EEA, the UK and US states such as California, you may have rights to access, correct, delete, restrict or object to the use of your data, to data portability, and to complain to your data protection authority. We do not sell or share personal information as those laws define it, and we do not make automated decisions with legal effect. Write to <a href="mailto:[email protected]">[email protected]</a>; we answer within 30 days and will not treat you differently for asking.</p></section>
++<section><h2 id="s11">Children</h2><p>ai.openvibe.services is not for children under 13, and we do not knowingly collect their information. If you believe a child has given us personal information, contact us and we will delete it.</p></section>
++<section><h2 id="s12">Changes and contact</h2><p>We will post changes here and update the date above; significant changes are announced on the site. Questions and requests: <a href="mailto:[email protected]">[email protected]</a>.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/terms">Terms of Service</a><a href="/dmca">DMCA &amp; Copyright</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/ai.openvibe.services/release.json b/dist/ai.openvibe.services/release.json
nnew file mode 100644
iindex 0000000..8c448c3
---- /dev/null
++++ b/dist/ai.openvibe.services/release.json
@@@ -0,0 +1,13 @@
++{
++ "service": "ai",
++ "release": "878913042518",
++ "released_at": "2026-09-28T00:00:00.000Z",
++ "booted_at": null,
++ "contracts_version": null,
++ "packages": {
++ "openvibe-shared": "1.23.0"
++ },
++ "min_client_release": null,
++ "mixed_version_window_hours": 24,
++ "kind": "placeholder"
++}
ddiff --git a/dist/ai.openvibe.services/robots.txt b/dist/ai.openvibe.services/robots.txt
nnew file mode 100644
iindex 0000000..e53638e
---- /dev/null
++++ b/dist/ai.openvibe.services/robots.txt
@@@ -0,0 +1,4 @@
++User-agent: *
++Allow: /
++Disallow: /auth/
++Sitemap: https://ai.openvibe.services/sitemap.xml
ddiff --git a/dist/ai.openvibe.services/sitemap.xml b/dist/ai.openvibe.services/sitemap.xml
nnew file mode 100644
iindex 0000000..d06ebeb
---- /dev/null
++++ b/dist/ai.openvibe.services/sitemap.xml
@@@ -0,0 +1,4 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
++ <url><loc>https://ai.openvibe.services/</loc><lastmod>2026-09-28</lastmod><changefreq>weekly</changefreq><priority>1.0</priority></url>
++</urlset>
ddiff --git a/dist/ai.openvibe.services/status.json b/dist/ai.openvibe.services/status.json
nnew file mode 100644
iindex 0000000..11dc454
---- /dev/null
++++ b/dist/ai.openvibe.services/status.json
@@@ -0,0 +1,23 @@
++{
++ "domain": "ai.openvibe.services",
++ "name": "ai.openvibe.services",
++ "stage": "placeholder",
++ "live": false,
++ "plannedRepo": "OpenVibers/OpenVibe.AI",
++ "repoUrl": "https://github.com/OpenVibers/OpenVibe.AI",
++ "repoExists": true,
++ "repoStage": "service-running",
++ "service": {
++ "stage": "alpha",
++ "code": true,
++ "deployed": true,
++ "statusCommit": "f034a9f",
++ "exposure": "internal",
++ "publicOrigin": null
++ },
++ "launchWaitsFor": "a public API with its own keys, quotas and playground; today only other OpenVibe services call it",
++ "factsAsOf": "2026-09-24",
++ "network": "https://openvibe.network",
++ "updated": "2026-09-28",
++ "note": "Static page served by OpenVibers/OpenVibe.Sites; service facts come from each repository's STATUS.json and the Network registry (facts.json). Removed from sites.json in the same release that the real service takes over this domain."
++}
ddiff --git a/dist/ai.openvibe.services/terms.html b/dist/ai.openvibe.services/terms.html
nnew file mode 100644
iindex 0000000..aaf878c
---- /dev/null
++++ b/dist/ai.openvibe.services/terms.html
@@@ -0,0 +1,114 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>Terms of Service — ai.openvibe.services</title>
++<meta name="description" content="The rules for using ai.openvibe.services, in plain language.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://ai.openvibe.services/terms">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="ai.openvibe.services">
++<meta property="og:title" content="Terms of Service — ai.openvibe.services">
++<meta property="og:description" content="The rules for using ai.openvibe.services, in plain language.">
++<meta property="og:url" content="https://ai.openvibe.services/terms">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="Terms of Service — ai.openvibe.services">
++<meta name="twitter:description" content="The rules for using ai.openvibe.services, in plain language.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="ai" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">ai.openvibe.services</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">ai.openvibe.services</p><h1>Terms of Service</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">The short version</a></li><li><a href="#s2">Who can use it</a></li><li><a href="#s3">This site is not open yet</a></li><li><a href="#s4">Rules for everyone</a></li><li><a href="#s5">Automated and AI-written text</a></li><li><a href="#s6">Reporting and moderation</a></li><li><a href="#s7">Leaving</a></li><li><a href="#s8">Open source, links and feedback</a></li><li><a href="#s9">No warranty, limited liability</a></li><li><a href="#s10">Governing law</a></li><li><a href="#s11">Changes and contact</a></li></ol></nav>
++<section><h2 id="s1">The short version</h2><p>ai.openvibe.services is part of OpenVibe, an open source, community-run network. Use it for lawful things, be decent to other people, and do not try to break it. Most of it works without an account. We can remove content or accounts that break these terms. The service is provided as it is, without warranties.</p><p>These terms cover ai.openvibe.services, its subdomains, and any other domain that serves the same service. Other OpenVibe sites have their own terms, written for what those sites do.</p></section>
++<section><h2 id="s2">Who can use it</h2><p>You must be at least 13 years old, or the minimum age of digital consent where you live. If you are under 18, a parent or guardian must agree to these terms for you. You may not use ai.openvibe.services if you were banned from the network, or if the law where you live forbids it.</p></section>
++<section><h2 id="s3">This site is not open yet</h2><p>ai.openvibe.services is a reserved address that currently shows a preview page. There is nothing to sign up for or post here yet. When it opens, these terms will be replaced with ones written for what it does, and the date above will change.</p></section>
++<section><h2 id="s4">Rules for everyone</h2><p>OpenVibe leans toward open expression. These limits apply on every site:</p><ul><li>Nothing illegal where you are or in the United States, where our servers are.</li><li>No sexual content involving minors and no sexualisation of minors, ever. We report it to the authorities.</li><li>No credible threats, incitement to violence, or publishing private information to harm someone.</li><li>No content you do not have the rights to.</li><li>No malware, phishing, spam, fraud, or impersonation of a person or organisation to deceive.</li><li>No attempts to disrupt the service, get around bans, rate limits or access controls, or reach other people's accounts or data.</li><li>No scraping that ignores robots.txt or our rate limits. Respectful crawlers, archives and AI agents are welcome; a machine-readable map is at /llms.txt where available.</li></ul></section>
++<section><h2 id="s5">Automated and AI-written text</h2><p>Some descriptive text on OpenVibe, such as footer blurbs, summaries and suggestions, is written by automated systems and checked by rules rather than by a person. It can be wrong. Do not rely on it for decisions that matter.</p></section>
++<section><h2 id="s6">Reporting and moderation</h2><p>Report content with the report controls where they exist, or write to <a href="mailto:[email protected]">[email protected]</a>. Copyright complaints follow the <a href="/dmca">DMCA process</a>. We may remove content, limit features, or suspend accounts that break these terms or put other people or the service at risk, and we may act without notice when the harm is urgent. If you think we got it wrong, reply to the notice or write to the same address and a person will look again.</p></section>
++<section><h2 id="s7">Leaving</h2><p>You can stop using ai.openvibe.services at any time. Sections that by their nature should survive (licences for content already shared, liability, governing law) continue after you leave.</p></section>
++<section><h2 id="s8">Open source, links and feedback</h2><p>OpenVibe's code is public. Each repository's licence governs your use of the code; these terms govern your use of the hosted service at ai.openvibe.services. Links to other sites are provided for convenience and we are not responsible for them. If you send us ideas or fixes, we may use them without owing you anything, and contributions to the code are made under the repository's licence.</p></section>
++<section><h2 id="s9">No warranty, limited liability</h2><p>The service is provided "as is" and "as available", without warranties of any kind, including fitness for a particular purpose, accuracy of results, or uninterrupted availability. To the extent the law allows, OpenVibe and the people who run it are not liable for indirect, incidental or consequential losses, lost data or lost profits arising from your use of ai.openvibe.services, and our total liability is limited to the greater of what you paid us in the past twelve months or fifty US dollars. Nothing here limits liability that cannot be limited by law, and consumer rights you have under the law of your country remain.</p><p>If your use of ai.openvibe.services breaks these terms or the law and someone brings a claim against us because of it, you agree to cover our reasonable costs.</p></section>
++<section><h2 id="s10">Governing law</h2><p>These terms are governed by the laws of the United States and the State of Washington, without regard to conflicts of law. Disputes are handled in the federal or state courts located in Washington State, unless the consumer law of your country gives you the right to use your local courts. If part of these terms cannot be enforced, the rest still applies. Not enforcing a term once does not waive it. These terms are the whole agreement between us about ai.openvibe.services.</p></section>
++<section><h2 id="s11">Changes and contact</h2><p>We may update these terms. Material changes are announced on the site before they take effect, and the date at the top changes. Continuing to use ai.openvibe.services after a change means you accept it. Questions: <a href="mailto:[email protected]">[email protected]</a>.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/privacy">Privacy Policy</a><a href="/dmca">DMCA &amp; Copyright</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/api.openvibe.network/index.html b/dist/api.openvibe.network/index.html
iindex c8794d4..0ec7800 100644
---- a/dist/api.openvibe.network/index.html
++++ b/dist/api.openvibe.network/index.html
@@@ -157,7 +157,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://auth.openvibe.network/"><i class="fa-solid fa-key" aria-hidden="true"></i>auth.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -168,6 +168,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/api.openvibe.network/release.json b/dist/api.openvibe.network/release.json
iindex 02a848c..24f65f5 100644
---- a/dist/api.openvibe.network/release.json
++++ b/dist/api.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "api",
-- "release": "93c16e099b7c",
++ "release": "5f4109b62022",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/auth.openvibe.network/index.html b/dist/auth.openvibe.network/index.html
iindex f2032ed..47e604c 100644
---- a/dist/auth.openvibe.network/index.html
++++ b/dist/auth.openvibe.network/index.html
@@@ -156,7 +156,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -167,6 +167,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/auth.openvibe.network/release.json b/dist/auth.openvibe.network/release.json
iindex 46719be..4e54682 100644
---- a/dist/auth.openvibe.network/release.json
++++ b/dist/auth.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "auth",
-- "release": "81ac11db46c1",
++ "release": "3af247c31d95",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openre.stream/index.html b/dist/openre.stream/index.html
iindex d5f8f8c..03d17f5 100644
---- a/dist/openre.stream/index.html
++++ b/dist/openre.stream/index.html
@@@ -171,7 +171,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -182,6 +182,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openre.stream/release.json b/dist/openre.stream/release.json
iindex c484128..0bb262c 100644
---- a/dist/openre.stream/release.json
++++ b/dist/openre.stream/release.json
@@@ -1,6 +1,6 @@
{
"service": "stream",
-- "release": "17c409245ae7",
++ "release": "6b05b3da46f2",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.bot/404.html b/dist/openvibe.bot/404.html
nnew file mode 100644
iindex 0000000..21c29cd
---- /dev/null
++++ b/dist/openvibe.bot/404.html
@@@ -0,0 +1,35 @@
++<!DOCTYPE html>
++<html lang="en">
++<head>
++<meta charset="utf-8">
++<meta name="viewport" content="width=device-width, initial-scale=1">
++<title>Not found · OpenVibe.Bot</title>
++<meta name="robots" content="noindex">
++<meta name="theme-color" content="#f472b6">
++<link rel="icon" type="image/svg+xml" data-ov-icon="network" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<style>
++*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
++:root{--bg-primary:#0a0f1c;--bg-secondary:#101828;--border:#1f2d47;--text-primary:#e6edf7;--text-secondary:#96a7c2;--site:#f472b6}
++body{background:var(--bg-primary);color:var(--text-primary);font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;min-height:100vh;display:grid;place-items:center;padding:24px 16px}
++main{max-width:560px;text-align:center}
++.code{font-size:14px;font-weight:700;letter-spacing:.2em;color:var(--site)}
++h1{font-size:clamp(28px,5vw,40px);font-weight:800;letter-spacing:-.8px;margin:10px 0 12px}
++p{color:var(--text-secondary);font-size:15px;line-height:1.65}
++.links{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:24px}
++a{display:inline-block;padding:11px 18px;border-radius:12px;font-size:14px;font-weight:600;text-decoration:none;border:1px solid var(--border);color:var(--text-primary);background:var(--bg-secondary)}
++a:first-child{background:var(--site);border-color:var(--site);color:#0b0d10}
++</style>
++</head>
++<body>
++<main>
++ <p class="code">404</p>
++ <h1>This page does not exist</h1>
++ <p>openvibe.bot has only its front page and legal pages for now. The address you followed is not one of them.</p>
++ <div class="links">
++ <a href="https://openvibe.bot/">OpenVibe.Bot</a>
++ <a href="https://openvibe.network/">OpenVibe.Network</a>
++ </div>
++</main>
++</body>
++</html>
ddiff --git a/dist/openvibe.bot/dmca.html b/dist/openvibe.bot/dmca.html
nnew file mode 100644
iindex 0000000..ab9296e
---- /dev/null
++++ b/dist/openvibe.bot/dmca.html
@@@ -0,0 +1,109 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>DMCA &amp; Copyright — OpenVibe.Bot</title>
++<meta name="description" content="How to report copyright infringement on OpenVibe.Bot, and how to respond to a report.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://openvibe.bot/dmca">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="OpenVibe.Bot">
++<meta property="og:title" content="DMCA &amp; Copyright — OpenVibe.Bot">
++<meta property="og:description" content="How to report copyright infringement on OpenVibe.Bot, and how to respond to a report.">
++<meta property="og:url" content="https://openvibe.bot/dmca">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="DMCA &amp; Copyright — OpenVibe.Bot">
++<meta name="twitter:description" content="How to report copyright infringement on OpenVibe.Bot, and how to respond to a report.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="bot" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">OpenVibe.Bot</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">OpenVibe.Bot</p><h1>DMCA &amp; Copyright</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">Our position</a></li><li><a href="#s2">Before you send a notice</a></li><li><a href="#s3">Send a takedown notice</a></li><li><a href="#s4">What happens next</a></li><li><a href="#s5">Repeat infringers and false claims</a></li><li><a href="#s6">Other complaints</a></li></ol></nav>
++<section><h2 id="s1">Our position</h2><p>OpenVibe.Bot respects copyright and responds to clear notices of alleged infringement under the Digital Millennium Copyright Act (17 U.S.C. § 512). OpenVibe.Bot currently publishes only its own material and does not host uploads from the public.</p></section>
++<section><h2 id="s2">Before you send a notice</h2><p>Consider whether the use is permitted, for example as fair use, commentary, criticism, or under a licence. Notices must come from the copyright owner or someone authorised to act for them. Misrepresentations in a notice carry legal liability.</p></section>
++<section><h2 id="s3">Send a takedown notice</h2><p>Email <a href="mailto:[email protected]">[email protected]</a> with all of the following:</p><ol><li>Your name, postal address, phone number and email address, and whom you represent.</li><li>The copyrighted work you say was infringed, or a representative list if there are several.</li><li>The exact URL on openvibe.bot of each item you want removed. General descriptions, search results and channel links are not enough to find it.</li><li>A statement that you have a good-faith belief the use is not authorised by the copyright owner, its agent or the law.</li><li>A statement, under penalty of perjury, that the information is accurate and that you are the owner or authorised to act for the owner.</li><li>Your physical or electronic signature.</li></ol></section>
++<section><h2 id="s4">What happens next</h2><p>We remove or disable access to the material, tell the person who posted it, and give them a copy of your notice, including your contact details. We act on complete notices as quickly as we can, normally within a few business days. Incomplete notices get a reply saying what is missing.</p></section>
++<section><h2 id="s5">Repeat infringers and false claims</h2><p>Accounts that receive repeated valid notices lose the ability to post and, in appropriate circumstances, are terminated across the network. Knowingly false notices and counter-notices carry liability under § 512(f); we refuse notices that are clearly abusive or automated without review.</p></section>
++<section><h2 id="s6">Other complaints</h2><p>Trademark, privacy, impersonation, harassment and other non-copyright complaints go to the same address; say which kind of complaint it is and give the exact URL. Content that sexually exploits children should be reported to us immediately and to the <a href="https://report.cybertip.org/" rel="noopener">NCMEC CyberTipline</a> or your national hotline; we remove it and report it to the authorities.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/terms">Terms of Service</a><a href="/privacy">Privacy Policy</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/openvibe.bot/index.html b/dist/openvibe.bot/index.html
nnew file mode 100644
iindex 0000000..b5d2183
---- /dev/null
++++ b/dist/openvibe.bot/index.html
@@@ -0,0 +1,284 @@
++<!DOCTYPE html>
++<html lang="en">
++<head>
++<meta charset="utf-8">
++<meta name="viewport" content="width=device-width, initial-scale=1">
++<title>OpenVibe.Bot — Robots, cameras and devices you can share safely.</title>
++<meta name="description" content="OpenVibe.Bot will let you register robots, Raspberry Pis, cameras, motors, sensors and other devices, pair them securely, and control them yourself or hand control to friends, stream viewers, apps or your AI agents with timed turns, queues and permissions. Safety runs on the device too: heartbeats, command time limits, speed and range limits and an emergency stop that works without the cloud. OpenVibe.Live already runs stream-controlled robots; Bot makes the device its own thing.">
++<meta name="keywords" content="remote control robot, stream controlled robot, raspberry pi robot control, telepresence robot, iot device control api">
++<meta name="robots" content="index, follow, max-image-preview:large">
++<meta name="theme-color" content="#f472b6">
++<link rel="canonical" href="https://openvibe.bot/">
++<link rel="icon" type="image/svg+xml" data-ov-icon="network" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<link rel="manifest" href="/manifest.webmanifest">
++<link rel="alternate" type="text/html" hreflang="en" href="https://openvibe.bot/">
++<meta property="og:type" content="website">
++<meta property="og:site_name" content="OpenVibe.Bot">
++<meta property="og:url" content="https://openvibe.bot/">
++<meta property="og:title" content="OpenVibe.Bot — Robots, cameras and devices you can share safely.">
++<meta property="og:description" content="OpenVibe.Bot will let you register robots, Raspberry Pis, cameras, motors, sensors and other devices, pair them securely, and control them yourself or hand control to friends, stream viewers, apps or your AI agents with timed turns, queues and permissions. Safety runs on the device too: heartbeats, command time limits, speed and range limits and an emergency stop that works without the cloud. OpenVibe.Live already runs stream-controlled robots; Bot makes the device its own thing.">
++<meta property="og:image" content="https://openvibe.network/assets/logo-512.png">
++<meta property="og:image:alt" content="OpenVibe">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="OpenVibe.Bot — Robots, cameras and devices you can share safely.">
++<meta name="twitter:description" content="OpenVibe.Bot will let you register robots, Raspberry Pis, cameras, motors, sensors and other devices, pair them securely, and control them yourself or hand control to friends, stream viewers, apps or your AI agents with timed turns, queues and permissions. Safety runs on the device too: heartbeats, command time limits, speed and range limits and an emergency stop that works without the cloud. OpenVibe.Live already runs stream-controlled robots; Bot makes the device its own thing.">
++<meta name="twitter:image" content="https://openvibe.network/assets/logo-512.png">
++<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://openvibe.bot/#site","url":"https://openvibe.bot/","name":"OpenVibe.Bot","description":"OpenVibe.Bot will let you register robots, Raspberry Pis, cameras, motors, sensors and other devices, pair them securely, and control them yourself or hand control to friends, stream viewers, apps or your AI agents with timed turns, queues and permissions. Safety runs on the device too: heartbeats, command time limits, speed and range limits and an emergency stop that works without the cloud. OpenVibe.Live already runs stream-controlled robots; Bot makes the device its own thing.","inLanguage":"en","publisher":{"@type":"Organization","@id":"https://openvibe.network/#org","name":"OpenVibe","url":"https://openvibe.network/","logo":"https://openvibe.network/assets/logo-512.png","sameAs":["https://github.com/OpenVibers","https://discord.gg/M6MuRUaeJj"]},"isPartOf":{"@type":"WebSite","@id":"https://openvibe.network/#site","name":"OpenVibe.Network","url":"https://openvibe.network/"}},{"@type":"WebPage","@id":"https://openvibe.bot/#page","url":"https://openvibe.bot/","name":"OpenVibe.Bot — Robots, cameras and devices you can share safely.","description":"OpenVibe.Bot will let you register robots, Raspberry Pis, cameras, motors, sensors and other devices, pair them securely, and control them yourself or hand control to friends, stream viewers, apps or your AI agents with timed turns, queues and permissions. Safety runs on the device too: heartbeats, command time limits, speed and range limits and an emergency stop that works without the cloud. OpenVibe.Live already runs stream-controlled robots; Bot makes the device its own thing.","isPartOf":{"@id":"https://openvibe.bot/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-28","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"OpenVibe","item":"https://openvibe.network/"},{"@type":"ListItem","position":2,"name":"OpenVibe.Bot","item":"https://openvibe.bot/"}]}}]}</script>
++<script>(function(){try{var raw=localStorage.getItem('ov_theme');if(!raw)return;var t=JSON.parse(raw),v=t&&t.variables;if(!v)return;var el=document.documentElement;for(var k in v)if(k.charAt(0)==='-')el.style.setProperty(k,v[k]);if(t.id)el.setAttribute('data-theme',t.id);}catch(_){}})();</script>
++<script src="/shared/theme-loader.js?v=d9b9af081efe" defer></script>
++<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
++<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" media="print" onload="this.media='all'">
++<noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"></noscript>
++<style>
++*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
++:root{--bg-primary:#0a0f1c;--bg-secondary:#101828;--bg-card:#131c2e;--bg-hover:#1c2a44;--border:#1f2d47;--text-primary:#e6edf7;--text-secondary:#96a7c2;--text-muted:#7386a3;--accent:#3b82f6;--accent-light:#60a5fa;--accent-rgb:59,130,246;--on-accent:#fff;--site:#f472b6;--site-rgb:244,114,182}
++html{scroll-behavior:smooth}
++body{background:var(--bg-primary);color:var(--text-primary);font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;min-height:100vh;display:flex;flex-direction:column;overflow-x:hidden}
++main{flex:1;position:relative}
++.orbs{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
++.orbs i{position:absolute;border-radius:50%;filter:blur(90px);opacity:.16;animation:drift 26s ease-in-out infinite alternate}
++.orbs i:nth-child(1){width:420px;height:420px;background:var(--site);top:-140px;left:-120px}
++.orbs i:nth-child(2){width:360px;height:360px;background:var(--accent);top:40%;right:-140px;animation-delay:-9s}
++.orbs i:nth-child(3){width:300px;height:300px;background:var(--site);bottom:-120px;left:38%;animation-delay:-17s}
++@keyframes drift{0%{transform:translate(0,0) scale(1)}50%{transform:translate(-26px,36px) scale(1.07)}100%{transform:translate(34px,-28px) scale(.95)}}
++.wrap{position:relative;z-index:1;max-width:1040px;margin:0 auto;padding:0 20px}
++.hero{padding:84px 0 44px;text-align:center}
++.hero .mark{display:inline-grid;place-items:center;width:84px;height:84px;border-radius:24px;background:rgba(var(--site-rgb),.12);border:1px solid rgba(var(--site-rgb),.35);color:var(--site);font-size:34px;margin-bottom:22px;box-shadow:0 20px 60px rgba(var(--site-rgb),.18);animation:rise .6s cubic-bezier(.2,.8,.2,1) both}
++.hero .badge{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;border-radius:999px;border:1px solid var(--border);background:var(--bg-secondary);font-size:12px;font-weight:600;color:var(--text-secondary);letter-spacing:.3px;margin-bottom:22px;animation:rise .6s .05s cubic-bezier(.2,.8,.2,1) both}
++.hero .badge b{color:var(--site)}
++.hero h1{font-size:clamp(34px,6vw,58px);font-weight:800;letter-spacing:-1.4px;line-height:1.08;animation:rise .6s .1s cubic-bezier(.2,.8,.2,1) both}
++.hero h1 .d{color:var(--site)}
++.hero h1 .tld{color:var(--text-secondary)}
++.hero .tag{font-size:clamp(18px,2.6vw,24px);font-weight:600;color:var(--text-primary);margin:18px 0 10px;animation:rise .6s .16s cubic-bezier(.2,.8,.2,1) both}
++.hero p.lead{color:var(--text-secondary);font-size:16px;line-height:1.65;max-width:680px;margin:0 auto;animation:rise .6s .22s cubic-bezier(.2,.8,.2,1) both}
++.ctas{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:30px;animation:rise .6s .3s cubic-bezier(.2,.8,.2,1) both}
++.hero .status{margin:22px auto 0;max-width:720px;font-size:12.5px;line-height:1.7;color:var(--text-muted);border:1px dashed var(--border);border-radius:12px;padding:10px 14px;background:rgba(0,0,0,.15)}
++.hero .status b{color:var(--site)}
++.hero .status code{font-size:12px;color:var(--text-secondary);background:var(--bg-secondary);padding:1px 6px;border-radius:6px}
++.hero .status a{color:var(--text-secondary)}
++.btn{display:inline-flex;align-items:center;gap:9px;padding:12px 20px;border-radius:12px;font-size:14px;font-weight:600;text-decoration:none;border:1px solid var(--border);color:var(--text-primary);background:var(--bg-secondary);transition:transform .15s,border-color .15s,box-shadow .15s}
++.btn:hover{transform:translateY(-1px);border-color:var(--site);box-shadow:0 10px 30px rgba(var(--site-rgb),.15)}
++.btn-primary{background:var(--site);border-color:var(--site);color:#0b0d10}
++.btn-primary:hover{filter:brightness(1.08)}
++@keyframes rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
++section{padding:36px 0}
++h2{font-size:22px;font-weight:700;letter-spacing:-.3px;margin-bottom:6px}
++.lead2{color:var(--text-secondary);font-size:14px;margin-bottom:20px}
++.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px}
++.card{background:var(--bg-card);border:1px solid var(--border);border-radius:16px;padding:20px;transition:transform .2s,border-color .2s,box-shadow .2s;text-decoration:none;color:inherit;display:flex;flex-direction:column;gap:8px}
++a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);box-shadow:0 16px 40px rgba(0,0,0,.35)}
++.card .ic{width:40px;height:40px;border-radius:11px;display:grid;place-items:center;background:rgba(var(--site-rgb),.12);color:var(--site);font-size:17px}
++.card b{font-size:15px}
++.card span{font-size:13px;color:var(--text-secondary);line-height:1.55}
++.card .go{margin-top:auto;font-size:12.5px;font-weight:600;color:var(--site)}
++.highlight .hl-card{border:1px solid rgba(var(--accent-rgb),.45);background:rgba(var(--accent-rgb),.10);border-radius:18px;padding:22px 22px 18px}
++.highlight h2{margin:0 0 8px}.highlight h2 i{color:var(--accent-light)}.highlight p{margin:0 0 10px}
++.highlight ul{margin:0 0 14px;padding-left:20px}.highlight li{margin:4px 0}
++.faq details{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:12px 14px;margin:8px 0}
++.faq summary{cursor:pointer;font-weight:600}.faq details p{margin:8px 0 0;opacity:.85}
++.meanwhile .card .ic{background:rgba(var(--accent-rgb),.12);color:var(--accent-light)}
++.net .card .ic{background:var(--bg-hover);color:var(--text-primary)}
++.rooms{display:flex;flex-wrap:wrap;gap:8px}
++.rooms a{font-size:12.5px;padding:7px 12px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary);text-decoration:none;transition:all .15s;background:var(--bg-secondary)}
++.rooms a:hover{color:var(--text-primary);border-color:var(--site)}
++.rooms a i{margin-right:6px;opacity:.8}
++.strip{border:1px solid var(--border);border-radius:18px;background:var(--bg-secondary);padding:30px 26px;text-align:center;margin:10px 0 50px}
++.strip h3{font-size:19px;font-weight:700;margin:12px 0 8px}
++.strip p{font-size:14px;color:var(--text-secondary);max-width:600px;margin:0 auto 18px;line-height:1.6}
++.strip .ov-mark{width:44px;height:44px}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}}
++@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
++</style>
++</head>
++<body>
++<div class="orbs"><i></i><i></i><i></i></div>
++<div id="navbar-mount"></div>
++<main class="wrap">
++ <header class="hero">
++ <div class="mark"><i class="fa-solid fa-robot" aria-hidden="true"></i></div>
++ <div class="badge"><span class="ov-mark" data-size="16" data-variant="bot"></span> Part of the OpenVibe network · <b>planned</b></div>
++ <h1>OpenVibe<span class="d">.</span><span class="tld">Bot</span></h1>
++ <div class="tag">Robots, cameras and devices you can share safely.</div>
++ <p class="lead">OpenVibe.Bot will let you register robots, Raspberry Pis, cameras, motors, sensors and other devices, pair them securely, and control them yourself or hand control to friends, stream viewers, apps or your AI agents with timed turns, queues and permissions. Safety runs on the device too: heartbeats, command time limits, speed and range limits and an emergency stop that works without the cloud. OpenVibe.Live already runs stream-controlled robots; Bot makes the device its own thing.</p>
++ <div class="ctas">
++ <a class="btn btn-primary" href="https://openvibe.network/login?return=https%3A%2F%2Fopenvibe.bot%2F"><i class="fa-solid fa-right-to-bracket"></i> Sign in with OpenVibe</a>
++ <a class="btn" href="https://openvibe.network/#network"><i class="fa-solid fa-circle-nodes"></i> The whole network</a>
++ <a class="btn" href="https://discord.gg/M6MuRUaeJj" rel="noopener"><i class="fa-brands fa-discord"></i> Follow the build</a>
++ </div>
++ <p class="status"><i class="fa-solid fa-clock" aria-hidden="true"></i> Status: <b>planned</b> · <strong>OpenVibe.Bot</strong> is planned; its repository and code do not exist yet: this page is a placeholder, nothing here is live yet. The public launch is waiting for device pairing and control leases split out of OpenVibe.Live. · as of 2026-09-24 · <a href="/status.json">status.json</a></p>
++ </header>
++
++
++ <section id="what">
++ <h2>What OpenVibe.Bot will be</h2>
++ <p class="lead2">Same account, same themes, same navbar as every other OpenVibe site — built in the open, run by its community.</p>
++ <div class="grid">
++ <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Pair devices</b><span>Revocable device keys and one-time pairing codes, not stream keys.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Share control</b><span>Owner, whitelist, queues, timed turns, moderators and apps.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Safe on the device</b><span>Dead-man stop, command limits and local emergency stop.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>Stream it</b><span>Connect a device to a Live stream, a game or a website.</span></div>
++ </div>
++ </section>
++
++ <section class="meanwhile">
++ <h2>Meanwhile, on the network</h2>
++ <p class="lead2">Most of this already exists somewhere on OpenVibe — start there today.</p>
++ <div class="grid">
++ <a class="card" href="https://openvibe.live"><div class="ic"><i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i></div><b>Robots on OpenVibe.Live</b><span>Stream-controlled robots and cameras run on Live today.</span><span class="go">openvibe.live →</span></a>
++ <a class="card" href="https://github.com/OpenVibers/OpenVibe.Extensions"><div class="ic"><i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i></div><b>OpenVibe.Extensions</b><span>Device-side agents and hardware scripts.</span><span class="go">github.com/OpenVibers/OpenVibe.Extensions →</span></a>
++ </div>
++ </section>
++
++
++ <section class="net">
++ <h2>The OpenVibe network</h2>
++ <p class="lead2">One account for all of it. Sign in once and every site signs you in.</p>
++ <div class="grid">
++ <a class="card" href="https://openvibe.live"><div class="ic"><i class="fa-solid fa-tower-broadcast" aria-hidden="true"></i></div><b>OpenVibe.Live</b><span>Go live, chat, clip, restream</span><span class="go">openvibe.live →</span></a>
++ <a class="card" href="https://openvibe.tools"><div class="ic"><i class="fa-solid fa-screwdriver-wrench" aria-hidden="true"></i></div><b>OpenVibe.Tools</b><span>Hundreds of online tools</span><span class="go">openvibe.tools →</span></a>
++ <a class="card" href="https://openvibe.community"><div class="ic"><i class="fa-solid fa-people-group" aria-hidden="true"></i></div><b>OpenVibe.Community</b><span>Pastes, posts, people</span><span class="go">openvibe.community →</span></a>
++ <a class="card" href="https://openvibe.games"><div class="ic"><i class="fa-solid fa-gamepad" aria-hidden="true"></i></div><b>OpenVibe.Games</b><span>Scraplandia and browser games</span><span class="go">openvibe.games →</span></a>
++ <a class="card" href="https://openvibe.media"><div class="ic"><i class="fa-solid fa-photo-film" aria-hidden="true"></i></div><b>OpenVibe.Media</b><span>VODs, clips and files</span><span class="go">openvibe.media →</span></a>
++ <a class="card" href="https://openvibe.network"><div class="ic"><i class="fa-solid fa-circle-nodes" aria-hidden="true"></i></div><b>OpenVibe.Network</b><span>One account, every site</span><span class="go">openvibe.network →</span></a>
++ </div>
++ <h2 style="margin-top:28px;font-size:16px">Other OpenVibe domains, not open yet</h2>
++ <div class="rooms" style="margin-top:8px">
++ <a href="https://openvibe.news/"><i class="fa-solid fa-newspaper" aria-hidden="true"></i>OpenVibe.News</a>
++ <a href="https://openvibe.reviews/"><i class="fa-solid fa-star-half-stroke" aria-hidden="true"></i>OpenVibe.Reviews</a>
++ <a href="https://openvibe.tips/"><i class="fa-solid fa-hand-holding-heart" aria-hidden="true"></i>OpenVibe.Tips</a>
++ <a href="https://openvibe.vip/"><i class="fa-solid fa-crown" aria-hidden="true"></i>OpenVibe.VIP</a>
++ <a href="https://openvibe.trade/"><i class="fa-solid fa-chart-line" aria-hidden="true"></i>OpenVibe.Trade</a>
++ <a href="https://openvibe.host/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Host</a>
++ <a href="https://openvibe.deals/"><i class="fa-solid fa-tags" aria-hidden="true"></i>OpenVibe.Deals</a>
++ <a href="https://openvibe.coupons/"><i class="fa-solid fa-ticket" aria-hidden="true"></i>OpenVibe.Coupons</a>
++ <a href="https://openre.stream/"><i class="fa-solid fa-satellite-dish" aria-hidden="true"></i>OpenRe.Stream</a>
++ <a href="https://auth.openvibe.network/"><i class="fa-solid fa-key" aria-hidden="true"></i>auth.openvibe.network</a>
++ <a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
++ <a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
++ <a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
++ <a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
++ <a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
++ <a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
++ <a href="https://openvibe.food/"><i class="fa-solid fa-utensils" aria-hidden="true"></i>OpenVibe.Food</a>
++ <a href="https://openvibe.quest/"><i class="fa-solid fa-map" aria-hidden="true"></i>OpenVibe.Quest</a>
++ <a href="https://openvibe.rent/"><i class="fa-solid fa-key" aria-hidden="true"></i>OpenVibe.Rent</a>
++ <a href="https://openvibe.homes/"><i class="fa-solid fa-house" aria-hidden="true"></i>OpenVibe.Homes</a>
++ <a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
++ <a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
++ <a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ </div>
++ </section>
++
++ <div class="strip">
++ <span class="ov-mark" data-size="44" data-variant="bot"></span>
++ <h3>Open source. Community run.</h3>
++ <p>Every OpenVibe site is built in the open by the people using it — free speech within the rules, no gatekeeping, one identity that follows you everywhere.</p>
++ <a class="btn" href="https://github.com/OpenVibers" rel="noopener"><i class="fa-brands fa-github"></i> OpenVibers on GitHub</a>
++ </div>
++</main>
++<style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="full"><div class="ovf-inner">
++ <div class="ovf-cols">
++ <div class="ovf-col ovf-col--brand">
++ <a class="ovf-brand" href="/"><span class="ov-mark" data-size="26"></span><span>OpenVibe</span></a>
++ <p class="ovf-tagline">Open source and community run. Built in the open by the people using it.</p>
++ <div class="ovf-social">
++ <a href="https://github.com/OpenVibers" target="_blank" rel="noopener" aria-label="GitHub" title="GitHub"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path fill="currentColor" stroke="none" d="M12 2.2a9.8 9.8 0 0 0-3.1 19.1c.5.1.7-.2.7-.5v-1.7c-2.7.6-3.3-1.2-3.3-1.2-.4-1.1-1.1-1.4-1.1-1.4-.9-.6.1-.6.1-.6 1 .1 1.5 1 1.5 1 .9 1.5 2.3 1.1 2.9.8.1-.6.3-1.1.6-1.3-2.2-.2-4.5-1.1-4.5-4.8 0-1.1.4-1.9 1-2.6-.1-.2-.4-1.2.1-2.6 0 0 .8-.3 2.7 1a9.3 9.3 0 0 1 4.9 0c1.9-1.3 2.7-1 2.7-1 .5 1.4.2 2.4.1 2.6.6.7 1 1.5 1 2.6 0 3.7-2.3 4.6-4.5 4.8.4.3.7.9.7 1.800v2.700c0 .3.2.6.7.5A9.8 9.8 0 0 0 12 2.200z"/></svg></a><a href="https://discord.gg/M6MuRUaeJj" target="_blank" rel="noopener" aria-label="Discord" title="Discord"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path fill="currentColor" stroke="none" d="M19.3 5.300a16.5 16.5 0 0 0-4.1-1.300l-.5 1a15.3 15.3 0 0 0-5.4 0l-.5-1a16.5 16.5 0 0 0-4.1 1.300C2.1 9.2 1.4 13 1.7 16.700a16.6 16.6 0 0 0 5.1 2.600l1.1-1.800c-.6-.2-1.2-.5-1.7-.8l.4-.3a11.8 11.8 0 0 0 10.8 0l.4.3c-.5.3-1.1.6-1.7.8l1.1 1.800a16.6 16.6 0 0 0 5.1-2.600c.4-4.3-.7-8.1-3-11.400zM8.7 14.400c-1 0-1.8-.9-1.8-2.100s.8-2.1 1.8-2.1 1.9 1 1.8 2.100c0 1.2-.8 2.1-1.8 2.100zm6.6 0c-1 0-1.8-.9-1.8-2.100s.8-2.1 1.8-2.1 1.9 1 1.8 2.100c0 1.2-.8 2.1-1.8 2.100z"/></svg></a>
++ <a href="/sitemap.xml" aria-label="Sitemap" title="Sitemap"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="9" y="3.5" width="6" height="4.5" rx="1"/><rect x="3" y="16" width="6" height="4.5" rx="1"/><rect x="15" y="16" width="6" height="4.5" rx="1"/><path d="M12 8v4M6 16v-2.500h12V16"/></svg></a>
++ </div>
++ </div>
++
++ <nav class="ovf-col" aria-label="The OpenVibe network">
++ <h3>Network</h3>
++ <a href="https://openvibe.live" title="Go live, restream and clip">Live streaming</a><a href="https://openvibe.tools" title="The whole toolbox">Online tools</a><a href="https://dev.openvibe.tools" title="Formatters, encoders, validators">Developer tools</a><a href="https://net.openvibe.tools" title="Ping, DNS, Whois, SSL">Network diagnostics</a><a href="https://img.openvibe.tools" title="Convert, resize, compress">Image converter</a><a href="https://audio.openvibe.tools" title="Convert, trim, pitch-shift">Audio converter</a>
++ <a class="ovf-more" href="https://openvibe.network" target="_blank" rel="noopener">Everything else <svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
++ </nav>
++
++ <nav class="ovf-col" aria-label="Legal">
++ <h3>Legal</h3>
++ <a href="https://openvibe.live/tos">Terms of Service</a><a href="https://openvibe.live/privacy">Privacy Policy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ </div>
++ <div class="ovf-account" id="ovf-account" hidden></div>
++ <div class="ovf-bar">
++ <span class="ovf-copy">Open source &amp; community driven · built in the open</span>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="bot" href="https://openvibe.network/updates?site=bot" hidden></a>
++ <span class="ovf-legal-inline">
++ <a href="https://openvibe.network/updates?site=bot">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </span>
++ </div>
++ </div></footer>
++<script src="/shared/ov-mark.js?v=96079ebf2943" async></script>
++<script src="/shared/navbar.js?v=b50d9f47fc34"></script>
++<script src="/shared/footer.js?v=b99e512398d5"></script>
++<script>
++(function () {
++ if (window.OpenVibeNavbar) { try { OpenVibeNavbar.init({ service: 'bot', apiBase: 'https://openvibe.network', links: [{ label: 'What it will be', href: '#what' }, { label: 'The network', href: 'https://openvibe.network/#network', external: false }], history: { type: 'page', title: 'OpenVibe.Bot' } }); } catch (e) {} }
++ if (window.OpenVibeFooter) { try { OpenVibeFooter.init({ service: 'bot', variant: 'full', links: [{ heading: 'OpenVibe.Bot', items: [{ name: 'Sign in', url: 'https://openvibe.network/login?return=https%3A%2F%2Fopenvibe.bot%2F' }, { name: 'The network', url: 'https://openvibe.network/#network' }, { name: 'Discord', url: 'https://discord.gg/M6MuRUaeJj' }] }] }); } catch (e) {} }
++})();
++</script>
++</body>
++</html>
ddiff --git a/dist/openvibe.bot/manifest.webmanifest b/dist/openvibe.bot/manifest.webmanifest
nnew file mode 100644
iindex 0000000..a4c8902
---- /dev/null
++++ b/dist/openvibe.bot/manifest.webmanifest
@@@ -0,0 +1,48 @@
++{
++ "name": "OpenVibe.Bot",
++ "short_name": "Bot",
++ "description": "Robots, cameras and devices you can share safely.",
++ "start_url": "/",
++ "scope": "/",
++ "display": "standalone",
++ "background_color": "#0a0f1c",
++ "theme_color": "#3b82f6",
++ "icons": [
++ {
++ "src": "https://openvibe.network/assets/logo-72.png",
++ "sizes": "72x72",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-192.png",
++ "sizes": "192x192",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-512.png",
++ "sizes": "512x512",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-maskable-192.png",
++ "sizes": "192x192",
++ "type": "image/png",
++ "purpose": "maskable"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-maskable-512.png",
++ "sizes": "512x512",
++ "type": "image/png",
++ "purpose": "maskable"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo.svg",
++ "sizes": "any",
++ "type": "image/svg+xml",
++ "purpose": "any"
++ }
++ ]
++}
ddiff --git a/dist/openvibe.bot/privacy.html b/dist/openvibe.bot/privacy.html
nnew file mode 100644
iindex 0000000..0d7d2b8
---- /dev/null
++++ b/dist/openvibe.bot/privacy.html
@@@ -0,0 +1,115 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>Privacy Policy — OpenVibe.Bot</title>
++<meta name="description" content="What OpenVibe.Bot collects, why, and the choices you have.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://openvibe.bot/privacy">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="OpenVibe.Bot">
++<meta property="og:title" content="Privacy Policy — OpenVibe.Bot">
++<meta property="og:description" content="What OpenVibe.Bot collects, why, and the choices you have.">
++<meta property="og:url" content="https://openvibe.bot/privacy">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="Privacy Policy — OpenVibe.Bot">
++<meta name="twitter:description" content="What OpenVibe.Bot collects, why, and the choices you have.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="bot" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">OpenVibe.Bot</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">OpenVibe.Bot</p><h1>Privacy Policy</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">The short version</a></li><li><a href="#s2">What we collect</a></li><li><a href="#s3">Why we use it</a></li><li><a href="#s4">Cookies and storage in your browser</a></li><li><a href="#s5">Across OpenVibe sites</a></li><li><a href="#s6">Who we share with</a></li><li><a href="#s7">How long we keep things</a></li><li><a href="#s8">Where your data is</a></li><li><a href="#s9">Security</a></li><li><a href="#s10">Your choices and rights</a></li><li><a href="#s11">Children</a></li><li><a href="#s12">Changes and contact</a></li></ol></nav>
++<section><h2 id="s1">The short version</h2><p>OpenVibe.Bot collects what it needs to work and to keep abuse out, and no more. We do not sell or rent personal information, we do not share it for advertising, and we do not run advertising trackers. Most of OpenVibe.Bot works without an account.</p></section>
++<section><h2 id="s2">What we collect</h2><ul><li><b>Request logs.</b> Like every web server, ours record your IP address, browser type, the address requested and the time. We use them for security, rate limiting, debugging and aggregate traffic statistics.</li><li><b>Usage statistics.</b> First-party page views with a random session identifier, kept on our own servers, so we can see which parts of the network are used.</li><li><b>An anonymous page count.</b> The shared navigation bar reports one count per page load containing only the site's hostname and the day. No user, IP address or page is stored with it. It decides the order of sites in our menus. It is skipped when your browser sends Global Privacy Control or Do Not Track.</li></ul></section>
++<section><h2 id="s3">Why we use it</h2><ul><li>To provide the service you asked for and keep you signed in (performance of our agreement with you).</li><li>To keep the service secure, prevent abuse and understand usage in aggregate (our legitimate interests).</li><li>To send account email such as verification and password resets, and notifications you switched on (agreement and consent).</li><li>To comply with the law.</li></ul></section>
++<section><h2 id="s4">Cookies and storage in your browser</h2><p>We use a small number of first-party cookies: a sign-in token (<code>ov_token</code>), a refresh token limited to the sign-in paths, a short-lived state cookie during sign-in, and a hint (<code>ov_sso_hint</code>) that remembers whether you were signed in. openvibe.network also keeps a sign-in cookie that lets other OpenVibe sites check, in a hidden frame or through your browser's built-in federated sign-in, whether to sign you in quietly. It is never used for anything except that check.</p><p>Your theme, display settings (text size, reduced motion), recent pages, a cached copy of the navigation and similar conveniences are kept in your browser's local storage. There are no third-party advertising or social cookies. Our sites sit behind Cloudflare, which may set its own security cookies and measure performance.</p></section>
++<section><h2 id="s5">Across OpenVibe sites</h2><p>OpenVibe sites share one account. When you are signed in, the site you visit learns who you are from openvibe.network. While cross-site history is switched on, the pages and tools you open while signed in are listed for you, and only you, at <a href="https://openvibe.network/history">openvibe.network/history</a>, where you can clear the list or pause it.</p></section>
++<section><h2 id="s6">Who we share with</h2><p>Only the services needed to run the network: hosting (OVH, servers in the United States), network security and delivery (Cloudflare), object storage for media (Backblaze B2 or Cloudflare R2), and email delivery for account messages. They process data on our instructions. We disclose information when the law requires it, and we tell the person affected when we are allowed to. If OpenVibe is ever reorganised or handed to new maintainers, the data moves under the same promises.</p></section>
++<section><h2 id="s7">How long we keep things</h2><ul><li>Request logs and raw usage events: a limited rolling period, then totals only.</li><li>The anonymous page count: totals per site and day, nothing personal to delete.</li></ul></section>
++<section><h2 id="s8">Where your data is</h2><p>Our servers are in the United States. If you use OpenVibe from elsewhere, your information is transferred to and processed in the United States, which may have different data protection rules from your country.</p></section>
++<section><h2 id="s9">Security</h2><p>Traffic is encrypted in transit. Passwords are stored as salted hashes, sign-in tokens are signed and short-lived, and internal service routes are not reachable from the internet. No system is perfectly secure; if a breach affects your personal information we will tell you and the relevant authorities as the law requires.</p></section>
++<section><h2 id="s10">Your choices and rights</h2><p>You can use most of OpenVibe.Bot without an account, block cookies, and switch on Global Privacy Control to skip the anonymous page count. With an account you can view, correct, export and delete your data from your account settings, or ask us to do it.</p><p>Depending on where you live, including the EEA, the UK and US states such as California, you may have rights to access, correct, delete, restrict or object to the use of your data, to data portability, and to complain to your data protection authority. We do not sell or share personal information as those laws define it, and we do not make automated decisions with legal effect. Write to <a href="mailto:[email protected]">[email protected]</a>; we answer within 30 days and will not treat you differently for asking.</p></section>
++<section><h2 id="s11">Children</h2><p>OpenVibe.Bot is not for children under 13, and we do not knowingly collect their information. If you believe a child has given us personal information, contact us and we will delete it.</p></section>
++<section><h2 id="s12">Changes and contact</h2><p>We will post changes here and update the date above; significant changes are announced on the site. Questions and requests: <a href="mailto:[email protected]">[email protected]</a>.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/terms">Terms of Service</a><a href="/dmca">DMCA &amp; Copyright</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/openvibe.bot/release.json b/dist/openvibe.bot/release.json
nnew file mode 100644
iindex 0000000..3cc4a9d
---- /dev/null
++++ b/dist/openvibe.bot/release.json
@@@ -0,0 +1,13 @@
++{
++ "service": "bot",
++ "release": "ed66413aa283",
++ "released_at": "2026-09-28T00:00:00.000Z",
++ "booted_at": null,
++ "contracts_version": null,
++ "packages": {
++ "openvibe-shared": "1.23.0"
++ },
++ "min_client_release": null,
++ "mixed_version_window_hours": 24,
++ "kind": "placeholder"
++}
ddiff --git a/dist/openvibe.bot/robots.txt b/dist/openvibe.bot/robots.txt
nnew file mode 100644
iindex 0000000..6ea2dad
---- /dev/null
++++ b/dist/openvibe.bot/robots.txt
@@@ -0,0 +1,4 @@
++User-agent: *
++Allow: /
++Disallow: /auth/
++Sitemap: https://openvibe.bot/sitemap.xml
ddiff --git a/dist/openvibe.bot/sitemap.xml b/dist/openvibe.bot/sitemap.xml
nnew file mode 100644
iindex 0000000..f88ce0e
---- /dev/null
++++ b/dist/openvibe.bot/sitemap.xml
@@@ -0,0 +1,4 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
++ <url><loc>https://openvibe.bot/</loc><lastmod>2026-09-28</lastmod><changefreq>weekly</changefreq><priority>1.0</priority></url>
++</urlset>
ddiff --git a/dist/openvibe.bot/status.json b/dist/openvibe.bot/status.json
nnew file mode 100644
iindex 0000000..bf9e1df
---- /dev/null
++++ b/dist/openvibe.bot/status.json
@@@ -0,0 +1,16 @@
++{
++ "domain": "openvibe.bot",
++ "name": "OpenVibe.Bot",
++ "stage": "placeholder",
++ "live": false,
++ "plannedRepo": null,
++ "repoUrl": null,
++ "repoExists": false,
++ "repoStage": "charter-only",
++ "service": null,
++ "launchWaitsFor": "device pairing and control leases split out of OpenVibe.Live",
++ "factsAsOf": "2026-09-24",
++ "network": "https://openvibe.network",
++ "updated": "2026-09-28",
++ "note": "Static page served by OpenVibers/OpenVibe.Sites; service facts come from each repository's STATUS.json and the Network registry (facts.json). Removed from sites.json in the same release that the real service takes over this domain."
++}
ddiff --git a/dist/openvibe.bot/terms.html b/dist/openvibe.bot/terms.html
nnew file mode 100644
iindex 0000000..5690e81
---- /dev/null
++++ b/dist/openvibe.bot/terms.html
@@@ -0,0 +1,114 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>Terms of Service — OpenVibe.Bot</title>
++<meta name="description" content="The rules for using OpenVibe.Bot, in plain language.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://openvibe.bot/terms">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="OpenVibe.Bot">
++<meta property="og:title" content="Terms of Service — OpenVibe.Bot">
++<meta property="og:description" content="The rules for using OpenVibe.Bot, in plain language.">
++<meta property="og:url" content="https://openvibe.bot/terms">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="Terms of Service — OpenVibe.Bot">
++<meta name="twitter:description" content="The rules for using OpenVibe.Bot, in plain language.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="bot" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">OpenVibe.Bot</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">OpenVibe.Bot</p><h1>Terms of Service</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">The short version</a></li><li><a href="#s2">Who can use it</a></li><li><a href="#s3">This site is not open yet</a></li><li><a href="#s4">Rules for everyone</a></li><li><a href="#s5">Automated and AI-written text</a></li><li><a href="#s6">Reporting and moderation</a></li><li><a href="#s7">Leaving</a></li><li><a href="#s8">Open source, links and feedback</a></li><li><a href="#s9">No warranty, limited liability</a></li><li><a href="#s10">Governing law</a></li><li><a href="#s11">Changes and contact</a></li></ol></nav>
++<section><h2 id="s1">The short version</h2><p>OpenVibe.Bot is part of OpenVibe, an open source, community-run network. Use it for lawful things, be decent to other people, and do not try to break it. Most of it works without an account. We can remove content or accounts that break these terms. The service is provided as it is, without warranties.</p><p>These terms cover openvibe.bot, its subdomains, and any other domain that serves the same service. Other OpenVibe sites have their own terms, written for what those sites do.</p></section>
++<section><h2 id="s2">Who can use it</h2><p>You must be at least 13 years old, or the minimum age of digital consent where you live. If you are under 18, a parent or guardian must agree to these terms for you. You may not use OpenVibe.Bot if you were banned from the network, or if the law where you live forbids it.</p></section>
++<section><h2 id="s3">This site is not open yet</h2><p>OpenVibe.Bot is a reserved address that currently shows a preview page. There is nothing to sign up for or post here yet. When it opens, these terms will be replaced with ones written for what it does, and the date above will change.</p></section>
++<section><h2 id="s4">Rules for everyone</h2><p>OpenVibe leans toward open expression. These limits apply on every site:</p><ul><li>Nothing illegal where you are or in the United States, where our servers are.</li><li>No sexual content involving minors and no sexualisation of minors, ever. We report it to the authorities.</li><li>No credible threats, incitement to violence, or publishing private information to harm someone.</li><li>No content you do not have the rights to.</li><li>No malware, phishing, spam, fraud, or impersonation of a person or organisation to deceive.</li><li>No attempts to disrupt the service, get around bans, rate limits or access controls, or reach other people's accounts or data.</li><li>No scraping that ignores robots.txt or our rate limits. Respectful crawlers, archives and AI agents are welcome; a machine-readable map is at /llms.txt where available.</li></ul></section>
++<section><h2 id="s5">Automated and AI-written text</h2><p>Some descriptive text on OpenVibe, such as footer blurbs, summaries and suggestions, is written by automated systems and checked by rules rather than by a person. It can be wrong. Do not rely on it for decisions that matter.</p></section>
++<section><h2 id="s6">Reporting and moderation</h2><p>Report content with the report controls where they exist, or write to <a href="mailto:[email protected]">[email protected]</a>. Copyright complaints follow the <a href="/dmca">DMCA process</a>. We may remove content, limit features, or suspend accounts that break these terms or put other people or the service at risk, and we may act without notice when the harm is urgent. If you think we got it wrong, reply to the notice or write to the same address and a person will look again.</p></section>
++<section><h2 id="s7">Leaving</h2><p>You can stop using OpenVibe.Bot at any time. Sections that by their nature should survive (licences for content already shared, liability, governing law) continue after you leave.</p></section>
++<section><h2 id="s8">Open source, links and feedback</h2><p>OpenVibe's code is public. Each repository's licence governs your use of the code; these terms govern your use of the hosted service at openvibe.bot. Links to other sites are provided for convenience and we are not responsible for them. If you send us ideas or fixes, we may use them without owing you anything, and contributions to the code are made under the repository's licence.</p></section>
++<section><h2 id="s9">No warranty, limited liability</h2><p>The service is provided "as is" and "as available", without warranties of any kind, including fitness for a particular purpose, accuracy of results, or uninterrupted availability. To the extent the law allows, OpenVibe and the people who run it are not liable for indirect, incidental or consequential losses, lost data or lost profits arising from your use of OpenVibe.Bot, and our total liability is limited to the greater of what you paid us in the past twelve months or fifty US dollars. Nothing here limits liability that cannot be limited by law, and consumer rights you have under the law of your country remain.</p><p>If your use of OpenVibe.Bot breaks these terms or the law and someone brings a claim against us because of it, you agree to cover our reasonable costs.</p></section>
++<section><h2 id="s10">Governing law</h2><p>These terms are governed by the laws of the United States and the State of Washington, without regard to conflicts of law. Disputes are handled in the federal or state courts located in Washington State, unless the consumer law of your country gives you the right to use your local courts. If part of these terms cannot be enforced, the rest still applies. Not enforcing a term once does not waive it. These terms are the whole agreement between us about OpenVibe.Bot.</p></section>
++<section><h2 id="s11">Changes and contact</h2><p>We may update these terms. Material changes are announced on the site before they take effect, and the date at the top changes. Continuing to use OpenVibe.Bot after a change means you accept it. Questions: <a href="mailto:[email protected]">[email protected]</a>.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/privacy">Privacy Policy</a><a href="/dmca">DMCA &amp; Copyright</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/openvibe.coupons/index.html b/dist/openvibe.coupons/index.html
iindex 5426a74..e1a37bb 100644
---- a/dist/openvibe.coupons/index.html
++++ b/dist/openvibe.coupons/index.html
@@@ -155,7 +155,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.coupons/release.json b/dist/openvibe.coupons/release.json
iindex 6ad966f..ee8db25 100644
---- a/dist/openvibe.coupons/release.json
++++ b/dist/openvibe.coupons/release.json
@@@ -1,6 +1,6 @@
{
"service": "coupons",
-- "release": "31ba478c8e98",
++ "release": "fa265d737360",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.deals/index.html b/dist/openvibe.deals/index.html
iindex 19701d9..3262fcc 100644
---- a/dist/openvibe.deals/index.html
++++ b/dist/openvibe.deals/index.html
@@@ -155,7 +155,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.deals/release.json b/dist/openvibe.deals/release.json
iindex e9a8762..53ddc84 100644
---- a/dist/openvibe.deals/release.json
++++ b/dist/openvibe.deals/release.json
@@@ -1,6 +1,6 @@
{
"service": "deals",
-- "release": "57701385bec8",
++ "release": "4be2e027a6d1",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.download/index.html b/dist/openvibe.download/index.html
iindex 9047264..9acae9f 100644
---- a/dist/openvibe.download/index.html
++++ b/dist/openvibe.download/index.html
@@@ -157,7 +157,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
<a href="https://openvibe.food/"><i class="fa-solid fa-utensils" aria-hidden="true"></i>OpenVibe.Food</a>
@@@ -167,6 +167,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.download/release.json b/dist/openvibe.download/release.json
iindex 1faaa53..98d43a8 100644
---- a/dist/openvibe.download/release.json
++++ b/dist/openvibe.download/release.json
@@@ -1,6 +1,6 @@
{
"service": "download",
-- "release": "1e85cd2bb122",
++ "release": "2ad77e5df4c0",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.food/index.html b/dist/openvibe.food/index.html
iindex de50113..1a306b7 100644
---- a/dist/openvibe.food/index.html
++++ b/dist/openvibe.food/index.html
@@@ -157,7 +157,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -167,6 +167,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.food/release.json b/dist/openvibe.food/release.json
iindex fe6633a..4c5fd78 100644
---- a/dist/openvibe.food/release.json
++++ b/dist/openvibe.food/release.json
@@@ -1,6 +1,6 @@
{
"service": "food",
-- "release": "a225568d9666",
++ "release": "4d3298b35063",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.help/404.html b/dist/openvibe.help/404.html
nnew file mode 100644
iindex 0000000..eea2618
---- /dev/null
++++ b/dist/openvibe.help/404.html
@@@ -0,0 +1,35 @@
++<!DOCTYPE html>
++<html lang="en">
++<head>
++<meta charset="utf-8">
++<meta name="viewport" content="width=device-width, initial-scale=1">
++<title>Not found · OpenVibe.Help</title>
++<meta name="robots" content="noindex">
++<meta name="theme-color" content="#4ade80">
++<link rel="icon" type="image/svg+xml" data-ov-icon="network" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<style>
++*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
++:root{--bg-primary:#0a0f1c;--bg-secondary:#101828;--border:#1f2d47;--text-primary:#e6edf7;--text-secondary:#96a7c2;--site:#4ade80}
++body{background:var(--bg-primary);color:var(--text-primary);font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;min-height:100vh;display:grid;place-items:center;padding:24px 16px}
++main{max-width:560px;text-align:center}
++.code{font-size:14px;font-weight:700;letter-spacing:.2em;color:var(--site)}
++h1{font-size:clamp(28px,5vw,40px);font-weight:800;letter-spacing:-.8px;margin:10px 0 12px}
++p{color:var(--text-secondary);font-size:15px;line-height:1.65}
++.links{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:24px}
++a{display:inline-block;padding:11px 18px;border-radius:12px;font-size:14px;font-weight:600;text-decoration:none;border:1px solid var(--border);color:var(--text-primary);background:var(--bg-secondary)}
++a:first-child{background:var(--site);border-color:var(--site);color:#0b0d10}
++</style>
++</head>
++<body>
++<main>
++ <p class="code">404</p>
++ <h1>This page does not exist</h1>
++ <p>openvibe.help has only its front page and legal pages for now. The address you followed is not one of them.</p>
++ <div class="links">
++ <a href="https://openvibe.help/">OpenVibe.Help</a>
++ <a href="https://openvibe.network/">OpenVibe.Network</a>
++ </div>
++</main>
++</body>
++</html>
ddiff --git a/dist/openvibe.help/dmca.html b/dist/openvibe.help/dmca.html
nnew file mode 100644
iindex 0000000..fb38fff
---- /dev/null
++++ b/dist/openvibe.help/dmca.html
@@@ -0,0 +1,109 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>DMCA &amp; Copyright — OpenVibe.Help</title>
++<meta name="description" content="How to report copyright infringement on OpenVibe.Help, and how to respond to a report.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://openvibe.help/dmca">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="OpenVibe.Help">
++<meta property="og:title" content="DMCA &amp; Copyright — OpenVibe.Help">
++<meta property="og:description" content="How to report copyright infringement on OpenVibe.Help, and how to respond to a report.">
++<meta property="og:url" content="https://openvibe.help/dmca">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="DMCA &amp; Copyright — OpenVibe.Help">
++<meta name="twitter:description" content="How to report copyright infringement on OpenVibe.Help, and how to respond to a report.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="help" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">OpenVibe.Help</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">OpenVibe.Help</p><h1>DMCA &amp; Copyright</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">Our position</a></li><li><a href="#s2">Before you send a notice</a></li><li><a href="#s3">Send a takedown notice</a></li><li><a href="#s4">What happens next</a></li><li><a href="#s5">Repeat infringers and false claims</a></li><li><a href="#s6">Other complaints</a></li></ol></nav>
++<section><h2 id="s1">Our position</h2><p>OpenVibe.Help respects copyright and responds to clear notices of alleged infringement under the Digital Millennium Copyright Act (17 U.S.C. § 512). OpenVibe.Help currently publishes only its own material and does not host uploads from the public.</p></section>
++<section><h2 id="s2">Before you send a notice</h2><p>Consider whether the use is permitted, for example as fair use, commentary, criticism, or under a licence. Notices must come from the copyright owner or someone authorised to act for them. Misrepresentations in a notice carry legal liability.</p></section>
++<section><h2 id="s3">Send a takedown notice</h2><p>Email <a href="mailto:[email protected]">[email protected]</a> with all of the following:</p><ol><li>Your name, postal address, phone number and email address, and whom you represent.</li><li>The copyrighted work you say was infringed, or a representative list if there are several.</li><li>The exact URL on openvibe.help of each item you want removed. General descriptions, search results and channel links are not enough to find it.</li><li>A statement that you have a good-faith belief the use is not authorised by the copyright owner, its agent or the law.</li><li>A statement, under penalty of perjury, that the information is accurate and that you are the owner or authorised to act for the owner.</li><li>Your physical or electronic signature.</li></ol></section>
++<section><h2 id="s4">What happens next</h2><p>We remove or disable access to the material, tell the person who posted it, and give them a copy of your notice, including your contact details. We act on complete notices as quickly as we can, normally within a few business days. Incomplete notices get a reply saying what is missing.</p></section>
++<section><h2 id="s5">Repeat infringers and false claims</h2><p>Accounts that receive repeated valid notices lose the ability to post and, in appropriate circumstances, are terminated across the network. Knowingly false notices and counter-notices carry liability under § 512(f); we refuse notices that are clearly abusive or automated without review.</p></section>
++<section><h2 id="s6">Other complaints</h2><p>Trademark, privacy, impersonation, harassment and other non-copyright complaints go to the same address; say which kind of complaint it is and give the exact URL. Content that sexually exploits children should be reported to us immediately and to the <a href="https://report.cybertip.org/" rel="noopener">NCMEC CyberTipline</a> or your national hotline; we remove it and report it to the authorities.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/terms">Terms of Service</a><a href="/privacy">Privacy Policy</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/openvibe.help/index.html b/dist/openvibe.help/index.html
nnew file mode 100644
iindex 0000000..d28ecc9
---- /dev/null
++++ b/dist/openvibe.help/index.html
@@@ -0,0 +1,284 @@
++<!DOCTYPE html>
++<html lang="en">
++<head>
++<meta charset="utf-8">
++<meta name="viewport" content="width=device-width, initial-scale=1">
++<title>OpenVibe.Help — Answers, support and a way to reach people.</title>
++<meta name="description" content="OpenVibe.Help will be the help and support center for every OpenVibe site: search answers drawn from the docs, wiki, blog and service status, follow troubleshooting guides, and open a ticket that stays one conversation on the web and by email. A Report Problem button on every site will attach the safe details staff need (release, request and trace ids) and never secrets.">
++<meta name="keywords" content="openvibe help, openvibe support, help center, support tickets, troubleshooting">
++<meta name="robots" content="index, follow, max-image-preview:large">
++<meta name="theme-color" content="#4ade80">
++<link rel="canonical" href="https://openvibe.help/">
++<link rel="icon" type="image/svg+xml" data-ov-icon="network" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<link rel="manifest" href="/manifest.webmanifest">
++<link rel="alternate" type="text/html" hreflang="en" href="https://openvibe.help/">
++<meta property="og:type" content="website">
++<meta property="og:site_name" content="OpenVibe.Help">
++<meta property="og:url" content="https://openvibe.help/">
++<meta property="og:title" content="OpenVibe.Help — Answers, support and a way to reach people.">
++<meta property="og:description" content="OpenVibe.Help will be the help and support center for every OpenVibe site: search answers drawn from the docs, wiki, blog and service status, follow troubleshooting guides, and open a ticket that stays one conversation on the web and by email. A Report Problem button on every site will attach the safe details staff need (release, request and trace ids) and never secrets.">
++<meta property="og:image" content="https://openvibe.network/assets/logo-512.png">
++<meta property="og:image:alt" content="OpenVibe">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="OpenVibe.Help — Answers, support and a way to reach people.">
++<meta name="twitter:description" content="OpenVibe.Help will be the help and support center for every OpenVibe site: search answers drawn from the docs, wiki, blog and service status, follow troubleshooting guides, and open a ticket that stays one conversation on the web and by email. A Report Problem button on every site will attach the safe details staff need (release, request and trace ids) and never secrets.">
++<meta name="twitter:image" content="https://openvibe.network/assets/logo-512.png">
++<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://openvibe.help/#site","url":"https://openvibe.help/","name":"OpenVibe.Help","description":"OpenVibe.Help will be the help and support center for every OpenVibe site: search answers drawn from the docs, wiki, blog and service status, follow troubleshooting guides, and open a ticket that stays one conversation on the web and by email. A Report Problem button on every site will attach the safe details staff need (release, request and trace ids) and never secrets.","inLanguage":"en","publisher":{"@type":"Organization","@id":"https://openvibe.network/#org","name":"OpenVibe","url":"https://openvibe.network/","logo":"https://openvibe.network/assets/logo-512.png","sameAs":["https://github.com/OpenVibers","https://discord.gg/M6MuRUaeJj"]},"isPartOf":{"@type":"WebSite","@id":"https://openvibe.network/#site","name":"OpenVibe.Network","url":"https://openvibe.network/"}},{"@type":"WebPage","@id":"https://openvibe.help/#page","url":"https://openvibe.help/","name":"OpenVibe.Help — Answers, support and a way to reach people.","description":"OpenVibe.Help will be the help and support center for every OpenVibe site: search answers drawn from the docs, wiki, blog and service status, follow troubleshooting guides, and open a ticket that stays one conversation on the web and by email. A Report Problem button on every site will attach the safe details staff need (release, request and trace ids) and never secrets.","isPartOf":{"@id":"https://openvibe.help/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-28","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"OpenVibe","item":"https://openvibe.network/"},{"@type":"ListItem","position":2,"name":"OpenVibe.Help","item":"https://openvibe.help/"}]}}]}</script>
++<script>(function(){try{var raw=localStorage.getItem('ov_theme');if(!raw)return;var t=JSON.parse(raw),v=t&&t.variables;if(!v)return;var el=document.documentElement;for(var k in v)if(k.charAt(0)==='-')el.style.setProperty(k,v[k]);if(t.id)el.setAttribute('data-theme',t.id);}catch(_){}})();</script>
++<script src="/shared/theme-loader.js?v=d9b9af081efe" defer></script>
++<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
++<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" media="print" onload="this.media='all'">
++<noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"></noscript>
++<style>
++*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
++:root{--bg-primary:#0a0f1c;--bg-secondary:#101828;--bg-card:#131c2e;--bg-hover:#1c2a44;--border:#1f2d47;--text-primary:#e6edf7;--text-secondary:#96a7c2;--text-muted:#7386a3;--accent:#3b82f6;--accent-light:#60a5fa;--accent-rgb:59,130,246;--on-accent:#fff;--site:#4ade80;--site-rgb:74,222,128}
++html{scroll-behavior:smooth}
++body{background:var(--bg-primary);color:var(--text-primary);font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;min-height:100vh;display:flex;flex-direction:column;overflow-x:hidden}
++main{flex:1;position:relative}
++.orbs{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
++.orbs i{position:absolute;border-radius:50%;filter:blur(90px);opacity:.16;animation:drift 26s ease-in-out infinite alternate}
++.orbs i:nth-child(1){width:420px;height:420px;background:var(--site);top:-140px;left:-120px}
++.orbs i:nth-child(2){width:360px;height:360px;background:var(--accent);top:40%;right:-140px;animation-delay:-9s}
++.orbs i:nth-child(3){width:300px;height:300px;background:var(--site);bottom:-120px;left:38%;animation-delay:-17s}
++@keyframes drift{0%{transform:translate(0,0) scale(1)}50%{transform:translate(-26px,36px) scale(1.07)}100%{transform:translate(34px,-28px) scale(.95)}}
++.wrap{position:relative;z-index:1;max-width:1040px;margin:0 auto;padding:0 20px}
++.hero{padding:84px 0 44px;text-align:center}
++.hero .mark{display:inline-grid;place-items:center;width:84px;height:84px;border-radius:24px;background:rgba(var(--site-rgb),.12);border:1px solid rgba(var(--site-rgb),.35);color:var(--site);font-size:34px;margin-bottom:22px;box-shadow:0 20px 60px rgba(var(--site-rgb),.18);animation:rise .6s cubic-bezier(.2,.8,.2,1) both}
++.hero .badge{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;border-radius:999px;border:1px solid var(--border);background:var(--bg-secondary);font-size:12px;font-weight:600;color:var(--text-secondary);letter-spacing:.3px;margin-bottom:22px;animation:rise .6s .05s cubic-bezier(.2,.8,.2,1) both}
++.hero .badge b{color:var(--site)}
++.hero h1{font-size:clamp(34px,6vw,58px);font-weight:800;letter-spacing:-1.4px;line-height:1.08;animation:rise .6s .1s cubic-bezier(.2,.8,.2,1) both}
++.hero h1 .d{color:var(--site)}
++.hero h1 .tld{color:var(--text-secondary)}
++.hero .tag{font-size:clamp(18px,2.6vw,24px);font-weight:600;color:var(--text-primary);margin:18px 0 10px;animation:rise .6s .16s cubic-bezier(.2,.8,.2,1) both}
++.hero p.lead{color:var(--text-secondary);font-size:16px;line-height:1.65;max-width:680px;margin:0 auto;animation:rise .6s .22s cubic-bezier(.2,.8,.2,1) both}
++.ctas{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:30px;animation:rise .6s .3s cubic-bezier(.2,.8,.2,1) both}
++.hero .status{margin:22px auto 0;max-width:720px;font-size:12.5px;line-height:1.7;color:var(--text-muted);border:1px dashed var(--border);border-radius:12px;padding:10px 14px;background:rgba(0,0,0,.15)}
++.hero .status b{color:var(--site)}
++.hero .status code{font-size:12px;color:var(--text-secondary);background:var(--bg-secondary);padding:1px 6px;border-radius:6px}
++.hero .status a{color:var(--text-secondary)}
++.btn{display:inline-flex;align-items:center;gap:9px;padding:12px 20px;border-radius:12px;font-size:14px;font-weight:600;text-decoration:none;border:1px solid var(--border);color:var(--text-primary);background:var(--bg-secondary);transition:transform .15s,border-color .15s,box-shadow .15s}
++.btn:hover{transform:translateY(-1px);border-color:var(--site);box-shadow:0 10px 30px rgba(var(--site-rgb),.15)}
++.btn-primary{background:var(--site);border-color:var(--site);color:#0b0d10}
++.btn-primary:hover{filter:brightness(1.08)}
++@keyframes rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
++section{padding:36px 0}
++h2{font-size:22px;font-weight:700;letter-spacing:-.3px;margin-bottom:6px}
++.lead2{color:var(--text-secondary);font-size:14px;margin-bottom:20px}
++.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px}
++.card{background:var(--bg-card);border:1px solid var(--border);border-radius:16px;padding:20px;transition:transform .2s,border-color .2s,box-shadow .2s;text-decoration:none;color:inherit;display:flex;flex-direction:column;gap:8px}
++a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);box-shadow:0 16px 40px rgba(0,0,0,.35)}
++.card .ic{width:40px;height:40px;border-radius:11px;display:grid;place-items:center;background:rgba(var(--site-rgb),.12);color:var(--site);font-size:17px}
++.card b{font-size:15px}
++.card span{font-size:13px;color:var(--text-secondary);line-height:1.55}
++.card .go{margin-top:auto;font-size:12.5px;font-weight:600;color:var(--site)}
++.highlight .hl-card{border:1px solid rgba(var(--accent-rgb),.45);background:rgba(var(--accent-rgb),.10);border-radius:18px;padding:22px 22px 18px}
++.highlight h2{margin:0 0 8px}.highlight h2 i{color:var(--accent-light)}.highlight p{margin:0 0 10px}
++.highlight ul{margin:0 0 14px;padding-left:20px}.highlight li{margin:4px 0}
++.faq details{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:12px 14px;margin:8px 0}
++.faq summary{cursor:pointer;font-weight:600}.faq details p{margin:8px 0 0;opacity:.85}
++.meanwhile .card .ic{background:rgba(var(--accent-rgb),.12);color:var(--accent-light)}
++.net .card .ic{background:var(--bg-hover);color:var(--text-primary)}
++.rooms{display:flex;flex-wrap:wrap;gap:8px}
++.rooms a{font-size:12.5px;padding:7px 12px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary);text-decoration:none;transition:all .15s;background:var(--bg-secondary)}
++.rooms a:hover{color:var(--text-primary);border-color:var(--site)}
++.rooms a i{margin-right:6px;opacity:.8}
++.strip{border:1px solid var(--border);border-radius:18px;background:var(--bg-secondary);padding:30px 26px;text-align:center;margin:10px 0 50px}
++.strip h3{font-size:19px;font-weight:700;margin:12px 0 8px}
++.strip p{font-size:14px;color:var(--text-secondary);max-width:600px;margin:0 auto 18px;line-height:1.6}
++.strip .ov-mark{width:44px;height:44px}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}}
++@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
++</style>
++</head>
++<body>
++<div class="orbs"><i></i><i></i><i></i></div>
++<div id="navbar-mount"></div>
++<main class="wrap">
++ <header class="hero">
++ <div class="mark"><i class="fa-solid fa-life-ring" aria-hidden="true"></i></div>
++ <div class="badge"><span class="ov-mark" data-size="16" data-variant="help"></span> Part of the OpenVibe network · <b>planned</b></div>
++ <h1>OpenVibe<span class="d">.</span><span class="tld">Help</span></h1>
++ <div class="tag">Answers, support and a way to reach people.</div>
++ <p class="lead">OpenVibe.Help will be the help and support center for every OpenVibe site: search answers drawn from the docs, wiki, blog and service status, follow troubleshooting guides, and open a ticket that stays one conversation on the web and by email. A Report Problem button on every site will attach the safe details staff need (release, request and trace ids) and never secrets.</p>
++ <div class="ctas">
++ <a class="btn btn-primary" href="https://openvibe.network/login?return=https%3A%2F%2Fopenvibe.help%2F"><i class="fa-solid fa-right-to-bracket"></i> Sign in with OpenVibe</a>
++ <a class="btn" href="https://openvibe.network/#network"><i class="fa-solid fa-circle-nodes"></i> The whole network</a>
++ <a class="btn" href="https://discord.gg/M6MuRUaeJj" rel="noopener"><i class="fa-brands fa-discord"></i> Follow the build</a>
++ </div>
++ <p class="status"><i class="fa-solid fa-clock" aria-hidden="true"></i> Status: <b>planned</b> · <strong>OpenVibe.Help</strong> is planned; its repository and code do not exist yet: this page is a placeholder, nothing here is live yet. The public launch is waiting for the ticket service and the Frame&#39;s Help button. · as of 2026-09-24 · <a href="/status.json">status.json</a></p>
++ </header>
++
++
++ <section id="what">
++ <h2>What OpenVibe.Help will be</h2>
++ <p class="lead2">Same account, same themes, same navbar as every other OpenVibe site — built in the open, run by its community.</p>
++ <div class="grid">
++ <div class="card"><div class="ic"><i class="fa-solid fa-life-ring" aria-hidden="true"></i></div><b>Grounded answers</b><span>From the real docs, wiki and status, with sources.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-life-ring" aria-hidden="true"></i></div><b>One support inbox</b><span>Signed in or not, on the web or by email.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-life-ring" aria-hidden="true"></i></div><b>Report a problem</b><span>Useful, privacy-scrubbed details attached for you.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-life-ring" aria-hidden="true"></i></div><b>For your projects</b><span>A support widget and help center for sites built on OpenVibe.</span></div>
++ </div>
++ </section>
++
++ <section class="meanwhile">
++ <h2>Meanwhile, on the network</h2>
++ <p class="lead2">Most of this already exists somewhere on OpenVibe — start there today.</p>
++ <div class="grid">
++ <a class="card" href="https://openvibe.network/status"><div class="ic"><i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i></div><b>Network status</b><span>Service health and incidents today.</span><span class="go">openvibe.network/status →</span></a>
++ <a class="card" href="https://openvibe.wiki"><div class="ic"><i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i></div><b>OpenVibe.Wiki</b><span>Guides and concepts.</span><span class="go">openvibe.wiki →</span></a>
++ </div>
++ </section>
++
++
++ <section class="net">
++ <h2>The OpenVibe network</h2>
++ <p class="lead2">One account for all of it. Sign in once and every site signs you in.</p>
++ <div class="grid">
++ <a class="card" href="https://openvibe.live"><div class="ic"><i class="fa-solid fa-tower-broadcast" aria-hidden="true"></i></div><b>OpenVibe.Live</b><span>Go live, chat, clip, restream</span><span class="go">openvibe.live →</span></a>
++ <a class="card" href="https://openvibe.tools"><div class="ic"><i class="fa-solid fa-screwdriver-wrench" aria-hidden="true"></i></div><b>OpenVibe.Tools</b><span>Hundreds of online tools</span><span class="go">openvibe.tools →</span></a>
++ <a class="card" href="https://openvibe.community"><div class="ic"><i class="fa-solid fa-people-group" aria-hidden="true"></i></div><b>OpenVibe.Community</b><span>Pastes, posts, people</span><span class="go">openvibe.community →</span></a>
++ <a class="card" href="https://openvibe.games"><div class="ic"><i class="fa-solid fa-gamepad" aria-hidden="true"></i></div><b>OpenVibe.Games</b><span>Scraplandia and browser games</span><span class="go">openvibe.games →</span></a>
++ <a class="card" href="https://openvibe.media"><div class="ic"><i class="fa-solid fa-photo-film" aria-hidden="true"></i></div><b>OpenVibe.Media</b><span>VODs, clips and files</span><span class="go">openvibe.media →</span></a>
++ <a class="card" href="https://openvibe.network"><div class="ic"><i class="fa-solid fa-circle-nodes" aria-hidden="true"></i></div><b>OpenVibe.Network</b><span>One account, every site</span><span class="go">openvibe.network →</span></a>
++ </div>
++ <h2 style="margin-top:28px;font-size:16px">Other OpenVibe domains, not open yet</h2>
++ <div class="rooms" style="margin-top:8px">
++ <a href="https://openvibe.news/"><i class="fa-solid fa-newspaper" aria-hidden="true"></i>OpenVibe.News</a>
++ <a href="https://openvibe.reviews/"><i class="fa-solid fa-star-half-stroke" aria-hidden="true"></i>OpenVibe.Reviews</a>
++ <a href="https://openvibe.tips/"><i class="fa-solid fa-hand-holding-heart" aria-hidden="true"></i>OpenVibe.Tips</a>
++ <a href="https://openvibe.vip/"><i class="fa-solid fa-crown" aria-hidden="true"></i>OpenVibe.VIP</a>
++ <a href="https://openvibe.trade/"><i class="fa-solid fa-chart-line" aria-hidden="true"></i>OpenVibe.Trade</a>
++ <a href="https://openvibe.host/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Host</a>
++ <a href="https://openvibe.deals/"><i class="fa-solid fa-tags" aria-hidden="true"></i>OpenVibe.Deals</a>
++ <a href="https://openvibe.coupons/"><i class="fa-solid fa-ticket" aria-hidden="true"></i>OpenVibe.Coupons</a>
++ <a href="https://openre.stream/"><i class="fa-solid fa-satellite-dish" aria-hidden="true"></i>OpenRe.Stream</a>
++ <a href="https://auth.openvibe.network/"><i class="fa-solid fa-key" aria-hidden="true"></i>auth.openvibe.network</a>
++ <a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
++ <a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
++ <a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
++ <a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
++ <a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
++ <a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
++ <a href="https://openvibe.food/"><i class="fa-solid fa-utensils" aria-hidden="true"></i>OpenVibe.Food</a>
++ <a href="https://openvibe.quest/"><i class="fa-solid fa-map" aria-hidden="true"></i>OpenVibe.Quest</a>
++ <a href="https://openvibe.rent/"><i class="fa-solid fa-key" aria-hidden="true"></i>OpenVibe.Rent</a>
++ <a href="https://openvibe.homes/"><i class="fa-solid fa-house" aria-hidden="true"></i>OpenVibe.Homes</a>
++ <a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
++ <a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
++ <a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
++ </div>
++ </section>
++
++ <div class="strip">
++ <span class="ov-mark" data-size="44" data-variant="help"></span>
++ <h3>Open source. Community run.</h3>
++ <p>Every OpenVibe site is built in the open by the people using it — free speech within the rules, no gatekeeping, one identity that follows you everywhere.</p>
++ <a class="btn" href="https://github.com/OpenVibers" rel="noopener"><i class="fa-brands fa-github"></i> OpenVibers on GitHub</a>
++ </div>
++</main>
++<style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="full"><div class="ovf-inner">
++ <div class="ovf-cols">
++ <div class="ovf-col ovf-col--brand">
++ <a class="ovf-brand" href="/"><span class="ov-mark" data-size="26"></span><span>OpenVibe</span></a>
++ <p class="ovf-tagline">Open source and community run. Built in the open by the people using it.</p>
++ <div class="ovf-social">
++ <a href="https://github.com/OpenVibers" target="_blank" rel="noopener" aria-label="GitHub" title="GitHub"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path fill="currentColor" stroke="none" d="M12 2.2a9.8 9.8 0 0 0-3.1 19.1c.5.1.7-.2.7-.5v-1.7c-2.7.6-3.3-1.2-3.3-1.2-.4-1.1-1.1-1.4-1.1-1.4-.9-.6.1-.6.1-.6 1 .1 1.5 1 1.5 1 .9 1.5 2.3 1.1 2.9.8.1-.6.3-1.1.6-1.3-2.2-.2-4.5-1.1-4.5-4.8 0-1.1.4-1.9 1-2.6-.1-.2-.4-1.2.1-2.6 0 0 .8-.3 2.7 1a9.3 9.3 0 0 1 4.9 0c1.9-1.3 2.7-1 2.7-1 .5 1.4.2 2.4.1 2.6.6.7 1 1.5 1 2.6 0 3.7-2.3 4.6-4.5 4.8.4.3.7.9.7 1.800v2.700c0 .3.2.6.7.5A9.8 9.8 0 0 0 12 2.200z"/></svg></a><a href="https://discord.gg/M6MuRUaeJj" target="_blank" rel="noopener" aria-label="Discord" title="Discord"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path fill="currentColor" stroke="none" d="M19.3 5.300a16.5 16.5 0 0 0-4.1-1.300l-.5 1a15.3 15.3 0 0 0-5.4 0l-.5-1a16.5 16.5 0 0 0-4.1 1.300C2.1 9.2 1.4 13 1.7 16.700a16.6 16.6 0 0 0 5.1 2.600l1.1-1.800c-.6-.2-1.2-.5-1.7-.8l.4-.3a11.8 11.8 0 0 0 10.8 0l.4.3c-.5.3-1.1.6-1.7.8l1.1 1.800a16.6 16.6 0 0 0 5.1-2.600c.4-4.3-.7-8.1-3-11.400zM8.7 14.400c-1 0-1.8-.9-1.8-2.100s.8-2.1 1.8-2.1 1.9 1 1.8 2.100c0 1.2-.8 2.1-1.8 2.100zm6.6 0c-1 0-1.8-.9-1.8-2.100s.8-2.1 1.8-2.1 1.9 1 1.8 2.100c0 1.2-.8 2.1-1.8 2.100z"/></svg></a>
++ <a href="/sitemap.xml" aria-label="Sitemap" title="Sitemap"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="9" y="3.5" width="6" height="4.5" rx="1"/><rect x="3" y="16" width="6" height="4.5" rx="1"/><rect x="15" y="16" width="6" height="4.5" rx="1"/><path d="M12 8v4M6 16v-2.500h12V16"/></svg></a>
++ </div>
++ </div>
++
++ <nav class="ovf-col" aria-label="The OpenVibe network">
++ <h3>Network</h3>
++ <a href="https://openvibe.live" title="Go live, restream and clip">Live streaming</a><a href="https://openvibe.tools" title="The whole toolbox">Online tools</a><a href="https://dev.openvibe.tools" title="Formatters, encoders, validators">Developer tools</a><a href="https://net.openvibe.tools" title="Ping, DNS, Whois, SSL">Network diagnostics</a><a href="https://img.openvibe.tools" title="Convert, resize, compress">Image converter</a><a href="https://audio.openvibe.tools" title="Convert, trim, pitch-shift">Audio converter</a>
++ <a class="ovf-more" href="https://openvibe.network" target="_blank" rel="noopener">Everything else <svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
++ </nav>
++
++ <nav class="ovf-col" aria-label="Legal">
++ <h3>Legal</h3>
++ <a href="https://openvibe.live/tos">Terms of Service</a><a href="https://openvibe.live/privacy">Privacy Policy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ </div>
++ <div class="ovf-account" id="ovf-account" hidden></div>
++ <div class="ovf-bar">
++ <span class="ovf-copy">Open source &amp; community driven · built in the open</span>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="help" href="https://openvibe.network/updates?site=help" hidden></a>
++ <span class="ovf-legal-inline">
++ <a href="https://openvibe.network/updates?site=help">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </span>
++ </div>
++ </div></footer>
++<script src="/shared/ov-mark.js?v=96079ebf2943" async></script>
++<script src="/shared/navbar.js?v=b50d9f47fc34"></script>
++<script src="/shared/footer.js?v=b99e512398d5"></script>
++<script>
++(function () {
++ if (window.OpenVibeNavbar) { try { OpenVibeNavbar.init({ service: 'help', apiBase: 'https://openvibe.network', links: [{ label: 'What it will be', href: '#what' }, { label: 'The network', href: 'https://openvibe.network/#network', external: false }], history: { type: 'page', title: 'OpenVibe.Help' } }); } catch (e) {} }
++ if (window.OpenVibeFooter) { try { OpenVibeFooter.init({ service: 'help', variant: 'full', links: [{ heading: 'OpenVibe.Help', items: [{ name: 'Sign in', url: 'https://openvibe.network/login?return=https%3A%2F%2Fopenvibe.help%2F' }, { name: 'The network', url: 'https://openvibe.network/#network' }, { name: 'Discord', url: 'https://discord.gg/M6MuRUaeJj' }] }] }); } catch (e) {} }
++})();
++</script>
++</body>
++</html>
ddiff --git a/dist/openvibe.help/manifest.webmanifest b/dist/openvibe.help/manifest.webmanifest
nnew file mode 100644
iindex 0000000..d1b2fdd
---- /dev/null
++++ b/dist/openvibe.help/manifest.webmanifest
@@@ -0,0 +1,48 @@
++{
++ "name": "OpenVibe.Help",
++ "short_name": "Help",
++ "description": "Answers, support and a way to reach people.",
++ "start_url": "/",
++ "scope": "/",
++ "display": "standalone",
++ "background_color": "#0a0f1c",
++ "theme_color": "#3b82f6",
++ "icons": [
++ {
++ "src": "https://openvibe.network/assets/logo-72.png",
++ "sizes": "72x72",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-192.png",
++ "sizes": "192x192",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-512.png",
++ "sizes": "512x512",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-maskable-192.png",
++ "sizes": "192x192",
++ "type": "image/png",
++ "purpose": "maskable"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-maskable-512.png",
++ "sizes": "512x512",
++ "type": "image/png",
++ "purpose": "maskable"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo.svg",
++ "sizes": "any",
++ "type": "image/svg+xml",
++ "purpose": "any"
++ }
++ ]
++}
ddiff --git a/dist/openvibe.help/privacy.html b/dist/openvibe.help/privacy.html
nnew file mode 100644
iindex 0000000..bdc60d1
---- /dev/null
++++ b/dist/openvibe.help/privacy.html
@@@ -0,0 +1,115 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>Privacy Policy — OpenVibe.Help</title>
++<meta name="description" content="What OpenVibe.Help collects, why, and the choices you have.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://openvibe.help/privacy">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="OpenVibe.Help">
++<meta property="og:title" content="Privacy Policy — OpenVibe.Help">
++<meta property="og:description" content="What OpenVibe.Help collects, why, and the choices you have.">
++<meta property="og:url" content="https://openvibe.help/privacy">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="Privacy Policy — OpenVibe.Help">
++<meta name="twitter:description" content="What OpenVibe.Help collects, why, and the choices you have.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="help" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">OpenVibe.Help</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">OpenVibe.Help</p><h1>Privacy Policy</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">The short version</a></li><li><a href="#s2">What we collect</a></li><li><a href="#s3">Why we use it</a></li><li><a href="#s4">Cookies and storage in your browser</a></li><li><a href="#s5">Across OpenVibe sites</a></li><li><a href="#s6">Who we share with</a></li><li><a href="#s7">How long we keep things</a></li><li><a href="#s8">Where your data is</a></li><li><a href="#s9">Security</a></li><li><a href="#s10">Your choices and rights</a></li><li><a href="#s11">Children</a></li><li><a href="#s12">Changes and contact</a></li></ol></nav>
++<section><h2 id="s1">The short version</h2><p>OpenVibe.Help collects what it needs to work and to keep abuse out, and no more. We do not sell or rent personal information, we do not share it for advertising, and we do not run advertising trackers. Most of OpenVibe.Help works without an account.</p></section>
++<section><h2 id="s2">What we collect</h2><ul><li><b>Request logs.</b> Like every web server, ours record your IP address, browser type, the address requested and the time. We use them for security, rate limiting, debugging and aggregate traffic statistics.</li><li><b>Usage statistics.</b> First-party page views with a random session identifier, kept on our own servers, so we can see which parts of the network are used.</li><li><b>An anonymous page count.</b> The shared navigation bar reports one count per page load containing only the site's hostname and the day. No user, IP address or page is stored with it. It decides the order of sites in our menus. It is skipped when your browser sends Global Privacy Control or Do Not Track.</li></ul></section>
++<section><h2 id="s3">Why we use it</h2><ul><li>To provide the service you asked for and keep you signed in (performance of our agreement with you).</li><li>To keep the service secure, prevent abuse and understand usage in aggregate (our legitimate interests).</li><li>To send account email such as verification and password resets, and notifications you switched on (agreement and consent).</li><li>To comply with the law.</li></ul></section>
++<section><h2 id="s4">Cookies and storage in your browser</h2><p>We use a small number of first-party cookies: a sign-in token (<code>ov_token</code>), a refresh token limited to the sign-in paths, a short-lived state cookie during sign-in, and a hint (<code>ov_sso_hint</code>) that remembers whether you were signed in. openvibe.network also keeps a sign-in cookie that lets other OpenVibe sites check, in a hidden frame or through your browser's built-in federated sign-in, whether to sign you in quietly. It is never used for anything except that check.</p><p>Your theme, display settings (text size, reduced motion), recent pages, a cached copy of the navigation and similar conveniences are kept in your browser's local storage. There are no third-party advertising or social cookies. Our sites sit behind Cloudflare, which may set its own security cookies and measure performance.</p></section>
++<section><h2 id="s5">Across OpenVibe sites</h2><p>OpenVibe sites share one account. When you are signed in, the site you visit learns who you are from openvibe.network. While cross-site history is switched on, the pages and tools you open while signed in are listed for you, and only you, at <a href="https://openvibe.network/history">openvibe.network/history</a>, where you can clear the list or pause it.</p></section>
++<section><h2 id="s6">Who we share with</h2><p>Only the services needed to run the network: hosting (OVH, servers in the United States), network security and delivery (Cloudflare), object storage for media (Backblaze B2 or Cloudflare R2), and email delivery for account messages. They process data on our instructions. We disclose information when the law requires it, and we tell the person affected when we are allowed to. If OpenVibe is ever reorganised or handed to new maintainers, the data moves under the same promises.</p></section>
++<section><h2 id="s7">How long we keep things</h2><ul><li>Request logs and raw usage events: a limited rolling period, then totals only.</li><li>The anonymous page count: totals per site and day, nothing personal to delete.</li></ul></section>
++<section><h2 id="s8">Where your data is</h2><p>Our servers are in the United States. If you use OpenVibe from elsewhere, your information is transferred to and processed in the United States, which may have different data protection rules from your country.</p></section>
++<section><h2 id="s9">Security</h2><p>Traffic is encrypted in transit. Passwords are stored as salted hashes, sign-in tokens are signed and short-lived, and internal service routes are not reachable from the internet. No system is perfectly secure; if a breach affects your personal information we will tell you and the relevant authorities as the law requires.</p></section>
++<section><h2 id="s10">Your choices and rights</h2><p>You can use most of OpenVibe.Help without an account, block cookies, and switch on Global Privacy Control to skip the anonymous page count. With an account you can view, correct, export and delete your data from your account settings, or ask us to do it.</p><p>Depending on where you live, including the EEA, the UK and US states such as California, you may have rights to access, correct, delete, restrict or object to the use of your data, to data portability, and to complain to your data protection authority. We do not sell or share personal information as those laws define it, and we do not make automated decisions with legal effect. Write to <a href="mailto:[email protected]">[email protected]</a>; we answer within 30 days and will not treat you differently for asking.</p></section>
++<section><h2 id="s11">Children</h2><p>OpenVibe.Help is not for children under 13, and we do not knowingly collect their information. If you believe a child has given us personal information, contact us and we will delete it.</p></section>
++<section><h2 id="s12">Changes and contact</h2><p>We will post changes here and update the date above; significant changes are announced on the site. Questions and requests: <a href="mailto:[email protected]">[email protected]</a>.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/terms">Terms of Service</a><a href="/dmca">DMCA &amp; Copyright</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/openvibe.help/release.json b/dist/openvibe.help/release.json
nnew file mode 100644
iindex 0000000..45ed315
---- /dev/null
++++ b/dist/openvibe.help/release.json
@@@ -0,0 +1,13 @@
++{
++ "service": "help",
++ "release": "b1b9cc2dc808",
++ "released_at": "2026-09-28T00:00:00.000Z",
++ "booted_at": null,
++ "contracts_version": null,
++ "packages": {
++ "openvibe-shared": "1.23.0"
++ },
++ "min_client_release": null,
++ "mixed_version_window_hours": 24,
++ "kind": "placeholder"
++}
ddiff --git a/dist/openvibe.help/robots.txt b/dist/openvibe.help/robots.txt
nnew file mode 100644
iindex 0000000..1ff1c17
---- /dev/null
++++ b/dist/openvibe.help/robots.txt
@@@ -0,0 +1,4 @@
++User-agent: *
++Allow: /
++Disallow: /auth/
++Sitemap: https://openvibe.help/sitemap.xml
ddiff --git a/dist/openvibe.help/sitemap.xml b/dist/openvibe.help/sitemap.xml
nnew file mode 100644
iindex 0000000..4621b50
---- /dev/null
++++ b/dist/openvibe.help/sitemap.xml
@@@ -0,0 +1,4 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
++ <url><loc>https://openvibe.help/</loc><lastmod>2026-09-28</lastmod><changefreq>weekly</changefreq><priority>1.0</priority></url>
++</urlset>
ddiff --git a/dist/openvibe.help/status.json b/dist/openvibe.help/status.json
nnew file mode 100644
iindex 0000000..7243e32
---- /dev/null
++++ b/dist/openvibe.help/status.json
@@@ -0,0 +1,16 @@
++{
++ "domain": "openvibe.help",
++ "name": "OpenVibe.Help",
++ "stage": "placeholder",
++ "live": false,
++ "plannedRepo": null,
++ "repoUrl": null,
++ "repoExists": false,
++ "repoStage": "charter-only",
++ "service": null,
++ "launchWaitsFor": "the ticket service and the Frame's Help button",
++ "factsAsOf": "2026-09-24",
++ "network": "https://openvibe.network",
++ "updated": "2026-09-28",
++ "note": "Static page served by OpenVibers/OpenVibe.Sites; service facts come from each repository's STATUS.json and the Network registry (facts.json). Removed from sites.json in the same release that the real service takes over this domain."
++}
ddiff --git a/dist/openvibe.help/terms.html b/dist/openvibe.help/terms.html
nnew file mode 100644
iindex 0000000..a5310f5
---- /dev/null
++++ b/dist/openvibe.help/terms.html
@@@ -0,0 +1,114 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>Terms of Service — OpenVibe.Help</title>
++<meta name="description" content="The rules for using OpenVibe.Help, in plain language.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://openvibe.help/terms">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="OpenVibe.Help">
++<meta property="og:title" content="Terms of Service — OpenVibe.Help">
++<meta property="og:description" content="The rules for using OpenVibe.Help, in plain language.">
++<meta property="og:url" content="https://openvibe.help/terms">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="Terms of Service — OpenVibe.Help">
++<meta name="twitter:description" content="The rules for using OpenVibe.Help, in plain language.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="help" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">OpenVibe.Help</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">OpenVibe.Help</p><h1>Terms of Service</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">The short version</a></li><li><a href="#s2">Who can use it</a></li><li><a href="#s3">This site is not open yet</a></li><li><a href="#s4">Rules for everyone</a></li><li><a href="#s5">Automated and AI-written text</a></li><li><a href="#s6">Reporting and moderation</a></li><li><a href="#s7">Leaving</a></li><li><a href="#s8">Open source, links and feedback</a></li><li><a href="#s9">No warranty, limited liability</a></li><li><a href="#s10">Governing law</a></li><li><a href="#s11">Changes and contact</a></li></ol></nav>
++<section><h2 id="s1">The short version</h2><p>OpenVibe.Help is part of OpenVibe, an open source, community-run network. Use it for lawful things, be decent to other people, and do not try to break it. Most of it works without an account. We can remove content or accounts that break these terms. The service is provided as it is, without warranties.</p><p>These terms cover openvibe.help, its subdomains, and any other domain that serves the same service. Other OpenVibe sites have their own terms, written for what those sites do.</p></section>
++<section><h2 id="s2">Who can use it</h2><p>You must be at least 13 years old, or the minimum age of digital consent where you live. If you are under 18, a parent or guardian must agree to these terms for you. You may not use OpenVibe.Help if you were banned from the network, or if the law where you live forbids it.</p></section>
++<section><h2 id="s3">This site is not open yet</h2><p>OpenVibe.Help is a reserved address that currently shows a preview page. There is nothing to sign up for or post here yet. When it opens, these terms will be replaced with ones written for what it does, and the date above will change.</p></section>
++<section><h2 id="s4">Rules for everyone</h2><p>OpenVibe leans toward open expression. These limits apply on every site:</p><ul><li>Nothing illegal where you are or in the United States, where our servers are.</li><li>No sexual content involving minors and no sexualisation of minors, ever. We report it to the authorities.</li><li>No credible threats, incitement to violence, or publishing private information to harm someone.</li><li>No content you do not have the rights to.</li><li>No malware, phishing, spam, fraud, or impersonation of a person or organisation to deceive.</li><li>No attempts to disrupt the service, get around bans, rate limits or access controls, or reach other people's accounts or data.</li><li>No scraping that ignores robots.txt or our rate limits. Respectful crawlers, archives and AI agents are welcome; a machine-readable map is at /llms.txt where available.</li></ul></section>
++<section><h2 id="s5">Automated and AI-written text</h2><p>Some descriptive text on OpenVibe, such as footer blurbs, summaries and suggestions, is written by automated systems and checked by rules rather than by a person. It can be wrong. Do not rely on it for decisions that matter.</p></section>
++<section><h2 id="s6">Reporting and moderation</h2><p>Report content with the report controls where they exist, or write to <a href="mailto:[email protected]">[email protected]</a>. Copyright complaints follow the <a href="/dmca">DMCA process</a>. We may remove content, limit features, or suspend accounts that break these terms or put other people or the service at risk, and we may act without notice when the harm is urgent. If you think we got it wrong, reply to the notice or write to the same address and a person will look again.</p></section>
++<section><h2 id="s7">Leaving</h2><p>You can stop using OpenVibe.Help at any time. Sections that by their nature should survive (licences for content already shared, liability, governing law) continue after you leave.</p></section>
++<section><h2 id="s8">Open source, links and feedback</h2><p>OpenVibe's code is public. Each repository's licence governs your use of the code; these terms govern your use of the hosted service at openvibe.help. Links to other sites are provided for convenience and we are not responsible for them. If you send us ideas or fixes, we may use them without owing you anything, and contributions to the code are made under the repository's licence.</p></section>
++<section><h2 id="s9">No warranty, limited liability</h2><p>The service is provided "as is" and "as available", without warranties of any kind, including fitness for a particular purpose, accuracy of results, or uninterrupted availability. To the extent the law allows, OpenVibe and the people who run it are not liable for indirect, incidental or consequential losses, lost data or lost profits arising from your use of OpenVibe.Help, and our total liability is limited to the greater of what you paid us in the past twelve months or fifty US dollars. Nothing here limits liability that cannot be limited by law, and consumer rights you have under the law of your country remain.</p><p>If your use of OpenVibe.Help breaks these terms or the law and someone brings a claim against us because of it, you agree to cover our reasonable costs.</p></section>
++<section><h2 id="s10">Governing law</h2><p>These terms are governed by the laws of the United States and the State of Washington, without regard to conflicts of law. Disputes are handled in the federal or state courts located in Washington State, unless the consumer law of your country gives you the right to use your local courts. If part of these terms cannot be enforced, the rest still applies. Not enforcing a term once does not waive it. These terms are the whole agreement between us about OpenVibe.Help.</p></section>
++<section><h2 id="s11">Changes and contact</h2><p>We may update these terms. Material changes are announced on the site before they take effect, and the date at the top changes. Continuing to use OpenVibe.Help after a change means you accept it. Questions: <a href="mailto:[email protected]">[email protected]</a>.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/privacy">Privacy Policy</a><a href="/dmca">DMCA &amp; Copyright</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/openvibe.homes/index.html b/dist/openvibe.homes/index.html
iindex 3fd114a..95c6e16 100644
---- a/dist/openvibe.homes/index.html
++++ b/dist/openvibe.homes/index.html
@@@ -156,7 +156,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.homes/release.json b/dist/openvibe.homes/release.json
iindex 5883c01..cbd1183 100644
---- a/dist/openvibe.homes/release.json
++++ b/dist/openvibe.homes/release.json
@@@ -1,6 +1,6 @@
{
"service": "homes",
-- "release": "58060c930b5f",
++ "release": "1921e724d1fb",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.host/index.html b/dist/openvibe.host/index.html
iindex 29950ed..89d428b 100644
---- a/dist/openvibe.host/index.html
++++ b/dist/openvibe.host/index.html
@@@ -156,7 +156,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -167,6 +167,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.host/release.json b/dist/openvibe.host/release.json
iindex d928a8f..72912e8 100644
---- a/dist/openvibe.host/release.json
++++ b/dist/openvibe.host/release.json
@@@ -1,6 +1,6 @@
{
"service": "host",
-- "release": "2a09d825d22a",
++ "release": "fe47476289eb",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.news/index.html b/dist/openvibe.news/index.html
iindex 5c19d16..76cbc07 100644
---- a/dist/openvibe.news/index.html
++++ b/dist/openvibe.news/index.html
@@@ -155,7 +155,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.news/release.json b/dist/openvibe.news/release.json
iindex 3dbd35e..279e363 100644
---- a/dist/openvibe.news/release.json
++++ b/dist/openvibe.news/release.json
@@@ -1,6 +1,6 @@
{
"service": "news",
-- "release": "75b6b83fb020",
++ "release": "ad5bfc74d96b",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.pics/index.html b/dist/openvibe.pics/index.html
iindex 653b6b2..9a3b6c3 100644
---- a/dist/openvibe.pics/index.html
++++ b/dist/openvibe.pics/index.html
@@@ -157,7 +157,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
<a href="https://openvibe.food/"><i class="fa-solid fa-utensils" aria-hidden="true"></i>OpenVibe.Food</a>
@@@ -167,6 +167,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.pics/release.json b/dist/openvibe.pics/release.json
iindex 079a204..a458809 100644
---- a/dist/openvibe.pics/release.json
++++ b/dist/openvibe.pics/release.json
@@@ -1,6 +1,6 @@
{
"service": "pics",
-- "release": "9582f25652e4",
++ "release": "c3f6165a1fb2",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.quest/index.html b/dist/openvibe.quest/index.html
iindex 4cbed7a..27f81f3 100644
---- a/dist/openvibe.quest/index.html
++++ b/dist/openvibe.quest/index.html
@@@ -156,7 +156,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.quest/release.json b/dist/openvibe.quest/release.json
iindex 09d918b..28dd35b 100644
---- a/dist/openvibe.quest/release.json
++++ b/dist/openvibe.quest/release.json
@@@ -1,6 +1,6 @@
{
"service": "quest",
-- "release": "c02bb6ca00d4",
++ "release": "216f1c920f23",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.rent/index.html b/dist/openvibe.rent/index.html
iindex 9447181..5c1c867 100644
---- a/dist/openvibe.rent/index.html
++++ b/dist/openvibe.rent/index.html
@@@ -156,7 +156,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.rent/release.json b/dist/openvibe.rent/release.json
iindex 416ee61..72a2490 100644
---- a/dist/openvibe.rent/release.json
++++ b/dist/openvibe.rent/release.json
@@@ -1,6 +1,6 @@
{
"service": "rent",
-- "release": "eb91b4b3c29f",
++ "release": "019c83c0251c",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.reviews/index.html b/dist/openvibe.reviews/index.html
iindex ababb0e..38cc6d8 100644
---- a/dist/openvibe.reviews/index.html
++++ b/dist/openvibe.reviews/index.html
@@@ -155,7 +155,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.reviews/release.json b/dist/openvibe.reviews/release.json
iindex fc57132..e427a72 100644
---- a/dist/openvibe.reviews/release.json
++++ b/dist/openvibe.reviews/release.json
@@@ -1,6 +1,6 @@
{
"service": "reviews",
-- "release": "be102e545ed1",
++ "release": "8f67277f5727",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.run/index.html b/dist/openvibe.run/index.html
iindex e6957bb..1b23493 100644
---- a/dist/openvibe.run/index.html
++++ b/dist/openvibe.run/index.html
@@@ -156,7 +156,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.homes/"><i class="fa-solid fa-house" aria-hidden="true"></i>OpenVibe.Homes</a>
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.run/release.json b/dist/openvibe.run/release.json
iindex 6bf3642..26d517e 100644
---- a/dist/openvibe.run/release.json
++++ b/dist/openvibe.run/release.json
@@@ -1,6 +1,6 @@
{
"service": "run",
-- "release": "c535a3e9f0a3",
++ "release": "be849d864716",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.services/index.html b/dist/openvibe.services/index.html
iindex 5f931e1..6da3577 100644
---- a/dist/openvibe.services/index.html
++++ b/dist/openvibe.services/index.html
@@@ -3,9 +3,9 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
--<title>OpenVibe.Services — One console for the whole network.</title>
--<meta name="description" content="OpenVibe.Services will be the console for developers and operators across the OpenVibe network: projects, keys and permissions, storage, events, functions and AI routes, usage and bills, logs and deploys, all in one place and all through the same open API and SDK.">
--<meta name="keywords" content="openvibe services, developer console, cloud console, api keys, open cloud">
++<title>OpenVibe.Services — Build with the whole network.</title>
++<meta name="description" content="OpenVibe.Services will be the way into everything programmable on OpenVibe. Start from what you want to build (monitor a page and summarise changes, run an AI agent, process uploads, control a robot, add support to a site) and it assembles the services, keys, permissions and working code for you. Then operate it all in one place: projects, grants, usage, quotas, runs, events, deploys and health, with each service keeping its own data.">
++<meta name="keywords" content="openvibe services, developer platform, open source backend, api platform, event bus api, ai gateway, website monitoring api, developer console">
<meta name="robots" content="index, follow, max-image-preview:large">
<meta name="theme-color" content="#38bdf8">
<link rel="canonical" href="https://openvibe.services/">
@@@ -16,15 +16,15 @@
<meta property="og:type" content="website">
<meta property="og:site_name" content="OpenVibe.Services">
<meta property="og:url" content="https://openvibe.services/">
--<meta property="og:title" content="OpenVibe.Services — One console for the whole network.">
--<meta property="og:description" content="OpenVibe.Services will be the console for developers and operators across the OpenVibe network: projects, keys and permissions, storage, events, functions and AI routes, usage and bills, logs and deploys, all in one place and all through the same open API and SDK.">
++<meta property="og:title" content="OpenVibe.Services — Build with the whole network.">
++<meta property="og:description" content="OpenVibe.Services will be the way into everything programmable on OpenVibe. Start from what you want to build (monitor a page and summarise changes, run an AI agent, process uploads, control a robot, add support to a site) and it assembles the services, keys, permissions and working code for you. Then operate it all in one place: projects, grants, usage, quotas, runs, events, deploys and health, with each service keeping its own data.">
<meta property="og:image" content="https://openvibe.network/assets/logo-512.png">
<meta property="og:image:alt" content="OpenVibe">
<meta name="twitter:card" content="summary">
--<meta name="twitter:title" content="OpenVibe.Services — One console for the whole network.">
--<meta name="twitter:description" content="OpenVibe.Services will be the console for developers and operators across the OpenVibe network: projects, keys and permissions, storage, events, functions and AI routes, usage and bills, logs and deploys, all in one place and all through the same open API and SDK.">
++<meta name="twitter:title" content="OpenVibe.Services — Build with the whole network.">
++<meta name="twitter:description" content="OpenVibe.Services will be the way into everything programmable on OpenVibe. Start from what you want to build (monitor a page and summarise changes, run an AI agent, process uploads, control a robot, add support to a site) and it assembles the services, keys, permissions and working code for you. Then operate it all in one place: projects, grants, usage, quotas, runs, events, deploys and health, with each service keeping its own data.">
<meta name="twitter:image" content="https://openvibe.network/assets/logo-512.png">
--<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://openvibe.services/#site","url":"https://openvibe.services/","name":"OpenVibe.Services","description":"OpenVibe.Services will be the console for developers and operators across the OpenVibe network: projects, keys and permissions, storage, events, functions and AI routes, usage and bills, logs and deploys, all in one place and all through the same open API and SDK.","inLanguage":"en","publisher":{"@type":"Organization","@id":"https://openvibe.network/#org","name":"OpenVibe","url":"https://openvibe.network/","logo":"https://openvibe.network/assets/logo-512.png","sameAs":["https://github.com/OpenVibers","https://discord.gg/M6MuRUaeJj"]},"isPartOf":{"@type":"WebSite","@id":"https://openvibe.network/#site","name":"OpenVibe.Network","url":"https://openvibe.network/"}},{"@type":"WebPage","@id":"https://openvibe.services/#page","url":"https://openvibe.services/","name":"OpenVibe.Services — One console for the whole network.","description":"OpenVibe.Services will be the console for developers and operators across the OpenVibe network: projects, keys and permissions, storage, events, functions and AI routes, usage and bills, logs and deploys, all in one place and all through the same open API and SDK.","isPartOf":{"@id":"https://openvibe.services/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-28","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"OpenVibe","item":"https://openvibe.network/"},{"@type":"ListItem","position":2,"name":"OpenVibe.Services","item":"https://openvibe.services/"}]}}]}</script>
++<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://openvibe.services/#site","url":"https://openvibe.services/","name":"OpenVibe.Services","description":"OpenVibe.Services will be the way into everything programmable on OpenVibe. Start from what you want to build (monitor a page and summarise changes, run an AI agent, process uploads, control a robot, add support to a site) and it assembles the services, keys, permissions and working code for you. Then operate it all in one place: projects, grants, usage, quotas, runs, events, deploys and health, with each service keeping its own data.","inLanguage":"en","publisher":{"@type":"Organization","@id":"https://openvibe.network/#org","name":"OpenVibe","url":"https://openvibe.network/","logo":"https://openvibe.network/assets/logo-512.png","sameAs":["https://github.com/OpenVibers","https://discord.gg/M6MuRUaeJj"]},"isPartOf":{"@type":"WebSite","@id":"https://openvibe.network/#site","name":"OpenVibe.Network","url":"https://openvibe.network/"}},{"@type":"WebPage","@id":"https://openvibe.services/#page","url":"https://openvibe.services/","name":"OpenVibe.Services — Build with the whole network.","description":"OpenVibe.Services will be the way into everything programmable on OpenVibe. Start from what you want to build (monitor a page and summarise changes, run an AI agent, process uploads, control a robot, add support to a site) and it assembles the services, keys, permissions and working code for you. Then operate it all in one place: projects, grants, usage, quotas, runs, events, deploys and health, with each service keeping its own data.","isPartOf":{"@id":"https://openvibe.services/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-28","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"OpenVibe","item":"https://openvibe.network/"},{"@type":"ListItem","position":2,"name":"OpenVibe.Services","item":"https://openvibe.services/"}]}}]}</script>
<script>(function(){try{var raw=localStorage.getItem('ov_theme');if(!raw)return;var t=JSON.parse(raw),v=t&&t.variables;if(!v)return;var el=document.documentElement;for(var k in v)if(k.charAt(0)==='-')el.style.setProperty(k,v[k]);if(t.id)el.setAttribute('data-theme',t.id);}catch(_){}})();</script>
<script src="/shared/theme-loader.js?v=d9b9af081efe" defer></script>
<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
@@@ -99,14 +99,14 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<div class="mark"><i class="fa-solid fa-server" aria-hidden="true"></i></div>
<div class="badge"><span class="ov-mark" data-size="16" data-variant="services"></span> Part of the OpenVibe network · <b>planned</b></div>
<h1>OpenVibe<span class="d">.</span><span class="tld">Services</span></h1>
-- <div class="tag">One console for the whole network.</div>
-- <p class="lead">OpenVibe.Services will be the console for developers and operators across the OpenVibe network: projects, keys and permissions, storage, events, functions and AI routes, usage and bills, logs and deploys, all in one place and all through the same open API and SDK.</p>
++ <div class="tag">Build with the whole network.</div>
++ <p class="lead">OpenVibe.Services will be the way into everything programmable on OpenVibe. Start from what you want to build (monitor a page and summarise changes, run an AI agent, process uploads, control a robot, add support to a site) and it assembles the services, keys, permissions and working code for you. Then operate it all in one place: projects, grants, usage, quotas, runs, events, deploys and health, with each service keeping its own data.</p>
<div class="ctas">
<a class="btn btn-primary" href="https://openvibe.network/login?return=https%3A%2F%2Fopenvibe.services%2F"><i class="fa-solid fa-right-to-bracket"></i> Sign in with OpenVibe</a>
<a class="btn" href="https://openvibe.network/#network"><i class="fa-solid fa-circle-nodes"></i> The whole network</a>
<a class="btn" href="https://discord.gg/M6MuRUaeJj" rel="noopener"><i class="fa-brands fa-discord"></i> Follow the build</a>
</div>
-- <p class="status"><i class="fa-solid fa-clock" aria-hidden="true"></i> Status: <b>planned</b> · <strong>OpenVibe.Services</strong> is planned; its repository and code do not exist yet: this page is a placeholder, nothing here is live yet. The public launch is waiting for the console bringing together Codes&#39; portal and the network&#39;s admin surfaces. · as of 2026-09-24 · <a href="/status.json">status.json</a></p>
++ <p class="status"><i class="fa-solid fa-clock" aria-hidden="true"></i> Status: <b>planned</b> · <strong>OpenVibe.Services</strong> is planned; its repository and code do not exist yet: this page is a placeholder, nothing here is live yet. The public launch is waiting for the catalog and console over the services that already run (AI, Events, Media, Search, Sources, Host, Tools). · as of 2026-09-24 · <a href="/status.json">status.json</a></p>
</header>
@@@ -114,10 +114,10 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<h2>What OpenVibe.Services will be</h2>
<p class="lead2">Same account, same themes, same navbar as every other OpenVibe site — built in the open, run by its community.</p>
<div class="grid">
-- <div class="card"><div class="ic"><i class="fa-solid fa-server" aria-hidden="true"></i></div><b>Projects &amp; keys</b><span>Members, keys and scoped permissions for everything you build.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-server" aria-hidden="true"></i></div><b>Every service</b><span>Storage, events, functions, AI, search and more, from one place.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-server" aria-hidden="true"></i></div><b>Usage &amp; bills</b><span>What you use, what it costs, with budgets and alerts.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-server" aria-hidden="true"></i></div><b>Open API</b><span>Everything the console does, the API and SDK do too.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-server" aria-hidden="true"></i></div><b>Discover</b><span>A catalog of services, recipes and templates, by what they do.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-server" aria-hidden="true"></i></div><b>Build</b><span>Projects, apps, keys, capabilities, playgrounds and starter code.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-server" aria-hidden="true"></i></div><b>Operate</b><span>Every resource across the network: runs, events, usage, quotas, health.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-server" aria-hidden="true"></i></div><b>Learn</b><span>Help, Wiki and Codes docs, linked from every page.</span></div>
</div>
</section>
@@@ -156,7 +156,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.homes/"><i class="fa-solid fa-house" aria-hidden="true"></i>OpenVibe.Homes</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.services/manifest.webmanifest b/dist/openvibe.services/manifest.webmanifest
iindex 06743d8..6c61b01 100644
---- a/dist/openvibe.services/manifest.webmanifest
++++ b/dist/openvibe.services/manifest.webmanifest
@@@ -1,7 +1,7 @@
{
"name": "OpenVibe.Services",
"short_name": "Services",
-- "description": "One console for the whole network.",
++ "description": "Build with the whole network.",
"start_url": "/",
"scope": "/",
"display": "standalone",
ddiff --git a/dist/openvibe.services/release.json b/dist/openvibe.services/release.json
iindex 792880a..70dae81 100644
---- a/dist/openvibe.services/release.json
++++ b/dist/openvibe.services/release.json
@@@ -1,6 +1,6 @@
{
"service": "services",
-- "release": "8634e5dd173f",
++ "release": "6761dac166dc",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.services/status.json b/dist/openvibe.services/status.json
iindex 550d7ca..451ff79 100644
---- a/dist/openvibe.services/status.json
++++ b/dist/openvibe.services/status.json
@@@ -8,7 +8,7 @@
"repoExists": false,
"repoStage": "charter-only",
"service": null,
-- "launchWaitsFor": "the console bringing together Codes' portal and the network's admin surfaces",
++ "launchWaitsFor": "the catalog and console over the services that already run (AI, Events, Media, Search, Sources, Host, Tools)",
"factsAsOf": "2026-09-24",
"network": "https://openvibe.network",
"updated": "2026-09-28",
ddiff --git a/dist/openvibe.space/index.html b/dist/openvibe.space/index.html
iindex 2243f46..28d9467 100644
---- a/dist/openvibe.space/index.html
++++ b/dist/openvibe.space/index.html
@@@ -156,7 +156,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.food/"><i class="fa-solid fa-utensils" aria-hidden="true"></i>OpenVibe.Food</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.space/release.json b/dist/openvibe.space/release.json
iindex 070ab0d..93d35aa 100644
---- a/dist/openvibe.space/release.json
++++ b/dist/openvibe.space/release.json
@@@ -1,6 +1,6 @@
{
"service": "space",
-- "release": "4b326ea17646",
++ "release": "00cda059f71c",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.tips/index.html b/dist/openvibe.tips/index.html
iindex 336e8a9..0dbaf3e 100644
---- a/dist/openvibe.tips/index.html
++++ b/dist/openvibe.tips/index.html
@@@ -155,7 +155,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.tips/release.json b/dist/openvibe.tips/release.json
iindex fd90257..d74663e 100644
---- a/dist/openvibe.tips/release.json
++++ b/dist/openvibe.tips/release.json
@@@ -1,6 +1,6 @@
{
"service": "tips",
-- "release": "a3068910348d",
++ "release": "fb1b0e739088",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.trade/index.html b/dist/openvibe.trade/index.html
iindex ca372dc..9303cc5 100644
---- a/dist/openvibe.trade/index.html
++++ b/dist/openvibe.trade/index.html
@@@ -155,7 +155,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.trade/release.json b/dist/openvibe.trade/release.json
iindex 0acb908..218aa1e 100644
---- a/dist/openvibe.trade/release.json
++++ b/dist/openvibe.trade/release.json
@@@ -1,6 +1,6 @@
{
"service": "trade",
-- "release": "1717c324a005",
++ "release": "868d9dfe5e51",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.video/index.html b/dist/openvibe.video/index.html
iindex 88b361e..959c745 100644
---- a/dist/openvibe.video/index.html
++++ b/dist/openvibe.video/index.html
@@@ -157,7 +157,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -167,6 +167,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.homes/"><i class="fa-solid fa-house" aria-hidden="true"></i>OpenVibe.Homes</a>
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.video/release.json b/dist/openvibe.video/release.json
iindex 05a1ef2..3a4ec24 100644
---- a/dist/openvibe.video/release.json
++++ b/dist/openvibe.video/release.json
@@@ -1,6 +1,6 @@
{
"service": "video",
-- "release": "af966edd9843",
++ "release": "669e11bbbfda",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.vip/index.html b/dist/openvibe.vip/index.html
iindex 3dce450..1a614ac 100644
---- a/dist/openvibe.vip/index.html
++++ b/dist/openvibe.vip/index.html
@@@ -155,7 +155,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/openvibe.vip/release.json b/dist/openvibe.vip/release.json
iindex 8eb7022..b054190 100644
---- a/dist/openvibe.vip/release.json
++++ b/dist/openvibe.vip/release.json
@@@ -1,6 +1,6 @@
{
"service": "vip",
-- "release": "95a4dfe96647",
++ "release": "40e88b658e9d",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.website/404.html b/dist/openvibe.website/404.html
nnew file mode 100644
iindex 0000000..dbf932e
---- /dev/null
++++ b/dist/openvibe.website/404.html
@@@ -0,0 +1,35 @@
++<!DOCTYPE html>
++<html lang="en">
++<head>
++<meta charset="utf-8">
++<meta name="viewport" content="width=device-width, initial-scale=1">
++<title>Not found · OpenVibe.Website</title>
++<meta name="robots" content="noindex">
++<meta name="theme-color" content="#22d3ee">
++<link rel="icon" type="image/svg+xml" data-ov-icon="network" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<style>
++*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
++:root{--bg-primary:#0a0f1c;--bg-secondary:#101828;--border:#1f2d47;--text-primary:#e6edf7;--text-secondary:#96a7c2;--site:#22d3ee}
++body{background:var(--bg-primary);color:var(--text-primary);font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;min-height:100vh;display:grid;place-items:center;padding:24px 16px}
++main{max-width:560px;text-align:center}
++.code{font-size:14px;font-weight:700;letter-spacing:.2em;color:var(--site)}
++h1{font-size:clamp(28px,5vw,40px);font-weight:800;letter-spacing:-.8px;margin:10px 0 12px}
++p{color:var(--text-secondary);font-size:15px;line-height:1.65}
++.links{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:24px}
++a{display:inline-block;padding:11px 18px;border-radius:12px;font-size:14px;font-weight:600;text-decoration:none;border:1px solid var(--border);color:var(--text-primary);background:var(--bg-secondary)}
++a:first-child{background:var(--site);border-color:var(--site);color:#0b0d10}
++</style>
++</head>
++<body>
++<main>
++ <p class="code">404</p>
++ <h1>This page does not exist</h1>
++ <p>openvibe.website has only its front page and legal pages for now. The address you followed is not one of them.</p>
++ <div class="links">
++ <a href="https://openvibe.website/">OpenVibe.Website</a>
++ <a href="https://openvibe.network/">OpenVibe.Network</a>
++ </div>
++</main>
++</body>
++</html>
ddiff --git a/dist/openvibe.website/dmca.html b/dist/openvibe.website/dmca.html
nnew file mode 100644
iindex 0000000..af49cf2
---- /dev/null
++++ b/dist/openvibe.website/dmca.html
@@@ -0,0 +1,109 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>DMCA &amp; Copyright — OpenVibe.Website</title>
++<meta name="description" content="How to report copyright infringement on OpenVibe.Website, and how to respond to a report.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://openvibe.website/dmca">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="OpenVibe.Website">
++<meta property="og:title" content="DMCA &amp; Copyright — OpenVibe.Website">
++<meta property="og:description" content="How to report copyright infringement on OpenVibe.Website, and how to respond to a report.">
++<meta property="og:url" content="https://openvibe.website/dmca">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="DMCA &amp; Copyright — OpenVibe.Website">
++<meta name="twitter:description" content="How to report copyright infringement on OpenVibe.Website, and how to respond to a report.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="website" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">OpenVibe.Website</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">OpenVibe.Website</p><h1>DMCA &amp; Copyright</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">Our position</a></li><li><a href="#s2">Before you send a notice</a></li><li><a href="#s3">Send a takedown notice</a></li><li><a href="#s4">What happens next</a></li><li><a href="#s5">Repeat infringers and false claims</a></li><li><a href="#s6">Other complaints</a></li></ol></nav>
++<section><h2 id="s1">Our position</h2><p>OpenVibe.Website respects copyright and responds to clear notices of alleged infringement under the Digital Millennium Copyright Act (17 U.S.C. § 512). OpenVibe.Website currently publishes only its own material and does not host uploads from the public.</p></section>
++<section><h2 id="s2">Before you send a notice</h2><p>Consider whether the use is permitted, for example as fair use, commentary, criticism, or under a licence. Notices must come from the copyright owner or someone authorised to act for them. Misrepresentations in a notice carry legal liability.</p></section>
++<section><h2 id="s3">Send a takedown notice</h2><p>Email <a href="mailto:[email protected]">[email protected]</a> with all of the following:</p><ol><li>Your name, postal address, phone number and email address, and whom you represent.</li><li>The copyrighted work you say was infringed, or a representative list if there are several.</li><li>The exact URL on openvibe.website of each item you want removed. General descriptions, search results and channel links are not enough to find it.</li><li>A statement that you have a good-faith belief the use is not authorised by the copyright owner, its agent or the law.</li><li>A statement, under penalty of perjury, that the information is accurate and that you are the owner or authorised to act for the owner.</li><li>Your physical or electronic signature.</li></ol></section>
++<section><h2 id="s4">What happens next</h2><p>We remove or disable access to the material, tell the person who posted it, and give them a copy of your notice, including your contact details. We act on complete notices as quickly as we can, normally within a few business days. Incomplete notices get a reply saying what is missing.</p></section>
++<section><h2 id="s5">Repeat infringers and false claims</h2><p>Accounts that receive repeated valid notices lose the ability to post and, in appropriate circumstances, are terminated across the network. Knowingly false notices and counter-notices carry liability under § 512(f); we refuse notices that are clearly abusive or automated without review.</p></section>
++<section><h2 id="s6">Other complaints</h2><p>Trademark, privacy, impersonation, harassment and other non-copyright complaints go to the same address; say which kind of complaint it is and give the exact URL. Content that sexually exploits children should be reported to us immediately and to the <a href="https://report.cybertip.org/" rel="noopener">NCMEC CyberTipline</a> or your national hotline; we remove it and report it to the authorities.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/terms">Terms of Service</a><a href="/privacy">Privacy Policy</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/openvibe.website/index.html b/dist/openvibe.website/index.html
nnew file mode 100644
iindex 0000000..88f5e3e
---- /dev/null
++++ b/dist/openvibe.website/index.html
@@@ -0,0 +1,284 @@
++<!DOCTYPE html>
++<html lang="en">
++<head>
++<meta charset="utf-8">
++<meta name="viewport" content="width=device-width, initial-scale=1">
++<title>OpenVibe.Website — Websites that work, not just pages.</title>
++<meta name="description" content="OpenVibe.Website will be an AI-assisted website and small-app builder with a real file tree: generate a site from a description, import one or fork a Git repository, edit HTML, CSS, JavaScript or Markdown by hand or visually, and publish to yourname.openvibe.website or your own domain. Sites can sign people in with OpenVibe, take bookings and forms, show media, run a blog or docs, and add chat, comments, memberships or support, with good SEO built in.">
++<meta name="keywords" content="ai website builder, open source website builder, static site builder, portfolio builder, website generator, docs site generator">
++<meta name="robots" content="index, follow, max-image-preview:large">
++<meta name="theme-color" content="#22d3ee">
++<link rel="canonical" href="https://openvibe.website/">
++<link rel="icon" type="image/svg+xml" data-ov-icon="network" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<link rel="manifest" href="/manifest.webmanifest">
++<link rel="alternate" type="text/html" hreflang="en" href="https://openvibe.website/">
++<meta property="og:type" content="website">
++<meta property="og:site_name" content="OpenVibe.Website">
++<meta property="og:url" content="https://openvibe.website/">
++<meta property="og:title" content="OpenVibe.Website — Websites that work, not just pages.">
++<meta property="og:description" content="OpenVibe.Website will be an AI-assisted website and small-app builder with a real file tree: generate a site from a description, import one or fork a Git repository, edit HTML, CSS, JavaScript or Markdown by hand or visually, and publish to yourname.openvibe.website or your own domain. Sites can sign people in with OpenVibe, take bookings and forms, show media, run a blog or docs, and add chat, comments, memberships or support, with good SEO built in.">
++<meta property="og:image" content="https://openvibe.network/assets/logo-512.png">
++<meta property="og:image:alt" content="OpenVibe">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="OpenVibe.Website — Websites that work, not just pages.">
++<meta name="twitter:description" content="OpenVibe.Website will be an AI-assisted website and small-app builder with a real file tree: generate a site from a description, import one or fork a Git repository, edit HTML, CSS, JavaScript or Markdown by hand or visually, and publish to yourname.openvibe.website or your own domain. Sites can sign people in with OpenVibe, take bookings and forms, show media, run a blog or docs, and add chat, comments, memberships or support, with good SEO built in.">
++<meta name="twitter:image" content="https://openvibe.network/assets/logo-512.png">
++<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://openvibe.website/#site","url":"https://openvibe.website/","name":"OpenVibe.Website","description":"OpenVibe.Website will be an AI-assisted website and small-app builder with a real file tree: generate a site from a description, import one or fork a Git repository, edit HTML, CSS, JavaScript or Markdown by hand or visually, and publish to yourname.openvibe.website or your own domain. Sites can sign people in with OpenVibe, take bookings and forms, show media, run a blog or docs, and add chat, comments, memberships or support, with good SEO built in.","inLanguage":"en","publisher":{"@type":"Organization","@id":"https://openvibe.network/#org","name":"OpenVibe","url":"https://openvibe.network/","logo":"https://openvibe.network/assets/logo-512.png","sameAs":["https://github.com/OpenVibers","https://discord.gg/M6MuRUaeJj"]},"isPartOf":{"@type":"WebSite","@id":"https://openvibe.network/#site","name":"OpenVibe.Network","url":"https://openvibe.network/"}},{"@type":"WebPage","@id":"https://openvibe.website/#page","url":"https://openvibe.website/","name":"OpenVibe.Website — Websites that work, not just pages.","description":"OpenVibe.Website will be an AI-assisted website and small-app builder with a real file tree: generate a site from a description, import one or fork a Git repository, edit HTML, CSS, JavaScript or Markdown by hand or visually, and publish to yourname.openvibe.website or your own domain. Sites can sign people in with OpenVibe, take bookings and forms, show media, run a blog or docs, and add chat, comments, memberships or support, with good SEO built in.","isPartOf":{"@id":"https://openvibe.website/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-28","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"OpenVibe","item":"https://openvibe.network/"},{"@type":"ListItem","position":2,"name":"OpenVibe.Website","item":"https://openvibe.website/"}]}}]}</script>
++<script>(function(){try{var raw=localStorage.getItem('ov_theme');if(!raw)return;var t=JSON.parse(raw),v=t&&t.variables;if(!v)return;var el=document.documentElement;for(var k in v)if(k.charAt(0)==='-')el.style.setProperty(k,v[k]);if(t.id)el.setAttribute('data-theme',t.id);}catch(_){}})();</script>
++<script src="/shared/theme-loader.js?v=d9b9af081efe" defer></script>
++<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
++<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" media="print" onload="this.media='all'">
++<noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"></noscript>
++<style>
++*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
++:root{--bg-primary:#0a0f1c;--bg-secondary:#101828;--bg-card:#131c2e;--bg-hover:#1c2a44;--border:#1f2d47;--text-primary:#e6edf7;--text-secondary:#96a7c2;--text-muted:#7386a3;--accent:#3b82f6;--accent-light:#60a5fa;--accent-rgb:59,130,246;--on-accent:#fff;--site:#22d3ee;--site-rgb:34,211,238}
++html{scroll-behavior:smooth}
++body{background:var(--bg-primary);color:var(--text-primary);font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;min-height:100vh;display:flex;flex-direction:column;overflow-x:hidden}
++main{flex:1;position:relative}
++.orbs{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
++.orbs i{position:absolute;border-radius:50%;filter:blur(90px);opacity:.16;animation:drift 26s ease-in-out infinite alternate}
++.orbs i:nth-child(1){width:420px;height:420px;background:var(--site);top:-140px;left:-120px}
++.orbs i:nth-child(2){width:360px;height:360px;background:var(--accent);top:40%;right:-140px;animation-delay:-9s}
++.orbs i:nth-child(3){width:300px;height:300px;background:var(--site);bottom:-120px;left:38%;animation-delay:-17s}
++@keyframes drift{0%{transform:translate(0,0) scale(1)}50%{transform:translate(-26px,36px) scale(1.07)}100%{transform:translate(34px,-28px) scale(.95)}}
++.wrap{position:relative;z-index:1;max-width:1040px;margin:0 auto;padding:0 20px}
++.hero{padding:84px 0 44px;text-align:center}
++.hero .mark{display:inline-grid;place-items:center;width:84px;height:84px;border-radius:24px;background:rgba(var(--site-rgb),.12);border:1px solid rgba(var(--site-rgb),.35);color:var(--site);font-size:34px;margin-bottom:22px;box-shadow:0 20px 60px rgba(var(--site-rgb),.18);animation:rise .6s cubic-bezier(.2,.8,.2,1) both}
++.hero .badge{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;border-radius:999px;border:1px solid var(--border);background:var(--bg-secondary);font-size:12px;font-weight:600;color:var(--text-secondary);letter-spacing:.3px;margin-bottom:22px;animation:rise .6s .05s cubic-bezier(.2,.8,.2,1) both}
++.hero .badge b{color:var(--site)}
++.hero h1{font-size:clamp(34px,6vw,58px);font-weight:800;letter-spacing:-1.4px;line-height:1.08;animation:rise .6s .1s cubic-bezier(.2,.8,.2,1) both}
++.hero h1 .d{color:var(--site)}
++.hero h1 .tld{color:var(--text-secondary)}
++.hero .tag{font-size:clamp(18px,2.6vw,24px);font-weight:600;color:var(--text-primary);margin:18px 0 10px;animation:rise .6s .16s cubic-bezier(.2,.8,.2,1) both}
++.hero p.lead{color:var(--text-secondary);font-size:16px;line-height:1.65;max-width:680px;margin:0 auto;animation:rise .6s .22s cubic-bezier(.2,.8,.2,1) both}
++.ctas{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:30px;animation:rise .6s .3s cubic-bezier(.2,.8,.2,1) both}
++.hero .status{margin:22px auto 0;max-width:720px;font-size:12.5px;line-height:1.7;color:var(--text-muted);border:1px dashed var(--border);border-radius:12px;padding:10px 14px;background:rgba(0,0,0,.15)}
++.hero .status b{color:var(--site)}
++.hero .status code{font-size:12px;color:var(--text-secondary);background:var(--bg-secondary);padding:1px 6px;border-radius:6px}
++.hero .status a{color:var(--text-secondary)}
++.btn{display:inline-flex;align-items:center;gap:9px;padding:12px 20px;border-radius:12px;font-size:14px;font-weight:600;text-decoration:none;border:1px solid var(--border);color:var(--text-primary);background:var(--bg-secondary);transition:transform .15s,border-color .15s,box-shadow .15s}
++.btn:hover{transform:translateY(-1px);border-color:var(--site);box-shadow:0 10px 30px rgba(var(--site-rgb),.15)}
++.btn-primary{background:var(--site);border-color:var(--site);color:#0b0d10}
++.btn-primary:hover{filter:brightness(1.08)}
++@keyframes rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
++section{padding:36px 0}
++h2{font-size:22px;font-weight:700;letter-spacing:-.3px;margin-bottom:6px}
++.lead2{color:var(--text-secondary);font-size:14px;margin-bottom:20px}
++.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px}
++.card{background:var(--bg-card);border:1px solid var(--border);border-radius:16px;padding:20px;transition:transform .2s,border-color .2s,box-shadow .2s;text-decoration:none;color:inherit;display:flex;flex-direction:column;gap:8px}
++a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);box-shadow:0 16px 40px rgba(0,0,0,.35)}
++.card .ic{width:40px;height:40px;border-radius:11px;display:grid;place-items:center;background:rgba(var(--site-rgb),.12);color:var(--site);font-size:17px}
++.card b{font-size:15px}
++.card span{font-size:13px;color:var(--text-secondary);line-height:1.55}
++.card .go{margin-top:auto;font-size:12.5px;font-weight:600;color:var(--site)}
++.highlight .hl-card{border:1px solid rgba(var(--accent-rgb),.45);background:rgba(var(--accent-rgb),.10);border-radius:18px;padding:22px 22px 18px}
++.highlight h2{margin:0 0 8px}.highlight h2 i{color:var(--accent-light)}.highlight p{margin:0 0 10px}
++.highlight ul{margin:0 0 14px;padding-left:20px}.highlight li{margin:4px 0}
++.faq details{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:12px 14px;margin:8px 0}
++.faq summary{cursor:pointer;font-weight:600}.faq details p{margin:8px 0 0;opacity:.85}
++.meanwhile .card .ic{background:rgba(var(--accent-rgb),.12);color:var(--accent-light)}
++.net .card .ic{background:var(--bg-hover);color:var(--text-primary)}
++.rooms{display:flex;flex-wrap:wrap;gap:8px}
++.rooms a{font-size:12.5px;padding:7px 12px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary);text-decoration:none;transition:all .15s;background:var(--bg-secondary)}
++.rooms a:hover{color:var(--text-primary);border-color:var(--site)}
++.rooms a i{margin-right:6px;opacity:.8}
++.strip{border:1px solid var(--border);border-radius:18px;background:var(--bg-secondary);padding:30px 26px;text-align:center;margin:10px 0 50px}
++.strip h3{font-size:19px;font-weight:700;margin:12px 0 8px}
++.strip p{font-size:14px;color:var(--text-secondary);max-width:600px;margin:0 auto 18px;line-height:1.6}
++.strip .ov-mark{width:44px;height:44px}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}}
++@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
++</style>
++</head>
++<body>
++<div class="orbs"><i></i><i></i><i></i></div>
++<div id="navbar-mount"></div>
++<main class="wrap">
++ <header class="hero">
++ <div class="mark"><i class="fa-solid fa-globe" aria-hidden="true"></i></div>
++ <div class="badge"><span class="ov-mark" data-size="16" data-variant="website"></span> Part of the OpenVibe network · <b>planned</b></div>
++ <h1>OpenVibe<span class="d">.</span><span class="tld">Website</span></h1>
++ <div class="tag">Websites that work, not just pages.</div>
++ <p class="lead">OpenVibe.Website will be an AI-assisted website and small-app builder with a real file tree: generate a site from a description, import one or fork a Git repository, edit HTML, CSS, JavaScript or Markdown by hand or visually, and publish to yourname.openvibe.website or your own domain. Sites can sign people in with OpenVibe, take bookings and forms, show media, run a blog or docs, and add chat, comments, memberships or support, with good SEO built in.</p>
++ <div class="ctas">
++ <a class="btn btn-primary" href="https://openvibe.network/login?return=https%3A%2F%2Fopenvibe.website%2F"><i class="fa-solid fa-right-to-bracket"></i> Sign in with OpenVibe</a>
++ <a class="btn" href="https://openvibe.network/#network"><i class="fa-solid fa-circle-nodes"></i> The whole network</a>
++ <a class="btn" href="https://discord.gg/M6MuRUaeJj" rel="noopener"><i class="fa-brands fa-discord"></i> Follow the build</a>
++ </div>
++ <p class="status"><i class="fa-solid fa-clock" aria-hidden="true"></i> Status: <b>planned</b> · <strong>OpenVibe.Website</strong> is planned; its repository and code do not exist yet: this page is a placeholder, nothing here is live yet. The public launch is waiting for tenant hosting on OpenVibe.Host (built, not launched) and the editor. · as of 2026-09-24 · <a href="/status.json">status.json</a></p>
++ </header>
++
++
++ <section id="what">
++ <h2>What OpenVibe.Website will be</h2>
++ <p class="lead2">Same account, same themes, same navbar as every other OpenVibe site — built in the open, run by its community.</p>
++ <div class="grid">
++ <div class="card"><div class="ic"><i class="fa-solid fa-globe" aria-hidden="true"></i></div><b>Generate or code</b><span>Describe it, import it, fork it, or write it yourself.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-globe" aria-hidden="true"></i></div><b>Real features</b><span>Sign-in, forms, bookings, media, blogs and support from the network.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-globe" aria-hidden="true"></i></div><b>Your files</b><span>Every generated site is readable, editable source.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-globe" aria-hidden="true"></i></div><b>Publish anywhere</b><span>yourname.openvibe.website or your own domain, with rollback.</span></div>
++ </div>
++ </section>
++
++ <section class="meanwhile">
++ <h2>Meanwhile, on the network</h2>
++ <p class="lead2">Most of this already exists somewhere on OpenVibe — start there today.</p>
++ <div class="grid">
++ <a class="card" href="https://openvibe.codes"><div class="ic"><i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i></div><b>OpenVibe.Codes</b><span>The developer portal, API and SDK docs work today.</span><span class="go">openvibe.codes →</span></a>
++ <a class="card" href="https://openvibe.tools"><div class="ic"><i class="fa-solid fa-arrow-up-right-from-square" aria-hidden="true"></i></div><b>OpenVibe.Tools</b><span>Dozens of tools that run in the browser today.</span><span class="go">openvibe.tools →</span></a>
++ </div>
++ </section>
++
++
++ <section class="net">
++ <h2>The OpenVibe network</h2>
++ <p class="lead2">One account for all of it. Sign in once and every site signs you in.</p>
++ <div class="grid">
++ <a class="card" href="https://openvibe.live"><div class="ic"><i class="fa-solid fa-tower-broadcast" aria-hidden="true"></i></div><b>OpenVibe.Live</b><span>Go live, chat, clip, restream</span><span class="go">openvibe.live →</span></a>
++ <a class="card" href="https://openvibe.tools"><div class="ic"><i class="fa-solid fa-screwdriver-wrench" aria-hidden="true"></i></div><b>OpenVibe.Tools</b><span>Hundreds of online tools</span><span class="go">openvibe.tools →</span></a>
++ <a class="card" href="https://openvibe.community"><div class="ic"><i class="fa-solid fa-people-group" aria-hidden="true"></i></div><b>OpenVibe.Community</b><span>Pastes, posts, people</span><span class="go">openvibe.community →</span></a>
++ <a class="card" href="https://openvibe.games"><div class="ic"><i class="fa-solid fa-gamepad" aria-hidden="true"></i></div><b>OpenVibe.Games</b><span>Scraplandia and browser games</span><span class="go">openvibe.games →</span></a>
++ <a class="card" href="https://openvibe.media"><div class="ic"><i class="fa-solid fa-photo-film" aria-hidden="true"></i></div><b>OpenVibe.Media</b><span>VODs, clips and files</span><span class="go">openvibe.media →</span></a>
++ <a class="card" href="https://openvibe.network"><div class="ic"><i class="fa-solid fa-circle-nodes" aria-hidden="true"></i></div><b>OpenVibe.Network</b><span>One account, every site</span><span class="go">openvibe.network →</span></a>
++ </div>
++ <h2 style="margin-top:28px;font-size:16px">Other OpenVibe domains, not open yet</h2>
++ <div class="rooms" style="margin-top:8px">
++ <a href="https://openvibe.news/"><i class="fa-solid fa-newspaper" aria-hidden="true"></i>OpenVibe.News</a>
++ <a href="https://openvibe.reviews/"><i class="fa-solid fa-star-half-stroke" aria-hidden="true"></i>OpenVibe.Reviews</a>
++ <a href="https://openvibe.tips/"><i class="fa-solid fa-hand-holding-heart" aria-hidden="true"></i>OpenVibe.Tips</a>
++ <a href="https://openvibe.vip/"><i class="fa-solid fa-crown" aria-hidden="true"></i>OpenVibe.VIP</a>
++ <a href="https://openvibe.trade/"><i class="fa-solid fa-chart-line" aria-hidden="true"></i>OpenVibe.Trade</a>
++ <a href="https://openvibe.host/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Host</a>
++ <a href="https://openvibe.deals/"><i class="fa-solid fa-tags" aria-hidden="true"></i>OpenVibe.Deals</a>
++ <a href="https://openvibe.coupons/"><i class="fa-solid fa-ticket" aria-hidden="true"></i>OpenVibe.Coupons</a>
++ <a href="https://openre.stream/"><i class="fa-solid fa-satellite-dish" aria-hidden="true"></i>OpenRe.Stream</a>
++ <a href="https://auth.openvibe.network/"><i class="fa-solid fa-key" aria-hidden="true"></i>auth.openvibe.network</a>
++ <a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
++ <a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
++ <a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
++ <a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
++ <a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
++ <a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
++ <a href="https://openvibe.food/"><i class="fa-solid fa-utensils" aria-hidden="true"></i>OpenVibe.Food</a>
++ <a href="https://openvibe.quest/"><i class="fa-solid fa-map" aria-hidden="true"></i>OpenVibe.Quest</a>
++ <a href="https://openvibe.rent/"><i class="fa-solid fa-key" aria-hidden="true"></i>OpenVibe.Rent</a>
++ <a href="https://openvibe.homes/"><i class="fa-solid fa-house" aria-hidden="true"></i>OpenVibe.Homes</a>
++ <a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
++ <a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
++ <a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
++ </div>
++ </section>
++
++ <div class="strip">
++ <span class="ov-mark" data-size="44" data-variant="website"></span>
++ <h3>Open source. Community run.</h3>
++ <p>Every OpenVibe site is built in the open by the people using it — free speech within the rules, no gatekeeping, one identity that follows you everywhere.</p>
++ <a class="btn" href="https://github.com/OpenVibers" rel="noopener"><i class="fa-brands fa-github"></i> OpenVibers on GitHub</a>
++ </div>
++</main>
++<style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="full"><div class="ovf-inner">
++ <div class="ovf-cols">
++ <div class="ovf-col ovf-col--brand">
++ <a class="ovf-brand" href="/"><span class="ov-mark" data-size="26"></span><span>OpenVibe</span></a>
++ <p class="ovf-tagline">Open source and community run. Built in the open by the people using it.</p>
++ <div class="ovf-social">
++ <a href="https://github.com/OpenVibers" target="_blank" rel="noopener" aria-label="GitHub" title="GitHub"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path fill="currentColor" stroke="none" d="M12 2.2a9.8 9.8 0 0 0-3.1 19.1c.5.1.7-.2.7-.5v-1.7c-2.7.6-3.3-1.2-3.3-1.2-.4-1.1-1.1-1.4-1.1-1.4-.9-.6.1-.6.1-.6 1 .1 1.5 1 1.5 1 .9 1.5 2.3 1.1 2.9.8.1-.6.3-1.1.6-1.3-2.2-.2-4.5-1.1-4.5-4.8 0-1.1.4-1.9 1-2.6-.1-.2-.4-1.2.1-2.6 0 0 .8-.3 2.7 1a9.3 9.3 0 0 1 4.9 0c1.9-1.3 2.7-1 2.7-1 .5 1.4.2 2.4.1 2.6.6.7 1 1.5 1 2.6 0 3.7-2.3 4.6-4.5 4.8.4.3.7.9.7 1.800v2.700c0 .3.2.6.7.5A9.8 9.8 0 0 0 12 2.200z"/></svg></a><a href="https://discord.gg/M6MuRUaeJj" target="_blank" rel="noopener" aria-label="Discord" title="Discord"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path fill="currentColor" stroke="none" d="M19.3 5.300a16.5 16.5 0 0 0-4.1-1.300l-.5 1a15.3 15.3 0 0 0-5.4 0l-.5-1a16.5 16.5 0 0 0-4.1 1.300C2.1 9.2 1.4 13 1.7 16.700a16.6 16.6 0 0 0 5.1 2.600l1.1-1.800c-.6-.2-1.2-.5-1.7-.8l.4-.3a11.8 11.8 0 0 0 10.8 0l.4.3c-.5.3-1.1.6-1.7.8l1.1 1.800a16.6 16.6 0 0 0 5.1-2.600c.4-4.3-.7-8.1-3-11.400zM8.7 14.400c-1 0-1.8-.9-1.8-2.100s.8-2.1 1.8-2.1 1.9 1 1.8 2.100c0 1.2-.8 2.1-1.8 2.100zm6.6 0c-1 0-1.8-.9-1.8-2.100s.8-2.1 1.8-2.1 1.9 1 1.8 2.100c0 1.2-.8 2.1-1.8 2.100z"/></svg></a>
++ <a href="/sitemap.xml" aria-label="Sitemap" title="Sitemap"><svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="9" y="3.5" width="6" height="4.5" rx="1"/><rect x="3" y="16" width="6" height="4.5" rx="1"/><rect x="15" y="16" width="6" height="4.5" rx="1"/><path d="M12 8v4M6 16v-2.500h12V16"/></svg></a>
++ </div>
++ </div>
++
++ <nav class="ovf-col" aria-label="The OpenVibe network">
++ <h3>Network</h3>
++ <a href="https://openvibe.live" title="Go live, restream and clip">Live streaming</a><a href="https://openvibe.tools" title="The whole toolbox">Online tools</a><a href="https://dev.openvibe.tools" title="Formatters, encoders, validators">Developer tools</a><a href="https://net.openvibe.tools" title="Ping, DNS, Whois, SSL">Network diagnostics</a><a href="https://img.openvibe.tools" title="Convert, resize, compress">Image converter</a><a href="https://audio.openvibe.tools" title="Convert, trim, pitch-shift">Audio converter</a>
++ <a class="ovf-more" href="https://openvibe.network" target="_blank" rel="noopener">Everything else <svg class="ovf-ic" viewBox="0 0 24 24" width="1em" height="1em" fill="none" stroke="currentColor" stroke-width="1.800" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 6l6 6-6 6"/></svg></a>
++ </nav>
++
++ <nav class="ovf-col" aria-label="Legal">
++ <h3>Legal</h3>
++ <a href="https://openvibe.live/tos">Terms of Service</a><a href="https://openvibe.live/privacy">Privacy Policy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ </div>
++ <div class="ovf-account" id="ovf-account" hidden></div>
++ <div class="ovf-bar">
++ <span class="ovf-copy">Open source &amp; community driven · built in the open</span>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="website" href="https://openvibe.network/updates?site=website" hidden></a>
++ <span class="ovf-legal-inline">
++ <a href="https://openvibe.network/updates?site=website">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </span>
++ </div>
++ </div></footer>
++<script src="/shared/ov-mark.js?v=96079ebf2943" async></script>
++<script src="/shared/navbar.js?v=b50d9f47fc34"></script>
++<script src="/shared/footer.js?v=b99e512398d5"></script>
++<script>
++(function () {
++ if (window.OpenVibeNavbar) { try { OpenVibeNavbar.init({ service: 'website', apiBase: 'https://openvibe.network', links: [{ label: 'What it will be', href: '#what' }, { label: 'The network', href: 'https://openvibe.network/#network', external: false }], history: { type: 'page', title: 'OpenVibe.Website' } }); } catch (e) {} }
++ if (window.OpenVibeFooter) { try { OpenVibeFooter.init({ service: 'website', variant: 'full', links: [{ heading: 'OpenVibe.Website', items: [{ name: 'Sign in', url: 'https://openvibe.network/login?return=https%3A%2F%2Fopenvibe.website%2F' }, { name: 'The network', url: 'https://openvibe.network/#network' }, { name: 'Discord', url: 'https://discord.gg/M6MuRUaeJj' }] }] }); } catch (e) {} }
++})();
++</script>
++</body>
++</html>
ddiff --git a/dist/openvibe.website/manifest.webmanifest b/dist/openvibe.website/manifest.webmanifest
nnew file mode 100644
iindex 0000000..f454da7
---- /dev/null
++++ b/dist/openvibe.website/manifest.webmanifest
@@@ -0,0 +1,48 @@
++{
++ "name": "OpenVibe.Website",
++ "short_name": "Website",
++ "description": "Websites that work, not just pages.",
++ "start_url": "/",
++ "scope": "/",
++ "display": "standalone",
++ "background_color": "#0a0f1c",
++ "theme_color": "#3b82f6",
++ "icons": [
++ {
++ "src": "https://openvibe.network/assets/logo-72.png",
++ "sizes": "72x72",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-192.png",
++ "sizes": "192x192",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-512.png",
++ "sizes": "512x512",
++ "type": "image/png",
++ "purpose": "any"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-maskable-192.png",
++ "sizes": "192x192",
++ "type": "image/png",
++ "purpose": "maskable"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo-maskable-512.png",
++ "sizes": "512x512",
++ "type": "image/png",
++ "purpose": "maskable"
++ },
++ {
++ "src": "https://openvibe.network/assets/logo.svg",
++ "sizes": "any",
++ "type": "image/svg+xml",
++ "purpose": "any"
++ }
++ ]
++}
ddiff --git a/dist/openvibe.website/privacy.html b/dist/openvibe.website/privacy.html
nnew file mode 100644
iindex 0000000..57e6b88
---- /dev/null
++++ b/dist/openvibe.website/privacy.html
@@@ -0,0 +1,115 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>Privacy Policy — OpenVibe.Website</title>
++<meta name="description" content="What OpenVibe.Website collects, why, and the choices you have.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://openvibe.website/privacy">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="OpenVibe.Website">
++<meta property="og:title" content="Privacy Policy — OpenVibe.Website">
++<meta property="og:description" content="What OpenVibe.Website collects, why, and the choices you have.">
++<meta property="og:url" content="https://openvibe.website/privacy">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="Privacy Policy — OpenVibe.Website">
++<meta name="twitter:description" content="What OpenVibe.Website collects, why, and the choices you have.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="website" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">OpenVibe.Website</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">OpenVibe.Website</p><h1>Privacy Policy</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">The short version</a></li><li><a href="#s2">What we collect</a></li><li><a href="#s3">Why we use it</a></li><li><a href="#s4">Cookies and storage in your browser</a></li><li><a href="#s5">Across OpenVibe sites</a></li><li><a href="#s6">Who we share with</a></li><li><a href="#s7">How long we keep things</a></li><li><a href="#s8">Where your data is</a></li><li><a href="#s9">Security</a></li><li><a href="#s10">Your choices and rights</a></li><li><a href="#s11">Children</a></li><li><a href="#s12">Changes and contact</a></li></ol></nav>
++<section><h2 id="s1">The short version</h2><p>OpenVibe.Website collects what it needs to work and to keep abuse out, and no more. We do not sell or rent personal information, we do not share it for advertising, and we do not run advertising trackers. Most of OpenVibe.Website works without an account.</p></section>
++<section><h2 id="s2">What we collect</h2><ul><li><b>Request logs.</b> Like every web server, ours record your IP address, browser type, the address requested and the time. We use them for security, rate limiting, debugging and aggregate traffic statistics.</li><li><b>Usage statistics.</b> First-party page views with a random session identifier, kept on our own servers, so we can see which parts of the network are used.</li><li><b>An anonymous page count.</b> The shared navigation bar reports one count per page load containing only the site's hostname and the day. No user, IP address or page is stored with it. It decides the order of sites in our menus. It is skipped when your browser sends Global Privacy Control or Do Not Track.</li></ul></section>
++<section><h2 id="s3">Why we use it</h2><ul><li>To provide the service you asked for and keep you signed in (performance of our agreement with you).</li><li>To keep the service secure, prevent abuse and understand usage in aggregate (our legitimate interests).</li><li>To send account email such as verification and password resets, and notifications you switched on (agreement and consent).</li><li>To comply with the law.</li></ul></section>
++<section><h2 id="s4">Cookies and storage in your browser</h2><p>We use a small number of first-party cookies: a sign-in token (<code>ov_token</code>), a refresh token limited to the sign-in paths, a short-lived state cookie during sign-in, and a hint (<code>ov_sso_hint</code>) that remembers whether you were signed in. openvibe.network also keeps a sign-in cookie that lets other OpenVibe sites check, in a hidden frame or through your browser's built-in federated sign-in, whether to sign you in quietly. It is never used for anything except that check.</p><p>Your theme, display settings (text size, reduced motion), recent pages, a cached copy of the navigation and similar conveniences are kept in your browser's local storage. There are no third-party advertising or social cookies. Our sites sit behind Cloudflare, which may set its own security cookies and measure performance.</p></section>
++<section><h2 id="s5">Across OpenVibe sites</h2><p>OpenVibe sites share one account. When you are signed in, the site you visit learns who you are from openvibe.network. While cross-site history is switched on, the pages and tools you open while signed in are listed for you, and only you, at <a href="https://openvibe.network/history">openvibe.network/history</a>, where you can clear the list or pause it.</p></section>
++<section><h2 id="s6">Who we share with</h2><p>Only the services needed to run the network: hosting (OVH, servers in the United States), network security and delivery (Cloudflare), object storage for media (Backblaze B2 or Cloudflare R2), and email delivery for account messages. They process data on our instructions. We disclose information when the law requires it, and we tell the person affected when we are allowed to. If OpenVibe is ever reorganised or handed to new maintainers, the data moves under the same promises.</p></section>
++<section><h2 id="s7">How long we keep things</h2><ul><li>Request logs and raw usage events: a limited rolling period, then totals only.</li><li>The anonymous page count: totals per site and day, nothing personal to delete.</li></ul></section>
++<section><h2 id="s8">Where your data is</h2><p>Our servers are in the United States. If you use OpenVibe from elsewhere, your information is transferred to and processed in the United States, which may have different data protection rules from your country.</p></section>
++<section><h2 id="s9">Security</h2><p>Traffic is encrypted in transit. Passwords are stored as salted hashes, sign-in tokens are signed and short-lived, and internal service routes are not reachable from the internet. No system is perfectly secure; if a breach affects your personal information we will tell you and the relevant authorities as the law requires.</p></section>
++<section><h2 id="s10">Your choices and rights</h2><p>You can use most of OpenVibe.Website without an account, block cookies, and switch on Global Privacy Control to skip the anonymous page count. With an account you can view, correct, export and delete your data from your account settings, or ask us to do it.</p><p>Depending on where you live, including the EEA, the UK and US states such as California, you may have rights to access, correct, delete, restrict or object to the use of your data, to data portability, and to complain to your data protection authority. We do not sell or share personal information as those laws define it, and we do not make automated decisions with legal effect. Write to <a href="mailto:[email protected]">[email protected]</a>; we answer within 30 days and will not treat you differently for asking.</p></section>
++<section><h2 id="s11">Children</h2><p>OpenVibe.Website is not for children under 13, and we do not knowingly collect their information. If you believe a child has given us personal information, contact us and we will delete it.</p></section>
++<section><h2 id="s12">Changes and contact</h2><p>We will post changes here and update the date above; significant changes are announced on the site. Questions and requests: <a href="mailto:[email protected]">[email protected]</a>.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/terms">Terms of Service</a><a href="/dmca">DMCA &amp; Copyright</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/openvibe.website/release.json b/dist/openvibe.website/release.json
nnew file mode 100644
iindex 0000000..86d08fc
---- /dev/null
++++ b/dist/openvibe.website/release.json
@@@ -0,0 +1,13 @@
++{
++ "service": "website",
++ "release": "b204b4e3483b",
++ "released_at": "2026-09-28T00:00:00.000Z",
++ "booted_at": null,
++ "contracts_version": null,
++ "packages": {
++ "openvibe-shared": "1.23.0"
++ },
++ "min_client_release": null,
++ "mixed_version_window_hours": 24,
++ "kind": "placeholder"
++}
ddiff --git a/dist/openvibe.website/robots.txt b/dist/openvibe.website/robots.txt
nnew file mode 100644
iindex 0000000..34c3b9c
---- /dev/null
++++ b/dist/openvibe.website/robots.txt
@@@ -0,0 +1,4 @@
++User-agent: *
++Allow: /
++Disallow: /auth/
++Sitemap: https://openvibe.website/sitemap.xml
ddiff --git a/dist/openvibe.website/sitemap.xml b/dist/openvibe.website/sitemap.xml
nnew file mode 100644
iindex 0000000..d19c6b2
---- /dev/null
++++ b/dist/openvibe.website/sitemap.xml
@@@ -0,0 +1,4 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
++ <url><loc>https://openvibe.website/</loc><lastmod>2026-09-28</lastmod><changefreq>weekly</changefreq><priority>1.0</priority></url>
++</urlset>
ddiff --git a/dist/openvibe.website/status.json b/dist/openvibe.website/status.json
nnew file mode 100644
iindex 0000000..ecf0c7a
---- /dev/null
++++ b/dist/openvibe.website/status.json
@@@ -0,0 +1,16 @@
++{
++ "domain": "openvibe.website",
++ "name": "OpenVibe.Website",
++ "stage": "placeholder",
++ "live": false,
++ "plannedRepo": null,
++ "repoUrl": null,
++ "repoExists": false,
++ "repoStage": "charter-only",
++ "service": null,
++ "launchWaitsFor": "tenant hosting on OpenVibe.Host (built, not launched) and the editor",
++ "factsAsOf": "2026-09-24",
++ "network": "https://openvibe.network",
++ "updated": "2026-09-28",
++ "note": "Static page served by OpenVibers/OpenVibe.Sites; service facts come from each repository's STATUS.json and the Network registry (facts.json). Removed from sites.json in the same release that the real service takes over this domain."
++}
ddiff --git a/dist/openvibe.website/terms.html b/dist/openvibe.website/terms.html
nnew file mode 100644
iindex 0000000..73b4f0a
---- /dev/null
++++ b/dist/openvibe.website/terms.html
@@@ -0,0 +1,114 @@
++<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
++<title>Terms of Service — OpenVibe.Website</title>
++<meta name="description" content="The rules for using OpenVibe.Website, in plain language.">
++<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
++<link rel="canonical" href="https://openvibe.website/terms">
++<meta property="og:type" content="article">
++<meta property="og:site_name" content="OpenVibe.Website">
++<meta property="og:title" content="Terms of Service — OpenVibe.Website">
++<meta property="og:description" content="The rules for using OpenVibe.Website, in plain language.">
++<meta property="og:url" content="https://openvibe.website/terms">
++<meta property="og:locale" content="en_US">
++<meta name="twitter:card" content="summary">
++<meta name="twitter:title" content="Terms of Service — OpenVibe.Website">
++<meta name="twitter:description" content="The rules for using OpenVibe.Website, in plain language.">
++<link rel="icon" type="image/svg+xml" data-ov-icon="website" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%22-32%20-32%2064%2064%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22ring%22%20x1%3D%220%22%20y1%3D%220%22%20x2%3D%221%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%232563eb%22%2F%3E%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22glow%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%22.34%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2360a5fa%22%20stop-opacity%3D%220%22%2F%3E%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22bg%22%20cx%3D%22.5%22%20cy%3D%22.38%22%20r%3D%22.8%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2316223a%22%2F%3E%3Cstop%20offset%3D%22.6%22%20stop-color%3D%22%230a0f1c%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23060912%22%2F%3E%3C%2FradialGradient%3E%3C%2Fdefs%3E%3Crect%20x%3D%22-32%22%20y%3D%22-32%22%20width%3D%2264%22%20height%3D%2264%22%20rx%3D%2215%22%20fill%3D%22url(%23bg)%22%2F%3E%3Cg%20transform%3D%22scale(1.22)%22%3E%0A%3Ccircle%20r%3D%2221%22%20fill%3D%22url(%23glow)%22%2F%3E%0A%3Ccircle%20r%3D%2218%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224%22%20opacity%3D%22.38%22%2F%3E%0A%3Cpath%20d%3D%22M0%2C-18%20A18%2C18%200%200%2C1%2017.4%2C4.6%22%20fill%3D%22none%22%20stroke%3D%22url(%23ring)%22%20stroke-width%3D%224.4%22%20stroke-linecap%3D%22round%22%2F%3E%0A%3Cpath%20d%3D%22M-9.5%2C-7%20L0%2C10%20L9.5%2C-7%22%20fill%3D%22none%22%20stroke%3D%22%23fff%22%20stroke-width%3D%224.8%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%0A%3Ccircle%20cx%3D%2217.4%22%20cy%3D%224.6%22%20r%3D%223.2%22%20fill%3D%22%23ffffff%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E">
++<meta name="theme-color" content="#0d131d">
++<meta name="color-scheme" content="dark">
++<style id="ov-critical">html{background:#0a0f1c;color:#e6edf7;color-scheme:dark}</style><script>(function(){try{var r=localStorage.getItem('ov_theme');if(!r)return;var t=JSON.parse(r),v=t&&t.variables;if(!v)return;var e=document.documentElement;for(var k in v)if(k.charAt(0)==='-')e.style.setProperty(k,v[k]);if(v['--bg-primary'])e.style.background=v['--bg-primary'];if(v['--text-primary'])e.style.color=v['--text-primary'];if(v['--color-scheme']==='light'||v['--color-scheme']==='dark')e.style.colorScheme=v['--color-scheme'];if(t.id)e.setAttribute('data-theme',t.id)}catch(_){}})();</script>
++<script src="https://openvibe.network/shared/theme-loader.js" defer></script><style>*{box-sizing:border-box}body{margin:0;background:var(--bg-primary,#0a0f18);color:var(--text-primary,#e6edf7);font:400 16px/1.65 Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
++.ov-legal{max-width:760px;margin:0 auto;padding:40px 20px 24px}.ov-legal-kicker{margin:0;font-size:13px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--accent-light,var(--accent,#60a5fa))}
++.ov-legal h1{font-size:clamp(28px,4.5vw,40px);letter-spacing:-.03em;line-height:1.1;margin:6px 0 4px}.ov-legal-date{color:var(--text-muted,#7d8aa0);font-size:14px;margin:0 0 28px}
++.ov-legal-toc{margin:0 0 8px;padding:14px 18px;border:1px solid var(--border,rgba(255,255,255,.1));border-radius:12px;background:var(--bg-secondary,#111826)}.ov-legal-toc ol{margin:0;padding-left:20px;columns:2 220px;column-gap:28px}.ov-legal-toc li{margin:3px 0;font-size:14px;break-inside:avoid}.ov-legal-toc a{text-decoration:none}.ov-legal section{scroll-margin-top:80px}
++.ov-legal h2{font-size:19px;margin:30px 0 8px;letter-spacing:-.01em}.ov-legal p,.ov-legal li{color:var(--text-secondary,#a8b3c4)}.ov-legal li{margin:6px 0}.ov-legal b{color:var(--text-primary,#e6edf7)}
++.ov-legal a{color:var(--accent-light,var(--accent,#60a5fa))}.ov-legal code{font-size:13.5px;background:var(--bg-secondary,#111826);padding:1px 6px;border-radius:5px}
++.ov-legal-more{display:flex;flex-wrap:wrap;gap:10px;margin-top:40px;padding-top:20px;border-top:1px solid var(--border,rgba(255,255,255,.1))}.ov-legal-more a{padding:8px 14px;border:1px solid var(--border,rgba(255,255,255,.12));border-radius:10px;text-decoration:none;font-weight:600;font-size:14px}</style></head><body>
++<noscript><nav aria-label="Site" style="display:flex;flex-wrap:wrap;align-items:center;gap:6px 16px;padding:12px 20px;border-bottom:1px solid rgba(255,255,255,.1);font:500 14px/1.4 system-ui,sans-serif"><a href="/" style="font-weight:700;color:inherit;text-decoration:none">OpenVibe.Website</a><span style="flex:1"></span><a href="https://openvibe.live/">Live</a><a href="https://openvibe.tools/">Tools</a><a href="https://openvibe.community/">Community</a><a href="https://openvibe.games/">Games</a><a href="https://openvibe.media/">Media</a><a href="https://openvibe.network/">Network</a></nav></noscript>
++<main><article class="ov-legal"><p class="ov-legal-kicker">OpenVibe.Website</p><h1>Terms of Service</h1><p class="ov-legal-date">Last updated <time datetime="2026-09-18">September 18, 2026</time></p>
++<nav class="ov-legal-toc" aria-label="On this page"><ol><li><a href="#s1">The short version</a></li><li><a href="#s2">Who can use it</a></li><li><a href="#s3">This site is not open yet</a></li><li><a href="#s4">Rules for everyone</a></li><li><a href="#s5">Automated and AI-written text</a></li><li><a href="#s6">Reporting and moderation</a></li><li><a href="#s7">Leaving</a></li><li><a href="#s8">Open source, links and feedback</a></li><li><a href="#s9">No warranty, limited liability</a></li><li><a href="#s10">Governing law</a></li><li><a href="#s11">Changes and contact</a></li></ol></nav>
++<section><h2 id="s1">The short version</h2><p>OpenVibe.Website is part of OpenVibe, an open source, community-run network. Use it for lawful things, be decent to other people, and do not try to break it. Most of it works without an account. We can remove content or accounts that break these terms. The service is provided as it is, without warranties.</p><p>These terms cover openvibe.website, its subdomains, and any other domain that serves the same service. Other OpenVibe sites have their own terms, written for what those sites do.</p></section>
++<section><h2 id="s2">Who can use it</h2><p>You must be at least 13 years old, or the minimum age of digital consent where you live. If you are under 18, a parent or guardian must agree to these terms for you. You may not use OpenVibe.Website if you were banned from the network, or if the law where you live forbids it.</p></section>
++<section><h2 id="s3">This site is not open yet</h2><p>OpenVibe.Website is a reserved address that currently shows a preview page. There is nothing to sign up for or post here yet. When it opens, these terms will be replaced with ones written for what it does, and the date above will change.</p></section>
++<section><h2 id="s4">Rules for everyone</h2><p>OpenVibe leans toward open expression. These limits apply on every site:</p><ul><li>Nothing illegal where you are or in the United States, where our servers are.</li><li>No sexual content involving minors and no sexualisation of minors, ever. We report it to the authorities.</li><li>No credible threats, incitement to violence, or publishing private information to harm someone.</li><li>No content you do not have the rights to.</li><li>No malware, phishing, spam, fraud, or impersonation of a person or organisation to deceive.</li><li>No attempts to disrupt the service, get around bans, rate limits or access controls, or reach other people's accounts or data.</li><li>No scraping that ignores robots.txt or our rate limits. Respectful crawlers, archives and AI agents are welcome; a machine-readable map is at /llms.txt where available.</li></ul></section>
++<section><h2 id="s5">Automated and AI-written text</h2><p>Some descriptive text on OpenVibe, such as footer blurbs, summaries and suggestions, is written by automated systems and checked by rules rather than by a person. It can be wrong. Do not rely on it for decisions that matter.</p></section>
++<section><h2 id="s6">Reporting and moderation</h2><p>Report content with the report controls where they exist, or write to <a href="mailto:[email protected]">[email protected]</a>. Copyright complaints follow the <a href="/dmca">DMCA process</a>. We may remove content, limit features, or suspend accounts that break these terms or put other people or the service at risk, and we may act without notice when the harm is urgent. If you think we got it wrong, reply to the notice or write to the same address and a person will look again.</p></section>
++<section><h2 id="s7">Leaving</h2><p>You can stop using OpenVibe.Website at any time. Sections that by their nature should survive (licences for content already shared, liability, governing law) continue after you leave.</p></section>
++<section><h2 id="s8">Open source, links and feedback</h2><p>OpenVibe's code is public. Each repository's licence governs your use of the code; these terms govern your use of the hosted service at openvibe.website. Links to other sites are provided for convenience and we are not responsible for them. If you send us ideas or fixes, we may use them without owing you anything, and contributions to the code are made under the repository's licence.</p></section>
++<section><h2 id="s9">No warranty, limited liability</h2><p>The service is provided "as is" and "as available", without warranties of any kind, including fitness for a particular purpose, accuracy of results, or uninterrupted availability. To the extent the law allows, OpenVibe and the people who run it are not liable for indirect, incidental or consequential losses, lost data or lost profits arising from your use of OpenVibe.Website, and our total liability is limited to the greater of what you paid us in the past twelve months or fifty US dollars. Nothing here limits liability that cannot be limited by law, and consumer rights you have under the law of your country remain.</p><p>If your use of OpenVibe.Website breaks these terms or the law and someone brings a claim against us because of it, you agree to cover our reasonable costs.</p></section>
++<section><h2 id="s10">Governing law</h2><p>These terms are governed by the laws of the United States and the State of Washington, without regard to conflicts of law. Disputes are handled in the federal or state courts located in Washington State, unless the consumer law of your country gives you the right to use your local courts. If part of these terms cannot be enforced, the rest still applies. Not enforcing a term once does not waive it. These terms are the whole agreement between us about OpenVibe.Website.</p></section>
++<section><h2 id="s11">Changes and contact</h2><p>We may update these terms. Material changes are announced on the site before they take effect, and the date at the top changes. Continuing to use OpenVibe.Website after a change means you accept it. Questions: <a href="mailto:[email protected]">[email protected]</a>.</p></section>
++<nav class="ov-legal-more" aria-label="Other policies"><a href="/privacy">Privacy Policy</a><a href="/dmca">DMCA &amp; Copyright</a><a href="https://openvibe.network/">About OpenVibe</a></nav></article></main><style id="ovf-css">
++.ovf{background:var(--bg-secondary,#12131c);border-top:1px solid var(--border,rgba(255,255,255,.08));margin-top:40px;
++ padding:clamp(24px,4vw,40px) clamp(14px,4vw,32px) calc(clamp(20px,3vw,28px) + env(safe-area-inset-bottom,0px));}
++.ovf[data-variant="compact"]{margin-top:24px;padding:14px clamp(12px,3vw,24px) calc(14px + env(safe-area-inset-bottom,0px));}
++.ovf-inner{max-width:1240px;margin:0 auto}
++.ovf-inner--compact{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px 18px;text-align:center}
++.ovf-cols{display:grid;gap:clamp(20px,3vw,36px);grid-template-columns:minmax(230px,1.6fr) repeat(auto-fit,minmax(120px,1fr));align-items:start}
++.ovf-col{display:flex;flex-direction:column;gap:8px;min-width:0}
++.ovf-col h3{margin:0 0 2px;font-size:.72rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted,#8b93ad)}
++.ovf-col a{color:var(--text-secondary,#b6bdd2);font-size:.86rem;text-decoration:none;line-height:1.4;width:fit-content;transition:color .15s,transform .15s}
++.ovf-col a:hover{color:var(--accent,#60a5fa);transform:translateX(2px)}
++.ovf-more{font-weight:600;opacity:.85}.ovf-ic{flex:none;vertical-align:-.14em}.ovf-more .ovf-ic{font-size:.85em;margin-left:3px;transition:transform .15s}.ovf-more:hover .ovf-ic{transform:translateX(3px)}.ovf-social .ovf-ic{font-size:17px}.ovf-account-links .ovf-ic{font-size:1.05em;opacity:.85}
++.ovf-brand{display:inline-flex;align-items:center;gap:9px;color:var(--text-primary,#f1f4fb);font-size:1.05rem;font-weight:700;text-decoration:none}
++.ovf-brand--sm{font-size:.9rem}
++.ovf-tagline{margin:0;font-size:.82rem;line-height:1.55;color:var(--text-muted,#8b93ad);max-width:46ch}
++.ovf-social{display:flex;gap:8px;margin-top:4px}
++.ovf-social a{width:36px;height:36px;border-radius:10px;display:grid;place-items:center;color:var(--text-secondary,#b6bdd2);
++ background:var(--bg-tertiary,#1a1b28);border:1px solid var(--border,rgba(255,255,255,.08));font-size:.95rem;transition:color .15s,border-color .15s,transform .15s}
++.ovf-social a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-2px)}
++.ovf-account{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 18px;
++ margin-top:clamp(18px,2.5vw,26px);padding:10px 14px;border-radius:14px;
++ background:color-mix(in srgb, var(--accent,#60a5fa) 8%, var(--bg-tertiary,#1a1b28));
++ border:1px solid color-mix(in srgb, var(--accent,#60a5fa) 26%, var(--border,rgba(255,255,255,.08)));
++ animation:ovfIn .4s ease-out both}
++@keyframes ovfIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
++.ovf-account-who{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--text-secondary,#b6bdd2)}
++.ovf-account-who strong{color:var(--text-primary,#f1f4fb)}
++.ovf-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;display:grid;place-items:center;
++ background:var(--accent,#60a5fa);color:#fff;font-size:.7rem;font-weight:800;flex:none}
++.ovf-avatar img{width:100%;height:100%;object-fit:cover}
++.ovf-account-links{display:flex;flex-wrap:wrap;gap:6px}
++.ovf-account-links a{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border-radius:999px;font-size:.78rem;font-weight:600;
++ color:var(--text-secondary,#b6bdd2);background:var(--bg-secondary,#12131c);border:1px solid var(--border,rgba(255,255,255,.08));
++ text-decoration:none;transition:color .15s,border-color .15s,transform .15s}
++.ovf-account-links a:hover{color:var(--accent,#60a5fa);border-color:var(--accent,#60a5fa);transform:translateY(-1px)}
++.ovf-account-links i{font-size:.72rem;opacity:.8}
++.ovf-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;
++ margin-top:clamp(20px,3vw,30px);padding-top:16px;border-top:1px solid var(--border,rgba(255,255,255,.08));
++ padding-inline:clamp(0px, calc(84px - (100vw - 1240px) / 2), 84px)}
++.ovf-copy{color:var(--text-muted,#8b93ad);font-size:.78rem}
++.ovf-legal-inline,.ovf-compact-links{display:flex;flex-wrap:wrap;gap:14px}
++.ovf [hidden],.ovf-account[hidden]{display:none!important}
++.ovf .ovf-shipped.ov-shipped-latest{font-size:.76rem;padding:4px 12px;max-width:min(520px,100%);background:transparent}
++.ovf-legal-inline a,.ovf-compact-links a{color:var(--text-muted,#8b93ad);font-size:.78rem;text-decoration:none;transition:color .15s}
++.ovf-legal-inline a:hover,.ovf-compact-links a:hover{color:var(--accent,#60a5fa)}
++.ovf-compact-meta{color:var(--text-muted,#8b93ad);font-size:.74rem}
++@media (max-width:900px){.ovf-cols{grid-template-columns:repeat(2,minmax(0,1fr))}.ovf-col--brand{grid-column:1/-1}}
++@media (max-width:560px){
++ .ovf{padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
++ .ovf[data-variant="compact"]{padding-bottom:calc(84px + env(safe-area-inset-bottom,0px))}
++ .ovf-cols{gap:22px 16px}
++ .ovf-bar{justify-content:center;text-align:center;padding-inline:0}
++ .ovf-legal-inline{justify-content:center}
++ .ovf-account{flex-direction:column;align-items:flex-start}
++}
++@media (prefers-reduced-motion:reduce){.ovf-account{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++.ovf{-webkit-tap-highlight-color:transparent}
++:where(.ovf) :where(a,button):active{scale:.97}
++:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
++@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}</style><footer id="ov-footer" class="ovf" data-variant="compact"><div class="ovf-inner ovf-inner--compact">
++ <a class="ovf-brand ovf-brand--sm" href="/"><span class="ov-mark" data-size="20"></span><span>OpenVibe.Network</span></a>
++ <nav class="ovf-compact-links" aria-label="Site links">
++
++ <a href="https://openvibe.network" target="_blank" rel="noopener">Network</a>
++ <a href="https://openvibe.network/updates?site=network">Updates</a>
++ <a href="https://openvibe.live/tos">Terms</a><a href="https://openvibe.live/privacy">Privacy</a><a href="https://openvibe.live/dmca">DMCA</a>
++ </nav>
++ <a class="ovf-shipped" data-ov-shipped="latest" data-service="network" href="https://openvibe.network/updates?site=network" hidden></a>
++ <span class="ovf-compact-meta">Open source · 2026</span>
++ </div></footer>
++<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script>
++<script>addEventListener('DOMContentLoaded',function(){var t=null;try{t=(document.cookie.match(/(?:^|; )ov_token=([^;]*)/)||[])[1]||localStorage.getItem('ov_token')}catch(e){}
++try{OpenVibeNavbar.init({service:"network",apiBase:'https://openvibe.network',token:t?decodeURIComponent(t):null})}catch(e){}
++try{OpenVibeFooter.init({service:"network",variant:'compact',mount:'#ov-footer',apiBase:'https://openvibe.network'})}catch(e){}});</script>
++</body></html>
\\ No newline at end of file
ddiff --git a/dist/realtime.openvibe.network/index.html b/dist/realtime.openvibe.network/index.html
iindex 1b60551..1dff042 100644
---- a/dist/realtime.openvibe.network/index.html
++++ b/dist/realtime.openvibe.network/index.html
@@@ -146,7 +146,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -157,6 +157,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/realtime.openvibe.network/release.json b/dist/realtime.openvibe.network/release.json
iindex 69cccd4..9d7fe8f 100644
---- a/dist/realtime.openvibe.network/release.json
++++ b/dist/realtime.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "realtime",
-- "release": "41d3ce573570",
++ "release": "9971cd9df338",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/status.openvibe.network/index.html b/dist/status.openvibe.network/index.html
iindex 7acff62..bdaf60b 100644
---- a/dist/status.openvibe.network/index.html
++++ b/dist/status.openvibe.network/index.html
@@@ -186,7 +186,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
<a href="https://themes.openvibe.network/"><i class="fa-solid fa-palette" aria-hidden="true"></i>themes.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -197,6 +197,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/status.openvibe.network/release.json b/dist/status.openvibe.network/release.json
iindex 1841f08..ce71f09 100644
---- a/dist/status.openvibe.network/release.json
++++ b/dist/status.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "status",
-- "release": "0ed67667e4fd",
++ "release": "6bba34057a40",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/themes.openvibe.network/index.html b/dist/themes.openvibe.network/index.html
iindex c2e64f2..0c3aa79 100644
---- a/dist/themes.openvibe.network/index.html
++++ b/dist/themes.openvibe.network/index.html
@@@ -155,7 +155,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://auth.openvibe.network/"><i class="fa-solid fa-key" aria-hidden="true"></i>auth.openvibe.network</a>
<a href="https://api.openvibe.network/"><i class="fa-solid fa-plug" aria-hidden="true"></i>api.openvibe.network</a>
<a href="https://admin.openvibe.network/"><i class="fa-solid fa-shield-halved" aria-hidden="true"></i>admin.openvibe.network</a>
-- <a href="https://ai.openvibe.network/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.network</a>
++ <a href="https://ai.openvibe.services/"><i class="fa-solid fa-robot" aria-hidden="true"></i>ai.openvibe.services</a>
<a href="https://openvibe.pics/"><i class="fa-solid fa-images" aria-hidden="true"></i>OpenVibe.Pics</a>
<a href="https://openvibe.download/"><i class="fa-solid fa-cloud-arrow-down" aria-hidden="true"></i>OpenVibe.Download</a>
<a href="https://openvibe.space/"><i class="fa-solid fa-layer-group" aria-hidden="true"></i>OpenVibe.Space</a>
@@@ -166,6 +166,9 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<a href="https://openvibe.services/"><i class="fa-solid fa-server" aria-hidden="true"></i>OpenVibe.Services</a>
<a href="https://openvibe.run/"><i class="fa-solid fa-terminal" aria-hidden="true"></i>OpenVibe.Run</a>
<a href="https://openvibe.video/"><i class="fa-solid fa-film" aria-hidden="true"></i>OpenVibe.Video</a>
++ <a href="https://openvibe.website/"><i class="fa-solid fa-globe" aria-hidden="true"></i>OpenVibe.Website</a>
++ <a href="https://openvibe.help/"><i class="fa-solid fa-life-ring" aria-hidden="true"></i>OpenVibe.Help</a>
++ <a href="https://openvibe.bot/"><i class="fa-solid fa-robot" aria-hidden="true"></i>OpenVibe.Bot</a>
</div>
</section>
ddiff --git a/dist/themes.openvibe.network/release.json b/dist/themes.openvibe.network/release.json
iindex 5e5b99d..389f4f8 100644
---- a/dist/themes.openvibe.network/release.json
++++ b/dist/themes.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "themes",
-- "release": "add8d8470c90",
++ "release": "13bb94dcbf34",
"released_at": "2026-09-28T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/sites.json b/sites.json
iindex 9982d13..f040baa 100644
---- a/sites.json
++++ b/sites.json
@@@ -665,26 +665,57 @@
"icon": "fa-robot",
"accent": "#c084fc",
"plannedRepo": "OpenVibe.AI",
-- "launch": "a public API with its own access rules; today only other OpenVibe services call it",
"legalProfile": "info",
-- "tagline": "AI as a service, for every OpenVibe product.",
-- "description": "OpenVibe.AI is the shared AI layer of the OpenVibe network: providers and models, routing, prompt templates, workflows, runs and quotas, so each product stops wiring its own. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; ai.openvibe.network has no public page or API yet.",
++ "tagline": "Moved: OpenVibe.AI's public home is ai.openvibe.services.",
++ "description": "OpenVibe.AI's public address is now ai.openvibe.services, next to the rest of the network's programmable services on OpenVibe.Services. This address serves only this notice until every client has moved; then it redirects.",
++ "keywords": "openvibe ai, openvibe network ai, openvibe platform",
++ "kind": "moved",
++ "linksLead": "OpenVibe.AI lives on OpenVibe.Services now.",
++ "links": [
++ [
++ "ai.openvibe.services",
++ "https://ai.openvibe.services/",
++ "OpenVibe.AI: the gateway, templates, workflows and runs."
++ ],
++ [
++ "OpenVibe.Services",
++ "https://openvibe.services/",
++ "Every programmable OpenVibe service in one place."
++ ]
++ ]
++ },
++ {
++ "domain": "ai.openvibe.services",
++ "zone": "openvibe.services",
++ "hostParts": [
++ "ai",
++ "openvibe.services"
++ ],
++ "tld": "ai",
++ "name": "ai.openvibe.services",
++ "icon": "fa-robot",
++ "accent": "#c084fc",
++ "plannedRepo": "OpenVibe.AI",
++ "launch": "a public API with its own keys, quotas and playground; today only other OpenVibe services call it",
++ "legalProfile": "info",
++ "tagline": "One AI gateway for every model you choose.",
++ "description": "OpenVibe.AI is the network's AI gateway: OpenAI-compatible providers, Anthropic, local and open models behind one API, with routing for cost, speed, quality or privacy, provider fallback, versioned prompt templates and typed workflows, durable runs, structured output, embeddings, speech to text and media analysis, budgets and your own provider keys. It runs today as an internal service that OpenVibe.Live and OpenVibe.Network call; its public API and playground open here.",
"pillars": [
[
-- "Providers & routing",
-- "Primary and fallback models per workflow, local or hosted."
++ "Any provider",
++ "OpenAI-compatible, Anthropic, local llama.cpp and open models, one API."
],
[
-- "Workflows",
-- "Versioned, schema-checked jobs with citations."
++ "Routing & fallback",
++ "Cheap, fast, best or private: routes choose, and fall back when a provider fails."
],
[
-- "Quotas & cost",
-- "Budgets per service, app and user."
++ "Templates & workflows",
++ "Versioned prompts and typed workflows with durable, resumable runs."
],
[
-- "Provenance",
-- "Every output remembers its sources and model."
++ "Your keys, your budget",
++ "Bring your own provider keys; quotas and budgets per project."
]
],
"meanwhile": [
@@@ -694,7 +725,7 @@
"Live's AI moments, recaps, summaries and translations run through OpenVibe.AI; captions still run inside Live."
]
],
-- "keywords": "openvibe ai, openvibe network ai, openvibe platform"
++ "keywords": "ai gateway, open source ai api, llm router, model routing, prompt templates, ai workflows, speech to text api, openvibe ai"
},
{
"domain": "status.openvibe.network",
@@@ -1014,24 +1045,24 @@
"icon": "fa-server",
"accent": "#38bdf8",
"noRepo": true,
-- "tagline": "One console for the whole network.",
-- "description": "OpenVibe.Services will be the console for developers and operators across the OpenVibe network: projects, keys and permissions, storage, events, functions and AI routes, usage and bills, logs and deploys, all in one place and all through the same open API and SDK.",
++ "tagline": "Build with the whole network.",
++ "description": "OpenVibe.Services will be the way into everything programmable on OpenVibe. Start from what you want to build (monitor a page and summarise changes, run an AI agent, process uploads, control a robot, add support to a site) and it assembles the services, keys, permissions and working code for you. Then operate it all in one place: projects, grants, usage, quotas, runs, events, deploys and health, with each service keeping its own data.",
"pillars": [
[
-- "Projects & keys",
-- "Members, keys and scoped permissions for everything you build."
++ "Discover",
++ "A catalog of services, recipes and templates, by what they do."
],
[
-- "Every service",
-- "Storage, events, functions, AI, search and more, from one place."
++ "Build",
++ "Projects, apps, keys, capabilities, playgrounds and starter code."
],
[
-- "Usage & bills",
-- "What you use, what it costs, with budgets and alerts."
++ "Operate",
++ "Every resource across the network: runs, events, usage, quotas, health."
],
[
-- "Open API",
-- "Everything the console does, the API and SDK do too."
++ "Learn",
++ "Help, Wiki and Codes docs, linked from every page."
]
],
"meanwhile": [
@@@ -1041,8 +1072,8 @@
"The developer portal and docs work today."
]
],
-- "keywords": "openvibe services, developer console, cloud console, api keys, open cloud",
-- "launch": "the console bringing together Codes' portal and the network's admin surfaces"
++ "keywords": "openvibe services, developer platform, open source backend, api platform, event bus api, ai gateway, website monitoring api, developer console",
++ "launch": "the catalog and console over the services that already run (AI, Events, Media, Search, Sources, Host, Tools)"
},
{
"domain": "openvibe.run",
@@@ -1122,6 +1153,132 @@
],
"keywords": "openvibe video, video hosting, youtube alternative, multi-platform upload, ai video tools",
"launch": "the video service on OpenVibe.Media"
++ },
++ {
++ "domain": "openvibe.website",
++ "tld": "website",
++ "name": "OpenVibe.Website",
++ "icon": "fa-globe",
++ "accent": "#22d3ee",
++ "noRepo": true,
++ "tagline": "Websites that work, not just pages.",
++ "description": "OpenVibe.Website will be an AI-assisted website and small-app builder with a real file tree: generate a site from a description, import one or fork a Git repository, edit HTML, CSS, JavaScript or Markdown by hand or visually, and publish to yourname.openvibe.website or your own domain. Sites can sign people in with OpenVibe, take bookings and forms, show media, run a blog or docs, and add chat, comments, memberships or support, with good SEO built in.",
++ "pillars": [
++ [
++ "Generate or code",
++ "Describe it, import it, fork it, or write it yourself."
++ ],
++ [
++ "Real features",
++ "Sign-in, forms, bookings, media, blogs and support from the network."
++ ],
++ [
++ "Your files",
++ "Every generated site is readable, editable source."
++ ],
++ [
++ "Publish anywhere",
++ "yourname.openvibe.website or your own domain, with rollback."
++ ]
++ ],
++ "meanwhile": [
++ [
++ "OpenVibe.Codes",
++ "https://openvibe.codes",
++ "The developer portal, API and SDK docs work today."
++ ],
++ [
++ "OpenVibe.Tools",
++ "https://openvibe.tools",
++ "Dozens of tools that run in the browser today."
++ ]
++ ],
++ "keywords": "ai website builder, open source website builder, static site builder, portfolio builder, website generator, docs site generator",
++ "launch": "tenant hosting on OpenVibe.Host (built, not launched) and the editor"
++ },
++ {
++ "domain": "openvibe.help",
++ "tld": "help",
++ "name": "OpenVibe.Help",
++ "icon": "fa-life-ring",
++ "accent": "#4ade80",
++ "noRepo": true,
++ "tagline": "Answers, support and a way to reach people.",
++ "description": "OpenVibe.Help will be the help and support center for every OpenVibe site: search answers drawn from the docs, wiki, blog and service status, follow troubleshooting guides, and open a ticket that stays one conversation on the web and by email. A Report Problem button on every site will attach the safe details staff need (release, request and trace ids) and never secrets.",
++ "pillars": [
++ [
++ "Grounded answers",
++ "From the real docs, wiki and status, with sources."
++ ],
++ [
++ "One support inbox",
++ "Signed in or not, on the web or by email."
++ ],
++ [
++ "Report a problem",
++ "Useful, privacy-scrubbed details attached for you."
++ ],
++ [
++ "For your projects",
++ "A support widget and help center for sites built on OpenVibe."
++ ]
++ ],
++ "meanwhile": [
++ [
++ "Network status",
++ "https://openvibe.network/status",
++ "Service health and incidents today."
++ ],
++ [
++ "OpenVibe.Wiki",
++ "https://openvibe.wiki",
++ "Guides and concepts."
++ ]
++ ],
++ "keywords": "openvibe help, openvibe support, help center, support tickets, troubleshooting",
++ "launch": "the ticket service and the Frame's Help button"
++ },
++ {
++ "domain": "openvibe.bot",
++ "tld": "bot",
++ "name": "OpenVibe.Bot",
++ "icon": "fa-robot",
++ "accent": "#f472b6",
++ "noRepo": true,
++ "tagline": "Robots, cameras and devices you can share safely.",
++ "description": "OpenVibe.Bot will let you register robots, Raspberry Pis, cameras, motors, sensors and other devices, pair them securely, and control them yourself or hand control to friends, stream viewers, apps or your AI agents with timed turns, queues and permissions. Safety runs on the device too: heartbeats, command time limits, speed and range limits and an emergency stop that works without the cloud. OpenVibe.Live already runs stream-controlled robots; Bot makes the device its own thing.",
++ "pillars": [
++ [
++ "Pair devices",
++ "Revocable device keys and one-time pairing codes, not stream keys."
++ ],
++ [
++ "Share control",
++ "Owner, whitelist, queues, timed turns, moderators and apps."
++ ],
++ [
++ "Safe on the device",
++ "Dead-man stop, command limits and local emergency stop."
++ ],
++ [
++ "Stream it",
++ "Connect a device to a Live stream, a game or a website."
++ ]
++ ],
++ "meanwhile": [
++ [
++ "Robots on OpenVibe.Live",
++ "https://openvibe.live",
++ "Stream-controlled robots and cameras run on Live today."
++ ],
++ [
++ "OpenVibe.Extensions",
++ "https://github.com/OpenVibers/OpenVibe.Extensions",
++ "Device-side agents and hardware scripts."
++ ]
++ ],
++ "keywords": "remote control robot, stream controlled robot, raspberry pi robot control, telepresence robot, iot device control api",
++ "launch": "device pairing and control leases split out of OpenVibe.Live"
}
]
}
ddiff --git a/test/build.test.js b/test/build.test.js
iindex ddf1531..df2b752 100644
---- a/test/build.test.js
++++ b/test/build.test.js
@@@ -114,7 +114,7 @@ for (const site of catalog.sites) {
assert.notStrictEqual(status.repoStage, 'charter-only', `${d}: status.json repoStage`);
}
const runs = rg.state === 'internal' || (st.code === true && st.deployed === true);
-- if (runs && st.stage !== 'closed' && rg.state !== 'live') {
++ if (runs && st.stage !== 'closed' && rg.state !== 'live' && site.kind !== 'moved') { // a moved notice speaks for its address, not the product
assert.ok(site.launch, `${d}: the service runs, so sites.json says what its public launch waits for ("launch")`);
assert.ok(html.includes(`The public launch is waiting for ${site.launch.replace(/'/g, '&#39;')}.`), `${d}: the page says what the launch waits for`);
assert.match(html, /in development/, `${d}: labelled in development`);