release-workflow
Use when preparing or executing a release of peek-stash-browser. Covers the full release lifecycle from validation through Docker image publishing.
SKILL.md.claude/skills/release-workflow/SKILL.md
GitHubRelease Workflow
Overview
Releases are triggered by pushing git tags. GitHub Actions builds and publishes Docker images automatically.
Pre-release validation → Version bump → Commit → Tag → Push → GitHub Actions → Docker Hub
Version Scheme
- Stable:
X.Y.Z(e.g.,3.3.1) - Beta:
X.Y.Z-beta.N(e.g.,3.3.2-beta.1) - Tag format:
vX.Y.ZorvX.Y.Z-beta.N
Both client/package.json and server/package.json must always have identical versions.
Step 1: Pre-Release Validation
Run /pre-release to execute all checks; checks 3-8 follow CI's jobs and their steps in order:
- CI on HEAD:
gh run list --commit "$(git rev-parse HEAD)" --workflow CI --json status,conclusion,databaseIdshows onecompleted,successrun, whose jobs includeImage Smoke Test / amd64and/ arm64 - Clean shared types build:
rm -rf shared/dist shared/tsconfig.tsbuildinfo && (cd shared && npm run build) - Format:
npm run format:check - Client checks:
(cd client && npm run typecheck && npm run lint && npm run build && npm run test:coverage) - Server checks:
(cd server && npx prisma generate && npm run lint && npm run typecheck && npm run test:coverage);typecheckcovers the source and the tests - Dependency audit:
npm audit --omit=dev --audit-level=highinserver,client,sharedand the root - E2E tests: covered by check 1
- Integration tests:
(cd server && npm run test:integration:replay) - Docker image: covered by check 1 (CI built and booted it on amd64 and arm64); to debug one locally,
docker build -f Dockerfile.production -t peek:test . && node docker/smoke-test.mjs peek:test
All 9 checks must pass before proceeding.
Step 2: Version Bump & Tag
Beta Release
Run /release-beta:
- Increment beta number:
3.3.2-beta.1→3.3.2-beta.2 - Or start new beta:
3.3.1→3.3.2-beta.1
Stable Release
Run /release-stable:
- Remove beta suffix:
3.3.2-beta.8→3.3.2 - Or increment:
3.3.2→3.3.3or3.4.0
What the Release Skills Do
- Verify on
mainbranch and up to date - Update version in
client/package.jsonandserver/package.json - Commit:
chore: bump version to X.Y.Z - Push commit to main
- Create tag:
git tag vX.Y.Z - Push tag:
git push origin vX.Y.Z
Step 3: Automated CI/CD
GitHub Actions (.github/workflows/docker-build.yml) triggers on v* tags:
- Smoke:
image-smoke.ymlbuilds the image natively on amd64 and arm64, boots each against an empty volume and pushes it by digest. - Publish: once both pass, the version,
betaorlatest/stabletags point at those two digests. Nothing is tagged if either fails. - Platforms:
linux/amd64+linux/arm64, each built on its own native runner (no QEMU). If one architecture fails, fix or re-run that job: the other may have left an untagged digest on Docker Hub, and no tag moved. - Push to Docker Hub:
carrotwaxr/peek-stash-browser - Tag strategy:
- Semver:
3.3.2 - Major.minor:
3.3 latest(stable releases only)stable(stable releases only)beta(beta releases only)
- Semver:
- GitHub Release: Auto-created with generated release notes, marked as prerelease if the tag has a hyphen
Docker Hub Tags After Release
| Release Type | Tags Applied |
|---|---|
v3.3.2 (stable) |
3.3.2, 3.3, latest, stable |
v3.3.2-beta.1 |
3.3.2-beta.1, beta |
Any tag with a hyphen is a prerelease: it never moves latest, stable or the major.minor tag, and its GitHub Release is marked prerelease. Only -beta tags move beta, so a v3.4.0-rc.1 gets 3.4.0-rc.1 alone.
Updating on unRAID
After GitHub Actions completes:
# SSH to your deployment server
ssh root@<server-ip>
# Pull new image
docker pull carrotwaxr/peek-stash-browser:latest # or :beta
# Restart container via unRAID WebGUI or CLI
docker stop peek-stash-browser && docker start peek-stash-browser
Semantic Versioning Guide
- Patch (3.3.X): Bug fixes, minor tweaks, no new features
- Minor (3.X.0): New features, backward-compatible changes
- Major (X.0.0): Breaking changes (rare — major UI overhauls, API changes)