Skip to content
Hoody.com

A Docker container is a build artifact: lightweight, stateless, and disposable. You bake an image, ship it, run it, and throw it away. Docker containers are packaging, not computing.

A Hoody container is a computer: a full Debian 13 Linux machine with systemd, its own filesystem, its own network stack, and its own process tree. It boots, runs services, and keeps its state, and it can hold terminals, desktops, databases, and browsers. It is a machine you work in.

Hoody containers run on hardware you control: flat-rate bare metal rented from the marketplace, or a shared free-tier server to start. There is no managed cloud layer between you and the host.


When you create a Hoody container, you get a complete Linux computer:

  • Debian 13 (Trixie) with full package manager (apt)
  • systemd init system (service management, not a single entrypoint process)
  • Own filesystem (persistent, writable, full Linux FHS)
  • Own network stack (own IP, own DNS, own routing table)
  • Own process tree (own PID namespace, isolated processes)
  • 18 built-in HTTP services (terminal, display, files, exec, sqlite, browser, agent, code, curl, notifications, daemons, cron, pipe, notes, watch, run, tunnel, proxy logs)

Each of those services is a URL, live from the moment the container starts, with no setup or deployment step.

Terminal window
# Create a container: a full Linux computer
hoody containers create --project abc123def456789012345678 \
--server-id node-us-server-id \
--name "dev-environment" \
--hoody-kit \
--dev-kit
# Once it is running, all 18 HTTP services are live

Docker solved packaging; Hoody containers are full machines. The two solve different problems.

Docker containerHoody container
What it isA process running from a filesystem imageA full Linux computer
Init systemNone (or an improvised PID 1)systemd
PersistenceEphemeral by default (volumes are add-ons)Persistent by default
NetworkShared bridge / host networkOwn network stack with own IP
ServicesOne process per container (convention)18 built-in HTTP services + anything you install
Accessdocker exec from the hostA URL, reachable from any network
StateDestroy and rebuildSnapshot, restore, branch
OSStripped-down layersFull Debian 13 with apt
PurposeShip softwareRun computers

Docker answers how to package and deploy an app. Hoody answers how to give someone a computer reachable from anywhere.


Virtual machines also give you full computers. They predate the web as an interface, though: the assumption is that you SSH in, configure by hand, and manage each machine individually.

Hoody containers take HTTP as the primary interface:

Traditional VMHoody container
AccessSSH, VNC, RDP (specialized clients)HTTPS (browser or curl)
Boot timeMinutesSeconds
OverheadFull OS + hypervisorLightweight (LXC + namespaces)
DensityLow (a full OS per VM)High (containers share what is identical)
IsolationHardware-level (hypervisor)Kernel-level (namespaces + seccomp)
Built-in servicesNone; install everything yourself18 HTTP services out of the box
EmbeddableNoYes; every service is an iframe-able URL
AI-accessibleRequires SSH adapterNative; the interface is HTTP
SnapshotsSlow (full disk image)Instant (copy-on-write)

The result is full, dedicated machines without the hypervisor overhead, the minutes-long boot, or the density penalty.


Every Kit-enabled container (the default) comes with the Hoody Kit: 18 services that expose Linux capabilities as HTTP endpoints. They are the container’s primary interface.

ServiceURL segmentWhat it does
Terminalterminal-NShell sessions via HTTP + WebSocket
Displaydisplay-NFull desktop environments (Xfce, etc.) via browser
Filesfiles-NFilesystem access (read, write, delete, list)
SQLitesqlite-NSQL databases queryable via HTTP
Execexec-NScripts that become HTTP endpoints automatically
Browserbrowser-NChrome/Chromium automation via REST
Agentagent-NHoody Agent, the built-in AI agent (chat, sessions, memory), in your browser
Codecode-NVS Code instances in the browser
cURLcurl-NTransform any REST call into a GET URL
Notificationsn-NPush notifications via HTTP
Daemonsdaemon-NBackground process management
Croncron-NScheduled task management
Pipepipe-NStreaming data transfer between devices
Notesnotes-NCollaborative notebooks with real-time sync
Watchwatch-NFile change notifications via HTTP + WebSocket
Runrun-NMulti-source app resolver (Nix, pkgx, AppImage, Docker/OCI)
Tunneltunnel-NTCP tunneling over HTTP (expose or pull services)
Proxy Logslogs-NAccess logs and traffic inspection for Hoody Proxy

Each service is a URL, and each URL is reachable from any network. The container is a Linux machine you operate over HTTP.

Terminal window
# Run a command in the container
hoody terminal sessions exec -c 890abcdef12345678901cdef \
--command "apt update && apt install -y nodejs"
# Read a file
hoody files get /home/user/app.js -c 890abcdef12345678901cdef
# Query a database
hoody db exec-transaction -c 890abcdef12345678901cdef \
--db /data/app.db \
--transaction '[{"query":"SELECT * FROM users"}]'

Each container is a private computer. Its files, processes, and network are its own, separate from every other container’s.

Own filesystem. Containers cannot see each other’s files, and there are no shared volumes by default. Each container has its own root filesystem, its own /home, its own /etc. You can explicitly share directories between containers if you choose, but isolation is the default.

Own network. Each container has its own IP address, its own routing table, its own DNS configuration. Containers do not share a network bridge. They communicate via HTTP URLs through the proxy, the same way any two computers on the internet communicate.

Own processes. PID namespaces give every container its own process tree. What runs in one container is invisible to the next.

Kernel-enforced. The separation comes from Linux namespaces, seccomp filters, and a hardened kernel, not from application code.


A container can expose multiple parallel sessions for instance-aware services. For those services, the instance number in the URL (-1, -2, -3) selects the session:

https://{projectId}-{containerId}-terminal-1.node-us.containers.hoody.com # Developer's shell
https://{projectId}-{containerId}-terminal-2.node-us.containers.hoody.com # Build process
https://{projectId}-{containerId}-terminal-3.node-us.containers.hoody.com # AI agent's session
https://{projectId}-{containerId}-display-1.node-us.containers.hoody.com # Main desktop
https://{projectId}-{containerId}-display-2.node-us.containers.hoody.com # Secondary monitor
https://{projectId}-{containerId}-sqlite-1.node-us.containers.hoody.com # SQLite service
https://{projectId}-{containerId}-sqlite-2.node-us.containers.hoody.com # Same SQLite service; the instance segment does not select a database
# Both reach the same files; pick the database with ?db=app or ?db=analytics

The container is the same in every case. For instance-aware services, different URLs identify concurrent sessions for different users or agents; SQLite instead selects the database with the db query parameter.

Multiplayer access comes from the URL scheme itself rather than from a feature you enable.


A traditional VM consumes fixed resources whether you use it or not: a 2-core, 4GB VM costs the same idle as it does under load.

Hoody containers share what is identical. BTRFS copy-on-write storage means containers cloned from the same base image share disk blocks, and the shared host kernel and page cache mean one hundred containers running the same base Debian image do not consume one hundred times the resources. You pay only for what differs.

In practice:

  • Development containers cost nearly nothing when idle
  • Test containers share base OS memory with production containers
  • Staging environments stop being a meaningful cost
  • Per-feature containers are practical
  • Each AI agent can have its own container

Containers have no per-unit cost: once a server exists, you can create as many as its capacity allows. That removes the usual reason to ration environments.

Terminal window
# Spawn 10 containers for parallel testing
for i in $(seq 1 10); do
hoody containers create --project $PROJECT_ID \
--server-id $SERVER_ID \
--name "test-runner-$i" \
--hoody-kit
done
# Each gets 18 HTTP services, each isolated
# Shared memory pages keep resource usage low

A container is not disposable. It keeps its state and history across every stage of its life.

Create. One POST to the API brings the container up with all services running.

Run. The container operates as a full Linux machine. Install software, run servers, write code, train models; everything persists.

Snapshot. Capture the entire filesystem state instantly. Snapshots are copy-on-write, so they cost almost nothing.

Stop. The container halts but keeps its filesystem. Start it again, and everything is where you left it.

Restore. Revert to any snapshot in one API call.

Copy. Duplicate a container to another server or project. Cloning a development environment for a new team member is one API call.

Delete. Destroy the container, and its URLs stop resolving.

At every stage, the container’s identity is its set of URLs. They appear when you create the container and disappear when you delete it.


In most infrastructure, the unit is ambiguous: a server, a VM, a pod, a process, or a function, depending on the layer you are looking at. In Hoody, the unit is the container:

  • A service runs in a container.
  • An AI gets access through the container’s URLs.
  • A risky experiment goes in its own container, away from everything else.
  • Rolling back means restoring a container snapshot.
  • Sharing an environment means sharing a container URL.

Everything else is built on top of containers, not beside them. That leaves one abstraction and one URL pattern to learn.


Next: The Hoody Proxy explains how URLs reach containers.