Migrating from standard-version to vmn

August 1, 2026 ยท View on GitHub

vmn is a language-agnostic, git-tag-based versioning CLI. This guide helps you migrate from standard-version, which was deprecated and archived in May 2023.

Why Migrate

standard-version was archived by its maintainers in 2023. The repository is read-only, no new releases will be published, and open issues will not be addressed. If you rely on standard-version today, you are running unsupported software.

vmn is an actively maintained alternative that offers:

  • Language-agnostic versioning that works beyond the Node.js ecosystem
  • Git-tag-based source of truth with structured YAML metadata in annotated tags
  • Multi-repo dependency tracking for products that span several repositories
  • State recovery via vmn goto to check out the exact repo state at any version
  • Root app / microservice topology for versioning parent apps and child services
  • 4-segment hotfix versions (major.minor.patch.hotfix) for hotfix workflows
  • Offline / air-gapped support via a local file backend
  • CI-agnostic operation: works in GitHub Actions, GitLab CI, Jenkins, Bitbucket Pipelines, or locally

Concept Mapping

standard-versionvmnNotes
.versionrc / .versionrc.json.vmn/{app}/conf.ymlPer-app configuration
"version" in package.jsonGit tag (source of truth)vmn's npm backend can also update package.json
--release-as major-r majorSame for minor, patch
--release-as 1.2.3--ov 1.2.3 (--override-version)Normally vmn increments; --ov forces an absolute version
--prerelease alpha--pr alphaPrerelease tagging
--dry-run--dry-runPreview without changes
--first-releaseNothing -- the first vmn stamp auto-initializesvmn init-app -v <version> my_app if you need a specific starting version
--tag-prefix vTag format is {app_name}_{version}vmn uses its own tag convention
CHANGELOG.md generationChangelog config in conf.ymlvmn supports changelog generation
--skip.changelogOmit changelog configChangelog is opt-in in vmn
--skip.tag--dry-runvmn always tags on stamp; use dry-run to skip
--commit-allvmn commits .vmn/ changes automaticallyHandled internally
lifecycle hooks (prebump, etc.)Not built-inUse CI pipeline steps around vmn stamp

Step-by-Step Migration

1. Install vmn

pip install vmn
# or: pipx install vmn
# or: uvx vmn

2. Initialize vmn

The first vmn stamp auto-initializes both the repository and the app, so you can skip straight to stamping. Run the explicit commands only if you want the .vmn/ scaffolding in place before your first version -- for example to seed a starting version:

vmn init                       # once per repository
vmn init-app -v 1.4.2 my_app   # once per app; -v sets the starting version

This registers my_app for versioning. vmn will create .vmn/my_app/conf.yml and .vmn/my_app/last_known_app_version.yml.

3. Configure Version Backends

If standard-version was updating package.json, configure vmn's npm backend:

# .vmn/my_app/conf.yml
conf:
  version_backends:
    npm:
      path: package.json

For Python projects, use the pep621 backend:

conf:
  version_backends:
    pep621:
      path: pyproject.toml

For Rust projects, use the cargo backend:

conf:
  version_backends:
    cargo:
      path: Cargo.toml

You can combine multiple backends if your project has several files that need version updates.

4. Enable Conventional Commits (Optional)

If you relied on standard-version's automatic release mode detection from conventional commit messages, enable the same behavior in vmn:

# .vmn/my_app/conf.yml
conf:
  conventional_commits: true

With this enabled, vmn stamp my_app (without -r) reads commit messages since the last stamp and automatically selects major, minor, or patch.

5. Stamp Your First vmn Version

# Explicit release mode
vmn stamp -r patch my_app

# Or, with conventional commits enabled
vmn stamp my_app

vmn creates an annotated git tag, updates configured version backends, commits the changes, and pushes.

6. Remove standard-version Configuration

# Remove config files
rm -f .versionrc .versionrc.json .versionrc.js

# Uninstall the package
npm uninstall standard-version
# or remove from devDependencies manually

7. Update CI Pipelines

Replace standard-version commands in your CI configuration:

Before (standard-version):

# GitHub Actions example
- run: npx standard-version
- run: git push --follow-tags

After (vmn):

# GitHub Actions example
- run: pip install vmn
- run: vmn stamp -r patch my_app

vmn handles the git commit, tag, and push internally (unless --dry-run is used).

8. Update npm Scripts (If Applicable)

Before:

{
  "scripts": {
    "release": "standard-version",
    "release:minor": "standard-version --release-as minor",
    "release:major": "standard-version --release-as major"
  }
}

After:

{
  "scripts": {
    "release": "vmn stamp -r patch my_app",
    "release:minor": "vmn stamp -r minor my_app",
    "release:major": "vmn stamp -r major my_app"
  }
}

Command Mapping Quick Reference

standard-version commandvmn equivalent
npx standard-versionvmn stamp -r patch my_app
npx standard-version --release-as minorvmn stamp -r minor my_app
npx standard-version --release-as majorvmn stamp -r major my_app
npx standard-version --prerelease alphavmn stamp -r patch --pr alpha my_app
npx standard-version --dry-runvmn stamp -r patch --dry-run my_app
npx standard-version --first-releasevmn stamp -r patch my_app (auto-inits)

FAQ

Can I keep my existing git tags?

Yes. vmn uses its own tag format ({app_name}_{version}), so it will not conflict with tags created by standard-version (typically v1.2.3). Both sets of tags can coexist in the same repository.

What happens to my CHANGELOG.md?

vmn does not modify files created by standard-version. Your existing CHANGELOG.md will remain untouched. If you configure vmn's changelog support, future entries will be appended according to vmn's format.

Can I use vmn in a monorepo?

Yes. Use a separate app name per package -- each is auto-initialized on its first stamp:

vmn stamp -r patch package_a
vmn stamp -r minor package_b

For microservice topologies, use the root-app feature -- each service keeps its own semver while the root gets an auto-incrementing integer:

vmn stamp -r patch my_platform/service_a
vmn stamp -r minor my_platform/service_b
vmn show --root my_platform

Does vmn support lifecycle hooks?

vmn does not have built-in lifecycle hooks like standard-version's prebump or postcommit. Instead, wrap vmn stamp in your CI pipeline or a shell script to run pre- and post-stamp steps.

Do I need Node.js to run vmn?

No. vmn is a Python CLI. Install it with pip, pipx, or uvx. It has no Node.js dependency.

Further Reading