monoceros init
Creates a container config at $MONOCEROS_HOME/container-configs/<name>.yml.
Two modes:
monoceros init <name> # documented modemonoceros init <name> --with-languages=… --with-features=… \ --with-services=… --with-mcp-servers=… --with-apt-packages=… \ --with-repos=… --with-ports=… # composed modeWithout any --with-* flag, init writes a documented template (everything
commented out). As soon as one category is set, it composes a yml that is
immediately applyable.
Purpose
Section titled “Purpose”A container config is the source of truth for a dev container. It lives
outside the container directory and can be freely edited before
monoceros apply <name> materializes a container from it. monoceros init
is the initial setup step - it produces the yml, not the container.
Category flags
Section titled “Category flags”Instead of a magic bag, each category has its own flag. They all take a comma-separated list or repeated occurrences:
| Flag | Content |
|---|---|
--with-languages | Language runtimes, curated. Optional :version (java:17). Written with the version inline, and as an editable object for languages with surfaced options (e.g. Java’s Maven/Gradle). Catalog: monoceros list-components. |
--with-features | Features. Catalog short name (claude, atlassian/twg) or a full OCI ref (ghcr.io/foo/bar:1). |
--with-services | Backing services. Curated name (postgres) gives a full block; an arbitrary image gives name + image + a commented scaffold. |
--with-mcp-servers | MCP servers the agents in this workbench can reach. Curated connectors (context7, rovo, notion, linear, figma, forge, microsoft-learn). One that takes an API key gets it seeded into <name>.env for you to fill; one that signs in interactively, or needs nothing at all, adds a single line and no key. |
--with-apt-packages | Arbitrary apt packages (openssl, make). No catalog. |
--with-repos | Git URLs, cloned into projects/ on first apply. Canonical hosts only (github.com / gitlab.com / bitbucket.org). |
--with-ports | Internal container ports routed through Traefik. First entry becomes <name>.localhost. |