Tenant asks for a change
Portal, email, or voice intake becomes a scoped implementation brief.
Open source / GitOps-native / Vault-integrated / MIT
OpenTenant composes the Helm charts you already run into a declarative multi-tenant control plane. Each tenant gets its own release, secrets scope, domain, and configuration.
Live control-plane model
Git events enter through one reviewable manifest. Vault authorizes the exact secrets each release needs. OpenTenant compiles the graph, routes workloads to connected premium providers, and keeps every tenant in its own operational space.
# The whole SaaS — one manifest. One Helm release per tenant. platform: cluster_domain: "opentenant.cloud" vault_root_path: "secret/data/opentenant/core" services: - id: "platform-routing-mesh" engine: docker-compose template_ref: git::github.com/org/routing-mesh tenants: - id: "tenant-acme" vault_tenant_path: "secret/data/tenants/acme" userspace: kube_namespace: tenant-acme-prod domain: acme.opentenant.cloud deployments: - id: "acme-app" engine: helm # your chart, unchanged template_ref: oci://registry.org/your-chart config_patches: replica_count: 3 dependencies: - "platform-routing-mesh"
OpenTenant is the orchestration layer — underneath, it's built entirely on battle-tested infrastructure you already know.
| System | Role in OpenTenant |
|---|---|
| HashiCorp Vault | The single source of truth for every secret. Per-tenant records are the contract between provisioning and deployment. Rotation flows through automatically. |
| Supabase | Platform auth (Supabase Auth + JWT guards), Management API for orgs/projects, Postgres per tenant, Storage, and OAuth2 "bring your own project" via Supabase Connect. |
| NestJS + TypeScript | The platform service — idempotent REST API for organizations, projects, tenant lifecycle, and the OAuth2 flow. Stateful secrets? Never. Everything in Vault. |
| Kubernetes | One Helm release per tenant. Namespaces as tenant boundaries. NetworkPolicies for pod-level isolation. Gateway API / Ingress for host-per-tenant routing. |
| Vault Secrets Operator | Reads tenant records from Vault and materializes them as Kubernetes Secrets inside the cluster. |
| Reloader | Watches tenant Secrets and rolls the exact pods affected by a credential rotation. Zero manual restarts, blast radius contained to one tenant. |
| External Secrets Operator |
ClusterSecretStore backed by Vault — flat tenant registry where every key under secret/metadata/tenants/ is one deployable
tenant. |
| Terraform | Declarative tenant registry: one Vault entry → namespace + ExternalSecret + Helm release. Remove the entry, tear down all three. |
| Cloudflare |
Edge SSL with Full (Strict), wildcard DNS *.yourdomain.com, WAF, WebSockets on, Origin CA
certs on nginx-ingress, real client IPs via CF-Connecting-IP. |
| nginx / ingress-nginx | The egress controller — single entry point, path-routed single domain, streaming uploads, WebSocket-friendly, COOP/COEP headers. |
| GitHub / GitLab |
GitOps source of truth for manifests and templates ( git:: refs), CI-driven reconciliation, and container
registries for OCI charts. |
| Docker Compose / PM2 | First-class alternative engines for lighter workloads — same manifest, same validation, same Vault hydration. |
OpenTenant Mobile
Model mobile delivery as infrastructure: GitLab starts the pipeline, Vault releases only the tenant-scoped credentials that build needs, and Expo targets mobile, TV, desktop, and connected-device experiences from one reviewable flow.
A reviewed pipeline identifies the tenant, target channels, Expo profile, and release version.
Tenant change service
Every request receives an owner, an SLA clock, a scoped branch, and a review trail. Agents can change the tenant experience while validation, approval, secrets policy, and release isolation remain deterministic.
Portal, email, or voice intake becomes a scoped implementation brief.
An agent works against the tenant’s branch, environment, and approved service boundary.
Diff review, tests, security policy, and explicit approval protect the shared platform.
The approved change deploys to the tenant release with rollback provenance intact.
Technical library
Architecture and security guides for platform teams operating isolated releases, secrets, networks, domains, and edge access.
From an Ubuntu cluster and external Vault to automated isolated releases.
Read guide → 10 / GUIDEPrivate origins, explicit hostnames, and reviewable access policy on Kubernetes.
Read guide → 11 / GUIDECompile DNS, secrets, edge, and application paths for each tenant release.
Read guide → 12 / GUIDESynchronize credentials and roll only the workloads that actually depend on them.
Read guide → 13 / GUIDEOwnership, DNS, Gateway routes, certificates, renewal, and safe offboarding.
Read guide →The manifest doesn't care what it manages — processes, properties, or crops. If it can be declared, it can be tenanted.
You built a great open-source app. Now ten thousand people want it "as a service." OpenTenant wraps your existing chart: each customer gets their own release, namespace, secrets, subdomain, and branding — from one manifest.
Point OpenTenant at physical space and a tenant becomes an office, retail slot, or clinic floor. Templates become device behaviors. Vault holds the cryptographic keys to the actual door locks.
Every grow rack is a tenant. Each farm runs its own "release" of the cultivation stack — irrigation schedules, lighting curves, climate recipes — declared as versioned templates and patched per crop.
Agencies and OEMs resell software under their own brand. OpenTenant gives each reseller a fully isolated userspace with custom domain, theme, and service mix — while you operate one platform.
enabled: falseNo deployment runs without passing the static validation engine — and isolation is enforced below the application layer.
Evaluation path
OpenTenant separates declarations, execution, and secrets so your team can review each concern independently. The orchestration layer composes the system; it does not replace the infrastructure you already trust.
Inspect the current implementation →Keep your Helm charts, Docker Compose files, or PM2 configs. OpenTenant references versioned templates instead of forking them.
Platform services, tenant userspaces, config patches, and dependencies live in one reviewable YAML contract.
Cycle, missing-link, and cross-tenant dependency checks run before the engine provisions or deploys a workload.
Dedicated releases and namespaces separate workloads, while scoped Vault paths and NetworkPolicies separate credentials and network access.
The manifest is a composition and bindings engine — raw execution lives in templates, secrets live in Vault, and the engine compiles it all. One Helm release per tenant, always.
Define platform services, tenant userspaces, and their deployments in one YAML file. Commit it to your GitOps repo — GitHub or GitLab.
The engine detects dependency cycles, missing links, and unsafe cross-tenant boundaries — before anything touches runtime.
Templates are fetched, config patches applied, and every tenant record written to Vault. The Vault Secrets Operator turns records into Kubernetes Secrets; Reloader rolls pods on credential rotation — automatically.
Each tenant gets their own Helm release, namespace, Ingress, and subdomain — routed through Cloudflare with wildcard DNS and TLS. Zero manual steps per tenant.