openvibers/openvibe.vip Commits
README and STATUS: launched 2026-10-17 at openvibe.vip, checkout open since the Billing cutover (#64)
Changes
@@@ -2,11 +2,9 @@> Memberships: plans, perks and benefits recognised across every OpenVibe site.--**Status:** alpha — runtime built and tested (roadmap Wave 10). Deployed internally, **not launched**:--it runs on the host since 2026-09-23 on `127.0.0.1:4620` only, holding the Live import (on 2026-09-24:--44 creators, 43 plans, 0 memberships), with checkout closed. `openvibe.vip` keeps its--[OpenVibe.Sites](https://github.com/OpenVibers/OpenVibe.Sites) placeholder until the launch rule--below holds.++**Status:** alpha — **launched 2026-10-17** at [openvibe.vip](https://openvibe.vip) (openvibe-contracts 0.200.0),++right after the Billing cutover made OpenVibe.Billing the money ledger. Checkout is open (PowerChat and Vibes credit);++the 43 plans imported from Live are on sale, with no memberships sold yet. It runs on the host since 2026-09-23.**Domain:** `openvibe.vip` (port 4620, service id `vip`)**Decision:** [ADR-012](https://github.com/OpenVibers/OpenVibe.Contracts/blob/main/docs/adr/ADR-012-economic-classification.md) —Billing holds the entitlement truth; VIP holds plans and perks.@@@ -93,10 +91,10 @@ fnm exec --using=22.22.1 npm test # every test/*.test.js: stub Network + Billnode scripts/subscribe.js # create the three Events subscriptions for Billing's events```--Production (deployed, loopback only): `/opt/openvibe.vip`, env `/etc/openvibe/vip.env`, unit--[deploy/systemd/openvibe-vip.service](deploy/systemd/openvibe-vip.service).--The vhost [deploy/nginx/openvibe.vip.conf](deploy/nginx/openvibe.vip.conf) is not installed yet:--`openvibe.vip` still serves the Sites placeholder. The three Events subscriptions exist.++Production: `/opt/openvibe.vip`, env `/etc/openvibe/vip.env`, unit++[deploy/systemd/openvibe-vip.service](deploy/systemd/openvibe-vip.service), vhost++[deploy/nginx/openvibe.vip.conf](deploy/nginx/openvibe.vip.conf) (installed 2026-10-17: `openvibe.vip` serves VIP).++The three Events subscriptions exist.## Design@@@ -363,8 +361,8 @@ and deletion in `account_data_events`.## Before and after the Billing cutover--Billing runs in shadow mode until the Wave 8 cutover (Live stays authoritative for money,--`BILLING_AUTHORITY=live`). Until then:++The cutover happened on 2026-10-17 (`BILLING_AUTHORITY=billing` in Live and Billing): checkout is open++(`VIP_CHECKOUT_PROVIDERS=powerchat,credit`). What held before it, kept for a rollback:- keep **checkout closed** (`VIP_CHECKOUT_PROVIDERS=` empty): a subscription sold through Billingnow would be one Live does not know about. Plan pages say joining is not open yet; the API answers@@@ -429,8 +427,8 @@ Production deploys with `sudo ovhost deploy vip` on the host (strategy `git-checfast-forward `/opt/openvibe.vip`, install on a lockfile change, restart, wait for `/api/ready`).The unit is `openvibe-vip.service` on `127.0.0.1:4620`, the env file `/etc/openvibe/vip.env`. The database is`ov_vip` on the host's data role (`sudo /opt/openvibe.host/roles/data/add-service.sh vip` writes its settings); the--release migrates it at boot. The vhost [deploy/nginx/openvibe.vip.conf](deploy/nginx/openvibe.vip.conf) waits--for the launch: `openvibe.vip` serves the Sites placeholder.++release migrates it at boot. The vhost [deploy/nginx/openvibe.vip.conf](deploy/nginx/openvibe.vip.conf) serves++`openvibe.vip` since the launch (2026-10-17).Rollback: ovhost puts the previous sha back by itself when `/api/ready` does not answer 2xx after therestart; afterwards `sudo ovhost rollback vip --to <sha>`. One blocker: `idx_vip_rules_resource` (oneactive rule per resource) was replaced by a per-creator unique index, and a release from before it@@@ -438,21 +436,18 @@ recreates the narrower index, which fails at boot once two creators gate the sam## Launch rule--This repository does not make the product real, and the domain keeps its placeholder page on--[OpenVibers/OpenVibe.Sites](https://github.com/OpenVibers/OpenVibe.Sites) until all of the--following exist (plan §12.12):++Held on 2026-10-17, when `openvibe.vip` launched (openvibe-contracts 0.200.0 made VIP `live`; Network stopped parking++the domain). The rule, as written before the launch (plan §12.12):1. an owning runtime with health/readiness endpoints and observability — ✔ (`/api/health`, truthful `/api/ready`, `/metrics`);2. canonical identity/auth integration (Network subjects, scoped service principals) — ✔; the `vip` principal is provisioned on the host;3. server-rendered public routes useful without JavaScript — ✔;--4. real persistence and end-to-end workflows — ✔ against stubs; not yet against the running Billing and Events (deployed, but Billing is in shadow and checkout is closed);++4. real persistence and end-to-end workflows — ✔, against the running Billing and Events since the cutover (2026-10-17);5. capability and event registration against `OpenVibe.Contracts` — ✔ v0.19.0;6. a migration/seed strategy ✔, a security/threat review (notes above; a review by someone else is still due), sitemap/robots ✔ (no feed by design);7. acceptance tests proving the advertised functionality — ✔ for VIP itself; cross-product convergence waits for the consumers.--The launch release removes the domain from `OpenVibe.Sites/sites.json`, switches routing and--registers maturity in the ecosystem registry atomically. A placeholder is never counted as an--implemented service.++A placeholder is never counted as an implemented service.---@@@ -3,7 +3,7 @@"stage": "alpha","code": true,"deployed": true,-- "deployment": "Deployed internally, not launched: deployed with `sudo ovhost deploy vip`, /opt/openvibe.vip, unit openvibe-vip, 127.0.0.1:4620 loopback only; https://openvibe.vip still serves the OpenVibe.Sites placeholder. Principal vip; three Events subscriptions for Billing's events (secret rotated 2026-09-24); checkout closed (VIP_CHECKOUT_PROVIDERS empty). On 2026-09-24 production held the Live import: 44 creators, 43 plans (one per creator), 0 memberships while Billing runs in shadow.",++ "deployment": "Launched 2026-10-17 at https://openvibe.vip (openvibe-contracts 0.200.0 made VIP live; vhost deploy/nginx/openvibe.vip.conf installed): deployed with `sudo ovhost deploy vip`, /opt/openvibe.vip, unit openvibe-vip, 127.0.0.1:4620 behind nginx. Principal vip; three Events subscriptions for Billing's events. Checkout open since the Billing cutover (VIP_CHECKOUT_PROVIDERS=powerchat,credit): 43 plans imported from Live, 0 memberships sold on launch day.","contracts": "openvibe-contracts v0.200.0","sdk": "openvibe-sdk v0.50.1","shared": "openvibe-shared v4.3.0",@@@ -29,8 +29,7 @@"crawler and AI-reader artifacts: /llms-full.txt serves the full text of the home, public creator and plan-terms pages (openvibe-shared/seo, cached 3600 s), and IndexNow (openvibe-shared/indexnow, INDEXNOW_KEY) serves its key file at /<key>.txt and pings the creator page, terms page and sitemap when a plan is published, edited or archived"],"not_yet": [-- "not launched: openvibe.vip is still an OpenVibe.Sites placeholder and the service answers on loopback only",-- "checkout is closed until the Billing cutover (Billing runs in shadow; the owner must re-point the PowerChat webhook first); no billing.* event has reached VIP",++ "no membership sold yet: the first real purchase through Billing (PowerChat or Vibes credit) is the end-to-end proof still due","Billing sells one channel subscription per member and creator: one purchasable plan per creator, no tiers, no network membership product","revocations reach Chat and Community through vip.membership.changed subscriptions (2026-09-24); Blog and Live still converge by the cache TTL (30-60 s)"],
@@ -2,11 +2,9 @@
@@ -2,11 +2,9 @@
> Memberships: plans, perks and benefits recognised across every OpenVibe site.
> Memberships: plans, perks and benefits recognised across every OpenVibe site.
-**Status:** alpha — runtime built and tested (roadmap Wave 10). Deployed internally, **not launched**:
-it runs on the host since 2026-09-23 on `127.0.0.1:4620` only, holding the Live import (on 2026-09-24:
-44 creators, 43 plans, 0 memberships), with checkout closed. `openvibe.vip` keeps its
-[OpenVibe.Sites](https://github.com/OpenVibers/OpenVibe.Sites) placeholder until the launch rule
-below holds.
+**Status:** alpha — **launched 2026-10-17** at [openvibe.vip](https://openvibe.vip) (openvibe-contracts 0.200.0),
+right after the Billing cutover made OpenVibe.Billing the money ledger. Checkout is open (PowerChat and Vibes credit);
+the 43 plans imported from Live are on sale, with no memberships sold yet. It runs on the host since 2026-09-23.
**Domain:** `openvibe.vip` (port 4620, service id `vip`)
**Domain:** `openvibe.vip` (port 4620, service id `vip`)
**Decision:** [ADR-012](https://github.com/OpenVibers/OpenVibe.Contracts/blob/main/docs/adr/ADR-012-economic-classification.md) —
**Decision:** [ADR-012](https://github.com/OpenVibers/OpenVibe.Contracts/blob/main/docs/adr/ADR-012-economic-classification.md) —
Billing holds the entitlement truth; VIP holds plans and perks.
Billing holds the entitlement truth; VIP holds plans and perks.
@@ -93,10 +91,10 @@ fnm exec --using=22.22.1 npm test # every test/*.test.js: stub Network + Bill
@@ -93,10 +91,10 @@ fnm exec --using=22.22.1 npm test # every test/*.test.js: stub Network + Bill
node scripts/subscribe.js # create the three Events subscriptions for Billing's events
node scripts/subscribe.js # create the three Events subscriptions for Billing's events
```
```
-Production (deployed, loopback only): `/opt/openvibe.vip`, env `/etc/openvibe/vip.env`, unit
-[deploy/systemd/openvibe-vip.service](deploy/systemd/openvibe-vip.service).
-The vhost [deploy/nginx/openvibe.vip.conf](deploy/nginx/openvibe.vip.conf) is not installed yet:
-`openvibe.vip` still serves the Sites placeholder. The three Events subscriptions exist.
+Production: `/opt/openvibe.vip`, env `/etc/openvibe/vip.env`, unit
+[deploy/systemd/openvibe-vip.service](deploy/systemd/openvibe-vip.service), vhost
+[deploy/nginx/openvibe.vip.conf](deploy/nginx/openvibe.vip.conf) (installed 2026-10-17: `openvibe.vip` serves VIP).
+The three Events subscriptions exist.
## Design
## Design
@@ -363,8 +361,8 @@ and deletion in `account_data_events`.
@@ -363,8 +361,8 @@ and deletion in `account_data_events`.
## Before and after the Billing cutover
## Before and after the Billing cutover
-Billing runs in shadow mode until the Wave 8 cutover (Live stays authoritative for money,
-`BILLING_AUTHORITY=live`). Until then:
+The cutover happened on 2026-10-17 (`BILLING_AUTHORITY=billing` in Live and Billing): checkout is open
+(`VIP_CHECKOUT_PROVIDERS=powerchat,credit`). What held before it, kept for a rollback:
- keep **checkout closed** (`VIP_CHECKOUT_PROVIDERS=` empty): a subscription sold through Billing
- keep **checkout closed** (`VIP_CHECKOUT_PROVIDERS=` empty): a subscription sold through Billing
now would be one Live does not know about. Plan pages say joining is not open yet; the API answers
now would be one Live does not know about. Plan pages say joining is not open yet; the API answers
@@ -429,8 +427,8 @@ Production deploys with `sudo ovhost deploy vip` on the host (strategy `git-chec
@@ -429,8 +427,8 @@ Production deploys with `sudo ovhost deploy vip` on the host (strategy `git-chec
fast-forward `/opt/openvibe.vip`, install on a lockfile change, restart, wait for `/api/ready`).
fast-forward `/opt/openvibe.vip`, install on a lockfile change, restart, wait for `/api/ready`).
The unit is `openvibe-vip.service` on `127.0.0.1:4620`, the env file `/etc/openvibe/vip.env`. The database is
The unit is `openvibe-vip.service` on `127.0.0.1:4620`, the env file `/etc/openvibe/vip.env`. The database is
`ov_vip` on the host's data role (`sudo /opt/openvibe.host/roles/data/add-service.sh vip` writes its settings); the
`ov_vip` on the host's data role (`sudo /opt/openvibe.host/roles/data/add-service.sh vip` writes its settings); the
-release migrates it at boot. The vhost [deploy/nginx/openvibe.vip.conf](deploy/nginx/openvibe.vip.conf) waits
-for the launch: `openvibe.vip` serves the Sites placeholder.
+release migrates it at boot. The vhost [deploy/nginx/openvibe.vip.conf](deploy/nginx/openvibe.vip.conf) serves
+`openvibe.vip` since the launch (2026-10-17).
Rollback: ovhost puts the previous sha back by itself when `/api/ready` does not answer 2xx after the
Rollback: ovhost puts the previous sha back by itself when `/api/ready` does not answer 2xx after the
restart; afterwards `sudo ovhost rollback vip --to <sha>`. One blocker: `idx_vip_rules_resource` (one
restart; afterwards `sudo ovhost rollback vip --to <sha>`. One blocker: `idx_vip_rules_resource` (one
active rule per resource) was replaced by a per-creator unique index, and a release from before it
active rule per resource) was replaced by a per-creator unique index, and a release from before it
@@ -438,21 +436,18 @@ recreates the narrower index, which fails at boot once two creators gate the sam
@@ -438,21 +436,18 @@ recreates the narrower index, which fails at boot once two creators gate the sam
## Launch rule
## Launch rule
-This repository does not make the product real, and the domain keeps its placeholder page on
-[OpenVibers/OpenVibe.Sites](https://github.com/OpenVibers/OpenVibe.Sites) until all of the
-following exist (plan §12.12):
+Held on 2026-10-17, when `openvibe.vip` launched (openvibe-contracts 0.200.0 made VIP `live`; Network stopped parking
+the domain). The rule, as written before the launch (plan §12.12):
1. an owning runtime with health/readiness endpoints and observability — ✔ (`/api/health`, truthful `/api/ready`, `/metrics`);
1. an owning runtime with health/readiness endpoints and observability — ✔ (`/api/health`, truthful `/api/ready`, `/metrics`);
2. canonical identity/auth integration (Network subjects, scoped service principals) — ✔; the `vip` principal is provisioned on the host;
2. canonical identity/auth integration (Network subjects, scoped service principals) — ✔; the `vip` principal is provisioned on the host;
3. server-rendered public routes useful without JavaScript — ✔;
3. server-rendered public routes useful without JavaScript — ✔;
-4. real persistence and end-to-end workflows — ✔ against stubs; not yet against the running Billing and Events (deployed, but Billing is in shadow and checkout is closed);
+4. real persistence and end-to-end workflows — ✔, against the running Billing and Events since the cutover (2026-10-17);
5. capability and event registration against `OpenVibe.Contracts` — ✔ v0.19.0;
5. capability and event registration against `OpenVibe.Contracts` — ✔ v0.19.0;
6. a migration/seed strategy ✔, a security/threat review (notes above; a review by someone else is still due), sitemap/robots ✔ (no feed by design);
6. a migration/seed strategy ✔, a security/threat review (notes above; a review by someone else is still due), sitemap/robots ✔ (no feed by design);
7. acceptance tests proving the advertised functionality — ✔ for VIP itself; cross-product convergence waits for the consumers.
7. acceptance tests proving the advertised functionality — ✔ for VIP itself; cross-product convergence waits for the consumers.
-The launch release removes the domain from `OpenVibe.Sites/sites.json`, switches routing and
-registers maturity in the ecosystem registry atomically. A placeholder is never counted as an
-implemented service.
+A placeholder is never counted as an implemented service.
---
---
@@ -3,7 +3,7 @@
@@ -3,7 +3,7 @@
"stage": "alpha",
"stage": "alpha",
"code": true,
"code": true,
"deployed": true,
"deployed": true,
- "deployment": "Deployed internally, not launched: deployed with `sudo ovhost deploy vip`, /opt/openvibe.vip, unit openvibe-vip, 127.0.0.1:4620 loopback only; https://openvibe.vip still serves the OpenVibe.Sites placeholder. Principal vip; three Events subscriptions for Billing's events (secret rotated 2026-09-24); checkout closed (VIP_CHECKOUT_PROVIDERS empty). On 2026-09-24 production held the Live import: 44 creators, 43 plans (one per creator), 0 memberships while Billing runs in shadow.",
+ "deployment": "Launched 2026-10-17 at https://openvibe.vip (openvibe-contracts 0.200.0 made VIP live; vhost deploy/nginx/openvibe.vip.conf installed): deployed with `sudo ovhost deploy vip`, /opt/openvibe.vip, unit openvibe-vip, 127.0.0.1:4620 behind nginx. Principal vip; three Events subscriptions for Billing's events. Checkout open since the Billing cutover (VIP_CHECKOUT_PROVIDERS=powerchat,credit): 43 plans imported from Live, 0 memberships sold on launch day.",
"contracts": "openvibe-contracts v0.200.0",
"contracts": "openvibe-contracts v0.200.0",
"sdk": "openvibe-sdk v0.50.1",
"sdk": "openvibe-sdk v0.50.1",
"shared": "openvibe-shared v4.3.0",
"shared": "openvibe-shared v4.3.0",
@@ -29,8 +29,7 @@
@@ -29,8 +29,7 @@
"crawler and AI-reader artifacts: /llms-full.txt serves the full text of the home, public creator and plan-terms pages (openvibe-shared/seo, cached 3600 s), and IndexNow (openvibe-shared/indexnow, INDEXNOW_KEY) serves its key file at /<key>.txt and pings the creator page, terms page and sitemap when a plan is published, edited or archived"
"crawler and AI-reader artifacts: /llms-full.txt serves the full text of the home, public creator and plan-terms pages (openvibe-shared/seo, cached 3600 s), and IndexNow (openvibe-shared/indexnow, INDEXNOW_KEY) serves its key file at /<key>.txt and pings the creator page, terms page and sitemap when a plan is published, edited or archived"
],
],
"not_yet": [
"not_yet": [
- "not launched: openvibe.vip is still an OpenVibe.Sites placeholder and the service answers on loopback only",
- "checkout is closed until the Billing cutover (Billing runs in shadow; the owner must re-point the PowerChat webhook first); no billing.* event has reached VIP",
+ "no membership sold yet: the first real purchase through Billing (PowerChat or Vibes credit) is the end-to-end proof still due",
"Billing sells one channel subscription per member and creator: one purchasable plan per creator, no tiers, no network membership product",
"Billing sells one channel subscription per member and creator: one purchasable plan per creator, no tiers, no network membership product",
"revocations reach Chat and Community through vip.membership.changed subscriptions (2026-09-24); Blog and Live still converge by the cache TTL (30-60 s)"
"revocations reach Chat and Community through vip.membership.changed subscriptions (2026-09-24); Blog and Live still converge by the cache TTL (30-60 s)"
],
],