Under the hood
Fifteen lines of YAML per app — read them, then add your own
1Overview
The files behind the buttons: `stacks/<app>/compose.yaml`, the `.env` next to it, and Dockge at localhost:5001 as the UI over them.
The bench is not magic and it is deliberately not a black box: every app is a folder in `stacks/` with a compose file you can read in a minute. Dockge, at port 5001, is a UI over exactly those folders. This chapter opens one compose file, explains the four things in it that matter, and then adds an app of your own to the bench — which is the moment the one-click install stops being someone else's software. → `docker-intro` teaches Docker itself; `dokploy-hetzner` is the same idea on a server.
One folder per app, one compose file per folder, and Dockge as a window onto them. That is the entire architecture, and it is chosen so that nothing you learn here is bench-specific: the same files run on a server, in CI, or on a colleague's laptop. The shared drive is worth understanding early. `shared/` in your HeidelbergBench folder is mounted into the apps and is the only path they can reach. Put a PDF there and every app can read it; anything an app writes appears there for you. Your documents, desktop and downloads are not mounted, which is why the dashboard can say "no access" and mean it.
When you want to change a port, add an app the store does not have, or understand what you actually installed.
image, ports, environment, volumes. Four keys explain almost every app on the bench.
A named volume is where your data lives. Deleting a container keeps it; `docker volume rm` does not.
2Lessons 3
2.1 Read one compose file
A compose file describes containers: which image, which ports, which settings, which disks. The bench has one per app and they are all short.
Open stacks/n8n/compose.yaml and be able to explain every line of it.
cat "$HOME/HeidelbergBench/stacks/n8n/compose.yaml"in a terminal — or open the file in any editor. On Windows the folder is in your user directory too.
- image — the exact software, versioned.
docker.n8n.io/n8nio/n8n:latestis what runs; nothing was built on your machine. - ports —
"5678:5678"maps your machine's port on the left to the container's on the right. Change the left number to move an app out of a collision. - environment — the settings, including
LLM_BASE_URLpointing at the gateway. This is how an app inherits your provider. - volumes — the named volume that survives everything.
n8n-datais where your workflows live; deleting the container does not touch it.
- You'll see About fifteen lines that account for the whole app.
- Takeaway Image, ports, environment, volumes. Four keys, and you can read every app on the bench.
2.2 Dockge: the window onto those folders
Dockge is a small open-source UI that manages compose stacks in one directory. On the bench that directory is stacks/, so everything it shows is a file you can also open in an editor.
Do this first Read one compose file
Read an app's live log, and restart it, without a terminal.
stacks/. - Open localhost:5001. Every folder under
stacks/is a stack here, with its status. - Click one and read the log. This is the first place to look when an app is misbehaving — most failures are one clear line.
- Edit and redeploy. Dockge writes the same compose file you just read. Nothing about the bench is hidden behind Dockge; it is a view.
- You'll see The same app names as on the dashboard, each with a live log.
- Takeaway One directory of compose files, two front doors onto it — the dashboard for students, Dockge for looking closer.
2.3 Add your own app
Adding an app to the bench is one new folder with one compose file. There is no registry to edit and no code to change — the bench lists what is on disk.
Do this first Dockge: the window onto those folders
Put an app of your choosing on your own bench, wired to your model.
mkdir -p "$HOME/HeidelbergBench/stacks/myapp" && cp "$HOME/HeidelbergBench/stacks/n8n/compose.yaml" "$HOME/HeidelbergBench/stacks/myapp/compose.yaml"in a terminal — start from a file that already works, then change the image, the port and the volume name.
- Copy a working file. Every bench stack joins the
heidelbergnetwork, which is how apps reach the gateway by name. - Change three things: the image, the left-hand port number (pick one nothing else uses), and the volume name.
- Give it the gateway if it talks to an AI:
OPENAI_API_BASE=http://litellm:4000/v1and the master key from your.env. Then it follows your provider like everything else. - Start it from Dockge. It appears on the dashboard as a tile with no chapter link — which is exactly right for an app you added yourself.
- You'll see Your app in the installed list, with its own memory figure.
- Takeaway The bench is a directory of compose files. Anything that runs in Docker can join it.
💬 Discuss this chapter
Ask, share, or report — over on the Heidelberg AI community forum.