mTLS + RBAC + audit built in
Keeper↔Soul transport is gRPC over mTLS. RBAC, an audit log and Vault integration are part of the core, not a paid add-on. Secrets are masked on output and never hit logs in the clear.
Everything to run your infrastructure — in one platform: a web UI, LDAP/OIDC sign-in, RBAC, audit, an API and MCP, certificate rotation. Describe the desired state — Soul Stack brings all your souls to it, in pull and in push.
# desired state, not a script
apply:
- module: core.pkg
name: nginx
state: present
- module: core.file
path: /etc/nginx/nginx.conf
template: nginx.conf.tmpl
vars:
workers: {{ soulprint.cpu.count }}
- module: core.service
name: nginx
state: started
enabled: trueIdentity, access, observability and an API are built into the core — not assembled from a zoo of tools. This set usually comes from 5–7 separate products; here it ships out of the box.
Behind each decision is a specific pain it removes: scattered tools instead of a platform, arbitrary code in config, vendor lock in the add-ons, a runtime on the host.
Keeper↔Soul transport is gRPC over mTLS. RBAC, an audit log and Vault integration are part of the core, not a paid add-on. Secrets are masked on output and never hit logs in the clear.
Expressions are CEL (not Turing-complete, no side effects); files render through Go text/template in strict mode. You cannot execute arbitrary code from config — config stays config.
A custom module is a separate binary over gRPC-stdio: a crashing plugin never takes the agent down, and its author picks its license. The core is BSL; the extension ecosystem is free.
The same binary applies a Destiny both as a daemon (pull) and as a one-shot over SSH (push, no agent on the host). One implementation instead of two incompatible branches.
The soul agent is a static binary. Managed hosts need no Python, no Ruby, no interpreter: core modules are native Go inside the binary. Less on the host means less drift and less attack surface.
The operator web UI is compiled into Keeper and served at /ui. No separate observability product to deploy.
A control-plane mini-simulation running entirely client-side: Keeper plans an incarnation, resolves secrets, renders the Destiny and brings a new node to its desired state — with an honest log.
Let’s compare architecture families. Mature tools carry their own trade-offs — here’s where Soul Stack took a different path.
| Push over SSH | Agent + master | Soul Stack | |
|---|---|---|---|
| Runtime on host | an interpreter is required | a resident agent + language runtime | one Go binary, no interpreter |
| Type safety | general-purpose text templating | DSL/templates in a general-purpose language | CEL + text/template (strict) — no code execution |
| Transport | SSH | a custom bus / HTTPS, often a private CA | gRPC over mTLS |
| Delivery model | push only | mostly pull | pull and push — one module set |
| RBAC · audit · web UI | assembled from third-party tools | separate add-ons on top | built into the core — out of the box |
| Control node | stateful | stateful master + a separate database | stateless cluster (PG + Redis) |
A per-family breakdown, scale figures and a “how to choose” section live in the documentation.
The product is never crippled to sell tiers: the source is open and auditable, and revenue comes from services and managed offerings on top of the open core.
keeper · soul · soulctl · soul-lint and the core modules under BSL 1.1: the source is open and available. Every release turns Apache 2.0 after two years. The exact terms of use are in the license.
Write and ship your own modules under any license, with no strings attached from the start. The extension ecosystem belongs to the community, not to a vendor.
From legacy to unified infrastructure in a couple of steps. A web UI, access, RBAC, audit and an API — in one platform, out of the box. Start small and grow without a rewrite.