openvibers/openvibe.tools Commits

The Tools gateway serves its own pinned OpenVibe Frame files at /shared/* (openvibe-shared/serve 1.12.0) and its server-rendered pages reference them by content hash

OP OpenVibers committed 24 Sept 2026 · 2b5104f4f0 · 4 files, +11 −8


Changes

ddiff --git a/apps/gateway/package-lock.json b/apps/gateway/package-lock.json
iindex 5b083a9..ae5caf3 100644
---- a/apps/gateway/package-lock.json
++++ b/apps/gateway/package-lock.json
@@@ -18,7 +18,7 @@
"helmet": "^8.1.0",
"jsonwebtoken": "^9.0.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.1",
-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.1"
++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0"
}
},
"node_modules/accepts": {
@@@ -1051,9 +1051,9 @@
}
},
"node_modules/openvibe-shared": {
-- "version": "1.11.1",
-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.1",
-- "integrity": "sha512-hBaZlZRVZjkGfsPQE16rQIou2lUuusADea3Evx1tVjB84FTHGHS7ZALfcXaNOk7dR53HOVTJrQ0njmScdreUiw==",
++ "version": "1.12.0",
++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0",
++ "integrity": "sha512-Qpy4YVoPMs1q/0/08/5ZODI0+7ev+Krk75nsRPsTjNCm7Eu91tt1LPnUNLt4kYfRj6duS+N9icm02gksnlMiyA==",
"license": "MIT",
"dependencies": {
"jsonwebtoken": "^9.0.0"
ddiff --git a/apps/gateway/package.json b/apps/gateway/package.json
iindex 4cff0c9..59c0bc9 100644
---- a/apps/gateway/package.json
++++ b/apps/gateway/package.json
@@@ -19,6 +19,6 @@
"helmet": "^8.1.0",
"jsonwebtoken": "^9.0.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.33.1",
-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.11.1"
++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.12.0"
}
}
ddiff --git a/apps/gateway/server/index.js b/apps/gateway/server/index.js
iindex 88e5ccb..d284d12 100644
---- a/apps/gateway/server/index.js
++++ b/apps/gateway/server/index.js
@@@ -384,6 +384,8 @@ function sendTool(req, res, file) {
// The apex is server-rendered from the registry: index, families, tool pages, search,
// sitemap.xml, robots.txt, llms.txt and /api/catalog.json (server/pages/site.js).
++// This site's own pinned copy of the OpenVibe Frame's browser files (openvibe-shared/serve).
++app.use('/shared', require('openvibe-shared/serve').handler());
app.use(require('./pages/site').createSiteRouter());
// Net tool subdomains → net.html SPA
ddiff --git a/apps/gateway/server/pages/site.js b/apps/gateway/server/pages/site.js
iindex 44bbb99..004175a 100644
---- a/apps/gateway/server/pages/site.js
++++ b/apps/gateway/server/pages/site.js
@@@ -12,6 +12,7 @@
// ═══════════════════════════════════════════════════════════════
const crypto = require('crypto');
const frame = require('openvibe-shared/frame');
++const ovServe = require('openvibe-shared/serve');
const express = require('express');
const seo = require('openvibe-shared/seo');
const icons = require('openvibe-shared/icons');
@@@ -119,14 +120,14 @@ ${head}
${appIcon.headTags({ site: 'tools', iconBase: '/assets' })}
<link rel="alternate" type="application/json" href="${SITE}/api/catalog.json" title="Tool catalog">
<link rel="preconnect" href="https://openvibe.network">
--<script src="https://openvibe.network/shared/theme-loader.js" defer></script>
++<script src="${ovServe.url('theme-loader.js')}" defer></script>
<style>${CSS}</style></head><body>${spriteSvg}
<noscript><header class="topbar"><a href="${SITE}/">${NAME}</a><nav>${families.filter(f => f.path).map(f => `<a href="${esc(f.path)}">${esc(f.name)}</a>`).join('')}<a href="/all-tools">All tools</a></nav></header></noscript>
<main class="wrap">${body}
<section aria-labelledby="net-h"><div class="sec-h"><h2 id="net-h">The rest of OpenVibe</h2></div><p class="sec-p">One account works on every site. Open source and community-run.</p>
<div class="net">${NETWORK.map(([ic, n, d, u]) => `<a class="tool" href="${u}">${icon(ic, 36)}<span class="tool-t"><b>${n}</b><small>${d}</small></span></a>`).join('')}</div></section>
</main>${frame.footer({ service: 'tools', variant: 'full', updates: '/updates' })}
--<script src="https://openvibe.network/shared/navbar.js" defer></script><script src="https://openvibe.network/shared/footer.js" defer></script><script src="/js/site.js" defer></script>
++<script src="${ovServe.url('navbar.js')}" defer></script><script src="${ovServe.url('footer.js')}" defer></script><script src="/js/site.js" defer></script>
</body></html>`;
}
@@@ -236,7 +237,7 @@ function cached(key, render) {
/** /developers: how to call any tool from code (run API, jobs, SDK, auth tiers, limits). */
function pageUpdates() {
const { families } = registry.get();
-- const body = `<nav class="crumbs" aria-label="Breadcrumb"><a href="/">Tools</a> › Updates</nav>${frame.updatesBody({ service: 'tools', siteName: NAME })}${frame.shippedScript()}`;
++ const body = `<nav class="crumbs" aria-label="Breadcrumb"><a href="/">Tools</a> › Updates</nav>${frame.updatesBody({ service: 'tools', siteName: NAME })}${`<script src="${ovServe.url('shipped.js')}" defer></script>`}`;
return shell({ families, body, head: head({ title: 'What shipped on OpenVibe.Tools', description: 'Every change deployed to OpenVibe.Tools, newest first, with the Patch notes that gather them.', canonical: SITE + '/updates' }) });
}