This document describes the release process for SheetAtlas, including how to create releases and how the automated pipeline works.
-
Create and push signed tag (from
developbranch):git checkout develop git tag -s v0.3.3 -m "Release v0.3.3 - Description" git push origin v0.3.3 -
Pipeline runs automatically (~5 minutes):
- Builds for Windows, Linux, macOS
- Creates GitHub release with artifacts
- Updates website files on
mainbranch ⚠️ Does NOT deploy website (GitHub limitation)
-
Deploy website manually (required after each release):
gh workflow run deploy-pages.yml
Or via GitHub Actions UI → Deploy GitHub Pages → Run workflow
-
Merge to main:
git checkout main git pull origin main # Get website updates from pipeline git merge develop git push origin main
| Step | Type | Command/Action |
|---|---|---|
| Tag creation | Manual | git tag -s v0.3.3 + push |
| Build artifacts | ✅ Automatic | Triggered by tag push |
| GitHub release | ✅ Automatic | Created with artifacts |
| Update website files | ✅ Automatic | Committed to main |
| Deploy website | gh workflow run deploy-pages.yml |
|
| Merge develop→main | Manual | After release verified |
Why manual website deploy? GitHub Actions workflows triggered by GITHUB_TOKEN (like our release pipeline) don't trigger other workflows automatically (prevents infinite loops). The deploy-pages.yml must be triggered manually.
We follow Semantic Versioning (SemVer):
- v0.x.x → Pre-release / Alpha (development phase)
- v1.x.x+ → Stable / Production-ready
Format: vMAJOR.MINOR.PATCH
- MAJOR: Breaking changes
- MINOR: New features (backward compatible)
- PATCH: Bug fixes
Examples:
v0.2.0→ Second alpha releasev0.2.1→ Alpha bugfix releasev1.0.0→ First stable releasev1.1.0→ Stable release with new features
The release pipeline automatically detects if a version is a prerelease:
- Tags starting with
v0.→ Marked as prerelease on GitHub - Tags starting with
v1.or higher → Marked as stable release
This is handled automatically in the workflow, no manual configuration needed.
The release process is fully automated via GitHub Actions workflow: .github/workflows/release.yml
┌─────────────────────────────────────────┐
│ Tag Push (v0.3.0) │
└─────────────┬───────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Release Pipeline Triggered │
└─────────────┬───────────────────────────┘
│
┌───────┴────────┬──────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Build │ │ Build │ │ Build │
│ Windows │ │ Linux │ │ macOS │
│ (2-3min) │ │ (1-2min) │ │ (1-2min) │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└──────┬───────┴──────┬───────┘
▼ ▼
┌──────────┐ ┌──────────────┐
│ Release │ │ Update │
│ Creation │──▶│ Website │
│ (~10s) │ │ (~20s) │
└──────────┘ └──────┬───────┘
▼
┌──────────────┐
│Deploy Pages │
│(automatic) │
└──────────────┘
Three build jobs run in parallel to maximize speed:
Build Windows (build-windows):
- Builds .NET application for
win-x64 - Creates installer with Inno Setup
- Produces:
SheetAtlas-Setup-win-x64.exe - Duration: ~2-3 minutes
Build Linux (build-linux):
- Builds .NET application for
linux-x64 - Creates tarball archive
- Creates Debian package (.deb) with proper structure
- Produces:
SheetAtlas-linux-x64.tar.gzSheetAtlas-linux-x64.deb(NEW in v0.3.0+)
- Duration: ~1-2 minutes
Build macOS (build-macos):
- Builds .NET application for
osx-x64 - Creates tarball archive
- Produces:
SheetAtlas-macos-x64.tar.gz - Duration: ~1-2 minutes
- Note: Unsigned (requires Apple Developer cert for .dmg)
Runs after all builds complete:
- Downloads all artifacts from build jobs
- Detects if version is prerelease (v0.x check)
- Creates GitHub release with:
- All platform artifacts
- CHANGELOG.md as release body
- Correct prerelease flag
- Auto-generated release notes
- Duration: ~10 seconds
Runs after release is created:
- Checks out
mainbranch - Generates
index.htmlfromindex.html.templateusingenvsubst - Replaces placeholders:
${VERSION}→ e.g.,v0.3.0${VERSION_NUMBER}→ e.g.,0.3.0${RELEASE_DATE}→ Current date${ALPHA_BANNER}→ Warning banner for v0.x versions${RELEASE_STATUS_TEXT}→ Status message
- Commits updated
index.htmltomainbranch - Triggers
deploy-pages.ymlautomatically - Duration: ~20 seconds
The existing deploy-pages.yml workflow automatically triggers when docs/website/ changes on main:
- Deploys updated website to GitHub Pages
- Duration: ~30-60 seconds
- No manual intervention required
All release artifacts use version-agnostic naming for compatibility with GitHub's /releases/latest/download/ URLs:
SheetAtlas-Setup-win-x64.exe # Windows installer
SheetAtlas-linux-x64.tar.gz # Linux tarball
SheetAtlas-linux-x64.deb # Linux Debian package
SheetAtlas-macos-x64.tar.gz # macOS tarball
This allows users to always download the latest version using static URLs:
https://github.com/ghostintheshell-192/sheet-atlas/releases/latest/download/SheetAtlas-Setup-win-x64.exe
Why not include version in filename?
/latest/URLs work automatically- No website updates needed per release
- Standard used by VS Code, GitHub CLI, Docker Desktop
The website is automatically updated on each release using a template-based system.
-
Template File:
docs/website/index.html.template- Contains placeholders like
${VERSION},${VERSION_NUMBER} - Committed to repository, maintained like code
- Contains placeholders like
-
Generation: Uses
envsubst(built-in Linux tool)- Fast, simple, no dependencies
- Replaces all
${VAR}placeholders with environment variables
-
Conditional Content: Alpha banner for v0.x versions
- Automatically shows/hides warning banner
- Based on version number detection
-
Auto-Commit: Generated
index.htmlcommitted tomain- Triggers GitHub Pages deployment
- Full audit trail of website changes
| Placeholder | Example Value | Description |
|---|---|---|
${VERSION} |
v0.3.0 |
Full version with 'v' prefix |
${VERSION_NUMBER} |
0.3.0 |
Version without 'v' prefix |
${RELEASE_DATE} |
2025-10-14 |
ISO format date |
${ALPHA_BANNER} |
<div>⚠️ Alpha...</div> |
HTML banner (empty for v1.x+) |
${RELEASE_STATUS_TEXT} |
Alpha release - ... |
Status message |
Test template generation locally:
cd /data/repos/sheet-atlas
# Set variables
export VERSION=v0.3.0
export VERSION_NUMBER=0.3.0
export RELEASE_DATE=$(date +%Y-%m-%d)
export ALPHA_BANNER='<div>⚠️ Alpha Software</div>'
export RELEASE_STATUS_TEXT="Alpha release - Testing phase"
# Generate
envsubst < docs/website/index.html.template > /tmp/test-index.html
# View result
firefox /tmp/test-index.html # or your browserIf you need to create a release manually (troubleshooting, special cases):
git checkout develop
git pull origin develop
# Tag the commit
git tag v0.3.0 -m "Release v0.3.0 - Feature description"
# Push tag (triggers pipeline)
git push origin v0.3.0Via GitHub Actions UI:
- Go to Actions → Release Pipeline
- Click Run workflow
- Enter tag name:
v0.3.0 - Click Run workflow
# Via GitHub CLI
gh run list --workflow=release.yml
gh run watch <run-id>
# Or via GitHub web UI
# https://github.com/ghostintheshell-192/sheet-atlas/actionsWindows build fails:
- Check Inno Setup installation in workflow
- Verify
build/installer/SheetAtlas-Installer.issexists - Check
.csprojconfiguration for Windows
Linux .deb creation fails:
- Check Debian package structure in workflow
- Verify
dpkg-debcommand syntax - Check file permissions in package
macOS build fails:
- Check Xcode/SDK compatibility
- Verify .NET 8 supports
osx-x64runtime
Artifacts not found:
- Check all build jobs completed successfully
- Verify artifact upload/download steps in workflow
- Check artifact names match in all jobs
Prerelease flag incorrect:
- Check version tag format (
v0.3.0not0.3.0) - Verify prerelease detection logic in workflow
- SemVer: v0.x = prerelease, v1.x+ = stable
Template not found:
- Ensure
index.html.templateexists onmainbranch - Check workflow checks out
maincorrectly - Verify file path:
docs/website/index.html.template
envsubst fails:
- Check all required variables are exported
- Verify no typos in placeholder names
- Test template generation locally first
Commit fails:
- Check Git configuration in workflow
- Verify
GITHUB_TOKENhas write permissions - Check branch protection rules on
main
GitHub Pages not updating:
- Verify
deploy-pages.ymlworkflow triggered - Check file is in
docs/website/path - Check GitHub Pages settings (source: main branch, /docs)
Race conditions (multiple workflows running):
- Old duplicate workflows were deleted in v0.3.0
- Only
release.ymlshould trigger on tags now - If issue persists, check for other workflows with
on: push: tags:
Version mismatch:
- Ensure tag format is exactly
vX.Y.Z(lowercase v, no spaces) - Update version in
*.csprojfiles before tagging - Keep CHANGELOG.md updated
Before creating a release:
- All tests passing (
dotnet test) - CHANGELOG.md updated with new version section
- Version number updated in
.csprojfiles - Breaking changes documented (if MAJOR version bump)
- Documentation updated for new features
- Local build tested (
dotnet build --configuration Release)
Creating release:
- Create and push tag (or use
release-changelog.yml) - Monitor workflow progress
- Verify all builds successful
- Check GitHub release created correctly
- Verify website updated (https://ghostintheshell-192.github.io/sheet-atlas/)
- Test download links work
- Announce release (GitHub Discussions, social media, etc.)
Post-release (major releases only):
- Update external listings (SourceForge, AlternativeTo) - see "External Listings" section
- Update website screenshots if UI changed significantly - see "Updating Screenshots" section
SheetAtlas is listed on external software directories. Update these after major releases (new features, significant changes):
| Platform | URL | Update Method |
|---|---|---|
| SourceForge | https://sourceforge.net/projects/sheet-atlas/ | Web UI (Project Admin) |
| AlternativeTo | https://alternativeto.net/software/sheetatlas/about/ | Web UI (Edit suggestion) |
| GitHub README | Repository root | Git commit |
- Project description - Reflect new features
- Feature list - Add new capabilities
- Screenshots - If UI changed significantly
- Version info - Current version number
See .personal/planning/external-listings.md for ready-to-use descriptions (create this file with current marketing copy).
Screenshots should be updated when the UI changes significantly (new tabs, redesigned views, etc.).
Located in docs/website/images/:
| Screenshot | Shows | Used on |
|---|---|---|
main-dark.png |
Main interface with files loaded | screenshots.html, OG image |
file-details-dark.png |
File details panel | screenshots.html |
treeview-dark.png |
Search results tree | screenshots.html |
search-data-dark.png |
Search data view | screenshots.html |
comparison-dark.png |
Row comparison view | screenshots.html |
Light theme variants (*-light.png) are kept as backup but not displayed.
- Resolution: 1920x1080 or similar 16:9 aspect ratio
- Theme: Use dark theme for consistency (matches current website)
- Content: Use realistic sample data, not test data
- Window: Capture full application window, not cropped
# 1. Take new screenshots, save to docs/website/images/
# 2. Commit and push
git add docs/website/images/*.png
git commit -m "docs: update screenshots for v0.X.0"
git push origin develop
# 3. After merge to main, deploy website
gh workflow run deploy-pages.ymlConsider adding screenshots for new features:
settings-dark.png- Settings tab with preferencestemplates-dark.png- Templates tab with validationcolumn-linking-dark.png- Column linking sidebar
Planned improvements for future releases:
- Windows: Code signing (.exe), winget package, portable .zip
- Linux: RPM package, Flatpak/Snap, AppImage
- macOS: Notarized .dmg installer, Homebrew cask
- Integrate
release-changelog.ymlinto main pipeline - Single command: version bump → changelog → tag → build → release → website
- Automated testing before release
- Release notes from conventional commits
- Automatic update mechanism in application
- Package manager submissions (winget, Homebrew, apt/yum repos)
- Digital signatures and checksums for all artifacts
- Workflow File:
.github/workflows/release.yml - Template File:
docs/website/index.html.template - Design Document:
.personal/work-in-progress/workflow-redesign-2025-10-14.md - Semantic Versioning: https://semver.org/
- GitHub Actions: https://docs.github.com/en/actions
Last Updated: 2026-01-19 Version: 1.1 Maintained by: SheetAtlas Team