This document explains how to create and publish a new release of Year Dots.
- Maintainer access to the repository
- Release keystore configured in GitHub Secrets
- Updated CHANGELOG.md
- All tests passing
- Ensure
mainbranch is stable and all CI checks pass - Update version in
app/build.gradle.kts:- Increment
versionCode - Update
versionName(follow semantic versioning)
- Increment
- Update
CHANGELOG.md:- Move items from "Unreleased" to new version section
- Add release date
- Verify all changes are documented
- Commit version bump:
git add app/build.gradle.kts CHANGELOG.md git commit -m "chore: bump version to X.Y.Z" git push origin main
# Create annotated tag
git tag -a vX.Y.Z -m "Release vX.Y.Z"
# Push tag to trigger release workflow
git push origin vX.Y.ZGitHub Actions will automatically:
- Build the release APK
- Sign the APK (if keystore secrets are configured)
- Extract changelog for this version
- Create GitHub release with APK attached
Monitor the workflow at: Actions → Release Build
- Verify the release appears on GitHub with correct APK
- Test the release APK on a physical device
- Update F-Droid metadata (if applicable)
- Announce release (optional):
- Reddit: r/Android, r/androidapps
- XDA Forums
- Social media
Year Dots follows Semantic Versioning:
MAJOR.MINOR.PATCH (e.g., 1.2.3)
- MAJOR: Breaking changes (e.g., minimum Android version bump)
- MINOR: New features (backwards-compatible)
- PATCH: Bug fixes and minor improvements
1.0.0→1.0.1: Fixed pill alignment bug1.0.0→1.1.0: Added widget support1.5.0→2.0.0: Raised minimum SDK to Android 10
For critical bugs in production:
-
Create hotfix branch from release tag:
git checkout -b hotfix/vX.Y.Z vX.Y.Z
-
Fix the bug and test thoroughly
-
Update version to X.Y.(Z+1) and CHANGELOG
-
Merge to main:
git checkout main git merge hotfix/vX.Y.Z
-
Tag and release as normal
If a release has critical issues:
- Mark the release as "Pre-release" on GitHub
- Add a warning to the release notes
- Prepare and release a hotfix version immediately
- Once hotfix is verified, delete the problematic release
keytool -genkey -v -keystore year-dots-release.keystore \
-alias year-dots -keyalg RSA -keysize 2048 -validity 10000IMPORTANT: Store the keystore and passwords securely!
Add these secrets to your repository:
-
KEYSTORE_BASE64: Base64-encoded keystore filebase64 -w 0 year-dots-release.keystore
-
KEYSTORE_PASSWORD: Keystore password -
KEY_ALIAS: Key alias (e.g., "year-dots") -
KEY_PASSWORD: Key password
Navigate to: Repository Settings → Secrets and variables → Actions → New repository secret
- Check that all secrets are configured correctly
- Verify CHANGELOG.md has section for the version
- Ensure build.gradle.kts version matches tag
- Verify APK is properly signed
- Check that
versionCodeis higher than previous release
- Ensure GitHub token has release permissions
- Verify tag follows
v*pattern
If GitHub Actions fails, build manually:
# Build release APK
./gradlew assembleRelease
# Sign APK
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 \
-keystore year-dots-release.keystore \
app/build/outputs/apk/release/app-release-unsigned.apk \
year-dots
# Align APK (optional but recommended)
zipalign -v 4 app/build/outputs/apk/release/app-release-unsigned.apk \
YearDots-vX.Y.Z.apk
# Create GitHub release manually via web UI| Version | Date | Highlights |
|---|---|---|
| 1.0.0 | 2026-02-01 | Initial public release |
- PUBLISHING.md - Guide for publishing to F-Droid and other platforms
- CHANGELOG.md - Detailed version history
Questions? Open an issue or contact maintainers.