Skip to main content
Version: 0.8.0

Versioning & Releases

This document explains the versioning strategy for this monorepo and recommendations for managing releases.

Current State​

Currently, the project is in early development. Versions are managed manually in each package.json file. Git tags are not yet implemented for automated release tracking.

Monorepo Versioning Strategies​

We recommend using one of the following strategies for this pnpm monorepo:

1. Fixed (Locked) Versioning​

All packages share the same version number. If one package has a major update, the version of all packages is bumped.

  • Pros: Simplest to understand; ensures compatibility.
  • Cons: Can lead to unnecessary version bumps for stable packages.

2. Independent Versioning​

Each package in apps/ is versioned independently based on its own changes.

  • Pros: More efficient; reflects the actual state of each app.
  • Cons: Harder to track which versions of different apps were tested together.

We highly recommend using Changesets to manage versioning and changelogs.

# Install changesets in root
pnpm add -Wd @changesets/cli
pnpm changeset init

Typical Release Flow​

  1. Add a Changeset: When you make a change, run pnpm changeset. It will ask which packages changed and what type of bump (patch, minor, major) is needed.
  2. Commit: Commit the generated .changeset/*.md file.
  3. Version: When ready to release, run pnpm changeset version. This will:
    • Bump versions in package.json files.
    • Update CHANGELOG.md for each package.
    • Delete the changeset files.
  4. Publish: Run pnpm publish -r.

Git Versioning Best Practices​

SemVer​

Always follow Semantic Versioning:

  • MAJOR.MINOR.PATCH
  • MAJOR: Breaking changes.
  • MINOR: New features (backward compatible).
  • PATCH: Bug fixes (backward compatibile).

Git Tagging​

Use Git tags to mark release points:

# Tag a release
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0

Conventional Commits​

Use Conventional Commits to automate versioning:

  • feat: ... -> Minor bump
  • fix: ... -> Patch bump
  • feat!: ... -> Major bump (breaking change)

Standalone Example: Manual Release Script​

If you prefer a manual approach without extra tools, you can use a simple script to bump and tag:

#!/bin/bash
# Simple release script example

VERSION=$1

if [ -z "$VERSION" ]; then
echo "Usage: ./release.sh 1.0.0"
exit 1
fi

# 1. Update versions (manual or via pnpm)
pnpm -r exec npm version $VERSION --no-git-tag-version

# 2. Commit and Tag
git add .
git commit -m "chore: release v$VERSION"
git tag -a "v$VERSION" -m "version $VERSION"

echo "Release v$VERSION ready. Push with: git push origin main --tags"