One-command Kubernetes platform for the sub-agency model.
Rapidly acquire, build, scale, and exit businesses with AI. Boot locally in 3 min ($0). Provision new apps from the UI — every change is a git commit, every rollback is a git revert.
Quick Start · The console · Add a business · GitOps write-back · Reproducibility
Running multiple businesses on Kubernetes normally means re-deriving the same infra decisions per business, wiring GitOps by hand, and juggling three different UIs to see what's actually running. This repo bundles all of that into one repo, one command, one console.
What you get out of the box:
- Local kind cluster (~3 min boot, $0)
- ArgoCD wired app-of-apps, pinned versions
- External Secrets Operator, NATS JetStream, Prometheus + Grafana as ArgoCD Applications
- Multi-tenant Next.js console: master view aggregating every business + per-business drill-in
- UI-driven app provisioning: fill a form → commit lands in git → ArgoCD reconciles
- Rollback via git revert: history page links straight to GitHub's revert UI
- One script up, one script down. No manual state, ever.
graph TD
subgraph "You"
U[Console UI]
end
subgraph "GitHub"
G[equity-platform repo]
end
subgraph "Kubernetes cluster"
A[ArgoCD]
subgraph "Platform (shared)"
NG[envoy-gateway]
ES[External Secrets]
NA[NATS JetStream]
PR[Prometheus + Grafana]
end
subgraph "Tenants (you create these)"
T1[business-a-prod ns]
T2[business-b-prod ns]
T3[business-c-prod ns]
end
end
U -->|Server Action: putFile| G
G -.->|poll every ~1 min| A
A -->|reconcile| NG
A -->|reconcile| ES
A -->|reconcile| NA
A -->|reconcile| PR
A -->|reconcile| T1
A -->|reconcile| T2
A -->|reconcile| T3
U -.->|read live state| A
U -.->|read metrics| NA
equity-platform/
├── local/ → kind cluster + one-command up.sh / down.sh
├── bootstrap/ → ArgoCD install + root app-of-apps + tenant namespaces
├── apps/ → ArgoCD Application manifests (children)
├── charts/ → per-app Helm values, pinned versions
├── console/ → Next.js 15 multi-tenant UI (see below)
└── .github/ → CI (shellcheck + yamllint + kubeconform) + CodeQL
Inside console/app/:
[tenant]/
├── page.tsx → per-tenant overview
├── apps/
│ ├── page.tsx → ArgoCD Applications table
│ └── new/ → provision form + Server Action (writes to git)
├── cron/ → CronJobs table with staleness heuristic
├── email/ → deliverability page (per-tenant Postgres)
├── events/ → NATS JetStream streams + consumers
└── history/ → recent commits + revert links
Routes: /master = aggregate, /<slug> = per-business drill-in.
The fastest way in: visit the hosted landing site → sign in with GitHub → we fork this repo to your account. Then clone your fork and boot locally. Marketing + auth live on Vercel (landing/); the platform itself runs on your machine (there's no cluster on Vercel).
See landing/README.md for the Vercel + GitHub App setup.
Requirements: Docker, Node.js 20+, Homebrew on macOS (or your platform's kind/kubectl/helm binaries).
# 1. Install tools
brew install kind kubectl helm
# 2. Clone
git clone https://github.com/jaredzwick/equity-platform ~/equity-platform
cd ~/equity-platform
# 3. Boot the cluster
./local/up.sh
# → creates kind cluster (~90s)
# → installs ArgoCD v2.13.1 (~2min)
# → applies platform namespaces (no tenants yet — you create them via the console)
# → applies root app-of-apps if a git remote is set
# 4. Start the console
cd console
npm install
npm run dev
# → open http://localhost:3030You'll land on /master. Click a business in the sidebar to drill in.
Tear down when done:
./local/down.shIdempotent. Destroys the kind cluster. Filesystem stays clean.
Agency settings screenshot: docs/screenshots/04-master-settings.png (full-height form).
The console is the whole UX. Sidebar lists every business (auto-discovered from namespace labels). Each business has 6 tabs:
| Tab | What it shows | Data source |
|---|---|---|
| Overview | Apps + CronJobs at a glance, stale-cron warnings | k8s API (filtered by tenant ns) |
| Apps | ArgoCD Applications table, one-click "+ New Application" | k8s API (argoproj.io/Applications) |
| Cron | Every CronJob, staleness heuristic (red if no success in 24h) | k8s BatchV1 API |
| Deliverability, bounce rate, complaint rate | Per-tenant Postgres email_events (opt-in) |
|
| Events | NATS JetStream streams + consumers + lag | NATS /jsz monitoring endpoint |
| History | Recent commits to this repo + revert links | GitHub API |
Master view (/master) aggregates across every business.
kubectl port-forward -n nats svc/nats-headless 8222:8222 &Or set NATS_MONITOR_URL in console/.env.local. Full env template in console/.env.example.
Preferred: use the console. Master view → + New Business → fill in display name + slug + namespace → Save. The console:
- Commits a new namespace block to
bootstrap/00-namespaces.yamlvia GitHub - Applies the namespace to the live cluster immediately
- Opens the new tenant's Profile tab so you can fill in brand, offer, legal, etc.
By hand: append a namespace block to bootstrap/00-namespaces.yaml:
apiVersion: v1
kind: Namespace
metadata:
name: myshop-prod
labels:
equity.io/tenant: myshop
equity.io/tenant-name: MyShopThen kubectl apply -f bootstrap/00-namespaces.yaml or re-run ./local/up.sh (idempotent).
Either way, the console auto-discovers the new tenant on next request — appears in the sidebar and gets its own drill-in view.
Each tenant has a declarative YAML profile at businesses/<slug>.yaml in the platform repo. Edit via the console (/<slug>/profile) or by hand. Fields: identity (LLC, domain, emails), brand (logo, colors, tagline), offer (price, Stripe IDs, CTA), copy (headlines, about, voice), legal (jurisdiction, EIN, policy URLs), integrations (GHL, n8n, Meta, GA, PostHog, Slack). Schema lives in console/lib/business-profile.ts — add a field there and the form regenerates.
The console can provision new ArgoCD Applications for you. Every change is a commit; every commit is reversible.
Enable it:
- Create a fine-grained GitHub PAT with Contents: Read and Write scoped to this repo.
- In
console/.env.local:GITHUB_TOKEN=github_pat_... GITHUB_REPO=jaredzwick/equity-platform - Restart
npm run dev.
Use it: Sidebar → pick a business → Apps → + New Application.
Form submit
│
▼
Server Action ─▶ GitHub API ─▶ 2 commits land in the repo
│ │
│ ▼
│ ArgoCD polls (~1 min)
│ │
▼ ▼
Redirect to ArgoCD reconciles new Application
/<tenant>/apps │
▼
App live in cluster
Rollback: History tab → revert → on any commit → opens GitHub's one-click revert PR → merge → ArgoCD reconciles previous state (~1 min).
The whole system boots and tears down with two scripts. This is the promise:
./local/up.sh # boot: kind + ArgoCD + platform apps + tenants
./local/down.sh # nuke: everything goneNothing is manual. Every infra change is a file in this repo. Every runtime change is a commit in this repo (via console) or a kubectl apply in your terminal.
Verified end-to-end on every push: shellcheck + yamllint + kubeconform against bootstrap/ and apps/. Required to merge. CodeQL runs weekly.
| Choice | Alternative | Why this |
|---|---|---|
| kind local | k3d / minikube | Best ArgoCD-local docs, ~90s boot |
| ArgoCD GitOps | Flux, no GitOps | Better UI = better observability for solo devs |
| App-of-apps | ApplicationSet | Simpler; upgrade when >20 apps |
| NATS JetStream | Redis Streams / Kafka | Persistent + replayable + no ZooKeeper |
| External Secrets Operator | SOPS / Sealed Secrets | Backend-agnostic — swap DO Secrets / 1Password / SOPS |
| Namespace-per-tenant | Cluster-per-tenant | Cheaper for solo shops |
| Contents API for write-back | Local git clone + shell out | No git state to manage; works local + in-cluster |
| 2 commits per new app | Git Data API (atomic) | Simpler; upgrade when atomicity bites |
| Revert via GitHub link | In-console revert | Keeps destructive actions in the review-friendly flow |
- cert-manager + Let's Encrypt ClusterIssuer
- Alertmanager → Slack integration
- Per-tenant NATS subject prefixes (
events.<tenant>.>) - Grafana panels embedded in tenant pages
- Prod overlay for DO Kubernetes
- 1-commit-per-app via Git Data API (atomicity)
- In-console diff + revert (no GitHub round-trip)
Business Source License 1.1 © 2026 Pypes LLC. Auto-converts to Apache 2.0 on 2030-08-03. See LICENSE + NOTICE.
TL;DR:
- ✅ Self-host it internally to run your own business — free forever.
- ✅ Read, modify, fork, redistribute the source.
- ❌ Offer it as a hosted/managed SaaS to third parties that competes with Pypes LLC's hosted version — that needs a commercial license (
commercial@pypes.dev). - 🔓 On 2030-08-03 (or four years after each release, whichever is later), the license auto-converts to Apache 2.0.
Pypes LLC operates a commercial hosted equity-platform — a separate offering not covered by this repository. See COMMERCIAL_BOUNDARY.md for how the OSS core and commercial layer are split.





