Compose explicit parts.
Declare a set of named dependencies. The lockfile pins each version and hash; shared packages keep their own identity.
Meet the package modelSMALL TOOL. UNIX SOUL.
Compose packages.
Ship files. Run processes.
A daemonless container runtime and package manager for Linux. Explicit dependencies, inspectable files, and a process you control.
curl -fsSL https://plybox.sh/install.sh | shLinux x86_64 / arm64 · Open source · Pre-1.0
The lockfile pins exact versions and hashes. Your app image carries dependency references; shared packages stay separate.
ply build .ply.toml → ply.lock → hello-0.1.0-linux-x64.img
FROM YOUR SHELL TO YOUR SERVER
scp.Your app ships as a file with locked dependency references.
The packages come together when it runs.
# A whole container, in plain text.
[package]
name = "hello"
version = "0.1.0"
base = "debian@13"
entrypoint = ["python3", "app.py"]
[dependencies]
python3 = "3.13"
[sources]
default = "https://registry.plybox.sh/ply/{package}"$ ply build .Resolve dependencies. Lock the hashes. Emit an image.
$ scp hello-*.img server:SSH, a file server, a USB drive. It’s just a file.
$ ssh server ply run hello-*.imgDependencies fetch by hash. Your app gets its own sandbox.
GOOD TOOLS GET OUT OF YOUR WAY
For people who want to know what’s running,
where the bytes came from, and how to stop it.
Declare a set of named dependencies. The lockfile pins each version and hash; shared packages keep their own identity.
Meet the package modelIntent in TOML. Packages in a content-addressed store. Runtime state in JSON. Files you can inspect, copy, and version with familiar tools.
See how the pieces fitLinux provides namespaces and cgroups. Your app is a process, logs flow to stdout, and signals work. No central Ply daemon to keep alive.
Read the architectureYOUR MACHINE. YOUR RULES.
~/home.Start with your app. Bring your favorite tools.