frontend), an allowlisted FastAPI product API (services.api.product_app:app), a schema-per-tenant PostgreSQL data layer, and two PostgreSQL-backed workers that provision tenants, train models, materialize insights, and deliver email. It intentionally does not document the historical research workbench (services.api.main, apps/web) except where the Research Workbench tab calls it out explicitly as a separate, non-deployed surface.
Who this is for
Engineers joining the team who need to run the product stack locally, understand tenant isolation and lifecycle, wire a frontend view to a real endpoint, or take a change through staging and production. The tone here is precise and factual: every path, port, endpoint, and table name in these pages has been checked against the current codebase, not against older prose docs.If something here disagrees with an older document under
docs/ in the backend repo, the code wins. These pages call out real gaps and stubs rather than describing aspirational behavior.Where to go next
Quickstart
Clone, run the local doctor, bring up the product stack with Docker Compose, and log in as staff in under 10 minutes.
Developer onboarding
A guided tour of both repos, the local product stack in depth, and the full onboarding-to-live walkthrough.
Architecture
Control plane vs. tenant schemas, the two workers, request lifecycle, security model, and observability surface.
API reference
The 41-operation allowlisted product API (plus three health endpoints): authentication, conventions, and every endpoint the frontend actually calls.
Features
What the staff onboarding portal and tenant console actually do, end to end, from provisioning through remediation.
Deployment & operations
Environments, the Render/Vercel demo topology, AWS and Azure Terraform/Bicep, migrations, and incident runbooks.
How the platform is organized
Causeloop separates two concerns that are easy to conflate: a control plane that knows about every tenant (identity, lifecycle state, provisioning, audit trail), and a tenant plane that is a privatetenant_<slug> PostgreSQL schema per customer, protected by both schema separation and PostgreSQL row-level security as defense in depth. An onboarding admin walks a new tenant through provisioning, historical data ingest, training-config, training, activation, and invitation entirely inside this control plane before the tenant is flipped to live. See Core concepts for the full lifecycle and Tenancy and data model for how isolation is enforced at the database layer.