Published in openvibe-contracts v0.76.0 (docs/adr/ADR-034-platform-north-star.md), rendered as is.

ADR-034: The platform north star — an open, affordable cloud

Status: Proposed 2026-09-28, for the owner's review. The owner's direction: "highly optimized, efficient, modular and fully scalable … powerful and interconnected, with a full SDK and API … the open affordable version of AWS one day … moddable." This ADR turns that into rules that every later decision and implementation follows. It guides roadmap workstream WS-W.

Context and current evidence

What exists already maps onto the primitives of a cloud:

| Cloud primitive | OpenVibe today | Decisions | |---|---|---| | Identity and access (IAM) | Network: subjects, OAuth 2, service and app principals, capability grants, staff maps, revocation | ADR-001, ADR-003 | | Accounts and tenants | Network projects: members, apps, environments, credentials, grants, quotas; project_id in Media, Host, Events | ADR-014 | | Object storage (S3) | Media: typed objects, namespaces, grants, signed URLs, B2 canonical + R2 hot tier, verification; an S3 subset is decided | ADR-006, ADR-031 | | Messaging (SNS/SQS/EventBridge) | Events: durable outbox/inbox, v2-signed webhooks, replay, realtime SSE with resume | ADR-004, ADR-005 | | Hosting and compute | Host: static sites, ovhost deploy/rollback/readiness/drills; Stage B for projects; Stage C (untrusted code) undecided | ADR-032 | | AI (Bedrock) | OpenVibe.AI: versioned workflows and templates, routes, BYO credentials, quotas, local models | ADR-015 | | Search, ingestion | Search, Sources | ADR-017, ADR-018 | | Billing and metering | Billing ledger, common.usage-recorded, per-actor limits, AI quotas | ADR-012 | | Developer surface | Codes (portal, apps, playgrounds, docs), openvibe-sdk v0.13, Contracts v0.75 | ADR-002, ADR-008 | | Extensions | Mods with their own principals, budgets and grants; Tools platform API | ADR-013, ADR-027 |

Everything runs on one host: about 25 Node services, one SQLite database each, as systemd units. Measured load is about 1% of what SQLite handles (ADR-007 amendment, 2026-09-26). Deploys are manual ovhost deploy runs.

At a much larger size, the database engine and the orchestrator are not what is expensive to change. The expensive things are boundaries: how tenants are separated, how resources are named, how access is decided, what the API contract is, and how usage is counted. Each of those touches every row, every route and every event, so changing it late means migrating everything. Today they are cheap to set.

Decision

1. Boundaries now, infrastructure when measured

Invest now in what is expensive to retrofit: tenancy, resource names, authorization, contracts and metering. Defer what is cheap to change later until a measured trigger says so: PostgreSQL (ADR-007's triggers), more hosts, containers (ADR-032), regions. A trigger turns into a planned move, never a rewrite, because the boundaries were right.

2. Every resource belongs to a project and has one name

3. One authorization model

4. Contracts are the product; SDKs, docs and tools are generated from them

5. Control plane and data plane; cells when one host is not enough

6. One service kit

Every service is built from the same kit:

create-openvibe-service generates a new service with readiness, metrics, limits, an outbox, drills, release.json, the README and STATUS.json that docs-currency expects, and CI already wired. A new cloud service is then only its domain code.

7. Deploys are pulled, gated and ordered by contracts

8. Extensibility at four levels, one manifest

  1. Events and webhooks (exist): a project subscribes to whatever its grants allow.
  2. Functions: project code run on events, schedules or HTTP (the "Lambda" level).
  1. UI extension points: named slots in the OpenVibe Frame, Live (overlays, chat commands, dashboard widgets), Games (mods) and Community (thread types).
  1. Marketplace: listings, review tiers (ADR-013 trust), signed packages, install counts, and revenue share through Billing. Paid listings need ADR-025 reopened first.

Mods, bots, functions and integrations are all extensions. One extension-manifest@1, generalizing mod-manifest@1, describes each one: its runtime, entry points, requested capabilities with resource scopes, and budgets.

9. Metering is a primitive, and affordable is a design target

10. Efficiency is measured, not assumed

11. Observability is part of the product

Every project can see its own traces (traceparent exists), metrics and logs, in the console and through the API, with retention per plan.

12. Many locations: load balancing, regions, edge nodes and geolocation

There are two kinds of location, because most of what "near the user" buys is cheap to place, while data is not.

Regions are full cells.

Edge nodes are small, cheap machines in many places. They run one agent with a few roles and hold no tenant data:

Edge nodes are listed in the registry with their location (city, country, coordinates, provider), roles, capacity and health. The same deploy controller (section 7) manages them.

Load balancing has three layers.

  1. Global, for HTTP and WebSocket. Cloudflare's anycast proxy with health-checked origin pools and geo steering, as today's proxy already does for one origin.
  2. Global, for protocols Cloudflare does not proxy (RTMP, TURN, game UDP). Geo-steered DNS picks candidate nodes, and the client confirms with measured round-trip time (below).
  3. Inside a region. nginx upstreams generated from the registry and checked by /ready. They are sticky where state lives in a process (a chat room by room hash, an ingest session by stream key), and plain round-robin elsewhere.

Geolocation is a platform service, not per-product code.

  1. measured round-trip time from the client to node beacons (small HTTPS or WebSocket endpoints on each edge node; the browser or game client times a few requests);
  2. Cloudflare's colo and country headers;
  3. an offline IP-to-region database.

What this enables. These are examples, not a closed list:

Consequences

Phasing (roadmap WS-W)

  1. The deploy controller, phase 1 (automatic deploys for low-risk services). Resource-name and grant-scope schemas in Contracts. Generated OpenAPI and AsyncAPI. The node registry schema (location, roles, capacity) and openvibe-sdk/geo, working with one location.
  2. Signed release packages and the release layout for every service. The service kit generator. extension-manifest@1, with mods migrated onto it. openvibe-sdk/policy.
  3. The Stage C function sandbox. Metering through Billing with a public price list. Per-project observability. The ov CLI. The first edge nodes (probe and relay roles on a few cheap machines on other continents), the probes API, and multi-location uptime checks.
  4. Cells, and the control plane's move to PostgreSQL, when a trigger fires. Edge ingest and cache roles. A second region with project home regions and data residency. Geo-steered load balancing for non-HTTP protocols. The marketplace, after ADR-025 is reopened.

What this ADR does not claim

None of the new parts are running. Only what the context table lists exists today. Each phase reports progress through the roadmap plan and each service's STATUS.json.