# Release with confidence. Mint gives every release a clear path from source to artifact to environment. Build once, review an exact selection, and keep evidence of what actually ran.
Integrate Mint →Explore environments
## One artifact. Any environment. Mint is a Go CLI and GitHub Action for release state. It versions source, records trusted immutable builds, coordinates reviewed environment releases, and records verified outcomes. Your application owns the build and deployment adapters.
Source→Build→Review→Verify
A sandbox can use the same digest as staging or a customer demo. No environment named production is required. Each environment has its own policy and deployment history; a multi-component application moves as a complete digest bundle. ## Start here - [How Mint works](https://jamesonstone.github.io/mint/how-it-works.md): source versions, candidates, frozen intent, and evidence. - [Integrate Mint](https://jamesonstone.github.io/mint/integration.md): choose a release model, add policy, and connect trusted adapters. - [Environments & sandboxes](https://jamesonstone.github.io/mint/environments.md): local versus shared scope, arbitrary names, and promotion prerequisites. - [Semantic versioning](https://jamesonstone.github.io/mint/versioning.md): understand what increments a version and what a tag proves. - [CHANGELOG integration](https://jamesonstone.github.io/mint/changelog.md): generate linked release notes from Conventional Commits. - [Release PRs](https://jamesonstone.github.io/mint/release-prs.md): review the selection that will deploy. - [Rollback & hotfix](https://jamesonstone.github.io/mint/recovery.md): recover without losing artifact identity or deployment evidence. ## Know what is proven | Evidence | What it means | | --- | --- | | Source tag | A source commit has a version identity. | | Trusted candidate | A successful build produced an eligible immutable artifact. | | Approved Release PR | Humans approved an exact selection and runtime configuration. | | Verified deployment | The adapter verified that exact selection in the environment. | | Live observation | Timestamped evidence of the runtime at observation time. | A merge, dispatch, image alias, or GitHub Release alone does not establish live runtime state. ## Read with an agent Use [llms.txt](https://jamesonstone.github.io/mint/llms.txt) for a concise map, [llms-full.txt](https://jamesonstone.github.io/mint/llms-full.txt) for the complete guides, or the **Markdown source** link on any page. The site works without JavaScript and loads its fonts locally. --- # How Mint works Mint separates release intent from the evidence that makes it safe to act on that intent. Its state lives with your repository and trusted GitHub Actions runs. ## The release lifecycle 1. **Version source.** Serialize version allocation on the current default-branch head. Each untagged first-parent source commit receives an immutable strict SemVer tag. 2. **Build once.** Your trusted producer builds the application and uploads a `mint-candidate` artifact containing `mint-candidate.json`. 3. **Register eligibility.** Mint authenticates the completed producer run and its archive digest, then records source, version, build configuration, and immutable artifact identity. 4. **Select per environment.** Policy chooses latest-following or an exact target. Prerequisites must have verified the complete selected artifact. 5. **Freeze intent.** Reviewed releases wait for current-head checks and independent human approval. Mint freezes the artifact and runtime configuration together. 6. **Deploy and verify.** The project adapter consumes the frozen intent without rebuilding, reports start, and supplies exact verification evidence. 7. **Record and report.** Verified history advances. Mint reports on the original PR and, if configured, publishes the canonical GitHub Release. ## Artifact identity A readable tag such as `sandbox` is an optional alias. The selected artifact is an immutable digest. For a multi-component application, `artifact.members` includes every component's reference, digest, and build configuration; the top-level digest fingerprints the complete bundle. The adapter must deploy and verify every member. A successful API deployment does not prove that the accompanying worker or frontend is correct. Build configuration identifies how the artifact was made. `configuration_sha256` separately identifies the runtime configuration approved for an environment. The same artifact can be deployed with different reviewed runtime configuration without rebuilding it. ## State and concurrency Shared environments have separate durable journals. The legacy `production` environment uses `mint-release-state`; other names use `mint-release-state-`. A component policy uses `mint-release-state..` for every environment, so components never share history or fences. Each environment retains a fence while a deployment is in flight or its outcome is uncertain. An uncertain outcome cannot be cleared by dispatching another deployment or merely observing the runtime. [Explicit reconciliation](https://jamesonstone.github.io/mint/recovery.md#reconcile-an-uncertain-deployment) checks fresh trusted evidence against the frozen intent or previous baseline. Local scope stores private machine observations. It cannot advance shared deployment history or satisfy a shared environment's prerequisite. ## What belongs to your application Mint owns version identity, release state, reviewed selection, and evidence validation. Your project owns Docker/package builds, registry authentication, artifact retention, deployment, runtime verification, cloud resources, and infrastructure permissions. Basic `mint release publish` resolves a version, writes `.version`, creates or reuses the Git tag, and creates or reuses a GitHub Release. That is a release-state publishing command, not the entire environment controller. It does not deploy an application. ## Publication-only projects Schema 2 supports `mode: artifact` and `mode: package` alongside `mode: deployment`. Publication-only environments describe publication intent and keep the project's existing publication implementation. Runtime operations are rejected; no fake deployment baseline is required. For deployment mode, at most one shared environment can have `publish: true`. Its verified release is canonical; other environments deploy without independently publishing the same version. --- # Integrate Mint Start with the smallest release model your repository needs. Add environment control when you need reviewed promotion, verified history, or recovery across environments. ## Install the CLI Use a published tag from [Mint releases](https://github.com/jamesonstone/mint/releases), rather than installing an unknown branch head. Mint's current build requires Go 1.25.5 or newer; check `go.mod` when upgrading. ```bash go install github.com/jamesonstone/mint/cmd/mint@ mint version mint help ``` Replace `` before running. An environment integration must pin a published immutable Mint commit containing schema 2 and team authorization support. Older releases may not support these features. ## Start with release-state publishing For repositories that only need tags and GitHub Releases, this minimal workflow runs Mint's existing action. Replace `` with the full commit SHA of a reviewed published release. ```yaml name: Publish release state on: push: branches: [main] permissions: contents: write concurrency: group: release-state cancel-in-progress: false jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 with: fetch-depth: 0 - uses: jamesonstone/mint@ with: command: release-publish commitish: ${{ github.sha }} owner: ${{ github.repository_owner }} repo: ${{ github.event.repository.name }} github-token: ${{ secrets.GITHUB_TOKEN }} ``` This writes `.version` in the runner workspace without the leading `v`. It does not commit that file, build containers, or deploy. Add application-owned build steps explicitly. Use one release publisher; remove competing automatic version/tag publishers when adopting Mint. For environment-controlled deployment, follow the next steps instead of publishing every source build as a canonical release. ## Add environment policy Create `.mint.yaml` using the [sandbox policy example](https://jamesonstone.github.io/mint/environments.md#sandbox-first-policy). Set the real repository, trusted workflow paths and check names. Choose explicit `default_environment` when multiple environments exist. For a team, use `authorization: repository-write`. Mint checks current effective GitHub write, maintain, or admin access for human requests, including team-derived access. Independent reviewers must also have write access. Bots and read/triage access cannot authorize releases. Optional `assignees` route work but grant no authority. Legacy policies can retain `human_login`; do not combine it with `authorization`. Review a migration of authorization separately from a target-only release request. ## Release several components from one repository A monorepo can promote each component through its own environments with its own version line. Write one schema 2 policy file per component, each with a `component` block. A `deployment` component also needs its own `control_workflow`; `package` and `artifact` components run no controller: ```yaml # .mint/backend.yaml schema_version: 2 mode: deployment repository: acme/app default_branch: main authorization: repository-write build_workflow: .github/workflows/backend-build.yaml control_workflow: .github/workflows/backend-mint.yaml component: name: backend # lowercase letters, digits, and - tag_prefix: backend/ # optional; defaults to / paths: [backend] # Git pathspecs this component owns changelog: backend/CHANGELOG.md environments: production: scope: shared deploy: reviewed follow: latest promotion_workflow: .github/workflows/backend-deploy.yaml publish: true ``` A component policy keeps everything separate from other components and from a repository-wide policy: | Concern | Repository-wide | Component `backend` | | --- | --- | --- | | Versions | `vX.Y.Z` | `backend/vX.Y.Z`, only for commits touching `paths` | | Journal | `mint-release-state[-]` | `mint-release-state.backend.` | | Release-control files | `CHANGELOG.md`, `.mint/proposal.json`, `.mint/summary.md` | `changelog`, `.mint/backend/proposal.json`, `.mint/backend/summary.md` | | Proposal marker | `