niso
Linux-native process packaging and isolation. No daemon. No layers. No bloat.
Package your application as a compressed archive, deploy it as an isolated systemd service. Same isolation as Docker, without the Docker daemon.
“What if we built container tooling today, knowing that Linux already handles process lifecycle, resource limits, process isolation, and networking?”
“We wouldn’t build a daemon. We’d build a package format.”
Why niso
Everything Docker does, without the things Docker shouldn't need.
Zero Daemons
No dockerd, no containerd, no shim. systemd manages the process lifecycle — restarts, logging, boot ordering. If systemd goes down, you have bigger problems.
Tiny Packages
Redis is 1.1 MB in niso, 40 MB in Docker. No OS base layers, no bundled runtimes. Ship only your application.
Isolated by Default
Each service runs in its own environment — separate user, separate filesystem, separate network. Can't see other services or the host. Stricter defaults than Docker.
Dependencies Packaged, Runtimes Deduplicated
Your code and node_modules ship in the package. The Node.js runtime is installed once on the host and bind-mounted into each app's isolated rootfs. Full isolation — the process can't see the host.
Simple Networking
Map ports, create networks, and services discover each other by name. No extra proxy processes running in the background.
Fleet Deploy
Rolling, canary, and all-at-once deployments across servers via SSH. No Kubernetes, no control plane, no agent.
Who is niso for
Backend teams shipping Rust/Go/C++
Docker images are 300-800MB for a 12MB binary. Build cache invalidation wastes hours.
niso packages are 5-15MB. No layers, no cache, no base image. Just your binary.
Node.js/Python developers
Every app ships its own copy of the runtime. 10 apps = 10 copies of Node.js.
Your code + node_modules ship in the package. Runtime installed once, bind-mounted into isolated rootfs per app. Package size: 5-15MB.
DevOps managing VPS fleets
Docker daemon uses 200MB+ RAM on every server. Compose v1 bugs. Volume name disasters.
Zero daemons. systemd manages everything. Volumes are directories with access control.
Security-conscious teams
Docker runs everything as root. Docker socket is root-equivalent. Containers share a bridge.
Each service is fully isolated — own user, own network, can't see other services. Packages are signed. Stricter defaults than Docker.
Docker vs niso
| Docker | niso | |
|---|---|---|
| Runtime overhead | dockerd + containerd + shim (~200 MB RAM) | Zero (systemd is already running) |
| Package size (Rust binary) | 50-800 MB (includes OS layer) | 5-15 MB (just the binary) |
| Package size (Node.js app) | 300-600 MB | 5-15 MB (code + deps, runtime on host) |
| Boot time | 1-5 seconds | Instant (systemd unit start) |
| Isolation | Keeps extra permissions by default | Fully isolated by default |
| Port mapping | Runs a proxy process per port | No extra processes |
| Service discovery | Docker socket API | DNS hostnames |
| Daemon required | Yes, for everything | No |
Compare sizes
niso packages vs Docker images. Same software, fraction of the size.
Docker sizes from official slim/alpine images. niso packages include the application binary/code and its dependencies. Language runtimes are on the host.
Same isolation as Docker, no daemon
niso activate my-api generates this service configuration. Linux enforces the isolation directly — no container runtime sitting in between.
[Unit]Description=niso: my-api v1.0.0After=network-online.targetOnFailure=niso-notify@%n.service[Service]Type=execExecStart=/opt/niso/packages/my-api/current/bin/my-apiDynamicUser=yesRestart=on-failure# FilesystemProtectSystem=strictProtectHome=yesPrivateTmp=yesPrivateDevices=yesPrivateIPC=yesProtectProc=invisible# SecurityNoNewPrivileges=yesCapabilityBoundingSet=RestrictNamespaces=yesSystemCallFilter=@system-serviceSystemCallFilter=~@mount ~@reboot ~@swap# ResourcesMemoryMax=512MCPUQuota=200%TasksMax=4096[Install]WantedBy=multi-user.targetKey directives
DynamicUser=yesEvery service gets its own unique user. Nothing runs as root.
ProtectSystem=strictHost filesystem is invisible. Only declared volumes are writable.
CapabilityBoundingSet=No special permissions. Docker keeps 14 by default — niso removes all of them.
SystemCallFilter=@system-serviceOnly safe operations allowed. Dangerous ones are blocked.
MemoryMax=512MHard memory limit. The process is stopped if it exceeds this.
NoNewPrivileges=yesThe process can never gain additional permissions.
Compose multi-service stacks
Like docker-compose, but with dependency health conditions, isolation presets, and runtime deduplication. One TOML file.
[stack]name = "my-platform" [[service]]name = "api"package = "@company/api:2.0"ports = ["8080:8080"]depends_on = { db = "healthy", redis = "started" } [[service]]name = "worker"package = "@company/worker:2.0"depends_on = { db = "healthy", redis = "started" } [[service]]name = "db"package = "postgres:16"volumes = { pgdata = { mount = "/data", exclusive = true } } [[service]]name = "redis"package = "redis:7.2"Dependency ordering
postgres waits for healthy (health check passes). api and worker start after both deps are ready.
$ niso stack upStart all services in dependency order
$ niso stack statusShow running state of every service
$ niso stack logs -fMultiplexed logs from all services
$ niso stack downStop everything in reverse order
One manifest, everything declared
No Dockerfile. No docker-compose.yml. Just manifest.toml.
[package]
name = "my-api"
version = "1.0.0"
[binary]
entrypoint = "my-api"
[runtime]
use = "nodejs:20" # runtime on host, deps in package
[healthcheck]
http = "http://127.0.0.1:8080/health"
[network]
ports = ["8080:8080"]
[isolation]
preset = "server" # fully isolated
[isolation.resources]
memory_max = "512M"
[volumes]
data = { mount = "/data", mode = "rw" }Architecture
9 crates. 2 binaries. Zero daemons. Written in Rust.
niso-coreManifest, config, state DB, discovery
niso-packPack, install, sign, scan
niso-systemdUnit generation, systemctl
niso-runtimeIsolation presets, security
niso-netNetworking, port mapping, DNS
niso-registryHTTP server, client, chunks
niso-fleetSSH deploy, strategies
niso-machinemacOS/Windows VM
niso-cli57 commands
┌──────────────┐
│ niso CLI │ 57 commands
└──────┬───────┘
┌───────────────┼───────────────┐
┌─────┴─────┐ ┌────┴────┐ ┌──────┴──────┐
│ niso-pack │ │ systemd │ │ niso-fleet │
│ pack/sign │ │ units │ │ SSH deploy │
└─────┬─────┘ └────┬────┘ └─────────────┘
│ │
┌─────┴──────────────┴─────┐
│ niso-core │
│ manifest · state · config│
└───────────┬───────────────┘
│
┌───────────┼───────────────┐
│ │ │
┌────┴────┐ ┌───┴────┐ ┌───────┴───────┐
│ runtime │ │ net │ │ registry │
│ isolate │ │ ports │ │ push/pull/auth│
│ presets │ │ DNS │ │ chunks │
└─────────┘ └────────┘ └───────────────┘Popular packages
Most pulled packages from the niso registry.
nginx
serviceHTTP server and reverse proxy
postgres
servicePostgreSQL relational database
nodejs
runtimeNode.js JavaScript runtime
redis
serviceRedis in-memory data store
python
runtimePython interpreter
bun
runtimeFast JavaScript runtime
Install
$ curl -sSL https://niso.dev/install.sh | shRequires Linux with systemd 250+ and cgroups v2. x86_64 and aarch64 supported. macOS and Windows developers can use niso machine for a lightweight development VM.
Get notified when niso 1.0 launches
No spam. One email when it ships.
Ready to replace Docker?
Start deploying in minutes. Read the docs, browse official packages, or install now.