Current user-visible release status is canonical at https://nimi.ai/download. This document is the maintainer release process; it does not restate user-facing status.
This repository has three distinct release identities. They must not be merged:
- Nimi installable product releases coordinate Desktop, Runtime, signing, update, and rollback.
- First-party public components release independently from component tags.
- Third-party Nimi Apps publish from their own publisher repositories and managed App workflows.
Production publication is tag-only. Manual workflow dispatch is dry-run only.
| Component | Production tag | Workflow | Destination |
|---|---|---|---|
@nimiplatform/sdk |
sdk/v<version> |
release.yml |
npm |
@nimiplatform/kit and @nimiplatform/kit-protected-local-* |
kit/v<version> |
release-kit.yml |
npm |
@nimiplatform/sdk-adapter-vercel-ai |
sdk-adapter-vercel-ai/v<version> |
release-sdk-adapter-vercel-ai.yml |
npm |
nimi-shell-protected-local |
nimi-shell-protected-local/v<version> |
release-nimi-shell-protected-local.yml |
crates.io |
nimi-shell-tauri |
nimi-shell-tauri/v<version> |
release-nimi-shell-tauri.yml |
crates.io |
@nimiplatform/app-tools |
app-tools/v<version> |
release-app-tools.yml |
npm |
For SDK, Kit, the Vercel adapter, and App Tools, the tag version must equal the
exact package.json version. They remain independently versioned; no root
vX.Y.Z tag, aggregate manifest, RC bundle, or global promotion workflow
identifies those packages.
The npm workflows retain their historical filenames because npm Trusted
Publisher configuration binds the repository and exact workflow identity. They
publish with GitHub OIDC and npm provenance and do not use NPM_TOKEN. Pull
request and manual dry-run jobs have no OIDC permission; only the tag-only publish
job receives id-token: write and it publishes the exact tarball validated by the
preceding job.
The component workflows run their affected build, tests, deterministic pack, and registry dry-run on pull requests while a version is unpublished. Once that exact version is public, the same check requires the candidate tarball SHA-1 to equal the immutable registry package instead of attempting to overwrite it. Tauri source tests run immediately; its cargo-package dry-run requires its exact protected-local version to be public. A release reconciliation PR is not merged until required repository checks and these component checks pass.
After merge, a maintainer may run a component workflow manually for another
dry-run. A manual dispatch cannot publish. Production publication starts only by
pushing the exact component tag at a commit already contained in origin/main.
Every npm package is packed before publication. The Kit tarball rewrites the
workspace SDK dependency to its public caret range and declares the two Kit
native packages (win32-x64, darwin-arm64) as ^<Kit version> optional
dependencies. release-kit.yml builds those native packages on their own
platforms and publishes them before Kit under the same kit/v tag. Runtime
binaries do not enter these component releases.
The two independent roots may begin separately:
- Publish SDK from
sdk/v<SDK version>. - Publish protected-local from
nimi-shell-protected-local/v<protected-local version>.
Then publish dependants:
- Kit waits for its declared SDK version to be visible on npm.
- The Vercel adapter waits for its SDK peer version to be visible on npm.
- Tauri reads the protected-local version declared by its own Cargo dependency and waits for that version to be visible on crates.io; it does not reuse the Tauri component version as protected-local identity.
- App Tools waits for the SDK, Kit, and Tauri versions embedded in its packed scaffold contract to be visible in their public registries. The Tauri publisher has already closed its protected-local dependency.
Each tag takes its version from that component's own manifest at the tagged
commit: sdks/typescript/package.json, kit/package.json,
app-tools/package.json, kit/shell/protected-local/Cargo.toml, and
kit/shell/tauri/Cargo.toml. A manifest version on main is a prepared
candidate, not a publication; npm and crates.io show which versions are public.
The current candidate combination is unpublished, and publishing it needs explicit authorization. Its intended tags, with the upgrade notes in the SDK, Kit, and adapter packages, are:
sdk/v0.19.0
nimi-shell-protected-local/v0.8.0
kit/v0.16.0
sdk-adapter-vercel-ai/v0.3.0
nimi-shell-tauri/v0.8.0
App Tools 0.11.4 is not part of this candidate: its fresh-scaffold default still
names SDK ^0.18.1, Kit ^0.15.3 and nimi-shell-tauri 0.7.0, which were never
published, so its registry preflight rejects it until that default names a
published combination.
nimi-shell-tauri/v0.2.0 is an immutable failed publication attempt. Its
crates.io dependency preflight was rejected before package upload, so the tag
remains reserved history and is never moved, deleted, or reused. Recovery uses
the next component version, nimi-shell-tauri/v0.2.1.
app-tools/v0.2.0 is an immutable first publication. Windows production
packaging recovery uses app-tools/v0.2.1; the earlier tag and package remain
unchanged.
Proto has no package manifest version and has no active production publisher in this release set. A future Proto publication identity requires separate authority and is not inferred from another component.
Component release tags are immutable and must never be moved, deleted, or reused. A transient workflow retry may run again from the same unchanged tag and verifies an already-published registry version only when its bytes match. A code change requires the next component version and a new component tag.
The historical v0.2.0-rc.1, v0.2.0, and v0.2.1-rc.1 refs are abandoned
global-library-train attempts. They remain immutable history and are not SDK,
Kit, App Tools, shell, Proto, third-party App, or installable-product release
truth. Do not promote, move, or reuse them.
.github/workflows/release-preview.yml remains a separate unsigned developer
preview path. It accepts an exact main commit, preview version, and sequence
number and produces immutable development assets with different per-OS payloads:
- Windows x64 contains only the source-local Kit package. It contains no Nimi App, Runtime archive, installer, or Windows service package.
- macOS arm64 contains an ad-hoc, repo-assisted
Nimi Dev.appcandidate and Runtime payload. Installation and uninstallation require the exact source checkout; the asset is not a standalone installer. - Linux has no preview asset.
The preview does not publish npm packages, crates, or Proto and never becomes input to a component release. It does not establish a Nimi product release, public download, native installation, first launch, self-update, or uninstall. Runtime service distribution, Desktop production signing/notarization, and Kit native carrier publication remain deferred.
- npm: Trusted Publisher for
nimiplatform/nimiand the exact component workflow filename; GitHub-hosted runner withid-token: write. - crates.io: Trusted Publisher for
nimiplatform/nimiand each exact shell workflow filename; GitHub-hosted runner withid-token: writeand the pinnedrust-lang/crates-io-auth-action. The protected-local 0.2.0 first publication is the one-time API-token bootstrap required before its Trusted Publisher can be configured; later shell publication does not use a repository token. - GitHub: component tag rules must prevent update and deletion while allowing the first tag creation.
Do not add local npm publication, manual production dispatch, registry upload fallbacks, or another global component publisher.
For each published component, verify:
- the immutable component tag resolves to the intended main commit;
- the registry version is visible;
- npm provenance names the exact component workflow and component tag;
- the published dependency versions match the package or scaffold contract;
- a public install or Cargo resolution no longer uses workspace/path sources.
These checks establish component publication only. They do not establish a Nimi product release, third-party App admission, installation, running process, or Nimi Access readiness.
When the published SDK, Kit native packages, or shell crates carry a newer
Runtime wire, refresh the proto breaking-change baseline to that component tag
with pnpm proto:baseline:refresh, recording its published artifacts and the
adjudication of every difference from the previous baseline. Until then the gate
protects only the older published wire.