Snapshot Release
A snapshot publishes the current state of any branch as a temporary version — try a feature branch in a real consumer before it is merged, without touching the repository: no commits, no tags, no changelog.
The snapshot flow bumps the version to a timestamped prerelease and publishes it under the given npm dist-tag. A repository released as 1.1.0 with a feat commit on the branch produces something like:
1.1.0 -> 1.2.0-canary.20260707111020The version is derived from the commits as usual, and the snapshot identifier is always applied — even with no new commits the version falls back to a patch bump, so a snapshot can never collide with a real released version. The latest dist-tag is never touched.
Snapshots run on demand from any branch, so they get their own workflow with a workflow_dispatch trigger:
name: Snapshoton: workflow_dispatch: inputs: tag: description: Snapshot tag type: string required: true default: snapshotjobs: snapshot: runs-on: ubuntu-latest name: Snapshot permissions: contents: read steps: - name: Checkout the repository uses: actions/checkout@v7 - name: Install pnpm uses: pnpm/action-setup@v6 with: version: 11 - name: Install Node.js uses: actions/setup-node@v6 with: node-version: 22 cache: 'pnpm' registry-url: 'https://registry.npmjs.org' - name: Install dependencies run: pnpm install - name: Publish snapshot uses: TrigenSoftware/simple-release-action@v2 with: workflow: snapshot github-token: ${{ secrets.GITHUB_TOKEN }} npm-token: ${{ secrets.NPM_TOKEN }} bump-snapshot: ${{ inputs.tag }}The tag input doubles as the prerelease identifier and the npm dist-tag the snapshot is published under.
With trusted publishing the snapshot job moves into the release workflow instead, because the trusted publisher is registered per workflow file.
Running it
Section titled “Running it”Go to Actions → Snapshot → Run workflow, pick the branch and the tag, and run — or from the CLI:
gh workflow run snapshot.yml --ref my-feature-branch -f tag=canaryThe published snapshot is then a one-liner away in any consumer project:
npm i your-package@canaryIn a monorepo all packages are snapshotted in one run, each from its own version — for example 1.1.0 and 1.0.0 packages become 1.1.1-canary.20260707111020 and 1.0.1-canary.20260707111020 under the same canary tag.