Getting Started¶
Installation¶
Or from source: git clone https://github.com/bethropolis/podbox && cd podbox && scripts/install.sh.
See the README for system requirements.
Two Ways to Create a Container¶
podbox supports two workflows. Pick the one that fits:
| Method | Use case | How it works |
|---|---|---|
| Prebuilt | Quick start, gaming, reproducible | Pull a ready-made image from a registry |
| Custom | Full control, specific packages | Build from a distro base image |
Prebuilt Method (Quick Start)¶
Prebuilt profiles come with Wayland, audio, GPU, and common packages ready to go.
Non-interactive¶
# Create a gaming-ready container
podbox create cachy
# Or a Fedora-based one with a custom name
podbox create fedora --name dev
Interactive¶
podbox init -i
# Select "CachyOS", "Fedora", or "Gaming" from the list
# Review and confirm the config
podbox create dev
What happens¶
podbox initscaffolds a config file (~/.config/podbox/<name>.toml)podbox createpulls the prebuilt image, installs Quadlet systemd units, and starts the containerpodbox enter <name>drops you into an interactive shell
Custom Method (Build from Base)¶
Build a container from a plain distro image with your own packages and configuration.
Non-interactive¶
# Create a config from a base image
podbox init fedora:44 --name myenv
# Or in one step — build and start
podbox build
podbox start
podbox enter myenv
Or in one step with create:
# podbox create works with any OCI image reference
podbox create myenv # uses local config
podbox create ubuntu:24.04 --name dev # pull + configure + enable + start
Interactive¶
podbox init -i
# Select "Custom (from scratch)" at the top of the list
# Enter: base image, packages, extra RUN commands
# Complete the wizard (shell, XDG dirs, GPU, lifecycle)
podbox create myenv
Custom config example¶
# ~/.config/podbox/myenv.toml
[image]
base = "fedora:44"
name = "myenv"
[image.packages]
install = ["fish", "git", "neovim", "gcc", "ripgrep"]
[container]
name = "myenv"
home = "~/containers/myenv"
shell = "/usr/bin/fish"
[integration]
wayland = true
audio = true
gpu = "auto"
[integration.xdg_dirs]
documents = true
downloads = true
projects = true
Empty or default sections ([lifecycle], [dbus], [container.env], etc.) are omitted automatically — the generated TOML stays concise (~25 lines).
Container naming¶
When podbox init <image> is called without --name, the container name is derived from the image tag:
| Image ref | Container name |
|---|---|
fedora:44 |
fedora-44 |
fedora:latest |
fedora |
ubuntu:24.04 |
ubuntu-24-04 |
ghcr.io/user/img:v1 |
img-v1 |
This avoids name conflicts when creating containers from different tags of the same base image. Use --name to override explicitly.
What happens¶
podbox initcreates the TOML configpodbox buildauto-generates a Containerfile, copies in the guest binary, and runspodman buildpodbox enableinstalls Quadlet systemd units (socket + container + host service)podbox startstarts the container viapodman startpodbox enter <name>opens an interactive shell
Daily Usage¶
Use podbox use to set an active context — then all commands target that container without needing -C or a name:
# Set active context
podbox use myenv
# All commands now target myenv by default
podbox status # "myenv [running]"
podbox logs # shows journalctl output
podbox exec -- htop # runs inside myenv
podbox stop
podbox start
# Other containers still work via explicit name
podbox status fedora
podbox enter fedora
Alternatively, pass the name directly on each command:
# Open a shell
podbox enter myenv
# Run a command
podbox exec myenv -- htop
# Launch a GUI app
podbox run firefox
# Export an app to your host launcher
podbox export app firefox
# Export a binary to ~/.local/bin
podbox export bin rg
# Check container status
podbox status myenv
# View logs
podbox logs myenv -f
# Stop and start
podbox stop myenv
podbox start myenv
Commands at a Glance¶
| Command | Description |
|---|---|
podbox init |
List available profiles |
podbox init <image> |
Scaffold a custom config from a base image |
podbox init -i |
Interactive wizard (custom or profile) |
podbox init --profile <name> |
Scaffold from a prebuilt profile |
podbox create <name> |
Init → build → enable → start in one step |
podbox create <image> --name <n> |
Pull + create config + enable + start |
podbox build [<name>] |
Build the container image |
podbox enable [<name>] |
Install Quadlet systemd files |
podbox disable [<name>] |
Remove Quadlet files |
podbox start [<name>] |
Start the container |
podbox stop [<name>] |
Stop the container |
podbox enter [<name>] |
Enter a running container (auto-starts) |
podbox shell [<name>] |
Open interactive shell (auto-detect) |
podbox exec [<name>] -- <cmd> |
Run a command |
podbox run <app> |
Launch a GUI app |
podbox status [<name>] |
Show container state |
podbox logs [<name>] [-f] [--since <time>] |
Show container logs |
podbox diff [<name>] |
Compare installed packages against config |
podbox pull <name> |
Pull a prebuilt image without building |
podbox use [<name>] [--clear] |
Manage active context |
podbox find-definition [<name>] |
Print path to the matching config TOML |
podbox export app / bin |
Export to host |
podbox doctor |
Diagnose common issues |
All commands support --dry-run to preview without side effects.
Next Steps¶
- Configuration Reference — all TOML keys
- Architecture Overview — how podbox works
- Desktop Integration — exporting apps and binaries
- Troubleshooting Guide — common issues