rivet

rivet vs Changesets

How rivet differs from Changesets

rivet follows the same release file workflow that Changesets popularized (create release files → bump → publish), but it makes different design choices in a few areas.

Globbing for groups

rivet supports glob patterns and ! negation in all package-name lists in the config — fixed, linked, and preMode.

In Changesets, you list exact package names:

{
  "fixed": [["@scope/core", "@scope/utils"]]
}

In rivet, you can use globs:

{
  "fixed": [
    ["@scope/core", "@scope/utils"],
    ["@scope/*", "!@scope/standalone"]
  ]
}

This means you can define a fixed or linked group for all packages under a scope without updating the config when new packages are added. The same glob support applies to preMode package patterns.

Linked groups

Changesets supports fixed groups (same version for all members). rivet adds linked groups — packages that share the same bump type but keep their own version numbers.

{
  "linked": [["@scope/hooks", "@scope/utils"]]
}

If @scope/hooks gets a minor bump and @scope/utils gets a patch, both are treated as minor. Each increments from its own current version. This is useful when packages are tightly coupled but don't need to be version-locked.

Per-package pre-release mode

In Changesets, pre-release is usually a global mode — either the whole repo is in pre-release or it isn't.

rivet takes a per-package approach. Different packages can have different pre-release tags simultaneously:

{
  "preMode": [
    { "tag": "beta", "packages": ["@scope/experimental-*"] },
    { "tag": "alpha", "packages": ["@scope/early-access-*"] }
  ]
}

You can also manage this via CLI:

rivet pre enter beta --package @scope/core
rivet pre enter alpha --package @scope/experimental-feature

And a single rivet bump can handle a mix of pre-release and stable packages in one run.

Other differences

syncCargoToml

rivet can bump versions in Cargo.toml alongside package.json — useful for Rust + npm projects (napi-rs, Tauri, etc.).

CI check command

rivet has a check command designed for multi-step CI pipelines. It uses exit codes to signal the current state:

rivet check   # exit 0 = pending or nothing, exit 1 = ready to release

Pre-release counters

rivet saves pre-release counters only after all file writes succeed. If a bump fails partway through, the counter is not incremented — a retry produces the same version. This avoids wasting pre-release numbers on failed runs.

Internal dependency strategies

rivet lets you control when internal dependency ranges update:

StrategyBehavior
patchUpdate when dependency got at least a patch (default)
minorUpdate only for minor or major
majorUpdate only for major
alwaysAlways update
neverNever update

Random file names

Release files get descriptive names like a3f2-calm-fox.md instead of timestamp-based names.

Archive mode

rivet bump --archive moves consumed release files to .rivet/archive/ instead of deleting them.

On this page