Skip to content

Set up a project

Add mm to a Compose project or prepare an existing checkout.

Install mm first. For a complete example with workstation setup, follow First local app.

New project

From the directory containing your Compose files, preview the generated setup:

sh
mm init --name example

Replace example with your project name. mm finds services, build settings, ports, environment templates, and possible development mounts. Review the proposed file changes, then use the printed hash to create them:

sh
mm init --name example --plan PLAN_HASH --yes

The review includes a project .gitignore update for /.config/mm.overrides.yaml, preserving existing rules. You can create that optional file later for local configuration overrides.

Open .config/mm.yaml and check the image repositories, environment bindings, routes, and mounts. Generated guesses may need editing. See where configuration belongs.

sh
mm config validate
mm env setup
mm secret status

Resolve missing values before building. If the project uses Age secrets:

sh
mm secret init age
mm secret generate --missing

generate --missing creates values only for secrets with a configured generator. For other values, use mm secret set KEY and enter the value at the hidden prompt.

Existing clone

Repositories initialized before local overrides were supported should add and commit /.config/mm.overrides.yaml to their project .gitignore once. Existing projects use the setup flow below; mm init is for creating a project configuration.

From the project directory, check what is needed on this workstation:

sh
mm dev setup project
mm env setup
mm secret status

Follow the project's instructions for runtime selection and secret providers. Set a missing secret without putting its value in shell arguments:

sh
mm secret set database.password

Replace database.password with the name reported by mm secret status.

Build and run

For projects with their own images, publish a matching build before deploying:

sh
mm build --publish plan
mm build --publish apply --plan BUILD_PLAN_HASH --yes
mm deploy plan
mm deploy apply --plan DEPLOY_PLAN_HASH --yes
mm service status

Use each plan's printed hash. Builds require Docker Buildx, registry access, and a clean full Git checkout. Skip the build commands for projects using only third-party images. See build and deploy.

The project-setup command can also apply a reviewed setup and deployment together:

sh
mm dev setup project --plan WORKFLOW_HASH --deploy-plan DEPLOY_HASH --yes

Use the setup hash from mm dev setup project and the deployment hash from mm deploy plan. This does not build missing images. Regenerate both reviews if either becomes stale.

Guided terminal

Run mm in an interactive terminal and open Guided for workstation setup, new projects, existing clones, and project editing. Scripts should use explicit subcommands instead.

Automation

Place --output json before the subcommand:

sh
mm --output json config validate
mm --output json deploy plan
mm --output json deploy apply --plan "$PLAN_HASH" --yes

Check the command's exit status as well as its JSON. Use --yes for required confirmation and --stdin for secret input:

sh
printf '%s' "$DATABASE_PASSWORD" | mm secret set database.password --stdin

Combined dev setup --services is not supported in JSON mode. Split it into setup and shared-service commands:

sh
mm --output json dev setup
mm --output json --runtime docker-compose dev services plan
mm --output json --runtime docker-compose dev services apply \
  --plan "$SERVICES_PLAN_HASH" --yes

Use the runtime that owns your local services throughout.