Skip to content

Commit c204502

Browse files
committed
Merge REVIEW.md: expanded comparison table, condensed troubleshooting with dedicated page, Quick Start cleanup
1 parent 25b9a43 commit c204502

4 files changed

Lines changed: 113 additions & 16 deletions

File tree

.github/workflows/docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ jobs:
4545
4646
- name: Fix asset paths in subdirectory pages
4747
run: |
48-
for dir in architecture config export guest dbus-proxy quadlet protocol; do
48+
for dir in architecture config export guest dbus-proxy quadlet protocol troubleshooting; do
4949
[ -d "site/$dir" ] && find "site/$dir" -name '*.html' -exec \
5050
sed -i 's|"assets/|"../assets/|g' {} +
5151
done

README.md

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
## Quick Start
2121

2222
```bash
23-
# 1. Install via pre-built binary
23+
# Install via pre-built binary
2424
curl -fsSL https://bethropolis.github.io/podbox/install.sh | sh
2525

2626
podbox create fedora # pulls, builds, enables, starts
@@ -31,14 +31,25 @@ Also available from source: `git clone https://github.com/bethropolis/podbox &&
3131

3232
## Why podbox?
3333

34-
Unlike other desktop sandboxing tools, `podbox` translates a single TOML config directly into native systemd Quadlet units — no daemon, no persistent orchestrator.
34+
Most desktop container tools make a trade-off: full integration means mounting your entire home directory into the container. podbox doesn't. You declare exactly what the container can see — directories, devices, and services — and nothing else is shared.
3535

3636
| | podbox | Distrobox / Toolbox | Raw `podman run` |
3737
|---|---|---|---|
38-
| **Daemonless** | Yes (systemd units) | Yes (shell shims) | No |
39-
| **Sandbox** | Strict (declared dirs only) | Weak (full `$HOME` mount) | Custom per invocation |
38+
| **Home directory** | Isolated volume, opt-in sharing | Full `$HOME` mounted by default | Manual `-v` flags |
39+
| **Config** | Declarative TOML, version-controllable | Imperative CLI flags | Shell flags per run |
40+
| **Lifecycle** | systemd Quadlet units | Shell shims | Manual |
4041
| **D-Bus** | Filtered via `xdg-dbus-proxy` | Unfiltered session bus | Unfiltered |
41-
| **Config** | Declarative TOML | Imperative CLI params | Shell flags |
42+
| **Wayland / audio** | Opt-out (on by default) | Always on | Manual |
43+
| **GPU** | `auto` / `nvidia` / off | `--nvidia` flag | Manual device flags |
44+
| **Notifications** | Guest interceptor → host | Via shared D-Bus | Not supported |
45+
| **Clipboard** | Guest interceptor → host | Via shared home | Not supported |
46+
| **Host commands** | `host-exec` interceptor | `distrobox-host-exec` | Not supported |
47+
| **SSH agent** | Socket forward (opt-in) | Auto-mounted | Not supported |
48+
| **Baked images** | Yes — packages in image, not runtime | No — packages reinstalled on rebuild | N/A |
49+
| **Reproducibility** | Full — TOML → image → unit | Partial — image only | None |
50+
| **Runtime** | Podman only | Podman / Docker / lilipod | Any OCI runtime |
51+
52+
> podbox is not a distrobox replacement. Distrobox optimises for maximum host integration and is excellent at that. podbox optimises for declared, reproducible environments where you control exactly what is shared.
4253
4354
## How It Works
4455

@@ -148,17 +159,9 @@ Supports `linux/x86_64`. Uninstall with `scripts/uninstall.sh`.
148159

149160
## Troubleshooting
150161

151-
### D-Bus proxy fails or container hangs
162+
Run `podbox doctor` first — it checks the most common issues automatically and explains what to fix.
152163

153-
Missing `xdg-dbus-proxy` on the host. Install it or set `dbus = false` under `[integration]`.
154-
155-
### UID mismatch inside mounts
156-
157-
`UserNS=keep-id` + `User=root` maps host UID 1000 to container UID 999. Don't `chown` inside mounts — it will corrupt host ownership.
158-
159-
### Desktop shims or interceptors not working
160-
161-
The `podbox-guest` daemon relies on `/run/podbox/bin` being in the guest `$PATH`. Verify the systemd socket unit is active: `systemctl --user status <name>.socket`.
164+
For detailed guides on specific issues (container won't start, D-Bus proxy, Wayland socket errors, interceptors, UID mapping, SSH agent forwarding, build failures, shell hangs), see the [Troubleshooting Guide](docs/troubleshooting.md).
162165

163166
## Command Reference
164167

@@ -205,6 +208,7 @@ All commands support `--dry-run` to preview without executing.
205208
| [D-Bus Proxy](docs/dbus-proxy.md) | Filtered D-Bus access via xdg-dbus-proxy |
206209
| [Quadlet Reference](docs/quadlet.md) | Generated systemd units |
207210
| [Host-Guest Protocol](docs/protocol.md) | Wire format and message types |
211+
| [Troubleshooting Guide](docs/troubleshooting.md) | Common issues and fixes |
208212

209213
## Contributing
210214

docs/troubleshooting.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
---
2+
description: Common podbox issues — container startup, D-Bus proxy, Wayland, interceptors, UID mapping, SSH agent forwarding, build failures, and shell hangs.
3+
---
4+
5+
# Troubleshooting
6+
7+
Running `podbox doctor` first is recommended — it checks the most common issues automatically and explains what to fix.
8+
9+
---
10+
11+
### Container won't start
12+
13+
```bash
14+
systemctl --user status <name>.service # check the unit status
15+
podbox logs # check container output
16+
```
17+
18+
If the unit failed immediately after `podbox enable`, the Quadlet file may be malformed. Run `podbox enable --dry-run` to inspect the generated files without writing them.
19+
20+
---
21+
22+
### D-Bus proxy fails or container hangs on startup
23+
24+
`xdg-dbus-proxy` is missing or not on `PATH`. Install it from your distro's package manager (`xdg-dbus-proxy` on most distros). Alternatively, set `dbus = false` under `[integration]` if you don't need D-Bus access.
25+
26+
```bash
27+
which xdg-dbus-proxy # should return a path
28+
```
29+
30+
---
31+
32+
### GUI apps don't appear / Wayland socket errors
33+
34+
Verify `$WAYLAND_DISPLAY` is set on the host before starting the container. The socket is resolved at `podbox enable` time — if it changed after a reboot, re-run `podbox enable` to regenerate the Quadlet with the correct socket path.
35+
36+
```bash
37+
echo $WAYLAND_DISPLAY # should be wayland-0 or similar
38+
podbox disable && podbox enable # regenerate Quadlets
39+
podbox stop && podbox start
40+
```
41+
42+
---
43+
44+
### Interceptors not working (notify-send, xdg-open, clipboard, host-exec)
45+
46+
The `podbox-guest` daemon connects to the host socket on container startup. If it can't connect, interceptors are silently skipped.
47+
48+
```bash
49+
systemctl --user status <name>.socket # check the socket unit
50+
podbox exec -- ps aux | grep podbox-guest # check daemon running
51+
podbox exec -- echo $PATH # check /run/podbox/bin
52+
```
53+
54+
If the socket unit is inactive, run `podbox enable` and `podbox start` again. If the daemon is running but `PATH` is wrong, the `/etc/environment.d/podbox.conf` file may not have been written — check with `podbox exec -- cat /etc/environment.d/podbox.conf`.
55+
56+
---
57+
58+
### UID mismatch or permission errors inside bind mounts
59+
60+
`UserNS=keep-id` maps your host UID into the container with a shift of 1 (host UID 1000 → container UID 999). Do not run `chown` on bind-mounted directories from inside the container — it will change ownership on the host through the idmapped mount.
61+
62+
If files appear owned by `nobody` inside the container, the mount was created before the UID mapping was set up. Stop the container, check the volume path exists on the host with the correct ownership, then start again.
63+
64+
---
65+
66+
### SSH agent not forwarding
67+
68+
SSH agent forwarding requires Podman >= 5.6 and `ssh_agent = true` in `[integration]`. Verify both:
69+
70+
```bash
71+
podman --version # must be >= 5.6
72+
grep ssh_agent ~/.config/podbox/<name>.toml
73+
```
74+
75+
If you're on Podman 5.5, the socket path is baked at `podbox enable` time. If `$SSH_AUTH_SOCK` changed since then (e.g. new login session), re-run `podbox disable && podbox enable`.
76+
77+
---
78+
79+
### Build fails or produces a stale image
80+
81+
Run `podbox build --rebuild` to force a full rebuild from scratch, bypassing the lock file. If the build context is corrupted:
82+
83+
```bash
84+
rm -rf ~/.local/share/podbox/<name>/ # clear build context
85+
podbox build --rebuild
86+
```
87+
88+
---
89+
90+
### Container starts but `podbox shell` hangs
91+
92+
The shell binary specified in `container.shell` may not be installed in the image. Check your `image.packages.install` list includes the shell package, then run `podbox build --rebuild`.

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ nav:
3636
- D-Bus Proxy: dbus-proxy.md
3737
- Quadlet Reference: quadlet.md
3838
- Protocol: protocol.md
39+
- Troubleshooting: troubleshooting.md
3940

4041
extra_css:
4142
- stylesheets/catppuccin.css

0 commit comments

Comments
 (0)