Introduction
Ephemeral SSH dev containers via native sshd
Podspawn is a single Go binary that hooks into your host's native sshd via AuthorizedKeysCommand, turning two lines of sshd_config into a full ephemeral container platform.
The core insight
You don't need a custom SSH server. Every existing tool in this space -- ContainerSSH, Coder, DevPod -- builds or embeds its own SSH daemon. Podspawn takes a fundamentally different approach: it lets OpenSSH handle the protocol and focuses exclusively on container lifecycle.
ssh alice@work.pod -> container created -> work -> exit -> container destroyedWhat makes it different
- Native sshd integration -- not a replacement, an extension. Two lines of config, every SSH feature works.
- Podfile environments -- declarative YAML for dev environments with packages, companion services, dotfiles, and lifecycle hooks.
- Security by default -- cap-drop ALL, no-new-privileges, PID limits, per-user network isolation, optional gVisor.
- AI agent ready -- disposable environments for autonomous coding agents. SSH in, run tests, exit. No cleanup.
Quick start
# Server setup (30 seconds)
curl -sSf https://podspawn.dev/install.sh | sh
sudo podspawn server-setup
sudo podspawn add-user alice --github alice
# Client (any SSH client works)
ssh alice@yourserver.comArchitecture at a glance
Podspawn is a single binary that serves both roles:
Server side -- sshd invokes podspawn auth-keys to check if a user is a container user. If yes, it returns keys with a command= directive that forces podspawn spawn, which creates/reattaches a Docker container and pipes I/O.
Client side -- the same binary provides podspawn connect as a ProxyCommand in ~/.ssh/config, creating a .pod namespace. ssh alice@work.pod is intercepted before DNS, routed to the right server, and the user lands in their container.
Same install, same binary, different commands. The client binary is optional -- any SSH client works without it.