[{"data":1,"prerenderedAt":1283},["ShallowReactive",2],{"docs-nav":3,"docs:\u002Fdocs\u002Fstart\u002Finstall":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":120,"body":141,"description":1276,"extension":1277,"meta":1278,"navigation":1279,"path":119,"seo":1280,"stem":1281,"__hash__":1282},"docs\u002Fdocs\u002Fstart\u002Finstall.md",{"type":142,"value":143,"toc":1264},"minimark",[144,148,191,206,237,240,263,272,277,284,317,397,403,407,410,419,432,437,474,477,490,497,521,562,569,574,589,604,644,651,670,685,688,691,695,698,716,722,741,751,762,766,769,786,789,792,804,807,817,820,832,838,841,845,971,974,997,1003,1007,1094,1101,1108,1112,1115,1132,1141,1153,1156,1200,1203,1206,1219,1230,1245,1249,1260],[145,146,147],"p",{},"Run the installer on Linux or macOS:",[149,150,155],"pre",{"className":151,"code":152,"language":153,"meta":154,"style":154},"language-sh shiki shiki-themes mm","curl --proto '=https' --tlsv1.2 -LsSf https:\u002F\u002Fget.modmon.org\u002Finstall.sh | sh\n","sh","",[156,157,158],"code",{"__ignoreMap":154},[159,160,163,167,171,175,178,181,184,188],"span",{"class":161,"line":162},"line",1,[159,164,166],{"class":165},"svrjQ","curl",[159,168,170],{"class":169},"sbRf1"," --proto",[159,172,174],{"class":173},"sv8ni"," '=https'",[159,176,177],{"class":169}," --tlsv1.2",[159,179,180],{"class":169}," -LsSf",[159,182,183],{"class":173}," https:\u002F\u002Fget.modmon.org\u002Finstall.sh",[159,185,187],{"class":186},"sIbZ0"," |",[159,189,190],{"class":165}," sh\n",[145,192,193,194,197,198,201,202,205],{},"The installer downloads the release for your platform, checks the archive's size\nand SHA-256 against the release manifest, and installs ",[156,195,196],{},"mm"," in ",[156,199,200],{},"~\u002F.local\u002Fbin",".\nIt does not use sudo and does not edit shell startup files. If the install\ndirectory is not on your ",[156,203,204],{},"PATH",", the installer prints the directory to add.",[145,207,208,209,211,212,215,216,219,220,215,223,226,227,230,231,236],{},"It needs ",[156,210,166],{}," or ",[156,213,214],{},"wget",", ",[156,217,218],{},"tar",", and one of ",[156,221,222],{},"sha256sum",[156,224,225],{},"shasum",", or ",[156,228,229],{},"openssl",".\nReleases are built for x86-64 and ARM64. See\n",[232,233,235],"a",{"href":234},"..\u002Freference\u002Fcapability-matrix","supported platforms"," for what each runtime\nand operating system supports.",[145,238,239],{},"Check the result, then set up local trust and shared services:",[149,241,243],{"className":151,"code":242,"language":153,"meta":154,"style":154},"mm --version\nmm dev setup\n",[156,244,245,252],{"__ignoreMap":154},[159,246,247,249],{"class":161,"line":162},[159,248,196],{"class":165},[159,250,251],{"class":169}," --version\n",[159,253,255,257,260],{"class":161,"line":254},2,[159,256,196],{"class":165},[159,258,259],{"class":173}," dev",[159,261,262],{"class":173}," setup\n",[145,264,265,268,269,271],{},[156,266,267],{},"mm dev setup"," shows its plan and asks before it changes anything. Run ",[156,270,196],{},"\nwithout arguments for the guided interface.",[273,274,276],"h2",{"id":275},"installer-options","Installer options",[145,278,279,280,283],{},"Pass options after ",[156,281,282],{},"sh -s --",":",[149,285,287],{"className":151,"code":286,"language":153,"meta":154,"style":154},"curl --proto '=https' --tlsv1.2 -LsSf https:\u002F\u002Fget.modmon.org\u002Finstall.sh | sh -s -- --with-daemon\n",[156,288,289],{"__ignoreMap":154},[159,290,291,293,295,297,299,301,303,305,308,311,314],{"class":161,"line":162},[159,292,166],{"class":165},[159,294,170],{"class":169},[159,296,174],{"class":173},[159,298,177],{"class":169},[159,300,180],{"class":169},[159,302,183],{"class":173},[159,304,187],{"class":186},[159,306,307],{"class":165}," sh",[159,309,310],{"class":169}," -s",[159,312,313],{"class":169}," --",[159,315,316],{"class":169}," --with-daemon\n",[318,319,320,333],"table",{},[321,322,323],"thead",{},[324,325,326,330],"tr",{},[327,328,329],"th",{},"Option",[327,331,332],{},"Effect",[334,335,336,347,357,371,384],"tbody",{},[324,337,338,344],{},[339,340,341],"td",{},[156,342,343],{},"--version vMAJOR.MINOR.PATCH",[339,345,346],{},"Install that exact release instead of the latest",[324,348,349,354],{},[339,350,351],{},[156,352,353],{},"--install-dir PATH",[339,355,356],{},"Choose a different binary directory",[324,358,359,364],{},[339,360,361],{},[156,362,363],{},"--with-daemon",[339,365,366,367,370],{},"Also install ",[156,368,369],{},"mmd","; does not start a service",[324,372,373,378],{},[339,374,375],{},[156,376,377],{},"--force",[339,379,380,381,383],{},"Allow a downgrade, or replace an ",[156,382,196],{}," whose version is unknown",[324,385,386,391],{},[339,387,388],{},[156,389,390],{},"--no-modify-path",[339,392,393,394,396],{},"Do not print the ",[156,395,204],{}," reminder",[145,398,399,400,402],{},"To update, run the installer again. It replaces the existing binary only after\nthe new one is verified, and refuses to downgrade without ",[156,401,377],{},".",[273,404,406],{"id":405},"build-from-a-checkout","Build from a checkout",[145,408,409],{},"To build mm yourself, clone the repository and run this from its root:",[149,411,413],{"className":151,"code":412,"language":153,"meta":154,"style":154},".\u002Finstall.sh\n",[156,414,415],{"__ignoreMap":154},[159,416,417],{"class":161,"line":162},[159,418,412],{"class":165},[145,420,421,422,424,425,427,428,431],{},"The installer builds mm and its dashboard, installs the binary in\n",[156,423,200],{},", sets up your shell's ",[156,426,204],{},", and runs workstation setup: wildcard\n",[156,429,430],{},".test"," DNS, a trusted local certificate authority, and a reviewed shared ingress,\ndashboard, and Mailpit service plan. Setup prompts for sudo and plan approval.\nYou do not need to install Rust or Node.js yourself.",[433,434,436],"h3",{"id":435},"requirements","Requirements",[318,438,439,449],{},[321,440,441],{},[324,442,443,446],{},[327,444,445],{},"Platform",[327,447,448],{},"What you need",[334,450,451,459],{},[324,452,453,456],{},[339,454,455],{},"Linux, x86-64 or ARM64",[339,457,458],{},"Local Docker with Compose, systemd, active systemd-resolved, and sudo access",[324,460,461,464],{},[339,462,463],{},"macOS, Intel or Apple Silicon",[339,465,466,467,473],{},"Apple Command Line Tools; for setup, Docker Desktop as the active Docker context, ",[232,468,472],{"href":469,"rel":470},"https:\u002F\u002Fbrew.sh",[471],"nofollow","Homebrew",", and sudo access",[145,475,476],{},"On macOS, install the command-line tools first if needed:",[149,478,480],{"className":151,"code":479,"language":153,"meta":154,"style":154},"xcode-select --install\n",[156,481,482],{"__ignoreMap":154},[159,483,484,487],{"class":161,"line":162},[159,485,486],{"class":165},"xcode-select",[159,488,489],{"class":169}," --install\n",[145,491,492,493,496],{},"Wait for that installation to finish, then run ",[156,494,495],{},".\u002Finstall.sh"," again.",[145,498,499,500,503,504,507,508,510,511,514,515,517,518,402],{},"Linux setup installs missing ",[156,501,502],{},"dnsmasq"," and ",[156,505,506],{},"haproxy"," packages using DNF, APT, or\nPacman. Other distributions need those packages installed beforehand. Existing\nworking wildcard ",[156,509,430],{}," resolution is reused. Otherwise setup installs the\ndedicated ",[156,512,513],{},"mm-test-dns"," service and host-only DNS interface, routing only ",[156,516,430],{},"\nqueries there. It does not add per-project entries to ",[156,519,520],{},"\u002Fetc\u002Fhosts",[145,522,523,524,503,526,528,529,532,533,536,537,539,540,543,544,546,547,550,551,554,555,503,558,561],{},"macOS setup installs missing ",[156,525,506],{},[156,527,502],{}," formulae with Homebrew as\nyour user. Local HTTPS on macOS is supported with Docker Desktop only: if\n",[156,530,531],{},"docker context show"," names another engine, such as Colima, run\n",[156,534,535],{},"docker context use desktop-linux"," before setup and when running mm. Existing\nworking wildcard ",[156,538,430],{}," resolution is reused. Otherwise setup adds\n",[156,541,542],{},"\u002Fetc\u002Fresolver\u002Ftest",", which sends only ",[156,545,430],{}," queries to a dnsmasq instance on\nthe dedicated loopback address ",[156,548,549],{},"127.0.77.53",". That dnsmasq runs from a\nroot-owned copy in ",[156,552,553],{},"\u002FLibrary\u002FPrivilegedHelperTools\u002F",", started by the\n",[156,556,557],{},"local.mm.dns",[156,559,560],{},"local.mm.loopback-alias"," launch daemons.",[145,563,564,565,568],{},"The default setup runtime is Docker Compose. If an existing installation uses\nPodman Compose, run setup with ",[156,566,567],{},"MM_SETUP_RUNTIME=podman-compose"," instead; do not\nswitch the runtime owning shared services implicitly.",[570,571,573],"h4",{"id":572},"privileges-and-binary-ownership","Privileges and binary ownership",[145,575,576,577,580,581,584,585,588],{},"The normal ",[156,578,579],{},"~\u002F.local\u002Fbin\u002Fmm"," remains owned by you and runs as your user. Setup\ninstalls a separate, protected ",[156,582,583],{},"mm-ingress-helper"," under ",[156,586,587],{},"\u002Fusr\u002Flocal\u002Flibexec\u002Fmm\u002F",".\nThat helper accepts only fixed, reviewed ingress installation\u002Fremoval operations;\nit is neither setuid nor a persistent root mm process. Setup does not install a\npasswordless sudo rule.",[145,590,591,592,595,596,599,600,603],{},"On SELinux-enabled hosts, the helper installs a fixed ",[156,593,594],{},"mm_ingress"," policy and\nlabels only the two target-specific backend TCP ports. This permits HAProxy's\ndomain transition under the hardened systemd unit and its connections to mm's\nloopback backend. SELinux stays enforcing; setup does not enable the global\n",[156,597,598],{},"haproxy_connect_any"," boolean. Fedora may require the\n",[156,601,602],{},"policycoreutils-python-utils"," package, which workstation setup installs when\nmissing.",[145,605,606,607,609,610,613,614,617,618,621,622,625,626,629,630,633,634,636,637,640,641,643],{},"On macOS, setup uses sudo only for ",[156,608,430],{}," DNS and, if you choose it, system-wide\ncertificate trust. macOS lets any user listen on ports 80 and 443 on all\naddresses, so HAProxy, the Compose autostart, and the dashboard run as your user\nin launchd agents under ",[156,611,612],{},"~\u002FLibrary\u002FLaunchAgents\u002F"," (",[156,615,616],{},"local.mm.ingress-forwarder",",\n",[156,619,620],{},"local.mm.ingress",", and ",[156,623,624],{},"local.mm.dashboard","). mm writes their configuration\nto ",[156,627,628],{},"~\u002FLibrary\u002FApplication Support\u002Fmm\u002F"," and their output to ",[156,631,632],{},"~\u002FLibrary\u002FLogs\u002Fmm\u002F",".\nAt login, ",[156,635,620],{}," retries every 15 seconds until Docker Desktop is\nrunning, then starts the ingress containers. The dashboard listens only on\n",[156,638,639],{},"127.0.0.1",". No ",[156,642,583],{}," is installed on macOS.",[145,645,646,647,650],{},"Once the public-port forwarder is installed, ordinary site routing changes reuse\nit when its ownership, fixed configuration, and availability still match. They\ndo not elevate the CLI. Changing or removing the host-level forwarding setup\nrequires sudo again. Rebuilds keep the CLI user-owned; ",[156,648,649],{},"--setup-only"," refreshes\nthe protected helper when necessary.",[145,652,653,654,656,657,661,662,665,666,669],{},"As its last step, setup registers the mm MCP server with Claude Code and\nOpenCode when they are on ",[156,655,204],{},", so their agents can\n",[232,658,660],{"href":659},"..\u002Fmcp","work on your projects",". It changes only each tool's own user\nconfiguration. ",[156,663,664],{},"--no-setup"," skips it; run ",[156,667,668],{},"mm agent setup --user --yes"," to do\nit later, or for Codex and Cursor.",[145,671,672,673,676,677,680,681,684],{},"Use ",[156,674,675],{},"mm ingress stop"," to free public ports 80\u002F443 for another development stack,\nand ",[156,678,679],{},"mm ingress start"," to resume mm's public forwarding. These global commands\nleave site containers and data running.\n",[156,682,683],{},"start"," also installs or repairs missing ingress prerequisites idempotently,\nusing the existing shared-services runtime and reviewed plans when needed.",[145,686,687],{},"The first build needs internet access, several GB of free disk space, and time\nto download and compile dependencies. Linux builds run in a Docker container\nlimited to 1 CPU and 4 GiB RAM, without extra container swap. Docker must run on the same machine and CPU\narchitecture; a remote Docker daemon is not supported.",[145,689,690],{},"On macOS, the installer downloads its own Rust and Node.js toolchains into a\nprivate user cache. Native Windows is not supported by this local installer.",[433,692,694],{"id":693},"check-it-works","Check it works",[145,696,697],{},"Open a new terminal, then run:",[149,699,701],{"className":151,"code":700,"language":153,"meta":154,"style":154},"mm --version\nmm --help\n",[156,702,703,709],{"__ignoreMap":154},[159,704,705,707],{"class":161,"line":162},[159,706,196],{"class":165},[159,708,251],{"class":169},[159,710,711,713],{"class":161,"line":254},[159,712,196],{"class":165},[159,714,715],{"class":169}," --help\n",[145,717,718,719,721],{},"The installer configures Bash, Zsh, and Fish. For another shell, add the printed\ninstall directory to ",[156,720,204],{}," yourself. To use mm immediately without opening a\nnew terminal:",[149,723,725],{"className":151,"code":724,"language":153,"meta":154,"style":154},"\"$HOME\u002F.local\u002Fbin\u002Fmm\" --help\n",[156,726,727],{"__ignoreMap":154},[159,728,729,732,736,739],{"class":161,"line":162},[159,730,731],{"class":165},"\"",[159,733,735],{"class":734},"sRW9m","$HOME",[159,737,738],{"class":165},"\u002F.local\u002Fbin\u002Fmm\"",[159,740,715],{"class":169},[145,742,743,744,746,747,750],{},"If your shell finds an older mm, use the ",[156,745,204],{}," command printed at the end of\ninstallation. ",[156,748,749],{},"command -v mm"," shows which copy your shell is using.",[145,752,753,754,757,758,761],{},"For Bash and Zsh, the installer also disables the legacy ",[156,755,756],{},"alias mm=.\u002Fmm"," when\nyou reload the configured startup file or open a new terminal. To clear that\nalias in an already-open session, run ",[156,759,760],{},"unalias mm",", or use the current-session\ncommand printed by the installer. Other custom aliases are preserved.",[433,763,765],{"id":764},"update","Update",[145,767,768],{},"From your checkout, get the latest changes and rerun the installer:",[149,770,772],{"className":151,"code":771,"language":153,"meta":154,"style":154},"git pull\n.\u002Finstall.sh\n",[156,773,774,782],{"__ignoreMap":154},[159,775,776,779],{"class":161,"line":162},[159,777,778],{"class":165},"git",[159,780,781],{"class":173}," pull\n",[159,783,784],{"class":161,"line":254},[159,785,412],{"class":165},[145,787,788],{},"It builds the current checkout, including local edits, even when the package\nversion has not changed. Downloaded dependencies and compilation results are\ncached to speed up later builds.",[145,790,791],{},"Normal installs use a fast incremental local build. For code-edit\u002Frebuild cycles\nafter workstation setup:",[149,793,795],{"className":151,"code":794,"language":153,"meta":154,"style":154},".\u002Finstall.sh --no-setup\n",[156,796,797],{"__ignoreMap":154},[159,798,799,801],{"class":161,"line":162},[159,800,495],{"class":165},[159,802,803],{"class":169}," --no-setup\n",[145,805,806],{},"The local profile disables link-time optimization and debug-info generation,\nretains incremental compilation, and caches optimized dependencies. Linux uses\nthe Rust toolchain's LLD linker with one linking thread. The first build populates\nthe cache; later builds reuse it. Unchanged build inputs reuse the cached binaries\nwithout rerunning npm or Cargo. Do not delete the cache to resolve an installer\nlock—it makes the next build cold again.",[145,808,672,809,812,813,816],{},[156,810,811],{},".\u002Finstall.sh --release"," when you specifically want the slower, fully optimized\nrelease build. Use ",[156,814,815],{},"--rebuild"," to force a build without deleting dependencies.\nLinux builds remain limited to 1 CPU and 4 GiB RAM in either mode, and cannot use\nextra swap. The default Cargo job count is one.",[145,818,819],{},"To finish or retry workstation setup without compiling anything:",[149,821,823],{"className":151,"code":822,"language":153,"meta":154,"style":154},".\u002Finstall.sh --setup-only\n",[156,824,825],{"__ignoreMap":154},[159,826,827,829],{"class":161,"line":162},[159,828,495],{"class":165},[159,830,831],{"class":169}," --setup-only\n",[145,833,834,835,837],{},"A setup failure leaves the successfully installed binary in place and reports\nthat workstation setup is incomplete. Fix the reported prerequisite and retry\n",[156,836,649],{},", rather than rebuilding.",[145,839,840],{},"If a previous shared-services operation left an interrupted journal, setup first\noffers a reviewed repair, then a fresh convergence plan. Neither setup plan\npurges data. Cancelling or leaving the service stack unhealthy keeps setup in an\nincomplete state instead of reporting success.",[433,842,844],{"id":843},"options","Options",[318,846,847,855],{},[321,848,849],{},[324,850,851,853],{},[327,852,329],{},[327,854,332],{},[334,856,857,865,874,883,892,902,912,921,932,948,961],{},[324,858,859,863],{},[339,860,861],{},[156,862,353],{},[339,864,356],{},[324,866,867,871],{},[339,868,869],{},[156,870,390],{},[339,872,873],{},"Leave shell startup files alone",[324,875,876,880],{},[339,877,878],{},[156,879,664],{},[339,881,882],{},"Install the binary without changing workstation DNS, trust, or services",[324,884,885,889],{},[339,886,887],{},[156,888,649],{},[339,890,891],{},"Set up the workstation and coding tools using the installed binary; skip compilation",[324,893,894,899],{},[339,895,896],{},[156,897,898],{},"--dev",[339,900,901],{},"Select the fast incremental local build, which is the default",[324,903,904,909],{},[339,905,906],{},[156,907,908],{},"--release",[339,910,911],{},"Build the slower optimized release binary",[324,913,914,918],{},[339,915,916],{},[156,917,815],{},[339,919,920],{},"Force a build instead of reusing an unchanged cached binary",[324,922,923,927],{},[339,924,925],{},[156,926,363],{},[339,928,929,930,370],{},"Also build and install ",[156,931,369],{},[324,933,934,939],{},[339,935,936],{},[156,937,938],{},"--build-only",[339,940,941,942,945,946],{},"Write binaries under ",[156,943,944],{},"target\u002Flocal-install\u002F\u003Ctarget>\u002F"," without installing them into your normal binary directory or changing ",[156,947,204],{},[324,949,950,955],{},[339,951,952],{},[156,953,954],{},"--jobs NUMBER",[339,956,957,958],{},"Set parallel Rust compilation jobs; default is ",[156,959,960],{},"1",[324,962,963,968],{},[339,964,965],{},[156,966,967],{},"--help",[339,969,970],{},"Show usage and requirements",[145,972,973],{},"For example:",[149,975,977],{"className":151,"code":976,"language":153,"meta":154,"style":154},".\u002Finstall.sh --install-dir \"$HOME\u002Fbin\" --no-modify-path\n",[156,978,979],{"__ignoreMap":154},[159,980,981,983,986,989,991,994],{"class":161,"line":162},[159,982,495],{"class":165},[159,984,985],{"class":169}," --install-dir",[159,987,988],{"class":173}," \"",[159,990,735],{"class":734},[159,992,993],{"class":173},"\u002Fbin\"",[159,995,996],{"class":169}," --no-modify-path\n",[145,998,999,1000,402],{},"Use a user-writable destination and run the installer without ",[156,1001,1002],{},"sudo",[433,1004,1006],{"id":1005},"if-installation-fails","If installation fails",[1008,1009,1010,1022,1032,1038,1044,1050,1082],"ul",{},[1011,1012,1013,1017,1018,1021],"li",{},[1014,1015,1016],"strong",{},"Docker unavailable:"," start Docker and check that ",[156,1019,1020],{},"docker info"," works as your\nnormal user, then rerun the installer.",[1011,1023,1024,1027,1028,1031],{},[1014,1025,1026],{},"Command Line Tools missing:"," complete ",[156,1029,1030],{},"xcode-select --install"," on macOS.",[1011,1033,1034,1037],{},[1014,1035,1036],{},"Build uses too much memory:"," use the default local profile and one job.\nThe Linux container is limited to 4 GiB with no extra swap.",[1011,1039,1040,1043],{},[1014,1041,1042],{},"Another installer is running:"," the message identifies its PID and host.\nLocks with an exited local owner are recovered automatically. An ownerless\nlock is left alone until running installers have been checked; do not delete\nthe dependency cache to clear it.",[1011,1045,1046,1049],{},[1014,1047,1048],{},"Build error:"," inspect the build log path printed by the installer.",[1011,1051,1052,1055,1056,1059,1060,1063,1064,1067,1068,1071,1072,1075,1076,1078,1079,402],{},[1014,1053,1054],{},"DNS, trust, or ingress setup failed:"," rerun ",[156,1057,1058],{},".\u002Finstall.sh --setup-only"," from\na terminal so sudo and the reviewed services plan can be approved. On Linux,\ninspect ",[156,1061,1062],{},"systemctl status mm-test-dns.service"," and\n",[156,1065,1066],{},"journalctl -u mm-test-dns.service"," for DNS service failures. On macOS, check\nthat ",[156,1069,1070],{},"scutil --dns"," lists a ",[156,1073,1074],{},"test"," resolver using ",[156,1077,549],{},", and inspect\n",[156,1080,1081],{},"sudo launchctl print system\u002Flocal.mm.dns",[1011,1083,1084,1087,1088,1090,1091,402],{},[1014,1085,1086],{},"macOS reports another Docker endpoint:"," local HTTPS on macOS needs Docker\nDesktop. Run ",[156,1089,535],{},", or unset ",[156,1092,1093],{},"DOCKER_HOST",[145,1095,1096,1097,1100],{},"The installer builds and checks the new binaries before replacing your installed\ncopy. It also writes ",[156,1098,1099],{},"install-receipt.txt"," beside the binaries with the source\nrevision and build toolchain versions.",[145,1102,1103,1104,1107],{},"The cache is ",[156,1105,1106],{},"${XDG_CACHE_HOME:-$HOME\u002F.cache}\u002Fmm-installer",". You can delete it\nwhen no installation is running; the next build will download dependencies again.",[433,1109,1111],{"id":1110},"uninstall","Uninstall",[145,1113,1114],{},"For the default destination:",[149,1116,1118],{"className":151,"code":1117,"language":153,"meta":154,"style":154},"rm \"$HOME\u002F.local\u002Fbin\u002Fmm\"\n",[156,1119,1120],{"__ignoreMap":154},[159,1121,1122,1125,1127,1129],{"class":161,"line":162},[159,1123,1124],{"class":165},"rm",[159,1126,988],{"class":173},[159,1128,735],{"class":734},[159,1130,1131],{"class":173},"\u002F.local\u002Fbin\u002Fmm\"\n",[145,1133,1134,1135,1137,1138,1140],{},"If you installed the optional daemon, remove ",[156,1136,369],{}," from the same directory too.\nYou can also remove ",[156,1139,1099],{},". For a custom destination, remove the\nfiles there instead.",[145,1142,1143,1144,1063,1148,1152],{},"Removing binaries leaves running services, certificates, and private state in\nplace. Use ",[232,1145,1147],{"href":1146},"..\u002Flocal-services","local service removal",[232,1149,1151],{"href":1150},"..\u002Flocal-https#uninstall","TLS removal"," first if you want to remove those too.",[145,1154,1155],{},"If the installer created mm's dedicated DNS service, remove it separately:",[149,1157,1159],{"className":151,"code":1158,"language":153,"meta":154,"style":154},"sudo systemctl disable --now mm-test-dns.service\nsudo rm \u002Fetc\u002Fsystemd\u002Fsystem\u002Fmm-test-dns.service \u002Fetc\u002Fmm\u002Fdnsmasq.conf\nsudo systemctl daemon-reload\n",[156,1160,1161,1177,1190],{"__ignoreMap":154},[159,1162,1163,1165,1168,1171,1174],{"class":161,"line":162},[159,1164,1002],{"class":165},[159,1166,1167],{"class":173}," systemctl",[159,1169,1170],{"class":173}," disable",[159,1172,1173],{"class":169}," --now",[159,1175,1176],{"class":173}," mm-test-dns.service\n",[159,1178,1179,1181,1184,1187],{"class":161,"line":254},[159,1180,1002],{"class":165},[159,1182,1183],{"class":173}," rm",[159,1185,1186],{"class":173}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fmm-test-dns.service",[159,1188,1189],{"class":173}," \u002Fetc\u002Fmm\u002Fdnsmasq.conf\n",[159,1191,1193,1195,1197],{"class":161,"line":1192},3,[159,1194,1002],{"class":165},[159,1196,1167],{"class":173},[159,1198,1199],{"class":173}," daemon-reload\n",[145,1201,1202],{},"Stopping that service removes its dedicated DNS interface. DNS provided by an\nexisting resolver that setup merely reused is not changed.",[145,1204,1205],{},"On macOS, remove mm's DNS integration from the checkout with:",[149,1207,1209],{"className":151,"code":1208,"language":153,"meta":154,"style":154},".\u002Fscripts\u002Finstall\u002Flocal-dns-macos.sh --remove\n",[156,1210,1211],{"__ignoreMap":154},[159,1212,1213,1216],{"class":161,"line":162},[159,1214,1215],{"class":165},".\u002Fscripts\u002Finstall\u002Flocal-dns-macos.sh",[159,1217,1218],{"class":169}," --remove\n",[145,1220,1221,1222,503,1224,1226,1227,1229],{},"It unloads ",[156,1223,557],{},[156,1225,560],{}," and removes only the\nfiles mm created: ",[156,1228,542],{},", the two launch daemons, the dnsmasq\nconfiguration, and the dnsmasq copy. Removing the local services also removes\nthe ingress and dashboard launch agents.",[145,1231,1232,1233,1236,1237,1240,1241,1244],{},"On NetworkManager hosts, setup also installs\n",[156,1234,1235],{},"\u002Fetc\u002FNetworkManager\u002Fconf.d\u002F90-mm-test-dns.conf"," to keep other connection\ndispatcher hooks from rewriting mm's DNS interface. Remove that mm-owned file\nand run ",[156,1238,1239],{},"sudo nmcli general reload conf"," when removing mm's DNS integration.\nAfter removing ingress, the protected helper can be removed from\n",[156,1242,1243],{},"\u002Fusr\u002Flocal\u002Flibexec\u002Fmm\u002Fmm-ingress-helper","; its user-owned build copy is beside\nthe CLI in the install directory.",[273,1246,1248],{"id":1247},"next-step","Next step",[145,1250,1251,1252,1254,1255,1259],{},"Workstation setup prepares DNS, trust, and shared services. Project images,\nenvironment values, and deployments are still project-specific. Bare ",[156,1253,196],{}," guides\nyou through missing prerequisites. ",[232,1256,1258],{"href":1257},"..\u002Ftutorials\u002Ffirst-local-app","Run your first local app","\nfor a complete example.",[1261,1262,1263],"style",{},"html pre.shiki code .svrjQ, html code.shiki .svrjQ{--shiki-default:var(--mm-code-function)}html pre.shiki code .sbRf1, html code.shiki .sbRf1{--shiki-default:var(--mm-code-option)}html pre.shiki code .sv8ni, html code.shiki .sv8ni{--shiki-default:var(--mm-code-string)}html pre.shiki code .sIbZ0, html code.shiki .sIbZ0{--shiki-default:var(--mm-code-punctuation)}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)}",{"title":154,"searchDepth":254,"depth":254,"links":1265},[1266,1267,1275],{"id":275,"depth":254,"text":276},{"id":405,"depth":254,"text":406,"children":1268},[1269,1270,1271,1272,1273,1274],{"id":435,"depth":1192,"text":436},{"id":693,"depth":1192,"text":694},{"id":764,"depth":1192,"text":765},{"id":843,"depth":1192,"text":844},{"id":1005,"depth":1192,"text":1006},{"id":1110,"depth":1192,"text":1111},{"id":1247,"depth":254,"text":1248},"Install mm with one command on Linux or macOS, or build it from a checkout.","md",{},true,{"title":120,"description":1276},"docs\u002Fstart\u002Finstall","_FesysoYUoa4tIpi10c4djrzzCIr8ASBQ6-tAUJVsAc",1794512545910]