Ship a multi-tenant product in weeks, not quarters.
Bring your domain. We bring auth, tenancy, AI, scheduling, on-prem bridge. Write a manifest, a few @platform_tool functions, and a UI panel. Multi-tenancy ships on day one.
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 build | We've already shipped it | You write |
|---|---|---|
| Auth (email, OAuth, SAML, SSO, API keys) | JWT + Firebase, hardened | Zero code |
| Tenant model + onboarding | Create/suspend/export, billing hooks | Wire your billing provider |
| RBAC engine | Module-declared roles, tenant-scoped grants | "roles": […] |
| Audit log | Platform-level, exportable | Zero code |
| Background jobs | Scheduler, cron + interval, tenant-scoped | @scheduled |
| Agent framework | Executor, tool registry, skills, memory, multi-provider failover | @platform_tool |
| Admin console | Tenants, modules, pipeline, sandbox, audit | Zero code |
| Your domain features | That's all yours | Your modules |
The first eight weeks.
Week 1 · License + deploy
Sign the platform license. Fork the repo into your org. Deploy to your GCP project. Auth, tenants, admin console live.
Week 2 · First module scaffolded
Pick the simplest piece of your domain. CLI-scaffold it. The agent sees its tools the moment they exist.
Week 3–4 · First module shipped
Routes, tools, UI panel, migration. Subscribe a sandbox tenant. The thing works end-to-end.
Week 5–6 · White-label + onboarding
Theme the tenant UI. Wire your billing provider's webhooks. Self-serve tenant signup if you want it.
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.
What "ship a module" looks like.
Three files, one CLI command, and a tenant can use your feature.
{
"code": "contracts",
"name": "Contract Renewals",
"version": "0.1.0",
"roles": ["sales", "manager"],
"ui_panel": "module-ui.tsx",
"table_prefix": "con_"
}
@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]
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>
);
}
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.