Heidelberg AICurriculum
Track 19 · Beginner
19.7

Under the hood

Fifteen lines of YAML per app — read them, then add your own

3 lessons 2026-08-13 AI-generated

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.

1.2After this chapter you can
Read the compose file behind any app on the bench and say what each part does
Use Dockge to start, stop and edit a stack, and to read its logs
Add your own app to the bench as a new folder in stacks/
Know where your data physically lives, and what the shared drive is
1.3When to reach for it

When you want to change a port, add an app the store does not have, or understand what you actually installed.

1.4Key parts

image, ports, environment, volumes. Four keys explain almost every app on the bench.

1.5Watch out

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.

Trycat "$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.

  1. image — the exact software, versioned. docker.n8n.io/n8nio/n8n:latest is what runs; nothing was built on your machine.
  2. 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.
  3. environment — the settings, including LLM_BASE_URL pointing at the gateway. This is how an app inherits your provider.
  4. volumes — the named volume that survives everything. n8n-data is 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.

Dockge asks for an account on its first open. It is local, like n8n's — after that it lists every folder in stacks/.
  1. Open localhost:5001. Every folder under stacks/ is a stack here, with its status.
  2. Click one and read the log. This is the first place to look when an app is misbehaving — most failures are one clear line.
  3. 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.

Trymkdir -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.

  1. Copy a working file. Every bench stack joins the heidelberg network, which is how apps reach the gateway by name.
  2. Change three things: the image, the left-hand port number (pick one nothing else uses), and the volume name.
  3. Give it the gateway if it talks to an AI: OPENAI_API_BASE=http://litellm:4000/v1 and the master key from your .env. Then it follows your provider like everything else.
  4. 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.