Supported features and platforms
Compare container runtimes, operating systems, and secret stores.
Use Docker Compose or Podman Compose for the full local-development workflow. Docker Swarm runs on one or many nodes, without development mounts or jobs.
Container runtimes
| Capability | Podman Compose | Docker Compose | Docker Swarm |
|---|---|---|---|
| Deploy services | yes | yes | Swarm stack |
| Service status | yes | yes | yes |
| Container health | yes | yes | not advertised |
| Managed networks and volumes | yes | yes | yes; shared volumes via NFS |
| Update files in managed volumes | yes | yes | unsupported |
| Direct environment interpolation | yes | yes | yes |
| Local bind mounts | yes | yes | unsupported |
| Runtime secret delivery | yes | yes | yes |
| Follow logs | yes | yes | yes, service/task stream |
| Execute a command | yes | yes | yes, tasks on the local node |
| Service placement | ignored | ignored | yes, placement |
| HTTPS routes with ACME | yes | yes | yes, on every ingress node |
| One-shot jobs | yes | yes | unsupported |
Deployment attempts to restore the last successful deployment if apply fails. See build and deploy for recovery limits. SSH access is handled by the remote daemon, not by a direct connection to a remote container engine.
Local platform support
| Platform | Trust scope | Verification |
|---|---|---|
| Debian/Ubuntu | system, sudo | CA bundle fingerprint and live CI handshake |
| Fedora/RHEL | system, sudo | extracted CA bundle fingerprint; no dedicated live runner |
| macOS | login keychain by default | keychain fingerprint and live CI handshake |
| Windows | Current User Root by default | typed X509Store query and live CI handshake |
Unknown Linux trust layouts and unsupported operating systems fail closed. Private Unix-style file permission enforcement is not implemented on non-Unix platforms, so operations requiring that guarantee are rejected there.
Release build targets
The release workflow builds the targets below. This lists build support, not download availability; see installation for the current installation path.
| Operating system | x86-64 | ARM64 | Native package |
|---|---|---|---|
| Linux glibc | x86_64-unknown-linux-gnu | aarch64-unknown-linux-gnu | .tar.gz |
| macOS | x86_64-apple-darwin | aarch64-apple-darwin | .tar.gz |
| Windows | x86_64-pc-windows-msvc | aarch64-pc-windows-msvc | .zip |
The release packages listed here use glibc on Linux. The checkout's local
./install.sh instead builds a musl Linux binary or a native macOS binary on
x86-64 and ARM64. It does not support native Windows. Release installers require
a package matching the exact operating system and architecture.
Secret storage
Authentication is private state or process input, never public project configuration.
| Provider | Operations | Revisions | Rotation | Authentication |
|---|---|---|---|---|
age | inspect, resolve, create, replace, batch replace, stage, promote, delete | compare-and-swap | staged | local X25519 identity |
env | inspect, resolve | observed process value | none | named process variable |
| OpenBao provider instance | inspect, resolve, create, replace, delete | compare-and-swap | replace | private AppRole credential |
| Vault provider instance | inspect, resolve, create, replace, delete | compare-and-swap | replace | private AppRole credential |
Age and environment storage accept text up to 1 MiB. OpenBao and Vault accept
safe text up to 512 KiB. Locations are bounded to 1,024 bytes where applicable;
environment locations must be valid variable names. mm secret provider list --output json returns driver and configured-instance descriptors without
revealing provider credentials.
Secret delivery
| Driver | Runtime | Delivery | mm plaintext lifetime |
|---|---|---|---|
direct-environment | all three | service environment | no mm file; engines may retain metadata |
operation-env-file | all three | service environment | owner-only operation file |
podman-native-secret | Podman Compose | native mounted secret | Podman-managed store |
swarm-native-secret | Docker Swarm | immutable mounted secret | Swarm-managed store (all nodes) |
compose-file-secret | Docker Compose outside Swarm | Compose file source | owner-only operation file |
Environment drivers accept text up to 1 MiB and names up to 255 bytes. Runtime
secret drivers use a conservative 500 KiB limit and accept text or binary.
Podman and Swarm support numeric UID, GID, and mode. Compose file secrets support
only UID 0, GID 0, mode 0444; other requests fail before a file is written.
Compose has no native persistent secret store. mm creates a private 0600
operation file and removes its path after Compose runs; the mounted inode remains
available to the created container, but recreation requires another operation.
Rotation is rejected if rollback material cannot be reconstructed.
One-shots reuse a configured Compose service contract, including its selected
environment and runtime secret mounts. Swarm one-shots fail capability preflight
because the CLI adapter cannot safely clone that complete contract without
placing environment values in process arguments. BuildKit secret inputs are a separate,
supported build path: build.secrets values are resolved only after review and
passed through private operation files. Compatibility planning rejects
unsupported runtime, workload, material, size, permission, and rollback
combinations before mutation.
Local services
The shared ingress, dashboard, Mailpit, and optional access-gate components are installation-wide local services. They require a configured local target, HAProxy, and either a Linux systemd host with a local Podman Compose or Docker Compose engine, or macOS with Docker Desktop and Docker Compose. They are not implemented on Windows or with other macOS container engines, and are not remote-host or multi-node service orchestration. Host publication is loopback-only where offered. Components use pinned images and ownership checks, and optional services are installed only through a reviewed plan.
Managed OpenBao and Vault support local Docker Compose and rootless Podman
Compose. They do not support managed lifecycle operations on Swarm or remote
targets. Rootless Podman requires a working user namespace and podman unshare.
For automation, capabilities JSON provides the generated runtime and secret-provider definitions.
See Known limitations for user-visible unsupported combinations.