Skip to content

ARCHITECTURE · COMPARISONS

Compared, honestly.

"Package once, run anywhere" has been promised before — usually with an asterisk: a compatible JVM already installed, an engine already running, a machine that looks like the build machine. Here is where tebako actually sits among the tools you know, including where they win.

What a process sees, in each world.

Strip away the packaging formats and the difference is one question: when your program calls open(), what answers?

TEBAKOyour processthe VFS — userland, in-processmounted imageshost, jail-gatedno kernel, no FUSE, no daemonDOCKER / OCIyour processkernel namespaces + overlayfsthe container image — Linux onlyneeds the engine; a hidden VM off-LinuxHOMEBREW / DNFyour processthe kernel — the plain host FS/opt/homebrew — mutated per installversions float with the repoRBENV / RVMyour processa shell shim re-points PATH~/.rbenv/versions/x.y.z — host filesruby versions managed; apps not packagedA VIRTUAL MACHINEyour processa guest kernel, on virtual hardwarea whole guest OS + its disk imagethe real boundary — at a gigabyte's weight

The landscape, in one table.

No column is all green, including ours. Read the rows you care about.

TebakoDocker/OCIrbenv/rvmHomebrewRubyGemsInstallerssnap/flatpakVMs
Unit of distributionone file: app + verifier + runtime referencelayered image tarballsnothing — it manages installsa bottle (tarball) per formulaa .gem per library.dmg / .pkg / .msi per appa snap via the storea disk image (GBs)
Runtime sharingyes — one verified copy per machine, all apps share itlayers, server-side onlyyes, per ruby — apps not isolatedshared, but floats with the reposhared per ruby installno — every app carries its worldshared runtimes exist, store-mediatedno — a whole OS per workload
Install footprint~/.tebako + one PATH entryan engine, usually root; a VM on macOS/Windowsshims + ruby builds/opt/homebrew, root-adjacentthe ruby installationsystem-wide, admin rightsa daemon + system mountshypervisor + guest OS
Reproducibilitya closed function of bytes — the same artifacts the publisher testedreproducible inside a Linux ABI onlyno — rebuilds driftno — installs float with repo stateno — resolution floatswhatever the installer bundledchannels float; confinement varies with the host kernelyes, at enormous weight
Isolationdeclarative per-run filesystem jails — no root, no daemonkernel namespacesnonenonenonenonekernel confinement, distro-dependenthardware boundary — the real thing
Trustthe object: SHA-256 anchors + opt-in OpenPGP, verified offlinethe channel + optional signing toolingthe channelthe channelthe channel; signing rare in practiceOS code-signing: "may this binary run?"the storewhatever you put inside
Offline / air-gapfull, once the cache is warm — TEBAKO_OFFLINE=1pull first, and the engine must runafter installnoafter installyesnoyes
Version managementper-invocation dispatch: env → project pin → user default → registry defaulttags, by handthe whole point — per-shellone version per formula namegemsets / bundlernochannelsno

Where each alternative genuinely wins.

Tebako is a distribution format for applications, not a bid to replace your package manager, your container engine, or your hypervisor.

RubyGemssharing code between developers. Tebako packages applications; gems remain how developers share libraries.
rbenv / rvmhacking on ruby itself. If your job is building interpreters, you want a version manager, not a package.
Homebrew / apt / dnfOS-integrated components with a security-update channel. Tebako deliberately never manages the OS.
Installers (.dmg/.msi)deep OS integration: drivers, system extensions, things that must be on the host.
snap / flatpakstore discoverability and automatic updates — a real distribution channel, with a daemon attached.
Docker / OCIserver-side multi-process orchestration. Tebako distributes tools to people; Docker runs services on fleets.
Virtual machineshard boundaries for hostile native code. Jails are filesystem policy, not a hardware security boundary.

What exists nowhere else.

  • A single file that is simultaneously the app, its verifier, and its runtime resolver — self-authenticating, offline, over any transport including a USB stick.
  • Universal payloads over digest-pinned shared runtimes — a pure-language app ships one image for every platform, and the runtime underneath it downloads once per machine. The fidelity of bundling, the footprint of sharing.
  • Recursive payload composition — an app declares toolkits and data at mount points, each independently published and versioned, resolved from a provides/requires graph.
  • Per-run declarative jails for the end user — no daemon, no root, no kernel module; tighten any command's filesystem view at invocation time.
  • One signed-image algebra at every level — sources, runtimes, payloads, packages, registries — verified the same way, with verification that survives redistribution through untrusted mirrors.