Skip to content

monoceros init

Creates a container config at $MONOCEROS_HOME/container-configs/<name>.yml. Two modes:

Terminal window
monoceros init <name> # documented mode
monoceros init <name> --with-languages=… --with-features=… \
--with-services=… --with-mcp-servers=… --with-apt-packages=… \
--with-repos=… --with-ports=… # composed mode

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

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.

Instead of a magic bag, each category has its own flag. They all take a comma-separated list or repeated occurrences:

FlagContent
--with-languagesLanguage 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-featuresFeatures. Catalog short name (claude, atlassian/twg) or a full OCI ref (ghcr.io/foo/bar:1).
--with-servicesBacking services. Curated name (postgres) gives a full block; an arbitrary image gives name + image + a commented scaffold.
--with-mcp-serversMCP 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-packagesArbitrary apt packages (openssl, make). No catalog.
--with-reposGit URLs, cloned into projects/ on first apply. Canonical hosts only (github.com / gitlab.com / bitbucket.org).
--with-portsInternal container ports routed through Traefik. First entry becomes <name>.localhost.