podspawnpodspawn

Quick Start

From zero to a dev container in under a minute

Three commands. No server, no SSH, no configuration.

Install podspawn

curl -sSfL https://podspawn.dev/up | bash

The installer runs a setup wizard that asks about your use case, shell, base image, and services. Every question is a numbered menu, so there's nothing to type. Hit Enter at each prompt to accept the defaults, or answer "n" to skip the wizard entirely.

The wizard creates two files:

  • ~/.podspawn/config.yaml -- local defaults (image, shell, cpus, memory)
  • ~/.podspawn/podfile.yaml -- a starting Podfile with packages and services

You can edit these files anytime. See the Podfile reference for all options.

Create a container

podspawn create dev

Get a shell

podspawn shell dev

You're inside a container as a non-root user with passwordless sudo. The prompt shows username@machinename. Do your work, then exit.

Explore

podspawn list     # see what's running
podspawn run scratch  # one-shot throwaway container

Stop the container

podspawn stop dev

That's local mode. For the full walkthrough, see the Tutorial.

For teams sharing a Linux server. Three commands on the server, then users SSH in.

Install and configure the server

curl -sSfL https://podspawn.dev/up | bash
sudo podspawn server-setup
sudo podspawn add-user alice --github alice

Connect from any machine

ssh alice@yourserver.com

Alice lands in a container as a non-root user (alice@yourserver:~$). SFTP, port forwarding, and agent forwarding all work because sshd handles the protocol.

For the full server walkthrough, see the Tutorial.


What happened under the hood

Local mode:

podspawn create dev
  → docker run (detached, sleep infinity)
  → create non-root user (UID 1000, passwordless sudo)

podspawn shell dev
  → docker exec -it (interactive shell as non-root user)

podspawn stop dev
  → docker rm -f

Server mode:

ssh alice@yourserver.com
  → sshd calls: podspawn auth-keys alice
  → key matches → sshd forces: podspawn spawn --user alice
  → container created, I/O piped through
  → exit → grace period → container destroyed

Next steps

How is this guide?

On this page