Introduction

niso is a Linux-native alternative to Docker. It packages applications as compressed archives and runs them as first-class systemd services with full isolation — no daemon, no layers, no overhead.

If you deploy software to Linux servers, niso gives you everything Docker does — isolation, networking, volumes, multi-service composition — without the Docker daemon, layered images, or container runtime.

Processes run as regular systemd services. Packages contain your code and all its dependencies. Language runtimes (Node.js, Python, Ruby) are installed once on the host and bind-mounted into a fully isolated rootfs at activation — the process cannot see the host filesystem.

Why niso?#

Zero daemons

systemd is the runtime. No background process managing your processes.

Tiny packages

A Redis package is 1.1 MB in niso vs 40 MB in Docker. No OS layers.

Deps packaged, runtimes deduplicated

Your code + node_modules ship in the package. Runtime installed once, isolated per service.

Isolated by default

Each service gets its own user, filesystem, and network. Can't see the host or other services.

No layers

Single compressed archive. No layer caching, no build cache, no layer squashing.

Fleet deploy

Rolling, canary, and all-at-once deployments across servers via SSH.

Quick example#

Deploy a Rust HTTP server in under a minute:

bash
$ curl -sSL https://niso.dev/install.sh | sh$ niso init --template rust$ niso pack --binary target/release/my-api$ niso install my-api-1.0.0-x86_64.niso$ niso activate my-api$ niso status my-api  my-api  1.0.0  active (running)  uptime 3s  mem 12MB

How it works#

niso has three core ideas that differentiate it from Docker:

  1. Packages, not images. A .niso file is a compressed tar+zstd archive containing your binary (or app code), a manifest.toml, and an Ed25519 signature. No base image, no layers, no Dockerfile.
  2. systemd is the runtime. When you activate a package, niso generates a systemd unit file with full isolation (namespaces, seccomp, capabilities, cgroups). systemd manages the process lifecycle — restarts, logging, resource limits.
  3. Dependencies in, runtime deduplicated. Your code and all its dependencies (node_modules, pip packages, gems) ship inside the package. The language runtime (Node.js, Python, Ruby) is installed once on the host and bind-mounted into a fully isolated rootfs at activation. The process cannot access the host filesystem.

Docker comparison#

Dockerniso
docker buildniso pack
docker pushniso push
docker pullniso pull
docker runniso run / niso activate
docker psniso status / niso list
docker logsniso logs
docker execniso exec
docker stopniso deactivate
docker-compose upniso stack up
docker-compose downniso stack down

Next steps#