Commercial repo playbook
How and when we spin up panorama-enterprise, the private commercial repository. Extracted from ADR-0002 into an actionable checklist.
Why a separate repo at all
Read ADR-0002 for the full reasoning. Short version: contamination-proof boundary between OSS and commercial code + clean contributor story.
When to create it
Not yet. The project is pre-alpha. Spinning up a commercial repo too early signals to the OSS community that commercial is where the effort is going, and it saddles us with a two-pipeline burden before there's revenue to justify it.
Create panorama-enterprise when all three conditions are met:
- Panorama Community has shipped its first public release (
v0.3orv0.4, roughly Sept–Nov 2026). - We have a signed letter of intent from at least one paying design-partner customer who wants a feature we're willing to put in Enterprise.
- We have a full-time person who will own Enterprise (can be the same maintainer on part-time split initially).
Until then, any "Enterprise candidate" feature sits in a docs/en/enterprise-backlog.md file in the public repo, with a note that it's intentionally deferred.
Where it lives
- GitHub organisation
panorama(public-facing) — addpanorama-enterpriseas a private repo in the same org. GitHub's Teams model lets us limit access cleanly. - Alternative if the OSS community grows before Enterprise: consider
panorama-coas a separate corporate org and keep the community inpanorama. Decide at creation time based on ownership structure.
Repo layout (when we create it)
panorama-enterprise/
├── README.md # "This is the commercial edition..."
├── LICENSE # Proprietary commercial licence
├── packages/
│ ├── whitelabel/ # Per-tenant theming engine
│ ├── soc2-pack/ # SOC-2 audit evidence export
│ ├── okta-advanced/ # Premium Okta connector
│ └── policy-as-code/ # Rego-based ABAC
├── apps/
│ └── ops-console/ # Commercial-only ops dashboard
├── infra/
│ └── pinned-community/ # git submodule pointing at a Community tag
├── scripts/
│ └── bump-community.ts # Automated Community-version bump
├── package.json # Depends on @panorama/* @ <pinned version>
└── pnpm-workspace.yamlThe Enterprise build consumes the Community edition as:
- A pinned npm version of
@panorama/*packages (cleanest) - A git submodule at a signed release tag of the
panoramarepo (fallback if we need to patch before an upstream release)
Never by copy-paste of Community files.
Access controls
- Write access to
panorama-enterprise: full-time Enterprise maintainers only - Read access: same + a few trusted design-partner engineers under NDA
- CI secrets: separate from Community CI; no public Actions logs leak
- Issues: private; we triage and optionally mirror a sanitised version in the Community repo if it's non-sensitive
Release cadence
- Community releases on its own train (monthly 0.x during build-up; quarterly 1.x after GA)
- Enterprise releases follow a Community release by 1–2 weeks:
- Community v1.4.0 ships Monday
- Enterprise automation opens a bump PR in
panorama-enterprise - Engineers review, adjust anything (new API, breaking change), run the Enterprise-only test suite
- Enterprise v1.4.0 ships the following Monday
- Never release an Enterprise that depends on an unreleased Community
CLA
Contributions destined for the commercial repo require the contributor to have signed the Panorama CLA (Community-only contributions do not). The CLA grants the Panorama project the right to dual-license. We use the Apache Individual CLA text verbatim so lawyers can approve quickly.
Community-only contributors never see or sign a CLA.
Pricing strategy (outline)
Published separately at panorama.vitormr.dev/pricing when we're ready to sell. Typical shape:
- Starter — up to 50 users — per-user/month, credit card
- Growth — up to 500 users — per-user/month, invoice + PO
- Enterprise — unlimited — negotiated annual, SLA, SOC-2, support
- Non-profit & education discount (tier below Starter at cost)
- Panorama-hosted SaaS tier priced separately (adds infra + SOC-2 hosting)
Trademark registration
Spin up the commercial repo at the same time as the trademark filings (ADR-0004). The commercial entity holds the trademark; Community uses it under a perpetual royalty-free licence. This keeps the brand consistent across both editions and protects us if a SaaS fork tries to use the wordmark.
Day-one Enterprise features
The first set that justifies the split (and none sooner):
- White-label / theming — per-tenant logo, colour, email template, login page, custom domain. Relatively self-contained; high value for buyers.
- SOC-2 audit pack — evidence export, control mapping, scheduled attestation reports. Sellable into mid-market.
- Priority support dashboards — customer-facing ticketing that customers plug into via Zendesk / Intercom.
Deferred to a second wave:
- Premium IdP connectors (Okta advanced, PingFederate)
- ABAC / policy-as-code
- Predictive maintenance
- Data residency pinning
Exit clauses
If the Enterprise edition shuts down or the maintaining company ceases to operate, we commit to releasing the Enterprise repo under AGPL-3.0-or-later within 90 days, so customers are never stranded. This clause lives in the Enterprise licence text and the website — it's a credibility anchor for buyers comparing us against closed-source competitors.
Checklist before day 1 of Enterprise
- [ ] Trademark registrations filed (US + EU + BR)
- [ ] Commercial entity / LLC / Ltda set up
- [ ]
panorama-enterpriserepo created, access controls set - [ ] CLA workflow live (CLA Assistant or equivalent)
- [ ] Private CI with pinned-Community automation
- [ ] Pricing page draft
- [ ] Legal: commercial licence text reviewed (template plus adjustments)
- [ ] Support desk: email (support@), ticketing tool, on-call rota
- [ ] Observability for Enterprise-only modules separated from Community's