[{"data":1,"prerenderedAt":375},["ShallowReactive",2],{"docs-nav":3,"docs:\u002Fdocs\u002Fcontribute\u002Freleases":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":30,"body":141,"description":368,"extension":369,"meta":370,"navigation":371,"path":29,"seo":372,"stem":373,"__hash__":374},"docs\u002Fdocs\u002Fcontribute\u002Freleases.md",{"type":142,"value":143,"toc":361},"minimark",[144,148,153,161,217,220,224,251,280,287,300,304,307,337,340,344,351,354,357],[145,146,147],"p",{},"Releases are published by the protected GitHub Actions workflow. A manual\nworkflow run builds packages for checking; it does not publish a stable release.",[149,150,152],"h2",{"id":151},"before-you-start","Before you start",[145,154,155,156,160],{},"You need permission to create release tags and approve the GitHub ",[157,158,159],"code",{},"release","\nenvironment. The release infrastructure must already be configured:",[162,163,164,176,195,206],"ul",{},[165,166,167,168,171,172,175],"li",{},"A dedicated Cloudflare R2 bucket connected to ",[157,169,170],{},"get.modmon.org",", with HTTPS\nand TLS 1.2 or newer. Disable its public ",[157,173,174],{},"r2.dev"," URL.",[165,177,178,179,182,183,186,187,190,191,194],{},"A bucket-scoped read\u002Fwrite token. Store ",[157,180,181],{},"R2_ACCOUNT_ID",", ",[157,184,185],{},"R2_ACCESS_KEY_ID",",\nand ",[157,188,189],{},"R2_SECRET_ACCESS_KEY"," as protected environment secrets; store ",[157,192,193],{},"R2_BUCKET","\nas an environment variable.",[165,196,197,198,201,202,205],{},"Protected ",[157,199,200],{},"v*"," tags: restrict creation\u002Fdeletion, prevent updates, and require\nthe release commit to be on ",[157,203,204],{},"master",".",[165,207,208,209,212,213,216],{},"Cache rules that keep ",[157,210,211],{},"\u002Freleases\u002F**"," immutable for one year, revalidate\n",[157,214,215],{},"\u002Fmanifest.json",", and give root installers a short cache lifetime.",[145,218,219],{},"Test infrastructure changes using a separate bucket and hostname before using\nthe public release bucket. Keep credentials out of the repository and logs.",[149,221,223],{"id":222},"prepare-the-candidate","Prepare the candidate",[225,226,227,241,248],"ol",{},[165,228,229,230,182,233,236,237,240],{},"Update ",[157,231,232],{},"core\u002FCargo.toml",[157,234,235],{},"Cargo.lock",", and ",[157,238,239],{},"CHANGELOG.md"," to the same version.",[165,242,243,244,247],{},"Run ",[157,245,246],{},"make quality"," from the repository root.",[165,249,250],{},"Run local release preflight:",[252,253,258],"pre",{"className":254,"code":255,"language":256,"meta":257,"style":257},"language-sh shiki shiki-themes mm",".\u002Fscripts\u002Frelease-certify.sh preflight --output \u002Ftmp\u002Fmm-release-certification.json\n","sh","",[157,259,260],{"__ignoreMap":257},[261,262,265,269,273,277],"span",{"class":263,"line":264},"line",1,[261,266,268],{"class":267},"svrjQ",".\u002Fscripts\u002Frelease-certify.sh",[261,270,272],{"class":271},"sv8ni"," preflight",[261,274,276],{"class":275},"sbRf1"," --output",[261,278,279],{"class":271}," \u002Ftmp\u002Fmm-release-certification.json\n",[145,281,282,283,286],{},"The local report says ",[157,284,285],{},"incomplete"," until the hosted checks have passed. This is\nexpected: local checks cannot verify all supported platforms or public downloads.",[225,288,290,293],{"start":289},4,[165,291,292],{},"Push the candidate commit and run the live workflows for that exact commit:\nrobustness, runtime, secret, Vault, scheduler, remote, local TLS, and\nsupplemental checks. All must succeed; skipped or older runs do not qualify.",[165,294,295,296,299],{},"Create a new ",[157,297,298],{},"vMAJOR.MINOR.PATCH"," tag on that commit and push it. The version\nmust match the package files and changelog. Never move an existing release tag.",[149,301,303],{"id":302},"check-publication","Check publication",[145,305,306],{},"The tagged workflow builds x86-64 and ARM64 packages for Linux glibc, macOS,\nand Windows. It verifies uploads and clean installs before creating the GitHub\nRelease. Check that:",[162,308,309,312,318,325,331],{},[165,310,311],{},"All workflow jobs passed, including public installation tests.",[165,313,314,315,205],{},"The release includes binaries, source, checksums, manifests, and a passing\n",[157,316,317],{},"release-certificate.json",[165,319,320,321,324],{},"The public install guide works and ",[157,322,323],{},"mm --version"," reports the new version.",[165,326,327,330],{},[157,328,329],{},"mm doctor --check-updates"," can read the published manifest.",[165,332,333,334,205],{},"Earlier versions remain downloadable from ",[157,335,336],{},"\u002Freleases\u002FvMAJOR.MINOR.PATCH\u002F",[145,338,339],{},"Packages currently have no platform code signing or Apple notarization. The\nincluded package inventory and build statement do not imply signed provenance.",[149,341,343],{"id":342},"recover-a-failed-publication","Recover a failed publication",[145,345,346,347,350],{},"Keep the workflow log and ",[157,348,349],{},"publication-log.json",". Fix the reported upload,\npermission, DNS, or cache problem before retrying. An unchanged run may retry\nwhen already-uploaded files match byte-for-byte. Never delete or overwrite a\nhistorical release to make a retry pass.",[145,352,353],{},"If source changes are needed, use a new version and tag. Restore a latest-release\nmanifest only from a previously verified release, with its matching installers.\nDo not point users at a partial release or test bucket.",[145,355,356],{},"To rotate publishing credentials, create a replacement bucket token, update the\nprotected environment, test with a non-production rehearsal, then revoke the old\ntoken. Revoke suspected compromised credentials immediately and check release\nfile hashes and access logs.",[358,359,360],"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);}",{"title":257,"searchDepth":362,"depth":362,"links":363},2,[364,365,366,367],{"id":151,"depth":362,"text":152},{"id":222,"depth":362,"text":223},{"id":302,"depth":362,"text":303},{"id":342,"depth":362,"text":343},"Prepare, check, publish, and recover an mm release.","md",{},true,{"title":30,"description":368},"docs\u002Fcontribute\u002Freleases","sV61TgIqQh8cs_rad7mFqo3gM_pD9CD-rJq6hSZcsd8",1794512546199]