This is the on-ramp for OSS-first teams running Atmos with self-hosted CI. The hard constraint here is real: no SaaS dependencies. Terrantula respects it. The entire cattle wedge runs on free, self-hostable tooling — Terrantula's Apache 2.0 backend + Atmos + your own CI = full functionality at zero SaaS spend.
Terrantula treats Atmos as a peer substrate, not a thing to replace. Your Atmos stacks, your workflows, your S3 state, and your CI keep doing exactly what they do today.
Atmos is your configuration layer; atmos terraform apply (driven by an Atmos workflow) executes the actual Terraform. State lives in your S3. What you lack is a fleet-wide view across stacks — placement decisions, capacity ceilings, and the relationships between tenants are scattered across manifests and runbooks.
Terrantula is the fleet layer above Atmos — it composes with it rather than competing:
atmos-workflow trigger to invoke an Atmos workflow — through a runner you deploy.terraform apply — your Atmos runner does
Terrantula's Actions modify your IaC by opening a pull request (a new stacks/tenants/<id>.yaml manifest) and/or by invoking an Atmos workflow. The actual atmos terraform apply runs on a customer-deployed runner— a Docker container or CI job you operate — against your own S3 state. Terrantula never executes Terraform itself and never hosts runners or state.
The Atmos substrate is served by a reference runner you deploy yourself. Terrantula's atmos-workflow trigger HTTP-POSTs a structured payload to your runner; the runner clones your Atmos repo, runs atmos workflow <name> -s <stack>, and POSTs back to Terrantula's callback. Nothing routes through a hosted service unless you choose the hosted option. Self-hosting is a first-class path, not a downgrade.
Start with pure visibility. The CLI ingests an Atmos stacks directory directly. Point import-atmos at the directory, tell it which entity type the stacks map to, and give it a name template built from stack vars:
Preview without writing anything with --plan:
If your Atmos repo uses a nested stack layout (subdirectories under stacks/), add --recursive to walk the tree:
Then open the dashboard:
In local mode this is entirely self-contained — an embedded SQLite database, nothing leaving your machine, no server and no signup. For the step-by-step walkthrough, follow the Quick Start.
When you grow into a cattle problem, turn on Actions backed by the atmos-workflow trigger:
OnboardTenant). Terrantula validates parameters, enforces constraints, and picks the right cell.stacks/tenants/<id>.yaml manifest and/or POSTs the workflow payload to your runner.atmos workflow provision-tenant -s <stack> against your S3 state, then POSTs the outcome back to Terrantula's callback.active) on the callback.The Terrantula catalog is identical to the TFC and bare-TF variants; only the trigger configuration changes. See the cattle-saas-tenants-atmos canonical demo, which anchors exactly this OSS-first configuration.
atmos terraform apply. Terrantula never runs Terraform.Terrantula adds the fleet view, placement, constraint enforcement, and lifecycle — entirely on tooling you host.
atmos-workflow trigger, in detail.cattle-saas-tenants-atmos canonical demo.