[{"data":1,"prerenderedAt":774},["ShallowReactive",2],{"docs-nav":3,"docs:\u002Fdocs\u002Fonboarding":139},[4,7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,130,133,136],{"path":5,"title":6},"\u002Fdocs\u002Faccess-gating","Protect a local route",{"path":8,"title":9},"\u002Fdocs\u002Farchitecture\u002Fsecurity-and-trust","Security and trust",{"path":11,"title":12},"\u002Fdocs\u002Fconcepts\u002Fbuilds-and-deployments","Build and deploy",{"path":14,"title":15},"\u002Fdocs\u002Fconcepts\u002Fconfiguration-ownership","Where configuration belongs",{"path":17,"title":18},"\u002Fdocs\u002Fconcepts\u002Fenvironments-and-secrets","Environment values and secrets",{"path":20,"title":21},"\u002Fdocs\u002Fconcepts\u002Fmental-model","How projects fit together",{"path":23,"title":24},"\u002Fdocs\u002Fconcepts\u002Fplans-and-apply","Plans and apply",{"path":26,"title":27},"\u002Fdocs\u002Fconcepts\u002Ftargets-and-runtimes","Choose a target and runtime",{"path":29,"title":30},"\u002Fdocs\u002Fcontribute\u002Freleases","Publish a release",{"path":32,"title":33},"\u002Fdocs\u002Fdevelopment-mounts","Development mounts",{"path":35,"title":36},"\u002Fdocs\u002Fgetting-started","Getting started",{"path":38,"title":39},"\u002Fdocs\u002Fhelp\u002Ffaq","FAQ",{"path":41,"title":42},"\u002Fdocs\u002Fhelp\u002Ftroubleshooting","Troubleshooting",{"path":44,"title":45},"\u002Fdocs\u002Fhow-to\u002Fdeploy-production","Prepare a deployment environment",{"path":47,"title":48},"\u002Fdocs\u002Fhow-to\u002Fswarm-cluster","Run on a multi-node Swarm",{"path":50,"title":51},"\u002Fdocs","mm documentation",{"path":53,"title":54},"\u002Fdocs\u002Fjobs-and-schedules","Jobs and schedules",{"path":56,"title":57},"\u002Fdocs\u002Flocal-dashboard","Local dashboard",{"path":59,"title":60},"\u002Fdocs\u002Flocal-https","Local HTTPS",{"path":62,"title":63},"\u002Fdocs\u002Flocal-services","Local services",{"path":65,"title":66},"\u002Fdocs\u002Fmcp","Let an AI agent work on your project",{"path":68,"title":69},"\u002Fdocs\u002Fmulti-project-hosts","Run multiple projects on one host",{"path":71,"title":72},"\u002Fdocs\u002Fonboarding","Set up a project",{"path":74,"title":75},"\u002Fdocs\u002Fopenbao","Use OpenBao",{"path":77,"title":78},"\u002Fdocs\u002Fproject\u002Fcontributing","Contributing",{"path":80,"title":81},"\u002Fdocs\u002Fproject\u002Flicense","License",{"path":83,"title":84},"\u002Fdocs\u002Fproject\u002Fsecurity","Security",{"path":86,"title":87},"\u002Fdocs\u002Freference\u002Fcapability-matrix","Supported features and platforms",{"path":89,"title":90},"\u002Fdocs\u002Freference\u002Fcli","CLI command reference",{"path":92,"title":93},"\u002Fdocs\u002Freference\u002Fconfiguration","Configuration",{"path":95,"title":96},"\u002Fdocs\u002Freference\u002Fenvironment-variables","Environment variables",{"path":98,"title":99},"\u002Fdocs\u002Freference\u002Ferrors-and-exit-codes","Errors and exit codes",{"path":101,"title":102},"\u002Fdocs\u002Freference\u002Fknown-issues","Known limitations",{"path":104,"title":105},"\u002Fdocs\u002Fremote-access","Manage remote access",{"path":107,"title":108},"\u002Fdocs\u002Fremote-daemon","Set up a remote host",{"path":110,"title":111},"\u002Fdocs\u002Fruntime-observability","Status, logs, and commands",{"path":113,"title":114},"\u002Fdocs\u002Fsecret-delivery","Pass secrets to your app",{"path":116,"title":117},"\u002Fdocs\u002Fsecret-providers","Choose a secret store",{"path":119,"title":120},"\u002Fdocs\u002Fstart\u002Finstall","Install mm",{"path":122,"title":123},"\u002Fdocs\u002Fterminal-ui","Terminal UI",{"path":125,"title":126},"\u002Fdocs\u002Ftutorials\u002Fdotnet-web-api",".NET web API example",{"path":128,"title":129},"\u002Fdocs\u002Ftutorials\u002Ffirst-local-app","First local app",{"path":131,"title":132},"\u002Fdocs\u002Ftutorials\u002Flaravel-rust","Laravel and Rust example",{"path":134,"title":135},"\u002Fdocs\u002Ftutorials\u002Fnode-fullstack","Node full stack example",{"path":137,"title":138},"\u002Fdocs\u002Fvault","Use HashiCorp Vault",{"id":140,"title":72,"body":141,"description":767,"extension":768,"meta":769,"navigation":770,"path":71,"seo":771,"stem":772,"__hash__":773},"docs\u002Fdocs\u002Fonboarding.md",{"type":142,"value":143,"toc":760},"minimark",[144,156,161,164,194,201,226,241,252,289,292,320,330,334,347,350,384,387,404,413,417,420,491,498,501,530,541,545,556,560,567,624,635,672,679,753,756],[145,146,147,151,152,155],"p",{},[148,149,120],"a",{"href":150},".\u002Fstart\u002Finstall"," first. For a complete example with workstation\nsetup, follow ",[148,153,129],{"href":154},".\u002Ftutorials\u002Ffirst-local-app",".",[157,158,160],"h2",{"id":159},"new-project","New project",[145,162,163],{},"From the directory containing your Compose files, preview the generated setup:",[165,166,171],"pre",{"className":167,"code":168,"language":169,"meta":170,"style":170},"language-sh shiki shiki-themes mm","mm init --name example\n","sh","",[172,173,174],"code",{"__ignoreMap":170},[175,176,179,183,187,191],"span",{"class":177,"line":178},"line",1,[175,180,182],{"class":181},"svrjQ","mm",[175,184,186],{"class":185},"sv8ni"," init",[175,188,190],{"class":189},"sbRf1"," --name",[175,192,193],{"class":185}," example\n",[145,195,196,197,200],{},"Replace ",[172,198,199],{},"example"," with your project name. mm finds services, build settings,\nports, environment templates, and possible development mounts. Review the\nproposed file changes, then use the printed hash to create them:",[165,202,204],{"className":167,"code":203,"language":169,"meta":170,"style":170},"mm init --name example --plan PLAN_HASH --yes\n",[172,205,206],{"__ignoreMap":170},[175,207,208,210,212,214,217,220,223],{"class":177,"line":178},[175,209,182],{"class":181},[175,211,186],{"class":185},[175,213,190],{"class":189},[175,215,216],{"class":185}," example",[175,218,219],{"class":189}," --plan",[175,221,222],{"class":185}," PLAN_HASH",[175,224,225],{"class":189}," --yes\n",[145,227,228,229,232,233,236,237,155],{},"The review includes a project ",[172,230,231],{},".gitignore"," update for\n",[172,234,235],{},"\u002F.config\u002Fmm.overrides.yaml",", preserving existing rules. You can create that\noptional file later for ",[148,238,240],{"href":239},".\u002Freference\u002Fconfiguration#local-overrides","local configuration overrides",[145,242,243,244,247,248,155],{},"Open ",[172,245,246],{},".config\u002Fmm.yaml"," and check the image repositories, environment bindings,\nroutes, and mounts. Generated guesses may need editing. See\n",[148,249,251],{"href":250},".\u002Fconcepts\u002Fconfiguration-ownership","where configuration belongs",[165,253,255],{"className":167,"code":254,"language":169,"meta":170,"style":170},"mm config validate\nmm env setup\nmm secret status\n",[172,256,257,267,278],{"__ignoreMap":170},[175,258,259,261,264],{"class":177,"line":178},[175,260,182],{"class":181},[175,262,263],{"class":185}," config",[175,265,266],{"class":185}," validate\n",[175,268,270,272,275],{"class":177,"line":269},2,[175,271,182],{"class":181},[175,273,274],{"class":185}," env",[175,276,277],{"class":185}," setup\n",[175,279,281,283,286],{"class":177,"line":280},3,[175,282,182],{"class":181},[175,284,285],{"class":185}," secret",[175,287,288],{"class":185}," status\n",[145,290,291],{},"Resolve missing values before building. If the project uses Age secrets:",[165,293,295],{"className":167,"code":294,"language":169,"meta":170,"style":170},"mm secret init age\nmm secret generate --missing\n",[172,296,297,308],{"__ignoreMap":170},[175,298,299,301,303,305],{"class":177,"line":178},[175,300,182],{"class":181},[175,302,285],{"class":185},[175,304,186],{"class":185},[175,306,307],{"class":185}," age\n",[175,309,310,312,314,317],{"class":177,"line":269},[175,311,182],{"class":181},[175,313,285],{"class":185},[175,315,316],{"class":185}," generate",[175,318,319],{"class":189}," --missing\n",[145,321,322,325,326,329],{},[172,323,324],{},"generate --missing"," creates values only for secrets with a configured generator.\nFor other values, use ",[172,327,328],{},"mm secret set KEY"," and enter the value at the hidden prompt.",[157,331,333],{"id":332},"existing-clone","Existing clone",[145,335,336,337,339,340,342,343,346],{},"Repositories initialized before local overrides were supported should add and\ncommit ",[172,338,235],{}," to their project ",[172,341,231],{}," once. Existing\nprojects use the setup flow below; ",[172,344,345],{},"mm init"," is for creating a project configuration.",[145,348,349],{},"From the project directory, check what is needed on this workstation:",[165,351,353],{"className":167,"code":352,"language":169,"meta":170,"style":170},"mm dev setup project\nmm env setup\nmm secret status\n",[172,354,355,368,376],{"__ignoreMap":170},[175,356,357,359,362,365],{"class":177,"line":178},[175,358,182],{"class":181},[175,360,361],{"class":185}," dev",[175,363,364],{"class":185}," setup",[175,366,367],{"class":185}," project\n",[175,369,370,372,374],{"class":177,"line":269},[175,371,182],{"class":181},[175,373,274],{"class":185},[175,375,277],{"class":185},[175,377,378,380,382],{"class":177,"line":280},[175,379,182],{"class":181},[175,381,285],{"class":185},[175,383,288],{"class":185},[145,385,386],{},"Follow the project's instructions for runtime selection and secret providers.\nSet a missing secret without putting its value in shell arguments:",[165,388,390],{"className":167,"code":389,"language":169,"meta":170,"style":170},"mm secret set database.password\n",[172,391,392],{"__ignoreMap":170},[175,393,394,396,398,401],{"class":177,"line":178},[175,395,182],{"class":181},[175,397,285],{"class":185},[175,399,400],{"class":185}," set",[175,402,403],{"class":185}," database.password\n",[145,405,196,406,409,410,155],{},[172,407,408],{},"database.password"," with the name reported by ",[172,411,412],{},"mm secret status",[157,414,416],{"id":415},"build-and-run","Build and run",[145,418,419],{},"For projects with their own images, publish a matching build before deploying:",[165,421,423],{"className":167,"code":422,"language":169,"meta":170,"style":170},"mm build --publish plan\nmm build --publish apply --plan BUILD_PLAN_HASH --yes\nmm deploy plan\nmm deploy apply --plan DEPLOY_PLAN_HASH --yes\nmm service status\n",[172,424,425,438,456,465,481],{"__ignoreMap":170},[175,426,427,429,432,435],{"class":177,"line":178},[175,428,182],{"class":181},[175,430,431],{"class":185}," build",[175,433,434],{"class":189}," --publish",[175,436,437],{"class":185}," plan\n",[175,439,440,442,444,446,449,451,454],{"class":177,"line":269},[175,441,182],{"class":181},[175,443,431],{"class":185},[175,445,434],{"class":189},[175,447,448],{"class":185}," apply",[175,450,219],{"class":189},[175,452,453],{"class":185}," BUILD_PLAN_HASH",[175,455,225],{"class":189},[175,457,458,460,463],{"class":177,"line":280},[175,459,182],{"class":181},[175,461,462],{"class":185}," deploy",[175,464,437],{"class":185},[175,466,468,470,472,474,476,479],{"class":177,"line":467},4,[175,469,182],{"class":181},[175,471,462],{"class":185},[175,473,448],{"class":185},[175,475,219],{"class":189},[175,477,478],{"class":185}," DEPLOY_PLAN_HASH",[175,480,225],{"class":189},[175,482,484,486,489],{"class":177,"line":483},5,[175,485,182],{"class":181},[175,487,488],{"class":185}," service",[175,490,288],{"class":185},[145,492,493,494,155],{},"Use each plan's printed hash. Builds require Docker Buildx, registry access,\nand a clean full Git checkout. Skip the build commands for projects using only\nthird-party images. See ",[148,495,497],{"href":496},".\u002Fconcepts\u002Fbuilds-and-deployments","build and deploy",[145,499,500],{},"The project-setup command can also apply a reviewed setup and deployment together:",[165,502,504],{"className":167,"code":503,"language":169,"meta":170,"style":170},"mm dev setup project --plan WORKFLOW_HASH --deploy-plan DEPLOY_HASH --yes\n",[172,505,506],{"__ignoreMap":170},[175,507,508,510,512,514,517,519,522,525,528],{"class":177,"line":178},[175,509,182],{"class":181},[175,511,361],{"class":185},[175,513,364],{"class":185},[175,515,516],{"class":185}," project",[175,518,219],{"class":189},[175,520,521],{"class":185}," WORKFLOW_HASH",[175,523,524],{"class":189}," --deploy-plan",[175,526,527],{"class":185}," DEPLOY_HASH",[175,529,225],{"class":189},[145,531,532,533,536,537,540],{},"Use the setup hash from ",[172,534,535],{},"mm dev setup project"," and the deployment hash from\n",[172,538,539],{},"mm deploy plan",". This does not build missing images. Regenerate both reviews\nif either becomes stale.",[157,542,544],{"id":543},"guided-terminal","Guided terminal",[145,546,547,548,550,551,555],{},"Run ",[172,549,182],{}," in an interactive terminal and open ",[552,553,554],"strong",{},"Guided"," for workstation setup,\nnew projects, existing clones, and project editing. Scripts should use explicit\nsubcommands instead.",[157,557,559],{"id":558},"automation","Automation",[145,561,562,563,566],{},"Place ",[172,564,565],{},"--output json"," before the subcommand:",[165,568,570],{"className":167,"code":569,"language":169,"meta":170,"style":170},"mm --output json config validate\nmm --output json deploy plan\nmm --output json deploy apply --plan \"$PLAN_HASH\" --yes\n",[172,571,572,586,598],{"__ignoreMap":170},[175,573,574,576,579,582,584],{"class":177,"line":178},[175,575,182],{"class":181},[175,577,578],{"class":189}," --output",[175,580,581],{"class":185}," json",[175,583,263],{"class":185},[175,585,266],{"class":185},[175,587,588,590,592,594,596],{"class":177,"line":269},[175,589,182],{"class":181},[175,591,578],{"class":189},[175,593,581],{"class":185},[175,595,462],{"class":185},[175,597,437],{"class":185},[175,599,600,602,604,606,608,610,612,615,619,622],{"class":177,"line":280},[175,601,182],{"class":181},[175,603,578],{"class":189},[175,605,581],{"class":185},[175,607,462],{"class":185},[175,609,448],{"class":185},[175,611,219],{"class":189},[175,613,614],{"class":185}," \"",[175,616,618],{"class":617},"sRW9m","$PLAN_HASH",[175,620,621],{"class":185},"\"",[175,623,225],{"class":189},[145,625,626,627,630,631,634],{},"Check the command's exit status as well as its JSON. Use ",[172,628,629],{},"--yes"," for required\nconfirmation and ",[172,632,633],{},"--stdin"," for secret input:",[165,636,638],{"className":167,"code":637,"language":169,"meta":170,"style":170},"printf '%s' \"$DATABASE_PASSWORD\" | mm secret set database.password --stdin\n",[172,639,640],{"__ignoreMap":170},[175,641,642,645,648,650,653,655,659,662,664,666,669],{"class":177,"line":178},[175,643,644],{"class":181},"printf",[175,646,647],{"class":185}," '%s'",[175,649,614],{"class":185},[175,651,652],{"class":617},"$DATABASE_PASSWORD",[175,654,621],{"class":185},[175,656,658],{"class":657},"sIbZ0"," |",[175,660,661],{"class":181}," mm",[175,663,285],{"class":185},[175,665,400],{"class":185},[175,667,668],{"class":185}," database.password",[175,670,671],{"class":189}," --stdin\n",[145,673,674,675,678],{},"Combined ",[172,676,677],{},"dev setup --services"," is not supported in JSON mode. Split it into\nsetup and shared-service commands:",[165,680,682],{"className":167,"code":681,"language":169,"meta":170,"style":170},"mm --output json dev setup\nmm --output json --runtime docker-compose dev services plan\nmm --output json --runtime docker-compose dev services apply \\\n  --plan \"$SERVICES_PLAN_HASH\" --yes\n",[172,683,684,696,717,739],{"__ignoreMap":170},[175,685,686,688,690,692,694],{"class":177,"line":178},[175,687,182],{"class":181},[175,689,578],{"class":189},[175,691,581],{"class":185},[175,693,361],{"class":185},[175,695,277],{"class":185},[175,697,698,700,702,704,707,710,712,715],{"class":177,"line":269},[175,699,182],{"class":181},[175,701,578],{"class":189},[175,703,581],{"class":185},[175,705,706],{"class":189}," --runtime",[175,708,709],{"class":185}," docker-compose",[175,711,361],{"class":185},[175,713,714],{"class":185}," services",[175,716,437],{"class":185},[175,718,719,721,723,725,727,729,731,733,735],{"class":177,"line":280},[175,720,182],{"class":181},[175,722,578],{"class":189},[175,724,581],{"class":185},[175,726,706],{"class":189},[175,728,709],{"class":185},[175,730,361],{"class":185},[175,732,714],{"class":185},[175,734,448],{"class":185},[175,736,738],{"class":737},"s1Wbj"," \\\n",[175,740,741,744,746,749,751],{"class":177,"line":467},[175,742,743],{"class":189},"  --plan",[175,745,614],{"class":185},[175,747,748],{"class":617},"$SERVICES_PLAN_HASH",[175,750,621],{"class":185},[175,752,225],{"class":189},[145,754,755],{},"Use the runtime that owns your local services throughout.",[757,758,759],"style",{},"html pre.shiki code .svrjQ, html code.shiki .svrjQ{--shiki-default:var(--mm-code-function)}html pre.shiki code .sv8ni, html code.shiki .sv8ni{--shiki-default:var(--mm-code-string)}html pre.shiki code .sbRf1, html code.shiki .sbRf1{--shiki-default:var(--mm-code-option)}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sRW9m, html code.shiki .sRW9m{--shiki-default:var(--mm-code-variable)}html pre.shiki code .sIbZ0, html code.shiki .sIbZ0{--shiki-default:var(--mm-code-punctuation)}html pre.shiki code .s1Wbj, html code.shiki .s1Wbj{--shiki-default:var(--mm-code-constant)}",{"title":170,"searchDepth":269,"depth":269,"links":761},[762,763,764,765,766],{"id":159,"depth":269,"text":160},{"id":332,"depth":269,"text":333},{"id":415,"depth":269,"text":416},{"id":543,"depth":269,"text":544},{"id":558,"depth":269,"text":559},"Add mm to a Compose project or prepare an existing checkout.","md",{},true,{"title":72,"description":767},"docs\u002Fonboarding","2UbDfwoMhDXNj6hCvfTpSabs5da7XcFaq_UxKWrHJ00",1794512545910]