Pluggable agents
Drop a shell plugin into ~/.pod_agents_config/agents/. It is auto-discovered and gets its own CLI verb.
Pod Agents Manager turns any Linux box with rootless Podman into a multi-agent workstation for Claude Code, OpenCode, Crush, Pi, Hermes, Nanocoder, Little-Coder, and any custom agent you wrap.
CLI help
pod --help prints structured, script-friendly usage.Usage:
pod [--help|-h]
pod [--version|-v]
pod <action> [agent] [instance] [flavor] [volumes] [base]
Actions:
lifecycle: start stop restart status stats remove delete remove-all delete-all
interaction: join enter it tmux config
images: prebuild update self-update cache-clean base
batch: batch [log [id]|tmux|stats|list|stop <id>|...]
server: server {start|stop|restart|status|logs|build}
diagnostics: doctor
uninstall: uninstall
Examples:
pod config
pod doctor
pod self-update
pod start pi dev all all alpine
pod batch prompts.txt --concurrent
pod server start
pod --version
Why it exists
Pod Agents Manager keeps every coding agent reproducible, observable, and disposable without sacrificing the simplicity of a shell-native workflow. Quadlet generates the systemd units, Podman runs containers rootlessly, and your workspaces stay on the host where they belong.
Drop a shell plugin into ~/.pod_agents_config/agents/. It is auto-discovered and gets its own CLI verb.
Layer optional flavors such as bun or uv onto Alpine or Debian-based Node images.
Open a tiled grid with one pane per running pod for live terminal telemetry across the whole fleet.
Fan prompt files across running pods sequentially or concurrently with resumable progress and logs.
Mount one skills directory read-only into every pod, then symlink it into each agent's native location.
Run a small Go web UI on the host for stats, starts, stops, restarts, deletes, and new pod creation.
pod doctor reports podman, systemd, layout, env, port, and endpoint readiness with one-line fix hints — so misconfigured hosts fail fast.
Architecture
~/.pod_agents sourced as the pod function~/.pod_agents_config/.env for model and endpoint defaults~/.config/containers/systemd/*.container Quadlet templates~/Developer/<agent>-pods/<instance>/ persistent workspaces/workspace mounted to the host project directory/srv/skills mounted read-only from shared skillsInstall
Requirements: Linux, Bash 4+ on the runtime host, rootless Podman, systemd user services, and an OpenAI-compatible inference endpoint. The lint and test suite runs on macOS too (Bash 3.2+).
curl -fsSL https://raw.githubusercontent.com/robvanvolt/pod-agents-manager/main/install.sh | bash
pod functionexec bash -l
pod start pi dev
pod prebuild
Quickstart
pod doctor
Verify the host can run pods before anything else.
pod start pi dev
Start a Pi coding agent instance named dev.
pod join pi dev
Attach to the agent's tmux session.
pod tmux
Watch every running pod in a tiled grid.
pod batch prompts.txt --concurrent
Run prompt files across the active fleet.
pod server start
Launch the LAN dashboard on 0.0.0.0:1337.
Command surface
Every action accepts the same shape: pod <action> [agent] [instance] [flavor] [volumes] [base].
start, stop, restart, status, stats, remove, delete
prebuild, update, self-update, cache-clean, base
join, enter, it, tmux, config
batch, batch tmux, batch stats, batch list, batch stop
server start, server stop, server restart, server logs, server build
doctor — host readiness checks with PASS / WARN / FAIL output and one-line fix hints.
Agents, flavors, volume bundles, and skills are discovered directly from the config tree.
Agent plugins
A plugin defines where the agent stores config, how its image is built, and optionally how batch mode should invoke one prompt. No registry, service restart, or project scaffolding is required.
AGENT_VOLUME_CONFIG_PATH="/root/.config/my-agent"
AGENT_SKILLS_SUBPATH="agent/skills"
AGENT_BATCH_INVOKE='my-agent --print "$PROMPT"'
agent_build_containerfile() {
local build_dir="$1"; local flavor="$2"; local base="$3"
write_base_node_containerfile "$build_dir" "$flavor" "$base"
cat <<'EOF' >> "$build_dir/Containerfile"
RUN npm install -g my-agent && npm cache clean --force
CMD ["tail", "-f", "/dev/null"]
EOF
}
agent_generate_config() {
local config_dir="$1"; local action="$2"
[ "$action" = "update" ] && return 0
cat <<EOF > "$config_dir/config.json"
{ "baseUrl": "$OPENAI_BASE_URL", "model": "$DEFAULT_MODEL" }
EOF
}
Dashboard
pod server start builds a static Go binary, runs it on the host, and exposes JSON APIs that talk
to your real rootless Podman environment.
GET /api/stats for cached podman stats JSON.
GET /api/agents for live agents, flavors, volumes, and bases.
POST /api/action for safe lifecycle operations.
POST /api/create for new pod creation from the browser.
Batch processing
Batch mode copies the prompt file, creates detached runners, records progress per pod, and stores combined or
per-prompt logs under ~/.pod_agents_config/batch/<id>/.
pod batch prompts.txt
pod batch pi prompts.txt
pod batch pi dev prompts.txt --concurrent
pod batch tmux
pod batch stats
pod batch stop 20260430-120000
Development
The entrypoint sources numbered modules from ~/.pod_agents_config/lib/NN-*.sh in order; each
module ends with a return 99 sentinel so explicit early returns propagate correctly. A single
tests/run.sh runs bash -n syntax checks, shellcheck, the lib loader
contract, install / self-update regression guards, sandboxed smoke tests for --help,
--version, and doctor, helper-function unit tests, and a check that
pod --version agrees with version.conf. The same suite runs on every push and
pull request via GitHub Actions.
# run the full suite locally — no podman or systemd needed
bash tests/run.sh
# bump release: edit one file, commit, push
echo 'POD_AGENTS_VERSION="0.2.3"' > .pod_agents_config/version.conf
git commit -am "version 0.2.3" && git push