openvibers/openvibe.shared Commits

4.85.0: share cards for fourteen more sites (#239)

OP OpenVibers committed 12 days ago · 4e4478d71d · 21 files, +98 −3

* 4.85.0: share cards for fourteen more sites

* Icon names for the fourteen new share cards (build-icons.js)

* Changelog: the icon names

* The update log knows the fourteen new sites; Services subdomains and open.shoes resolve to their own site

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 7037c64..958945a 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -4,6 +4,19 @@ All notable changes to `openvibe-shared`. Versions follow [semver](https://semve
breaking change to any exported module, browser global or served file name is a new major.
A release is the git tag `vX.Y.Z`; consumers pin the tag's tarball (see README).
++## 4.85.0 — 2026-11-01
++
++- **Share cards for fourteen more sites.**
++ - Bench, Cam, Casino, Design, Domains, Exchange, Fun, Meme, Report, Surf, Today, Tours, Vision and Shoes had no
++ `social/<service>.jpg`. A shared link to their homes showed no picture, because shell.page's og:image is
++ `social.url(service)`.
++ - Drawn by `scripts/build-social-cards.js --only …` from each manifest's `site` block (OpenVibe.Contracts main), the
++ same way as every other card.
++ - `icons/sites.json` names their app icons (`scripts/build-icons.js`): installable apps and the app-icons test
++ need an entry for every site with a card.
++ - The update log (`shipped.js`) knows the fourteen as sites, so each one's own feed is shown. A Services subdomain
++ (`ai.`, `bench.openvibe.services`) and `open.shoes` resolve to their own site, the way Network's subdomains do.
++
## 4.84.0 — 2026-11-01
- **A page with no stylesheet of its own reads in the network's type.**
ddiff --git a/README.md b/README.md
iindex 55d6f96..a984f8b 100644
---- a/README.md
++++ b/README.md
@@@ -2,7 +2,7 @@
> Versioned UI, the OpenVibe Frame (the navbar, footer and "shipped" views every site sits in), SEO, legal and release-client packages every OpenVibe site renders.
--**Status:** alpha, v4.84.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
++**Status:** alpha, v4.85.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
consumer installs a tagged release and none keeps a vendored copy
([docs/migration-plan.md](docs/migration-plan.md) is done); each repository's `package.json` names
the tag it pins.
ddiff --git a/STATUS.json b/STATUS.json
iindex f6c65fe..ad554c2 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -4,7 +4,7 @@
"code": true,
"wave": "W2",
"package": "openvibe-shared",
-- "version": "4.84.0",
++ "version": "4.85.0",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"deployed": false,
"deployment": "none of its own: a package released as git tags; OpenVibe.Network serves /shared/* from its pinned tag, and a site can serve its own pinned copy (openvibe-shared/serve)",
ddiff --git a/icons/sites.json b/icons/sites.json
iindex c2712f9..7bb2a15 100644
---- a/icons/sites.json
++++ b/icons/sites.json
@@@ -9,6 +9,11 @@
"description": "Many models, one API. Every answer explained.",
"icon": "ai"
},
++ "bench": {
++ "name": "OpenVibe.Bench",
++ "description": "One AI benchmark and comparison engine for every room.",
++ "icon": "network"
++ },
"blog": {
"name": "OpenVibe.Blog",
"description": "Long-form, yours to keep",
@@@ -19,6 +24,16 @@
"description": "Drive any robot from your browser",
"icon": "network"
},
++ "cam": {
++ "name": "OpenVibe.Cam",
++ "description": "Your camera, your cameras, and Live's cam button",
++ "icon": "network"
++ },
++ "casino": {
++ "name": "OpenVibe.Casino",
++ "description": "Learn it, play it, never pay it",
++ "icon": "network"
++ },
"chat": {
"name": "OpenVibe.Chat",
"description": "Chat with Vibe, friends and groups",
@@@ -44,16 +59,36 @@
"description": "Deals worth sharing",
"icon": "network"
},
++ "design": {
++ "name": "OpenVibe.Design",
++ "description": "Make it yours",
++ "icon": "network"
++ },
++ "domains": {
++ "name": "OpenVibe.Domains",
++ "description": "Name it, price it, run it",
++ "icon": "network"
++ },
"events": {
"name": "OpenVibe.Events",
"description": "Events your services can count on.",
"icon": "network"
},
++ "exchange": {
++ "name": "OpenVibe.Exchange",
++ "description": "Trade what people make",
++ "icon": "network"
++ },
"food": {
"name": "OpenVibe.Food",
"description": "What should we eat?",
"icon": "network"
},
++ "fun": {
++ "name": "OpenVibe.Fun",
++ "description": "Something to do, alone, together, or live",
++ "icon": "network"
++ },
"games": {
"name": "OpenVibe.Games",
"description": "Browser games, and games you make",
@@@ -89,6 +124,11 @@
"description": "Videos, pictures and your files",
"icon": "media"
},
++ "meme": {
++ "name": "OpenVibe.Meme",
++ "description": "The internet's meme database",
++ "icon": "network"
++ },
"network": {
"name": "OpenVibe.Network",
"description": "Account and themes",
@@@ -119,6 +159,11 @@
"description": "Every rental site, one search",
"icon": "network"
},
++ "report": {
++ "name": "OpenVibe.Report",
++ "description": "Every number on OpenVibe, honest",
++ "icon": "network"
++ },
"reviews": {
"name": "OpenVibe.Reviews",
"description": "Reviews with receipts",
@@@ -139,21 +184,41 @@
"description": "Build on OpenVibe",
"icon": "network"
},
++ "shoes": {
++ "name": "OpenVibe.Shoes",
++ "description": "Every shoe, every market, the right price",
++ "icon": "network"
++ },
"space": {
"name": "OpenVibe.Space",
"description": "Make a space: an app on your account",
"icon": "space"
},
++ "surf": {
++ "name": "OpenVibe.Surf",
++ "description": "Ride, browse, watch",
++ "icon": "network"
++ },
"tips": {
"name": "OpenVibe.Tips",
"description": "Tips, paid messages and alerts for any stream",
"icon": "network"
},
++ "today": {
++ "name": "OpenVibe.Today",
++ "description": "Everything happening for you, today",
++ "icon": "network"
++ },
"tools": {
"name": "OpenVibe.Tools",
"description": "Every online tool",
"icon": "tools"
},
++ "tours": {
++ "name": "OpenVibe.Tours",
++ "description": "Go anywhere: fly, stay, walk, watch",
++ "icon": "network"
++ },
"trade": {
"name": "OpenVibe.Trade",
"description": "Watchlists and alerts",
@@@ -164,6 +229,11 @@
"description": "Memberships for creators and their software",
"icon": "network"
},
++ "vision": {
++ "name": "OpenVibe.Vision",
++ "description": "See with the best model for the job",
++ "icon": "network"
++ },
"watch": {
"name": "OpenVibe.Watch",
"description": "Know the moment it changes",
ddiff --git a/package.json b/package.json
iindex 54e2790..d96f818 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-shared",
-- "version": "4.84.0",
++ "version": "4.85.0",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"bin": {
ddiff --git a/shipped.js b/shipped.js
iindex edd2ed5..fb5be03 100644
---- a/shipped.js
++++ b/shipped.js
@@@ -45,6 +45,8 @@
video: 'Video', pics: 'Pics', rent: 'Rent', homes: 'Homes', work: 'Work', food: 'Food', help: 'Help', quest: 'Quest',
website: 'Website', fund: 'Fund', 'media-hub': 'Media Hub', extensions: 'Extensions', contracts: 'Contracts', sdk: 'SDK',
shared: 'Shared', examples: 'Examples', publishing: 'Publishing', play: 'Play', inventory: 'Inventory',
++ bench: 'Bench', cam: 'Cam', casino: 'Casino', design: 'Design', domains: 'Domains', exchange: 'Exchange', fun: 'Fun',
++ meme: 'Meme', report: 'Report', surf: 'Surf', today: 'Today', tours: 'Tours', vision: 'Vision', shoes: 'Shoes',
};
const STYLE_ID = 'ov-shipped-style';
const TEXT = 'var(--text-primary,var(--text,inherit))';
@@@ -143,6 +145,12 @@
const sub = h.replace(/\.?openvibe\.network$/, '');
return SITE_NAMES[sub] && sub !== 'network' ? sub : 'network';
}
++ // The Services family lives on its subdomains (ai., bench.openvibe.services), like the Network's.
++ if (/(^|\.)openvibe\.services$/.test(h)) {
++ const sub = h.replace(/\.?openvibe\.services$/, '');
++ return SITE_NAMES[sub] && sub !== 'services' ? sub : 'services';
++ }
++ if (/(^|\.)open\.shoes$/.test(h)) return 'shoes';
const m = /(?:^|\.)openvibe\.([a-z]+)$/.exec(h);
return m && SITE_NAMES[m[1]] ? m[1] : null;
}
ddiff --git a/social/bench.jpg b/social/bench.jpg
nnew file mode 100644
iindex 0000000..f3127d3
BBinary files /dev/null and b/social/bench.jpg differ
ddiff --git a/social/cam.jpg b/social/cam.jpg
nnew file mode 100644
iindex 0000000..c083937
BBinary files /dev/null and b/social/cam.jpg differ
ddiff --git a/social/casino.jpg b/social/casino.jpg
nnew file mode 100644
iindex 0000000..e021489
BBinary files /dev/null and b/social/casino.jpg differ
ddiff --git a/social/design.jpg b/social/design.jpg
nnew file mode 100644
iindex 0000000..d82efc5
BBinary files /dev/null and b/social/design.jpg differ
ddiff --git a/social/domains.jpg b/social/domains.jpg
nnew file mode 100644
iindex 0000000..c43a972
BBinary files /dev/null and b/social/domains.jpg differ
ddiff --git a/social/exchange.jpg b/social/exchange.jpg
nnew file mode 100644
iindex 0000000..8170c3b
BBinary files /dev/null and b/social/exchange.jpg differ
ddiff --git a/social/fun.jpg b/social/fun.jpg
nnew file mode 100644
iindex 0000000..7b6e497
BBinary files /dev/null and b/social/fun.jpg differ
ddiff --git a/social/meme.jpg b/social/meme.jpg
nnew file mode 100644
iindex 0000000..c8a8c66
BBinary files /dev/null and b/social/meme.jpg differ
ddiff --git a/social/report.jpg b/social/report.jpg
nnew file mode 100644
iindex 0000000..e72e54f
BBinary files /dev/null and b/social/report.jpg differ
ddiff --git a/social/shoes.jpg b/social/shoes.jpg
nnew file mode 100644
iindex 0000000..a1bad07
BBinary files /dev/null and b/social/shoes.jpg differ
ddiff --git a/social/surf.jpg b/social/surf.jpg
nnew file mode 100644
iindex 0000000..e36fe0e
BBinary files /dev/null and b/social/surf.jpg differ
ddiff --git a/social/today.jpg b/social/today.jpg
nnew file mode 100644
iindex 0000000..bd7c7a3
BBinary files /dev/null and b/social/today.jpg differ
ddiff --git a/social/tours.jpg b/social/tours.jpg
nnew file mode 100644
iindex 0000000..2242596
BBinary files /dev/null and b/social/tours.jpg differ
ddiff --git a/social/vision.jpg b/social/vision.jpg
nnew file mode 100644
iindex 0000000..1898f1a
BBinary files /dev/null and b/social/vision.jpg differ
ddiff --git a/test/shipped.test.js b/test/shipped.test.js
iindex 16ab39c..e081f16 100644
---- a/test/shipped.test.js
++++ b/test/shipped.test.js
@@@ -116,6 +116,10 @@ const data = {
assert.strictEqual(sf('bot'), 'bot');
assert.strictEqual(sf('www.openvibe.live'), 'live');
assert.strictEqual(sf('example.com'), null);
++ assert.strictEqual(sf('bench.openvibe.services'), 'bench', 'a Services subdomain is its own site');
++ assert.strictEqual(sf('ai.openvibe.services'), 'ai');
++ assert.strictEqual(sf('openvibe.services'), 'services');
++ assert.strictEqual(sf('open.shoes'), 'shoes');
assert.strictEqual(sf('live'), 'live');
// Every site with a share card and app icon (icons/sites.json, from the Contracts site blocks) is a registry id, so its
// own feed is the one shown: play.openvibe.network showed Network's changes while 'play' was missing (2026-10-15).