Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

podspawn/podspawn

Open more actions menu

podspawn

CI Release License: AGPL-3.0

Clone a repo. Run one command. Get the full dev environment.

git clone github.com/yourorg/project
cd project
podspawn dev

That's it. Podspawn reads the repo's podfile.yaml, builds a cached image, starts companion services (postgres, redis), mounts your code, and drops you into a shell. Works locally with Docker or remotely over SSH.

Install

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

How it works

A Podfile defines your dev environment:

extends: ubuntu-dev
packages:
  - go@1.25
  - nodejs@22
services:
  - name: postgres
    image: postgres:16
    env: { POSTGRES_PASSWORD: devpass }
env:
  DATABASE_URL: "postgres://postgres:devpass@postgres:5432/dev"
on_create: |
  go mod download
  npm install

extends: ubuntu-dev inherits common tools (git, ripgrep, fzf, neovim, jq). Your Podfile adds what's specific to your project. Podfiles compose -- a child inherits from a base and overrides what it needs.

Three ways to use it

podspawn dev (local, one command)

No SSH, no root, no daemon. Just Docker.

podspawn dev                    # shell into Podfile environment
podspawn dev -- make test       # run a command and exit
podspawn down                   # stop everything
podspawn init                   # scaffold a Podfile for your project

Your code is bind-mounted into the container. Edits on your host appear instantly inside. Companion services are accessible by name (postgres:5432).

Named machines (local, persistent)

For longer-lived environments, including branch-specific project workspaces:

podspawn create backend                          # create a named machine
podspawn add-project api --repo https://github.com/acme/api
podspawn create auth-fix --project api --branch feat/auth-retry
podspawn shell auth-fix                          # attach or restart it
podspawn run scratch                             # one-shot throwaway
podspawn run review --project api --branch fix/flaky-test
podspawn list                                    # see what's running
podspawn stop auth-fix                           # tear down container, keep checkout

Project-backed machines clone into ~/.podspawn/workspaces/<machine>/ in local mode. The checkout survives podspawn stop, so podspawn shell <machine> can recreate the container without recloning or rerunning on_create.

Server mode (remote, over SSH)

Hook into your existing sshd. Every SSH feature works.

ssh deploy@backend.pod
  -> sshd calls podspawn auth-keys
  -> container created from project Podfile
  -> companion services start
  -> you're in

SFTP, scp, rsync, port forwarding, agent forwarding, VS Code Remote, JetBrains Gateway, Cursor. Teammates need zero client-side install.

Podfile features

  • Packages: go@1.25, nodejs@22, python@3.13, rust@stable -- version-pinned installs
  • Services: postgres, redis, or any Docker image as a companion container
  • Extends: inherit from base Podfiles, override what you need
  • Bang-replace: packages!: to fully replace instead of merge
  • Lifecycle hooks: on_create (once) and on_start (every attach)
  • Port forwarding: auto-resolve conflicts, manual, or strict
  • Mount modes: bind (live sync), copy (one-shot), or none
  • Session modes: grace-period, destroy-on-disconnect, persistent

What's working

Dev environments

  • podspawn dev -- one-command setup from Podfile
  • podspawn down -- teardown with --clean for volumes
  • podspawn init -- scaffolding with project type detection
  • podspawn prebuild -- pre-build images for CI
  • Podfile extends with deep merge and bang-replace
  • mount: copy via Docker CopyToContainer
  • Port forwarding (auto, manual, expose strategies)
  • Embedded templates: go, node, python, rust, fullstack, minimal
  • Template registry with --update from podspawn/podfiles
  • devcontainer.json fallback

Local mode

  • Named machines (create, run, shell, list, stop)
  • Podfile environments (packages, services, env vars, hooks)
  • Default Podfile at ~/.podspawn/podfile.yaml
  • Registered project workspaces via create/run --project [--branch]

Server mode

  • Native sshd hook via AuthorizedKeysCommand
  • Three session modes: grace-period, destroy-on-disconnect, persistent
  • Persistent containers with bind-mounted home directories
  • Per-user bridge network isolation
  • Companion services on shared Docker network
  • SFTP, scp, rsync, port forwarding, agent forwarding
  • VS Code Remote, JetBrains Gateway, Cursor
  • Non-root container users with passwordless sudo
  • Project routing via .pod hostnames

Infrastructure

  • SQLite session state (WAL mode, crash recovery)
  • Cleanup daemon (grace periods, max lifetimes, orphan reconciliation)
  • Structured audit logging (JSON-lines)
  • Prometheus metrics (podspawn status --prometheus)
  • Security hardening (cap-drop ALL, no-new-privileges, PID limits, gVisor)
  • Multi-arch releases (linux/darwin/windows, amd64/arm64, deb/rpm/Homebrew)

Roadmap

What's coming next, roughly in priority order:

Feature Status Description
Dev integration tests Planned End-to-end tests for podspawn dev with real Docker
Image baking Planned Bake container user into image at build time for faster cold starts (~600ms)
prebuild --push Planned Push pre-built images to ghcr.io for CI
podspawn sync Planned Manual push/pull file sync between host and container
Warm container pool Exploring Pre-start containers in background for instant attach
Branch-based environments In progress local branch workspaces via create/run --project --branch
Shell completions Exploring bash, zsh, fish completions

See project_next_phase.md for detailed design notes.

Dogfooding

podspawn uses its own tool for development. See podfile.yaml in this repo:

git clone github.com/podspawn/podspawn
cd podspawn
podspawn dev
# Go 1.25, golangci-lint, delve, pre-commit hooks -- all ready

Commands

# Dev environments
podspawn dev               # Start from CWD Podfile
podspawn down              # Stop dev environment
podspawn init              # Scaffold a Podfile
podspawn prebuild          # Pre-build image for CI

# Named machines
podspawn create            # Create a named machine
podspawn run               # Create + attach, ephemeral
podspawn shell             # Attach to existing machine
podspawn list              # Show machines
podspawn stop              # Destroy a machine

# Server administration
podspawn server-setup      # Configure sshd
podspawn add-user          # Register SSH keys
podspawn add-project       # Register a project with Podfile
podspawn doctor            # Preflight checks

# Client
podspawn setup             # Configure ~/.ssh/config
podspawn ssh               # SSH wrapper with .pod routing
podspawn open              # VS Code / Cursor launcher

Comparison

Codespaces Coder DevPod podspawn
Self-hosted no yes yes yes
One-command setup yes no yes yes
SSH server custom custom custom native sshd
Config format devcontainer.json Terraform devcontainer.json Podfile
Companion services Docker Compose manual manual first-class
Extends / composition features system no features system extends + merge
Local mode no no yes yes
Persistent + ephemeral persistent only persistent only persistent only both
Complexity high high medium low
Open source no yes (Apache) yes (MPL) yes (AGPL)

Requirements

Local mode: Docker (OrbStack, Docker Desktop, Colima, Podman) Server mode: Docker + OpenSSH 7.4+ on Linux Client mode: SSH client

Documentation

Full docs at podspawn.dev:

Status

Alpha. Core features work and are tested (350+ unit tests, integration tests across 4 Linux distros). API may change between minor versions.

License

AGPL-3.0. If you run a modified version as a service, you share your changes.

About

Dev containers, locally or over SSH. One binary. Podfile config. Every SSH feature works.

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Morty Proxy This is a proxified and sanitized view of the page, visit original site.