10 free hours of engineering. · 1-hour scoping call up front — we'll start this week.Claim hours →
The math

The 80% you'd otherwise rebuild.

Every multi-tenant SaaS spends its first quarter rebuilding the same boring infrastructure. Auth. Tenants. Roles. Onboarding. Admin. Audit. Scheduler. Agent plumbing. Skip it.

You'd normally buildWe've already shipped itYou write
Auth (email, OAuth, SAML, SSO, API keys)JWT + Firebase, hardenedZero code
Tenant model + onboardingCreate/suspend/export, billing hooksWire your billing provider
RBAC engineModule-declared roles, tenant-scoped grants"roles": […]
Audit logPlatform-level, exportableZero code
Background jobsScheduler, cron + interval, tenant-scoped@scheduled
Agent frameworkExecutor, tool registry, skills, memory, multi-provider failover@platform_tool
Admin consoleTenants, modules, pipeline, sandbox, auditZero code
Your domain featuresThat's all yoursYour modules
From zero to multi-tenant

The first eight weeks.

01

Week 1 · License + deploy

Sign the platform license. Fork the repo into your org. Deploy to your GCP project. Auth, tenants, admin console live.

02

Week 2 · First module scaffolded

Pick the simplest piece of your domain. CLI-scaffold it. The agent sees its tools the moment they exist.

03

Week 3–4 · First module shipped

Routes, tools, UI panel, migration. Subscribe a sandbox tenant. The thing works end-to-end.

04

Week 5–6 · White-label + onboarding

Theme the tenant UI. Wire your billing provider's webhooks. Self-serve tenant signup if you want it.

05

Week 7–8 · Second module + GA

With one module behind you, the second is faster. You're shipping. The platform is the part you don't think about.

Your operating model

You run the cloud. You bill the customers. You own the brand. You write the modules.

$
Per-tenant or rev-share pricing

Pick what fits your business. No per-seat surprises.

Platform upgrades quarterly

Semver-tagged. Patch notes. You pull them on your schedule.

Direct line to engineering

Slack channel with the engineers who maintain the core. Not a help desk.

Optional managed mode

Have us run it on our GCP until you're ready to take over.

Write a manifest. Get a SaaS.

What "ship a module" looks like.

Three files, one CLI command, and a tenant can use your feature.

1. The manifest
{
  "code": "contracts",
  "name": "Contract Renewals",
  "version": "0.1.0",
  "roles": ["sales", "manager"],
  "ui_panel": "module-ui.tsx",
  "table_prefix": "con_"
}
2. The tool
@platform_tool(name="contracts.renewals_due", roles=["sales"])
async def renewals_due(ctx, within_days: int = 30):
    rows = await ctx.tenant_db.fetch(
        "SELECT * FROM con_contracts WHERE renews_on < $1",
        date.today() + timedelta(days=within_days),
    )
    return [dict(r) for r in rows]
3. The UI panel
import { ModulePanel, useTool } from "@platform/sdk";

export default function Contracts() {
  const { data, loading } = useTool("contracts.renewals_due", { within_days: 60 });
  return (
    <ModulePanel title="Renewals (next 60 days)">
      {data?.map((r) => <Row key={r.id} {...r} />)}
    </ModulePanel>
  );
}

And the agent already knows about it.

The moment your tool is decorated, the executor can call it. Your operators say "show me renewals due in the next 60 days" and the agent walks the data — no extra wiring.

White-label, end to end

Your customers see your brand.

Logo, color, typography

Theme tokens at the root. Replace them; the entire tenant console retints.

Custom domain per tenant

tenant.yourbrand.com — SaaS-style, with proper TLS.

Email & invitations

Branded onboarding emails. Your domain, your sender, your template.

Help / docs URL

Link your docs in the console shell. Or hide the docs link entirely.

Agent persona

Name and voice the assistant. We provide a tested baseline; rewrite freely.

Admin console

Optionally available to your team, hidden from tenants. Or fully co-branded.