openvibers/openvibe.sites Commits

openvibe.actor becomes the router for agent work, and openvibe.bot names its first robot (owner, 2026-09-29; plan T15/T16). Actor: one API for every AI agent, the right one for each task; a routing design preview (a task, the five modes, four kinds of agent system with illustrative cost, time and success, the pick and why), how a task runs, the modes (cheapest, balanced, best, fastest, private, budgets), what it routes to, live balancing with failover, checks and public rankings, templates for always-on agents, and questions (is it like OpenRouter, which systems, how it chooses, private data). Bot: the Adeept 4WD Smart Car for Raspberry Pi is the first kit, with a question saying why its own open control port never needs exposing. The vision layout gains extra card sections and the router preview (tight on phones).

OP OpenVibers committed 29 Sept 2026 · dc2f7d9e74 · 70 files, +708 −169


Changes

ddiff --git a/build.js b/build.js
iindex 8c22dc0..0066f15 100644
---- a/build.js
++++ b/build.js
@@@ -143,6 +143,16 @@ function visionViz(v) {
<figcaption>${esc(z.caption)}</figcaption>
</figure>`;
}
++ if (z.kind === 'router') {
++ return `<figure class="viz" aria-label="${esc(z.label)}">
++ <div class="viz-top"><span class="av"><i class="fa-solid fa-route" aria-hidden="true"></i></span><b>New task</b><span class="lat"><i class="fa-solid fa-wallet" aria-hidden="true"></i> ${esc(z.budget)}</span></div>
++ <p class="task">${esc(z.task)}</p>
++ <div class="modes" aria-hidden="true">${(z.modes || []).map((m) => `<span${m === z.mode ? ' class="on"' : ''}>${esc(m)}</span>`).join('')}</div>
++ <ol class="cands" aria-hidden="true">${(z.candidates || []).map((c) => `<li${c.pick ? ' class="pick"' : ''}><i class="fa-solid ${esc(c.icon)}"></i><b>${esc(c.name)}</b><span>${esc(c.cost)}</span><span>${esc(c.time)}</span><span>${esc(c.success)}</span>${c.pick ? '<em>picked</em>' : ''}</li>`).join('')}</ol>
++ <p class="why"><i class="fa-solid fa-circle-info" aria-hidden="true"></i> ${esc(z.why)}</p>
++ <figcaption>${esc(z.caption)}</figcaption>
++ </figure>`;
++ }
return '';
}
function vision(site) {
@@@ -173,6 +183,14 @@ ${v.choices ? `
${cards(v.features)}
</div>
</section>
++${(v.more || []).map((m) => `
++ <section${m.id ? ` id="${esc(m.id)}"` : ''}>
++ <h2>${esc(m.title)}</h2>
++ <p class="lead2">${esc(m.lead)}</p>
++ <div class="grid three">
++ ${cards(m.cards)}
++ </div>
++ </section>`).join('')}
${v.templates ? `
<section>
<h2>${esc(v.templates.title)}</h2>
@@@ -350,6 +368,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -357,7 +386,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
${site.statusApi ? STATUS_CSS : ''}</style>
</head>
ddiff --git a/dist/admin.openvibe.network/index.html b/dist/admin.openvibe.network/index.html
iindex 338b1ac..66e92bd 100644
---- a/dist/admin.openvibe.network/index.html
++++ b/dist/admin.openvibe.network/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/admin.openvibe.network/release.json b/dist/admin.openvibe.network/release.json
iindex 1cf01e6..62a3514 100644
---- a/dist/admin.openvibe.network/release.json
++++ b/dist/admin.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "admin",
-- "release": "4e2dec5e2993",
++ "release": "d3d93241fa2c",
"released_at": "2026-09-29T00: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 f45fd54..fc88498 100644
---- a/dist/ai.openvibe.network/index.html
++++ b/dist/ai.openvibe.network/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/ai.openvibe.network/release.json b/dist/ai.openvibe.network/release.json
iindex 7ab76a6..4952444 100644
---- a/dist/ai.openvibe.network/release.json
++++ b/dist/ai.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "ai",
-- "release": "7d2d151a6842",
++ "release": "7438b3f419e0",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/ai.openvibe.services/index.html b/dist/ai.openvibe.services/index.html
iindex 644708d..72c8d66 100644
---- a/dist/ai.openvibe.services/index.html
++++ b/dist/ai.openvibe.services/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/ai.openvibe.services/release.json b/dist/ai.openvibe.services/release.json
iindex 502f14e..ccdedac 100644
---- a/dist/ai.openvibe.services/release.json
++++ b/dist/ai.openvibe.services/release.json
@@@ -1,6 +1,6 @@
{
"service": "ai",
-- "release": "d9c70520ecef",
++ "release": "7ee74be90e8a",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/api.openvibe.network/index.html b/dist/api.openvibe.network/index.html
iindex 7ae4eb3..289ade1 100644
---- a/dist/api.openvibe.network/index.html
++++ b/dist/api.openvibe.network/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/api.openvibe.network/release.json b/dist/api.openvibe.network/release.json
iindex 585f92b..d30a938 100644
---- a/dist/api.openvibe.network/release.json
++++ b/dist/api.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "api",
-- "release": "4dc46ad3c820",
++ "release": "57d0965a86a0",
"released_at": "2026-09-29T00: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 3fdf726..02dcecb 100644
---- a/dist/auth.openvibe.network/index.html
++++ b/dist/auth.openvibe.network/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/auth.openvibe.network/release.json b/dist/auth.openvibe.network/release.json
iindex a34b560..7ce5cee 100644
---- a/dist/auth.openvibe.network/release.json
++++ b/dist/auth.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "auth",
-- "release": "2d9159294e65",
++ "release": "6eec453e0986",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openre.stream/index.html b/dist/openre.stream/index.html
iindex 74e1e7a..7a5682e 100644
---- a/dist/openre.stream/index.html
++++ b/dist/openre.stream/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openre.stream/release.json b/dist/openre.stream/release.json
iindex 535cfb5..92177e7 100644
---- a/dist/openre.stream/release.json
++++ b/dist/openre.stream/release.json
@@@ -1,6 +1,6 @@
{
"service": "stream",
-- "release": "12285800442e",
++ "release": "d89063824a8f",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.actor/index.html b/dist/openvibe.actor/index.html
iindex 441bae9..8a72a48 100644
---- a/dist/openvibe.actor/index.html
++++ b/dist/openvibe.actor/index.html
@@@ -3,9 +3,9 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
--<title>OpenVibe.Actor — Your agent in the cloud, connected to everything OpenVibe.</title>
--<meta name="description" content="OpenVibe.Actor gives you an AI agent that lives in OpenVibe&#39;s cloud and works for you around the clock. It remembers, runs on schedules and triggers, uses every OpenVibe product as a tool, browses and codes in a sandbox, and asks before it does anything that matters. Talk to it from any OpenVibe site, in chat, or from your own apps.">
--<meta name="keywords" content="cloud ai agent, hosted ai agent, personal ai agent, ai agent with memory, autonomous ai assistant, ai agent platform, open source ai agent, mcp server, ai agent approvals">
++<title>OpenVibe.Actor — One API for every AI agent. The right one for each task.</title>
++<meta name="description" content="OpenVibe.Actor sends each task to the agent system best suited to it, from hosted agent platforms to open-source runtimes, coding agents and OpenVibe&#39;s own, and balances them live on price, speed and success. Pick a mode (cheapest, balanced, best, fastest or private), set a budget, and get a checked result with its cost and the reason for every choice. On top of it, your own always-on agents work across the whole OpenVibe network.">
++<meta name="keywords" content="ai agent router, openrouter for agents, agent api, route tasks to ai agents, cheapest ai agent, ai agent comparison, hosted ai agent, cloud ai agent, personal ai agent, mcp server">
<meta name="robots" content="index, follow, max-image-preview:large">
<meta name="theme-color" content="#a78bfa">
<link rel="canonical" href="https://openvibe.actor/">
@@@ -16,15 +16,15 @@
<meta property="og:type" content="website">
<meta property="og:site_name" content="OpenVibe.Actor">
<meta property="og:url" content="https://openvibe.actor/">
--<meta property="og:title" content="OpenVibe.Actor — Your agent in the cloud, connected to everything OpenVibe.">
--<meta property="og:description" content="OpenVibe.Actor gives you an AI agent that lives in OpenVibe&#39;s cloud and works for you around the clock. It remembers, runs on schedules and triggers, uses every OpenVibe product as a tool, browses and codes in a sandbox, and asks before it does anything that matters. Talk to it from any OpenVibe site, in chat, or from your own apps.">
++<meta property="og:title" content="OpenVibe.Actor — One API for every AI agent. The right one for each task.">
++<meta property="og:description" content="OpenVibe.Actor sends each task to the agent system best suited to it, from hosted agent platforms to open-source runtimes, coding agents and OpenVibe&#39;s own, and balances them live on price, speed and success. Pick a mode (cheapest, balanced, best, fastest or private), set a budget, and get a checked result with its cost and the reason for every choice. On top of it, your own always-on agents work across the whole OpenVibe network.">
<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.Actor — Your agent in the cloud, connected to everything OpenVibe.">
--<meta name="twitter:description" content="OpenVibe.Actor gives you an AI agent that lives in OpenVibe&#39;s cloud and works for you around the clock. It remembers, runs on schedules and triggers, uses every OpenVibe product as a tool, browses and codes in a sandbox, and asks before it does anything that matters. Talk to it from any OpenVibe site, in chat, or from your own apps.">
++<meta name="twitter:title" content="OpenVibe.Actor — One API for every AI agent. The right one for each task.">
++<meta name="twitter:description" content="OpenVibe.Actor sends each task to the agent system best suited to it, from hosted agent platforms to open-source runtimes, coding agents and OpenVibe&#39;s own, and balances them live on price, speed and success. Pick a mode (cheapest, balanced, best, fastest or private), set a budget, and get a checked result with its cost and the reason for every choice. On top of it, your own always-on agents work across the whole OpenVibe network.">
<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.actor/#site","url":"https://openvibe.actor/","name":"OpenVibe.Actor","description":"OpenVibe.Actor gives you an AI agent that lives in OpenVibe's cloud and works for you around the clock. It remembers, runs on schedules and triggers, uses every OpenVibe product as a tool, browses and codes in a sandbox, and asks before it does anything that matters. Talk to it from any OpenVibe site, in chat, or from your own apps.","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.actor/#page","url":"https://openvibe.actor/","name":"OpenVibe.Actor — Your agent in the cloud, connected to everything OpenVibe.","description":"OpenVibe.Actor gives you an AI agent that lives in OpenVibe's cloud and works for you around the clock. It remembers, runs on schedules and triggers, uses every OpenVibe product as a tool, browses and codes in a sandbox, and asks before it does anything that matters. Talk to it from any OpenVibe site, in chat, or from your own apps.","isPartOf":{"@id":"https://openvibe.actor/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-29","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"OpenVibe","item":"https://openvibe.network/"},{"@type":"ListItem","position":2,"name":"OpenVibe.Actor","item":"https://openvibe.actor/"}]}},{"@type":"FAQPage","@id":"https://openvibe.actor/#faq","mainEntity":[{"@type":"Question","name":"How is this different from a chat assistant?","acceptedAnswer":{"@type":"Answer","text":"It keeps working when you leave: it has memory, schedules and triggers, and it can act across OpenVibe with the permissions you give it."}},{"@type":"Question","name":"Can it do things without asking?","acceptedAnswer":{"@type":"Answer","text":"Only what you allow. You grant each tool, and anything with consequences waits for your approval. Every action is logged, and you can stop an agent at any time."}},{"@type":"Question","name":"Which AI models does it use?","acceptedAnswer":{"@type":"Answer","text":"Any model OpenVibe.AI routes to, including open and local models, or your own API key."}},{"@type":"Question","name":"Can other apps use my agent?","acceptedAnswer":{"@type":"Answer","text":"Yes: an API, webhooks and an MCP server connect it to other tools and assistants."}},{"@type":"Question","name":"What will it cost?","acceptedAnswer":{"@type":"Answer","text":"You will be able to start without paying, within limits published before launch; heavier use and bigger models will be paid."}}]}]}</script>
++<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"WebSite","@id":"https://openvibe.actor/#site","url":"https://openvibe.actor/","name":"OpenVibe.Actor","description":"OpenVibe.Actor sends each task to the agent system best suited to it, from hosted agent platforms to open-source runtimes, coding agents and OpenVibe's own, and balances them live on price, speed and success. Pick a mode (cheapest, balanced, best, fastest or private), set a budget, and get a checked result with its cost and the reason for every choice. On top of it, your own always-on agents work across the whole OpenVibe network.","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.actor/#page","url":"https://openvibe.actor/","name":"OpenVibe.Actor — One API for every AI agent. The right one for each task.","description":"OpenVibe.Actor sends each task to the agent system best suited to it, from hosted agent platforms to open-source runtimes, coding agents and OpenVibe's own, and balances them live on price, speed and success. Pick a mode (cheapest, balanced, best, fastest or private), set a budget, and get a checked result with its cost and the reason for every choice. On top of it, your own always-on agents work across the whole OpenVibe network.","isPartOf":{"@id":"https://openvibe.actor/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-29","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"OpenVibe","item":"https://openvibe.network/"},{"@type":"ListItem","position":2,"name":"OpenVibe.Actor","item":"https://openvibe.actor/"}]}},{"@type":"FAQPage","@id":"https://openvibe.actor/#faq","mainEntity":[{"@type":"Question","name":"Is this like OpenRouter?","acceptedAnswer":{"@type":"Answer","text":"Yes, for agents: one API and one bill for many agent systems, with live prices and rankings. Actor routes whole tasks rather than single model calls, and it checks the results before you get them."}},{"@type":"Question","name":"Which agent systems does it use?","acceptedAnswer":{"@type":"Answer","text":"OpenVibe's own runtime, hosted agent platforms from companies like OpenAI and Anthropic, coding agents, and open-source agents on OpenVibe's hardware. Each is an adapter, so new ones join quickly."}},{"@type":"Question","name":"How does it choose?","acceptedAnswer":{"@type":"Answer","text":"For each kind of task it compares price, speed, success rate and current health across agent systems, then applies your mode and budget. Every choice is recorded and explained."}},{"@type":"Question","name":"Can I keep my data on OpenVibe?","acceptedAnswer":{"@type":"Answer","text":"Yes. Private mode uses only OpenVibe's own runtime and open models on its own hardware."}},{"@type":"Question","name":"Can it act without asking?","acceptedAnswer":{"@type":"Answer","text":"Only as far as you allow. Anything with consequences, like publishing, spending or moving a robot, waits for your approval, and every action is logged."}},{"@type":"Question","name":"What will it cost?","acceptedAnswer":{"@type":"Answer","text":"You will be able to start without paying, within limits published before launch; bigger tasks and stronger agents will be paid, with the cost shown per task."}}]}]}</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=ee4a6754d0f7" defer></script>
<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
@@@ -142,77 +153,105 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<div class="mark"><i class="fa-solid fa-user-astronaut" aria-hidden="true"></i></div>
<div class="badge"><span class="ov-mark" data-size="16" data-variant="actor"></span> Part of the OpenVibe network · <b>being built</b></div>
<h1>OpenVibe<span class="d">.</span><span class="tld">Actor</span></h1>
-- <div class="tag">Your agent in the cloud, connected to everything OpenVibe.</div>
-- <p class="lead">OpenVibe.Actor gives you an AI agent that lives in OpenVibe&#39;s cloud and works for you around the clock. It remembers, runs on schedules and triggers, uses every OpenVibe product as a tool, browses and codes in a sandbox, and asks before it does anything that matters. Talk to it from any OpenVibe site, in chat, or from your own apps.</p>
++ <div class="tag">One API for every AI agent. The right one for each task.</div>
++ <p class="lead">OpenVibe.Actor sends each task to the agent system best suited to it, from hosted agent platforms to open-source runtimes, coding agents and OpenVibe&#39;s own, and balances them live on price, speed and success. Pick a mode (cheapest, balanced, best, fastest or private), set a budget, and get a checked result with its cost and the reason for every choice. On top of it, your own always-on agents work across the whole OpenVibe network.</p>
<div class="ctas">
<a class="btn btn-primary" href="https://openvibe.network/login?return=https%3A%2F%2Fopenvibe.actor%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> See the network</a>
<a class="btn" href="https://discord.gg/M6MuRUaeJj" rel="noopener"><i class="fa-brands fa-discord"></i> Follow the build</a>
</div>
</div>
-- <figure class="viz" aria-label="Design preview: an agent&#39;s activity feed ending in a request for approval">
-- <div class="viz-top"><span class="av"><i class="fa-solid fa-user-astronaut" aria-hidden="true"></i></span><b>Nova</b><span class="muted">stream co-host</span><span class="lat"><i class="fa-solid fa-cloud" aria-hidden="true"></i> always on</span></div>
-- <ol class="feed"><li><i class="fa-solid fa-circle-check" aria-hidden="true"></i><span>Watched tonight&#39;s stream and marked 3 highlights</span></li><li><i class="fa-solid fa-circle-check" aria-hidden="true"></i><span>Clipped the best one on OpenVibe.Media</span></li><li><i class="fa-solid fa-circle-check" aria-hidden="true"></i><span>Drafted a post for your blog with the clip</span></li>
-- <li class="ask"><i class="fa-solid fa-hand" aria-hidden="true"></i><span>Publish the post on openvibe.blog?</span><span class="pills" aria-hidden="true"><span class="ok">Approve</span><span>Not yet</span></span></li></ol>
-- <figcaption>Design preview of an agent at work</figcaption>
++ <figure class="viz" aria-label="Design preview: a task routed across four agent systems with cost, time and success estimates, the balanced mode selected">
++ <div class="viz-top"><span class="av"><i class="fa-solid fa-route" aria-hidden="true"></i></span><b>New task</b><span class="lat"><i class="fa-solid fa-wallet" aria-hidden="true"></i> budget 50¢</span></div>
++ <p class="task">Research five competitors of my shop and write a one-page brief with sources.</p>
++ <div class="modes" aria-hidden="true"><span>Cheapest</span><span class="on">Balanced</span><span>Best</span><span>Fastest</span><span>Private</span></div>
++ <ol class="cands" aria-hidden="true"><li class="pick"><i class="fa-solid fa-circle-nodes"></i><b>OpenVibe runtime</b><span>6¢</span><span>3 min</span><span>92%</span><em>picked</em></li><li><i class="fa-solid fa-cloud"></i><b>Hosted frontier agent</b><span>31¢</span><span>2 min</span><span>95%</span></li><li><i class="fa-solid fa-code"></i><b>Coding agent</b><span>12¢</span><span>4 min</span><span>81%</span></li><li><i class="fa-solid fa-lock"></i><b>Open model on OpenVibe</b><span>1¢</span><span>7 min</span><span>74%</span></li></ol>
++ <p class="why"><i class="fa-solid fa-circle-info" aria-hidden="true"></i> Meets this task&#39;s quality bar at the lowest expected cost; a second model family checks the brief before you get it.</p>
++ <figcaption>Design preview; the numbers are illustrative</figcaption>
</figure>
</header>
<section id="what">
-- <h2>Start in a minute</h2>
-- <p class="lead2">Describe what you want or start from a template. Change anything later.</p>
++ <h2>How a task runs</h2>
++ <p class="lead2">Send a task from the site, the API or any OpenVibe app. Actor does the rest.</p>
<ol class="steps">
-- <li><span class="n">1</span><b>Create an agent</b><span>Pick a template or describe the job in your own words. Choose its model and its personality.</span></li>
-- <li><span class="n">2</span><b>Decide what it may do</b><span>Grant it tools one by one. Anything with consequences, like publishing, spending or moving a robot, waits for your approval.</span></li>
-- <li><span class="n">3</span><b>Let it work</b><span>It runs in the cloud on schedules and triggers, and you can reach it from any OpenVibe site.</span></li>
++ <li><span class="n">1</span><b>Describe the task</b><span>Say what you want done, pick a mode and set a budget. Attach files or give it a robot, a site or a stream to work with.</span></li>
++ <li><span class="n">2</span><b>Actor picks the agent</b><span>It weighs every agent system on live price, speed and success for this kind of task, picks one, and tells you why.</span></li>
++ <li><span class="n">3</span><b>Checked, then delivered</b><span>A different model checks the result; a failed check moves the task to a stronger agent. You see the cost to the cent.</span></li>
</ol>
</section>
<section>
-- <h2>What your agent can do</h2>
-- <p class="lead2">An agent is only as useful as what it can reach. Yours can reach the whole network.</p>
++ <h2>Modes</h2>
++ <p class="lead2">Tell Actor what matters most. It balances the rest.</p>
<div class="grid three">
-- <div class="card"><div class="ic"><i class="fa-solid fa-cloud" aria-hidden="true"></i></div><b>Always on</b><span>Runs in OpenVibe&#39;s cloud around the clock. Close your laptop; it keeps going.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-circle-nodes" aria-hidden="true"></i></div><b>Uses the whole network</b><span>Live, Chat, Blog, Wiki, Community, Tools, Media, Host, Bot and more, each through its own API.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-window-maximize" aria-hidden="true"></i></div><b>Browses and codes</b><span>A sandboxed browser and code runner for work outside the network.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-brain" aria-hidden="true"></i></div><b>Remembers</b><span>Long-term memory you can read, edit and wipe.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-hand" aria-hidden="true"></i></div><b>Asks first</b><span>An approval inbox, a full activity log, spending limits and a kill switch.</span></div>
-- <div class="card"><div class="ic"><i class="fa-solid fa-shuffle" aria-hidden="true"></i></div><b>Any model</b><span>Routed through OpenVibe.AI: hosted, open or local models, or your own key.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-coins" aria-hidden="true"></i></div><b>Cheapest</b><span>The lowest expected cost that still meets the task&#39;s quality bar.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-scale-balanced" aria-hidden="true"></i></div><b>Balanced</b><span>The default: cost, quality and speed weighed together.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-trophy" aria-hidden="true"></i></div><b>Best</b><span>The highest chance of a right answer first time; cost comes second.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-bolt" aria-hidden="true"></i></div><b>Fastest</b><span>The shortest time to a checked result.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-lock" aria-hidden="true"></i></div><b>Private</b><span>Only agents that keep your data on OpenVibe: its own runtime and open models on its hardware.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-wallet" aria-hidden="true"></i></div><b>Budgets</b><span>A hard limit per task and per day. Actor never goes over it.</span></div>
++ </div>
++ </section>
++
++ <section id="routes">
++ <h2>What it routes to</h2>
++ <p class="lead2">Every agent system worth using, behind one API, one key and one bill.</p>
++ <div class="grid three">
++ <div class="card"><div class="ic"><i class="fa-solid fa-circle-nodes" aria-hidden="true"></i></div><b>OpenVibe&#39;s own runtime</b><span>Uses every OpenVibe product as a tool, with models chosen by OpenVibe.AI.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-cloud" aria-hidden="true"></i></div><b>Hosted agent platforms</b><span>Agent platforms from companies like OpenAI and Anthropic, with their browsers, code runners and search.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-code" aria-hidden="true"></i></div><b>Coding agents</b><span>For tasks that are really code: fixes, features, reviews and tests.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-server" aria-hidden="true"></i></div><b>Open-source agents</b><span>Open runtimes and open models on OpenVibe&#39;s own hardware: the Private mode.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-key" aria-hidden="true"></i></div><b>Your own keys</b><span>Bring a key for any platform and pay it directly; Actor still routes, checks and explains.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-plug-circle-plus" aria-hidden="true"></i></div><b>New ones, fast</b><span>A new agent platform is one adapter. The day it lands, every app and agent can use it.</span></div>
++ </div>
++ </section>
++ <section>
++ <h2>Balanced live, explained always</h2>
++ <p class="lead2">Choices come from what actually happens, not from marketing pages.</p>
++ <div class="grid three">
++ <div class="card"><div class="ic"><i class="fa-solid fa-chart-line" aria-hidden="true"></i></div><b>Live signals</b><span>Price, speed, success rate and outages per agent system and per kind of task, updated from real runs.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-arrows-rotate" aria-hidden="true"></i></div><b>Failover</b><span>When an agent system slows down or fails, tasks move to the next best one at once.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-list-check" aria-hidden="true"></i></div><b>Checked results</b><span>Cheap first, then stronger agents only when a check fails: you pay for strength only when a task needs it.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-magnifying-glass-chart" aria-hidden="true"></i></div><b>Public rankings</b><span>Success, cost and time per agent system for each kind of task, from real traffic, with dates.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-receipt" aria-hidden="true"></i></div><b>Every choice explained</b><span>Which agent ran, why it won, what else was considered and what it cost.</span></div>
++ <div class="card"><div class="ic"><i class="fa-solid fa-user-astronaut" aria-hidden="true"></i></div><b>Your agents, on top</b><span>Always-on agents with memory, schedules and approvals; every task they take goes through the router.</span></div>
</div>
</section>
<section>
-- <h2>Start from a template</h2>
-- <p class="lead2">Each one is a starting point you can change.</p>
++ <h2>Start an agent from a template</h2>
++ <p class="lead2">Each one is a starting point you can change, and each routes its work through Actor.</p>
<div class="chips big"><span><i class="fa-solid fa-tower-broadcast" aria-hidden="true"></i>Stream co-host</span><span><i class="fa-solid fa-shield" aria-hidden="true"></i>Chat moderator</span><span><i class="fa-solid fa-magnifying-glass" aria-hidden="true"></i>Research assistant</span><span><i class="fa-solid fa-globe" aria-hidden="true"></i>Site builder</span><span><i class="fa-solid fa-robot" aria-hidden="true"></i>Robot pilot</span><span><i class="fa-solid fa-calendar-check" aria-hidden="true"></i>Personal assistant</span></div>
</section>
<section class="meanwhile">
<h2>Reachable everywhere</h2>
-- <p class="lead2">Your agent is part of the network, not a separate app.</p>
++ <p class="lead2">Actor is part of the network, not a separate app.</p>
<div class="grid">
<div class="card"><div class="ic"><i class="fa-solid fa-bars" aria-hidden="true"></i></div><b>On every OpenVibe site</b><span>An agent button in the navbar, with the page you are on as context.</span></div>
<a class="card" href="https://openvibe.chat"><div class="ic"><i class="fa-solid fa-comments" aria-hidden="true"></i></div><b>In chat</b><span>Direct messages on OpenVibe.Chat and @mentions in Live chat and Community threads.</span><span class="go">openvibe.chat →</span></a>
-- <a class="card" href="https://openvibe.bot"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>With your robots</b><span>Give it a robot on OpenVibe.Bot to patrol, check on or perform with, with your approval.</span><span class="go">openvibe.bot →</span></a>
-- <a class="card" href="https://openvibe.codes"><div class="ic"><i class="fa-solid fa-plug" aria-hidden="true"></i></div><b>From your own apps</b><span>An API, webhooks and an MCP server, so other assistants can use OpenVibe tools and talk to your agent.</span><span class="go">openvibe.codes →</span></a>
++ <a class="card" href="https://openvibe.bot"><div class="ic"><i class="fa-solid fa-robot" aria-hidden="true"></i></div><b>With your robots</b><span>Give an agent a robot on OpenVibe.Bot to patrol, check on or perform with, with your approval.</span><span class="go">openvibe.bot →</span></a>
++ <a class="card" href="https://openvibe.codes"><div class="ic"><i class="fa-solid fa-plug" aria-hidden="true"></i></div><b>From your own apps</b><span>An API, webhooks and an MCP server, so other assistants can hand tasks to Actor.</span><span class="go">openvibe.codes →</span></a>
</div>
</section>
<section id="questions" class="faq">
<h2>Questions</h2>
-- <details><summary>How is this different from a chat assistant?</summary><p>It keeps working when you leave: it has memory, schedules and triggers, and it can act across OpenVibe with the permissions you give it.</p></details>
-- <details><summary>Can it do things without asking?</summary><p>Only what you allow. You grant each tool, and anything with consequences waits for your approval. Every action is logged, and you can stop an agent at any time.</p></details>
-- <details><summary>Which AI models does it use?</summary><p>Any model OpenVibe.AI routes to, including open and local models, or your own API key.</p></details>
-- <details><summary>Can other apps use my agent?</summary><p>Yes: an API, webhooks and an MCP server connect it to other tools and assistants.</p></details>
-- <details><summary>What will it cost?</summary><p>You will be able to start without paying, within limits published before launch; heavier use and bigger models will be paid.</p></details>
++ <details><summary>Is this like OpenRouter?</summary><p>Yes, for agents: one API and one bill for many agent systems, with live prices and rankings. Actor routes whole tasks rather than single model calls, and it checks the results before you get them.</p></details>
++ <details><summary>Which agent systems does it use?</summary><p>OpenVibe&#39;s own runtime, hosted agent platforms from companies like OpenAI and Anthropic, coding agents, and open-source agents on OpenVibe&#39;s hardware. Each is an adapter, so new ones join quickly.</p></details>
++ <details><summary>How does it choose?</summary><p>For each kind of task it compares price, speed, success rate and current health across agent systems, then applies your mode and budget. Every choice is recorded and explained.</p></details>
++ <details><summary>Can I keep my data on OpenVibe?</summary><p>Yes. Private mode uses only OpenVibe&#39;s own runtime and open models on its own hardware.</p></details>
++ <details><summary>Can it act without asking?</summary><p>Only as far as you allow. Anything with consequences, like publishing, spending or moving a robot, waits for your approval, and every action is logged.</p></details>
++ <details><summary>What will it cost?</summary><p>You will be able to start without paying, within limits published before launch; bigger tasks and stronger agents will be paid, with the cost shown per task.</p></details>
</section>
<section class="build">
<div class="card">
<b><i class="fa-solid fa-person-digging" aria-hidden="true"></i> Build status</b>
-- <span>OpenVibe.Actor is being built now, on the network&#39;s accounts, AI router and event system that already run. Its own service is not running yet: this page is a placeholder, nothing here is live yet. It opens with agent accounts with delegated permissions on OpenVibe.Network and the Actor service. · as of 2026-09-29 · <a href="/status.json">status.json</a></span>
++ <span>OpenVibe.Actor is being built now, on the network&#39;s accounts, AI router and event system that already run. Its own service is not running yet: this page is a placeholder, nothing here is live yet. It opens with the task router with its first agent adapters, then personal agents on OpenVibe.Network accounts. · as of 2026-09-29 · <a href="/status.json">status.json</a></span>
</div>
</section>
ddiff --git a/dist/openvibe.actor/manifest.webmanifest b/dist/openvibe.actor/manifest.webmanifest
iindex 5115b7a..ba11f3c 100644
---- a/dist/openvibe.actor/manifest.webmanifest
++++ b/dist/openvibe.actor/manifest.webmanifest
@@@ -1,7 +1,7 @@
{
"name": "OpenVibe.Actor",
"short_name": "Actor",
-- "description": "Your agent in the cloud, connected to everything OpenVibe.",
++ "description": "One API for every AI agent. The right one for each task.",
"start_url": "/",
"scope": "/",
"display": "standalone",
ddiff --git a/dist/openvibe.actor/release.json b/dist/openvibe.actor/release.json
iindex 542471c..d6b81bf 100644
---- a/dist/openvibe.actor/release.json
++++ b/dist/openvibe.actor/release.json
@@@ -1,6 +1,6 @@
{
"service": "actor",
-- "release": "d726e134d007",
++ "release": "90914e18ca92",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.actor/status.json b/dist/openvibe.actor/status.json
iindex ac1bb73..13fa6ad 100644
---- a/dist/openvibe.actor/status.json
++++ b/dist/openvibe.actor/status.json
@@@ -8,7 +8,7 @@
"repoExists": false,
"repoStage": "charter-only",
"service": null,
-- "launchWaitsFor": "agent accounts with delegated permissions on OpenVibe.Network and the Actor service",
++ "launchWaitsFor": "the task router with its first agent adapters, then personal agents on OpenVibe.Network accounts",
"factsAsOf": "2026-09-29",
"network": "https://openvibe.network",
"updated": "2026-09-29",
ddiff --git a/dist/openvibe.bot/index.html b/dist/openvibe.bot/index.html
iindex 30e3e3d..08d89dd 100644
---- a/dist/openvibe.bot/index.html
++++ b/dist/openvibe.bot/index.html
@@@ -24,7 +24,7 @@
<meta name="twitter:title" content="OpenVibe.Bot — Get your robot online in minutes.">
<meta name="twitter:description" content="OpenVibe.Bot is an open control panel for robots. Add a robot, pair it with one command or a QR code, and drive it from any browser with live video, real controls and a stop button that always works. Buy a ready-made bot or bring your own Raspberry Pi, ESP32, ROS 2 robot or phone. Share control, automate it, hand it to your AI agent, and stream it to OpenVibe.Live or openre.stream when you want to.">
<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 is an open control panel for robots. Add a robot, pair it with one command or a QR code, and drive it from any browser with live video, real controls and a stop button that always works. Buy a ready-made bot or bring your own Raspberry Pi, ESP32, ROS 2 robot or phone. Share control, automate it, hand it to your AI agent, and stream it to OpenVibe.Live or openre.stream when you want to.","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 — Get your robot online in minutes.","description":"OpenVibe.Bot is an open control panel for robots. Add a robot, pair it with one command or a QR code, and drive it from any browser with live video, real controls and a stop button that always works. Buy a ready-made bot or bring your own Raspberry Pi, ESP32, ROS 2 robot or phone. Share control, automate it, hand it to your AI agent, and stream it to OpenVibe.Live or openre.stream when you want to.","isPartOf":{"@id":"https://openvibe.bot/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-29","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/"}]}},{"@type":"FAQPage","@id":"https://openvibe.bot/#faq","mainEntity":[{"@type":"Question","name":"Do I need to open ports on my router?","acceptedAnswer":{"@type":"Answer","text":"No. The robot connects out to OpenVibe, and video and controls travel over WebRTC, so it works behind ordinary home and mobile networks."}},{"@type":"Question","name":"Is it only for streaming?","acceptedAnswer":{"@type":"Answer","text":"No. Streaming is optional. Bot is a control panel for your robot first: drive it, check on it, share it and automate it."}},{"@type":"Question","name":"What hardware works?","acceptedAnswer":{"@type":"Answer","text":"A Raspberry Pi or another Linux board, an ESP32, a ROS 2 robot, an Android phone, or an ONVIF or RTSP camera. The curated kits list exactly what to buy."}},{"@type":"Question","name":"How does it keep the robot safe?","acceptedAnswer":{"@type":"Answer","text":"The device stops its motors by itself when commands or the connection stop. There is an emergency stop in the panel, limits on speed, range and time, and every command is logged."}},{"@type":"Question","name":"What will it cost?","acceptedAnswer":{"@type":"Answer","text":"Controlling your own robot will not cost anything. Limits and any paid extras will be published before launch."}}]}]}</script>
++<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 is an open control panel for robots. Add a robot, pair it with one command or a QR code, and drive it from any browser with live video, real controls and a stop button that always works. Buy a ready-made bot or bring your own Raspberry Pi, ESP32, ROS 2 robot or phone. Share control, automate it, hand it to your AI agent, and stream it to OpenVibe.Live or openre.stream when you want to.","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 — Get your robot online in minutes.","description":"OpenVibe.Bot is an open control panel for robots. Add a robot, pair it with one command or a QR code, and drive it from any browser with live video, real controls and a stop button that always works. Buy a ready-made bot or bring your own Raspberry Pi, ESP32, ROS 2 robot or phone. Share control, automate it, hand it to your AI agent, and stream it to OpenVibe.Live or openre.stream when you want to.","isPartOf":{"@id":"https://openvibe.bot/#site"},"datePublished":"2026-09-17","dateModified":"2026-09-29","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/"}]}},{"@type":"FAQPage","@id":"https://openvibe.bot/#faq","mainEntity":[{"@type":"Question","name":"Do I need to open ports on my router?","acceptedAnswer":{"@type":"Answer","text":"No. The robot connects out to OpenVibe, and video and controls travel over WebRTC, so it works behind ordinary home and mobile networks."}},{"@type":"Question","name":"Is it only for streaming?","acceptedAnswer":{"@type":"Answer","text":"No. Streaming is optional. Bot is a control panel for your robot first: drive it, check on it, share it and automate it."}},{"@type":"Question","name":"Which robot comes first?","acceptedAnswer":{"@type":"Answer","text":"The Adeept 4WD Smart Car Kit for Raspberry Pi: four motors, a pan-tilt camera, distance and line sensors, lights and a buzzer. OpenVibe's device agent drives it directly, so its own open control port never has to be exposed."}},{"@type":"Question","name":"What hardware works?","acceptedAnswer":{"@type":"Answer","text":"A Raspberry Pi or another Linux board, an ESP32, a ROS 2 robot, an Android phone, or an ONVIF or RTSP camera. The curated kits list exactly what to buy."}},{"@type":"Question","name":"How does it keep the robot safe?","acceptedAnswer":{"@type":"Answer","text":"The device stops its motors by itself when commands or the connection stop. There is an emergency stop in the panel, limits on speed, range and time, and every command is logged."}},{"@type":"Question","name":"What will it cost?","acceptedAnswer":{"@type":"Answer","text":"Controlling your own robot will not cost anything. Limits and any paid extras will be published before launch."}}]}]}</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=ee4a6754d0f7" defer></script>
<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin>
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
@@@ -180,7 +191,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<h2>Buy one or bring your own</h2>
<p class="lead2">Start with hardware that is known to work, or use what you already have.</p>
<div class="choice">
-- <div class="card big"><div class="ic"><i class="fa-solid fa-box-open" aria-hidden="true"></i></div><b>Get a robot</b><span>Curated kits with parts lists, tested settings and build guides, and ready-made bots that arrive paired to your account.</span><div class="chips"><span>Rover kits</span><span>Telepresence bots</span><span>Pan-tilt cameras</span><span>Robot arms</span></div></div>
++ <div class="card big"><div class="ic"><i class="fa-solid fa-box-open" aria-hidden="true"></i></div><b>Get a robot</b><span>Curated kits with parts lists, tested settings and build guides, and ready-made bots that arrive paired to your account. The first one on OpenVibe.Bot is the Adeept 4WD Smart Car for Raspberry Pi.</span><div class="chips"><span>Adeept 4WD Smart Car (Raspberry Pi)</span><span>Rover kits</span><span>Telepresence bots</span><span>Pan-tilt cameras</span><span>Robot arms</span></div></div>
<div class="card big"><div class="ic"><i class="fa-solid fa-screwdriver-wrench" aria-hidden="true"></i></div><b>Bring your own</b><span>Anything with motors, a camera or sensors. Install the OpenVibe device agent or add the library, and your robot shows up in the panel.</span><div class="chips"><span>Raspberry Pi and Linux boards</span><span>ESP32</span><span>ROS 2</span><span>Android phones</span><span>ONVIF and RTSP cameras</span><span>Serial motor boards</span></div></div>
</div>
</section>
@@@ -199,6 +210,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
</section>
++
<section class="meanwhile">
<h2>Stream it, record it, connect it</h2>
<p class="lead2">Optional, one toggle each. Your robot does not need an audience to be useful.</p>
@@@ -214,6 +226,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
<h2>Questions</h2>
<details><summary>Do I need to open ports on my router?</summary><p>No. The robot connects out to OpenVibe, and video and controls travel over WebRTC, so it works behind ordinary home and mobile networks.</p></details>
<details><summary>Is it only for streaming?</summary><p>No. Streaming is optional. Bot is a control panel for your robot first: drive it, check on it, share it and automate it.</p></details>
++ <details><summary>Which robot comes first?</summary><p>The Adeept 4WD Smart Car Kit for Raspberry Pi: four motors, a pan-tilt camera, distance and line sensors, lights and a buzzer. OpenVibe&#39;s device agent drives it directly, so its own open control port never has to be exposed.</p></details>
<details><summary>What hardware works?</summary><p>A Raspberry Pi or another Linux board, an ESP32, a ROS 2 robot, an Android phone, or an ONVIF or RTSP camera. The curated kits list exactly what to buy.</p></details>
<details><summary>How does it keep the robot safe?</summary><p>The device stops its motors by itself when commands or the connection stop. There is an emergency stop in the panel, limits on speed, range and time, and every command is logged.</p></details>
<details><summary>What will it cost?</summary><p>Controlling your own robot will not cost anything. Limits and any paid extras will be published before launch.</p></details>
ddiff --git a/dist/openvibe.bot/release.json b/dist/openvibe.bot/release.json
iindex 3b106e1..d291f97 100644
---- a/dist/openvibe.bot/release.json
++++ b/dist/openvibe.bot/release.json
@@@ -1,6 +1,6 @@
{
"service": "bot",
-- "release": "d6dcf5253182",
++ "release": "0d72df741ce6",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.coupons/index.html b/dist/openvibe.coupons/index.html
iindex 1796a4a..0349f64 100644
---- a/dist/openvibe.coupons/index.html
++++ b/dist/openvibe.coupons/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.coupons/release.json b/dist/openvibe.coupons/release.json
iindex 0737f4e..626296d 100644
---- a/dist/openvibe.coupons/release.json
++++ b/dist/openvibe.coupons/release.json
@@@ -1,6 +1,6 @@
{
"service": "coupons",
-- "release": "35ee1dcacac8",
++ "release": "8770f6d712a0",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.deals/index.html b/dist/openvibe.deals/index.html
iindex 1517ac3..c549d73 100644
---- a/dist/openvibe.deals/index.html
++++ b/dist/openvibe.deals/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.deals/release.json b/dist/openvibe.deals/release.json
iindex 1c5ba6d..56a29a0 100644
---- a/dist/openvibe.deals/release.json
++++ b/dist/openvibe.deals/release.json
@@@ -1,6 +1,6 @@
{
"service": "deals",
-- "release": "c650df3e7943",
++ "release": "d020ff1ae119",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.download/index.html b/dist/openvibe.download/index.html
iindex b00da61..eb27d6b 100644
---- a/dist/openvibe.download/index.html
++++ b/dist/openvibe.download/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.download/release.json b/dist/openvibe.download/release.json
iindex eb9382f..cdedca3 100644
---- a/dist/openvibe.download/release.json
++++ b/dist/openvibe.download/release.json
@@@ -1,6 +1,6 @@
{
"service": "download",
-- "release": "f31103a9b687",
++ "release": "fe3036a1a92f",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.events/index.html b/dist/openvibe.events/index.html
iindex d573d7d..1de01d2 100644
---- a/dist/openvibe.events/index.html
++++ b/dist/openvibe.events/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.events/release.json b/dist/openvibe.events/release.json
iindex cabea7f..114f209 100644
---- a/dist/openvibe.events/release.json
++++ b/dist/openvibe.events/release.json
@@@ -1,6 +1,6 @@
{
"service": "events",
-- "release": "775d8a75ec2d",
++ "release": "215c667caeec",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.food/index.html b/dist/openvibe.food/index.html
iindex 6da7e17..6f2e329 100644
---- a/dist/openvibe.food/index.html
++++ b/dist/openvibe.food/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.food/release.json b/dist/openvibe.food/release.json
iindex fddcc78..2385fdc 100644
---- a/dist/openvibe.food/release.json
++++ b/dist/openvibe.food/release.json
@@@ -1,6 +1,6 @@
{
"service": "food",
-- "release": "33fe172f4ba8",
++ "release": "f10c97817980",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.help/index.html b/dist/openvibe.help/index.html
iindex 51fa27c..d5cb16a 100644
---- a/dist/openvibe.help/index.html
++++ b/dist/openvibe.help/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.help/release.json b/dist/openvibe.help/release.json
iindex 287b0e5..ba9b3d4 100644
---- a/dist/openvibe.help/release.json
++++ b/dist/openvibe.help/release.json
@@@ -1,6 +1,6 @@
{
"service": "help",
-- "release": "ff05ba62a0a6",
++ "release": "a22dfa6141ae",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.homes/index.html b/dist/openvibe.homes/index.html
iindex 7b59170..759e29d 100644
---- a/dist/openvibe.homes/index.html
++++ b/dist/openvibe.homes/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.homes/release.json b/dist/openvibe.homes/release.json
iindex 984581a..c547cde 100644
---- a/dist/openvibe.homes/release.json
++++ b/dist/openvibe.homes/release.json
@@@ -1,6 +1,6 @@
{
"service": "homes",
-- "release": "b7b52e6c88f7",
++ "release": "6de124d8b681",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.host/index.html b/dist/openvibe.host/index.html
iindex 46c4297..a2d3f34 100644
---- a/dist/openvibe.host/index.html
++++ b/dist/openvibe.host/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.host/release.json b/dist/openvibe.host/release.json
iindex ef102f3..be92c0a 100644
---- a/dist/openvibe.host/release.json
++++ b/dist/openvibe.host/release.json
@@@ -1,6 +1,6 @@
{
"service": "host",
-- "release": "073bff41498e",
++ "release": "2233fb7572a6",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.news/index.html b/dist/openvibe.news/index.html
iindex 047fe1f..fc997ca 100644
---- a/dist/openvibe.news/index.html
++++ b/dist/openvibe.news/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.news/release.json b/dist/openvibe.news/release.json
iindex c1104bc..9f373f7 100644
---- a/dist/openvibe.news/release.json
++++ b/dist/openvibe.news/release.json
@@@ -1,6 +1,6 @@
{
"service": "news",
-- "release": "ed41915d231f",
++ "release": "afad07684f23",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.pics/index.html b/dist/openvibe.pics/index.html
iindex 192be67..c02a228 100644
---- a/dist/openvibe.pics/index.html
++++ b/dist/openvibe.pics/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.pics/release.json b/dist/openvibe.pics/release.json
iindex 70900c9..0da5621 100644
---- a/dist/openvibe.pics/release.json
++++ b/dist/openvibe.pics/release.json
@@@ -1,6 +1,6 @@
{
"service": "pics",
-- "release": "e72016bc0394",
++ "release": "35f8193c0d26",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.quest/index.html b/dist/openvibe.quest/index.html
iindex d85b18d..c081962 100644
---- a/dist/openvibe.quest/index.html
++++ b/dist/openvibe.quest/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.quest/release.json b/dist/openvibe.quest/release.json
iindex 8de67ae..f5949c4 100644
---- a/dist/openvibe.quest/release.json
++++ b/dist/openvibe.quest/release.json
@@@ -1,6 +1,6 @@
{
"service": "quest",
-- "release": "61a9d8435854",
++ "release": "4eba62984a98",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.rent/index.html b/dist/openvibe.rent/index.html
iindex c2399e5..d14d440 100644
---- a/dist/openvibe.rent/index.html
++++ b/dist/openvibe.rent/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.rent/release.json b/dist/openvibe.rent/release.json
iindex 8aa028b..9d8ef7d 100644
---- a/dist/openvibe.rent/release.json
++++ b/dist/openvibe.rent/release.json
@@@ -1,6 +1,6 @@
{
"service": "rent",
-- "release": "c4da9315548d",
++ "release": "98a920e4ebb8",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.reviews/index.html b/dist/openvibe.reviews/index.html
iindex 1dc3d2b..9d1e84c 100644
---- a/dist/openvibe.reviews/index.html
++++ b/dist/openvibe.reviews/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.reviews/release.json b/dist/openvibe.reviews/release.json
iindex 62e8139..3736831 100644
---- a/dist/openvibe.reviews/release.json
++++ b/dist/openvibe.reviews/release.json
@@@ -1,6 +1,6 @@
{
"service": "reviews",
-- "release": "d33908ce7111",
++ "release": "7aabc2d9e18e",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.run/index.html b/dist/openvibe.run/index.html
iindex 7e63502..0bd2d5b 100644
---- a/dist/openvibe.run/index.html
++++ b/dist/openvibe.run/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.run/release.json b/dist/openvibe.run/release.json
iindex c912cf0..1c478ef 100644
---- a/dist/openvibe.run/release.json
++++ b/dist/openvibe.run/release.json
@@@ -1,6 +1,6 @@
{
"service": "run",
-- "release": "685bc59d6098",
++ "release": "5f1846f79623",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.services/index.html b/dist/openvibe.services/index.html
iindex 1a68d04..0565171 100644
---- a/dist/openvibe.services/index.html
++++ b/dist/openvibe.services/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.services/release.json b/dist/openvibe.services/release.json
iindex c736aae..3afbea4 100644
---- a/dist/openvibe.services/release.json
++++ b/dist/openvibe.services/release.json
@@@ -1,6 +1,6 @@
{
"service": "services",
-- "release": "3c4ff0411564",
++ "release": "8d2fa89ea9e3",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.space/index.html b/dist/openvibe.space/index.html
iindex 6d84008..282f664 100644
---- a/dist/openvibe.space/index.html
++++ b/dist/openvibe.space/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.space/release.json b/dist/openvibe.space/release.json
iindex 2260cbc..1489bb5 100644
---- a/dist/openvibe.space/release.json
++++ b/dist/openvibe.space/release.json
@@@ -1,6 +1,6 @@
{
"service": "space",
-- "release": "48f1d864bd53",
++ "release": "bce11705589a",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.tips/index.html b/dist/openvibe.tips/index.html
iindex 5e93f78..a7dcfab 100644
---- a/dist/openvibe.tips/index.html
++++ b/dist/openvibe.tips/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.tips/release.json b/dist/openvibe.tips/release.json
iindex 953a38a..3609d47 100644
---- a/dist/openvibe.tips/release.json
++++ b/dist/openvibe.tips/release.json
@@@ -1,6 +1,6 @@
{
"service": "tips",
-- "release": "bbdd22624542",
++ "release": "ef1de815fca3",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.trade/index.html b/dist/openvibe.trade/index.html
iindex 82257b6..6c32571 100644
---- a/dist/openvibe.trade/index.html
++++ b/dist/openvibe.trade/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.trade/release.json b/dist/openvibe.trade/release.json
iindex 60c32ad..91b7720 100644
---- a/dist/openvibe.trade/release.json
++++ b/dist/openvibe.trade/release.json
@@@ -1,6 +1,6 @@
{
"service": "trade",
-- "release": "93c7a5251945",
++ "release": "7df1bf9642b6",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.video/index.html b/dist/openvibe.video/index.html
iindex 7040be1..237e370 100644
---- a/dist/openvibe.video/index.html
++++ b/dist/openvibe.video/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.video/release.json b/dist/openvibe.video/release.json
iindex dc840e1..ddfac80 100644
---- a/dist/openvibe.video/release.json
++++ b/dist/openvibe.video/release.json
@@@ -1,6 +1,6 @@
{
"service": "video",
-- "release": "e9c38e4e184a",
++ "release": "9ee86614f867",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.vip/index.html b/dist/openvibe.vip/index.html
iindex 09aa7c7..1fb1639 100644
---- a/dist/openvibe.vip/index.html
++++ b/dist/openvibe.vip/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.vip/release.json b/dist/openvibe.vip/release.json
iindex b751c05..e0c09fb 100644
---- a/dist/openvibe.vip/release.json
++++ b/dist/openvibe.vip/release.json
@@@ -1,6 +1,6 @@
{
"service": "vip",
-- "release": "3cf1ce50fcfa",
++ "release": "a39b685cc155",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.watch/index.html b/dist/openvibe.watch/index.html
iindex 62c4699..decf9b9 100644
---- a/dist/openvibe.watch/index.html
++++ b/dist/openvibe.watch/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.watch/release.json b/dist/openvibe.watch/release.json
iindex 743a833..9d8729d 100644
---- a/dist/openvibe.watch/release.json
++++ b/dist/openvibe.watch/release.json
@@@ -1,6 +1,6 @@
{
"service": "watch",
-- "release": "db3af1fe5690",
++ "release": "520b6134c006",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/openvibe.website/index.html b/dist/openvibe.website/index.html
iindex a9d037e..b903db8 100644
---- a/dist/openvibe.website/index.html
++++ b/dist/openvibe.website/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/openvibe.website/release.json b/dist/openvibe.website/release.json
iindex bf2e945..a2e5263 100644
---- a/dist/openvibe.website/release.json
++++ b/dist/openvibe.website/release.json
@@@ -1,6 +1,6 @@
{
"service": "website",
-- "release": "7ed1a86c7726",
++ "release": "c470104088ba",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/dist/realtime.openvibe.network/index.html b/dist/realtime.openvibe.network/index.html
iindex 388dca3..a318c01 100644
---- a/dist/realtime.openvibe.network/index.html
++++ b/dist/realtime.openvibe.network/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/realtime.openvibe.network/release.json b/dist/realtime.openvibe.network/release.json
iindex 4905709..dfa02d6 100644
---- a/dist/realtime.openvibe.network/release.json
++++ b/dist/realtime.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "realtime",
-- "release": "b271aa178d7e",
++ "release": "0221dfe18e0e",
"released_at": "2026-09-29T00: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 04c6651..cfaa680 100644
---- a/dist/status.openvibe.network/index.html
++++ b/dist/status.openvibe.network/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
.live .sum{font-size:14px;color:var(--text-secondary);margin-bottom:14px;line-height:1.6}
.live .sum b{color:var(--text-primary)}
ddiff --git a/dist/status.openvibe.network/release.json b/dist/status.openvibe.network/release.json
iindex ffa0333..a518ab7 100644
---- a/dist/status.openvibe.network/release.json
++++ b/dist/status.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "status",
-- "release": "e2fecfa09c74",
++ "release": "9b981c0c3e79",
"released_at": "2026-09-29T00: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 b427d2c..cc8e076 100644
---- a/dist/themes.openvibe.network/index.html
++++ b/dist/themes.openvibe.network/index.html
@@@ -123,6 +123,17 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.steps .n{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#0b0d10;background:var(--site)}
.steps b{font-size:15px}.steps span:last-child{font-size:13px;color:var(--text-secondary);line-height:1.55}
.grid.three{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
++.viz .task{font-size:14px;line-height:1.5;padding:10px 12px;border-radius:12px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-primary)}
++.viz .modes{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
++.viz .modes span{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border);color:var(--text-secondary)}
++.viz .modes .on{background:var(--site);border-color:var(--site);color:#0b0d10}
++.cands{list-style:none;display:grid;gap:6px}
++.cands li{display:grid;grid-template-columns:18px minmax(0,1fr) 54px 50px 44px;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;border-radius:10px;background:var(--bg-secondary);border:1px solid var(--border);color:var(--text-secondary);position:relative}
++.cands li i{color:var(--text-muted)}.cands li b{font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
++.cands li span{text-align:right;font-variant-numeric:tabular-nums}
++.cands li.pick{border-color:rgba(var(--site-rgb),.55);background:rgba(var(--site-rgb),.09)}.cands li.pick i{color:var(--site)}
++.cands li em{position:absolute;top:-8px;right:10px;font-style:normal;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:1px 7px;border-radius:999px;background:var(--site);color:#0b0d10}
++.viz .why{margin-top:10px;font-size:12.5px;line-height:1.5;color:var(--text-secondary)}.viz .why i{color:var(--site);margin-right:4px}
.choice{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}
.card.big{padding:24px}.card.big b{font-size:17px}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
@@@ -130,7 +141,7 @@ a.card:hover{transform:translateY(-3px);border-color:rgba(var(--site-rgb),.6);bo
.chips.big span{font-size:13.5px;padding:9px 14px;color:var(--text-primary)}.chips.big span i{color:var(--site);margin-right:8px}
.build .card{border-style:dashed;background:rgba(0,0,0,.15)}.build .card b i{color:var(--site);margin-right:6px}.build .card span a{color:var(--text-secondary)}.build .card code{font-size:12px}
@media (max-width:860px){.hero.split{grid-template-columns:1fr;text-align:center;gap:28px}.hero.split .ctas{justify-content:center}.hero.split p.lead{margin:0 auto}}
--@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}}
++@media (max-width:600px){.hero{padding-top:56px}.ctas .btn{width:100%;justify-content:center}.viz-ctrl{flex-direction:column;align-items:stretch}.dpad{align-self:center}.cands li{grid-template-columns:14px minmax(0,1fr) 30px 40px 30px;gap:6px;font-size:12px;padding:8px}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
ddiff --git a/dist/themes.openvibe.network/release.json b/dist/themes.openvibe.network/release.json
iindex b70039c..1480a68 100644
---- a/dist/themes.openvibe.network/release.json
++++ b/dist/themes.openvibe.network/release.json
@@@ -1,6 +1,6 @@
{
"service": "themes",
-- "release": "9bc65bb6a1b1",
++ "release": "b6662abd3bc6",
"released_at": "2026-09-29T00:00:00.000Z",
"booted_at": null,
"contracts_version": null,
ddiff --git a/sites.json b/sites.json
iindex 6a1f71f..6c736e7 100644
---- a/sites.json
++++ b/sites.json
@@@ -1331,8 +1331,9 @@
{
"icon": "fa-box-open",
"title": "Get a robot",
-- "text": "Curated kits with parts lists, tested settings and build guides, and ready-made bots that arrive paired to your account.",
++ "text": "Curated kits with parts lists, tested settings and build guides, and ready-made bots that arrive paired to your account. The first one on OpenVibe.Bot is the Adeept 4WD Smart Car for Raspberry Pi.",
"chips": [
++ "Adeept 4WD Smart Car (Raspberry Pi)",
"Rover kits",
"Telepresence bots",
"Pan-tilt cameras",
@@@ -1427,6 +1428,10 @@
"Is it only for streaming?",
"No. Streaming is optional. Bot is a control panel for your robot first: drive it, check on it, share it and automate it."
],
++ [
++ "Which robot comes first?",
++ "The Adeept 4WD Smart Car Kit for Raspberry Pi: four motors, a pan-tilt camera, distance and line sensors, lights and a buzzer. OpenVibe's device agent drives it directly, so its own open control port never has to be exposed."
++ ],
[
"What hardware works?",
"A Raspberry Pi or another Linux board, an ESP32, a ROS 2 robot, an Android phone, or an ONVIF or RTSP camera. The curated kits list exactly what to buy."
@@@ -1489,8 +1494,8 @@
"name": "OpenVibe.Actor",
"icon": "fa-user-astronaut",
"accent": "#a78bfa",
-- "tagline": "Your agent in the cloud, connected to everything OpenVibe.",
-- "description": "OpenVibe.Actor gives you an AI agent that lives in OpenVibe's cloud and works for you around the clock. It remembers, runs on schedules and triggers, uses every OpenVibe product as a tool, browses and codes in a sandbox, and asks before it does anything that matters. Talk to it from any OpenVibe site, in chat, or from your own apps.",
++ "tagline": "One API for every AI agent. The right one for each task.",
++ "description": "OpenVibe.Actor sends each task to the agent system best suited to it, from hosted agent platforms to open-source runtimes, coding agents and OpenVibe's own, and balances them live on price, speed and success. Pick a mode (cheapest, balanced, best, fastest or private), set a budget, and get a checked result with its cost and the reason for every choice. On top of it, your own always-on agents work across the whole OpenVibe network.",
"pillars": [
[
"Your agents",
@@@ -1521,8 +1526,8 @@
"The API and SDK agents are built on."
]
],
-- "keywords": "cloud ai agent, hosted ai agent, personal ai agent, ai agent with memory, autonomous ai assistant, ai agent platform, open source ai agent, mcp server, ai agent approvals",
-- "launch": "agent accounts with delegated permissions on OpenVibe.Network and the Actor service",
++ "keywords": "ai agent router, openrouter for agents, agent api, route tasks to ai agents, cheapest ai agent, ai agent comparison, hosted ai agent, cloud ai agent, personal ai agent, mcp server",
++ "launch": "the task router with its first agent adapters, then personal agents on OpenVibe.Network accounts",
"noRepo": true,
"vision": {
"badge": "being built",
@@@ -1532,73 +1537,181 @@
"fa-circle-nodes"
],
"viz": {
-- "kind": "agent",
-- "name": "Nova",
-- "role": "stream co-host",
-- "state": "always on",
-- "icon": "fa-user-astronaut",
-- "steps": [
-- "Watched tonight's stream and marked 3 highlights",
-- "Clipped the best one on OpenVibe.Media",
-- "Drafted a post for your blog with the clip"
++ "kind": "router",
++ "budget": "budget 50¢",
++ "task": "Research five competitors of my shop and write a one-page brief with sources.",
++ "modes": [
++ "Cheapest",
++ "Balanced",
++ "Best",
++ "Fastest",
++ "Private"
++ ],
++ "mode": "Balanced",
++ "candidates": [
++ {
++ "icon": "fa-circle-nodes",
++ "name": "OpenVibe runtime",
++ "cost": "6¢",
++ "time": "3 min",
++ "success": "92%",
++ "pick": true
++ },
++ {
++ "icon": "fa-cloud",
++ "name": "Hosted frontier agent",
++ "cost": "31¢",
++ "time": "2 min",
++ "success": "95%"
++ },
++ {
++ "icon": "fa-code",
++ "name": "Coding agent",
++ "cost": "12¢",
++ "time": "4 min",
++ "success": "81%"
++ },
++ {
++ "icon": "fa-lock",
++ "name": "Open model on OpenVibe",
++ "cost": "1¢",
++ "time": "7 min",
++ "success": "74%"
++ }
],
-- "ask": "Publish the post on openvibe.blog?",
-- "caption": "Design preview of an agent at work",
-- "label": "Design preview: an agent's activity feed ending in a request for approval"
++ "why": "Meets this task's quality bar at the lowest expected cost; a second model family checks the brief before you get it.",
++ "caption": "Design preview; the numbers are illustrative",
++ "label": "Design preview: a task routed across four agent systems with cost, time and success estimates, the balanced mode selected"
},
-- "stepsTitle": "Start in a minute",
-- "stepsLead": "Describe what you want or start from a template. Change anything later.",
++ "stepsTitle": "How a task runs",
++ "stepsLead": "Send a task from the site, the API or any OpenVibe app. Actor does the rest.",
"steps": [
[
-- "Create an agent",
-- "Pick a template or describe the job in your own words. Choose its model and its personality."
++ "Describe the task",
++ "Say what you want done, pick a mode and set a budget. Attach files or give it a robot, a site or a stream to work with."
],
[
-- "Decide what it may do",
-- "Grant it tools one by one. Anything with consequences, like publishing, spending or moving a robot, waits for your approval."
++ "Actor picks the agent",
++ "It weighs every agent system on live price, speed and success for this kind of task, picks one, and tells you why."
],
[
-- "Let it work",
-- "It runs in the cloud on schedules and triggers, and you can reach it from any OpenVibe site."
++ "Checked, then delivered",
++ "A different model checks the result; a failed check moves the task to a stronger agent. You see the cost to the cent."
]
],
-- "featuresTitle": "What your agent can do",
-- "featuresLead": "An agent is only as useful as what it can reach. Yours can reach the whole network.",
++ "featuresTitle": "Modes",
++ "featuresLead": "Tell Actor what matters most. It balances the rest.",
"features": [
[
-- "fa-cloud",
-- "Always on",
-- "Runs in OpenVibe's cloud around the clock. Close your laptop; it keeps going."
++ "fa-coins",
++ "Cheapest",
++ "The lowest expected cost that still meets the task's quality bar."
],
[
-- "fa-circle-nodes",
-- "Uses the whole network",
-- "Live, Chat, Blog, Wiki, Community, Tools, Media, Host, Bot and more, each through its own API."
++ "fa-scale-balanced",
++ "Balanced",
++ "The default: cost, quality and speed weighed together."
],
[
-- "fa-window-maximize",
-- "Browses and codes",
-- "A sandboxed browser and code runner for work outside the network."
++ "fa-trophy",
++ "Best",
++ "The highest chance of a right answer first time; cost comes second."
],
[
-- "fa-brain",
-- "Remembers",
-- "Long-term memory you can read, edit and wipe."
++ "fa-bolt",
++ "Fastest",
++ "The shortest time to a checked result."
],
[
-- "fa-hand",
-- "Asks first",
-- "An approval inbox, a full activity log, spending limits and a kill switch."
++ "fa-lock",
++ "Private",
++ "Only agents that keep your data on OpenVibe: its own runtime and open models on its hardware."
],
[
-- "fa-shuffle",
-- "Any model",
-- "Routed through OpenVibe.AI: hosted, open or local models, or your own key."
++ "fa-wallet",
++ "Budgets",
++ "A hard limit per task and per day. Actor never goes over it."
]
],
++ "more": [
++ {
++ "id": "routes",
++ "title": "What it routes to",
++ "lead": "Every agent system worth using, behind one API, one key and one bill.",
++ "cards": [
++ [
++ "fa-circle-nodes",
++ "OpenVibe's own runtime",
++ "Uses every OpenVibe product as a tool, with models chosen by OpenVibe.AI."
++ ],
++ [
++ "fa-cloud",
++ "Hosted agent platforms",
++ "Agent platforms from companies like OpenAI and Anthropic, with their browsers, code runners and search."
++ ],
++ [
++ "fa-code",
++ "Coding agents",
++ "For tasks that are really code: fixes, features, reviews and tests."
++ ],
++ [
++ "fa-server",
++ "Open-source agents",
++ "Open runtimes and open models on OpenVibe's own hardware: the Private mode."
++ ],
++ [
++ "fa-key",
++ "Your own keys",
++ "Bring a key for any platform and pay it directly; Actor still routes, checks and explains."
++ ],
++ [
++ "fa-plug-circle-plus",
++ "New ones, fast",
++ "A new agent platform is one adapter. The day it lands, every app and agent can use it."
++ ]
++ ]
++ },
++ {
++ "title": "Balanced live, explained always",
++ "lead": "Choices come from what actually happens, not from marketing pages.",
++ "cards": [
++ [
++ "fa-chart-line",
++ "Live signals",
++ "Price, speed, success rate and outages per agent system and per kind of task, updated from real runs."
++ ],
++ [
++ "fa-arrows-rotate",
++ "Failover",
++ "When an agent system slows down or fails, tasks move to the next best one at once."
++ ],
++ [
++ "fa-list-check",
++ "Checked results",
++ "Cheap first, then stronger agents only when a check fails: you pay for strength only when a task needs it."
++ ],
++ [
++ "fa-magnifying-glass-chart",
++ "Public rankings",
++ "Success, cost and time per agent system for each kind of task, from real traffic, with dates.",
++ null
++ ],
++ [
++ "fa-receipt",
++ "Every choice explained",
++ "Which agent ran, why it won, what else was considered and what it cost."
++ ],
++ [
++ "fa-user-astronaut",
++ "Your agents, on top",
++ "Always-on agents with memory, schedules and approvals; every task they take goes through the router."
++ ]
++ ]
++ }
++ ],
"templates": {
-- "title": "Start from a template",
-- "lead": "Each one is a starting point you can change.",
++ "title": "Start an agent from a template",
++ "lead": "Each one is a starting point you can change, and each routes its work through Actor.",
"items": [
[
"fa-tower-broadcast",
@@@ -1627,7 +1740,7 @@
]
},
"connectTitle": "Reachable everywhere",
-- "connectLead": "Your agent is part of the network, not a separate app.",
++ "connectLead": "Actor is part of the network, not a separate app.",
"connect": [
[
"fa-bars",
@@@ -1643,13 +1756,13 @@
[
"fa-robot",
"With your robots",
-- "Give it a robot on OpenVibe.Bot to patrol, check on or perform with, with your approval.",
++ "Give an agent a robot on OpenVibe.Bot to patrol, check on or perform with, with your approval.",
"https://openvibe.bot"
],
[
"fa-plug",
"From your own apps",
-- "An API, webhooks and an MCP server, so other assistants can use OpenVibe tools and talk to your agent.",
++ "An API, webhooks and an MCP server, so other assistants can hand tasks to Actor.",
"https://openvibe.codes"
]
],
@@@ -1657,24 +1770,28 @@
},
"faq": [
[
-- "How is this different from a chat assistant?",
-- "It keeps working when you leave: it has memory, schedules and triggers, and it can act across OpenVibe with the permissions you give it."
++ "Is this like OpenRouter?",
++ "Yes, for agents: one API and one bill for many agent systems, with live prices and rankings. Actor routes whole tasks rather than single model calls, and it checks the results before you get them."
++ ],
++ [
++ "Which agent systems does it use?",
++ "OpenVibe's own runtime, hosted agent platforms from companies like OpenAI and Anthropic, coding agents, and open-source agents on OpenVibe's hardware. Each is an adapter, so new ones join quickly."
],
[
-- "Can it do things without asking?",
-- "Only what you allow. You grant each tool, and anything with consequences waits for your approval. Every action is logged, and you can stop an agent at any time."
++ "How does it choose?",
++ "For each kind of task it compares price, speed, success rate and current health across agent systems, then applies your mode and budget. Every choice is recorded and explained."
],
[
-- "Which AI models does it use?",
-- "Any model OpenVibe.AI routes to, including open and local models, or your own API key."
++ "Can I keep my data on OpenVibe?",
++ "Yes. Private mode uses only OpenVibe's own runtime and open models on its own hardware."
],
[
-- "Can other apps use my agent?",
-- "Yes: an API, webhooks and an MCP server connect it to other tools and assistants."
++ "Can it act without asking?",
++ "Only as far as you allow. Anything with consequences, like publishing, spending or moving a robot, waits for your approval, and every action is logged."
],
[
"What will it cost?",
-- "You will be able to start without paying, within limits published before launch; heavier use and bigger models will be paid."
++ "You will be able to start without paying, within limits published before launch; bigger tasks and stronger agents will be paid, with the cost shown per task."
]
]
},