Lightweight container runtime

No daemon. No Docker.
Just containers.

cardinal is a single ~5 MB static Go binary that runs OCI images with Linux namespaces, a bridge network, cluster orchestration, and serverless functions — no dockerd, no system daemon, nothing to babysit.

Linux · unshare + overlayfs · MIT license
bash — cardinal
$ cardinal run -d -n web -p 8080:80 nginx:alpine ✓ pulled nginx:alpine ✓ container "web" created · 10.0.2.2 ✓ port 8080 → 80 (iptables DNAT)   $ curl -s http://localhost:8080 HTTP/1.1 200 OK   $ cardinal ps
~5MB
single static binary
0
daemons to run
27
one-command blueprints
Go
zero runtime dependencies
Why cardinal

Everything a container runtime should be, nothing it shouldn't.

cardinal is built for the command line: fast, predictable, and small enough to live on any VPS. It gives you the containers you need without the machinery you don't.

binary

No daemon

A single static binary talks to the kernel directly. No dockerd, no background service, nothing listening when you aren't using it.

oci

OCI images

Run any OCI or Docker image. Pull from Docker Hub, verify digests offline, and build new images with cardinal commit.

net

Bridge networking

Every container gets an IP on the cardinal0 bridge (10.0.2.0/24) with port mapping via iptables DNAT — no restart to change ports.

cluster

Cluster orchestration

Join nodes into a cluster with service scaling, rolling updates, and DNS-based service discovery — still in the same binary.

faas

FaaS / serverless

Deploy images as serverless functions with warm replicas, auto-scaling, and scale-to-zero after an idle window.

templates

One-command blueprints

A registry of 27 ready-to-deploy templates — WordPress, Minecraft, PostgreSQL and more — installed with a single cardinal blueprint install.

security

Hardened by default

Built-in seccomp profile (blocks 30+ syscalls), AppArmor support, read-only device mounts, network segmentation (--isolated), AES-256-GCM encrypted backups, and audit logging.

compose

Compose & recover

Declare multi-container stacks in cardinal.toml and start them with cardinal up. Containers with --restart always recover automatically on boot via a systemd supervisor.

How it works

One binary. Kernel namespaces. A bridge called cardinal0.

A container is just an image plus a writable overlay, pinned into isolated namespaces and wired to a private network.

H cardinal0 10.0.2.1/24 · host gateway Host
A container "web" eth0 · 10.0.2.2 nginx:alpine
B container "db" eth0 · 10.0.2.3 postgres:16

Each cardinal run launches an unshare process with PID, mount, network, UTS and IPC namespaces, pivots into an overlay rootfs, then execs your command. Containers reach each other across the bridge and reach you through DNAT port rules.

cardinal0 · routing
# A → host          ping 10.0.2.1      (gateway)
# host → A          ping 10.0.2.2      (host route)
# A → B             ping 10.0.2.3      (via bridge)
# A → B's port      curl 10.0.2.1:8080 (DNAT → B:80)
Philosophy

Design principles, not feature checklists.

cardinal is built around six ideas. They explain why there is no daemon, why the binary is 5 MB, and why security is on before you ask for it.

01

What isn't running can't break.

No daemon, no hidden process: cardinal exists only while you are using it. Idle means zero processes, zero ports, zero attack surface.

02

Size is a feature.

One ~5 MB static binary. Less code, fewer bugs, less memory, faster starts — small enough to live on any VPS.

03

The kernel is the API.

cardinal talks to the kernel directly — unshare, pivot_root, cgroups, iptables. No middleware layer inventing its own reality: what you see is what happens.

04

Persistence is a choice.

Containers die cleanly. Auto-restart (--restart always) is an explicit decision, not a hidden background service. The supervisor is opt-in, not on by default.

05

Secure by default, not after the incident.

Seccomp blocking 30+ syscalls, AppArmor, --isolated networking — on out of the box. “Safe if you configure it” is not the philosophy.

06

Capabilities are features, not products.

Clusters, FaaS, encrypted backups, audit logging — all in the same binary. No second product to install when you outgrow one container.

Read the full philosophy →
Comparison

Docker, minus the daemon.

cardinal keeps the parts of the container model that matter and drops the machinery that weighs it down.

Feature cardinal Docker
DaemonNonedockerd required
Binary size~5 MB~100+ MB
Image formatOCI / Docker V2OCI / Docker V2
Bridge networkcardinal0 · 10.0.2.0/24docker0
Auto-startsystemd supervisorsystemd dockerd
Composecardinal.tomldocker-compose
Cluster orchestrationBuilt inSwarm
FaaS / serverlessBuilt in
Seccomp / AppArmorDefault + customDefault + custom
Backup encryptionAES-256-GCM
Audit loggingBuilt inauditd integration

See the full comparison — cardinal vs Docker vs Podman →

Blueprints

Deploy real apps in one command.

A curated registry of templates for databases, game servers, web apps, and more. Install pulls the image, resolves ports, and prompts for the env vars you care about.

Browse all 27 blueprints →
Get started

Install in one line.

Native packages for Debian/Ubuntu, Fedora/RHEL, Arch, Alpine, NixOS, Snap and AppImage — or just grab the static binary. Full instructions are in the docs.

install · Universal installer
curl -fsSL https://raw.githubusercontent.com/animesao/cardinal/main/install.sh | sudo bash

Auto-detects your distro and package manager (apt / dnf / pacman / apk), installs dependencies, and verifies the SHA-256 checksum.

first containers
cardinal pull nginx:alpine
cardinal run -d -n web -p 8080:80 nginx:alpine
cardinal ps
curl http://localhost:8080
Community

Build with the cardinal community.

Join the official Discord to ask questions, share blueprints, follow releases, and talk with people building on cardinal.

Join Discord

Put your VPS to work.

No daemon to install, no compose files to fight. Read the docs and run your first container in under a minute.

Read the documentation