Core workflows 2 min read

Building a custom image

Every user container runs the same image: comcon:latest, built from one Containerfile. comcon generate produces that file from your choices, builds it locally, and only then offers it as a preset.

Your choices

ChoiceOptionsDefault
Base OSdebian-trixie, debian-bookworm, ubuntu-24.04debian-trixie
AgentDevin, MagicStride, Claude Code, Codex, OpenCode, or none — a closed recipe list, so every image is a known-good buildDevin
BrowserHeadful Chromium (the browser.<user> surface) or noneChromium
Toolkitsoffice (LibreOffice + Evince), imagemagick, nodejs-devtools, or a custom package listnone — CLI tooling only
Capabilitieswine (Windows binaries), android-tools (adb)none
Web surfacesWhich /etc/comcon/apps/*.conf route declarations shipbrowser.conf

You bring your own agent subscriptions — comcon installs the tooling, you sign in once inside your container.

What every image guarantees

The generated Containerfile follows a fixed contract so the surfaces always work:

  1. A non-root user (uid 1000) with passwordless sudo inside the container only — agents can install packages without ever touching the host.
  2. Zellij pinned to a released version, serving the term.<user> web terminal.
  3. The browser machinery when Chromium is included: Xvfb, the CDP screencast bridge, the canvas client, and agent helpers that drive the same visible browser.
  4. Container sshd on :2222, published per user as ssh -p 2200+slot — the remote-attach path. Key-only, lands inside the container, never on the host.
  5. Fixed port contract: EXPOSE 2222 8082 9222 9223 9224 plus agent serve ports. Publishing decisions live in provisioning, not the image.

Example requests

generate a minimal image — claude-code, no browser, no extra apps
generate an image with devin + chromium + nodejs-devtools + android-tools

Custom images are verified by an actual build before deploy. If a choice has no recipe, the generator says so instead of improvising.

Deploy now