Use this checklist before publishing a new taskers release.
- Make sure the release work is recorded clearly in
jj. - Describe the current change with
jj desc -m "<type>: <summary>"if needed. - Split unrelated work into separate changes before publishing.
- Bump the workspace version in
Cargo.tomland update any internal dependency version pins that still reference the previous release. - Do not run the publish dry-runs until the version bump is done everywhere. Re-running
cargo publish --dry-runagainst an already-published version will verify packaged siblings against crates.io's existing releases instead of your local unpublished changes.
- Regenerate the README screenshots:
bash scripts/capture_demo_screenshots.sh- Review the updated files in
docs/screenshots/. - Update
README.mdif the screenshots or release notes no longer match the current UI.
- Run the full test suite:
cargo test- Run the GTK smoke checks:
bash scripts/smoke_taskers_ui.sh
bash scripts/smoke_taskers_focus_churn.sh- Build the Linux app bundle that the published launcher expects:
bash scripts/build_linux_bundle.sh
bash scripts/smoke_linux_release_launcher.shThe output asset name must match:
taskers-linux-bundle-v<version>-<target>.tar.xz
- Build the macOS release assets on macOS:
bash scripts/install_macos_codesign_certificate.sh
bash scripts/generate_macos_project.sh
xcodebuild build \
-project macos/Taskers.xcodeproj \
-scheme TaskersMac \
-configuration Release \
-derivedDataPath build/macos/DerivedData \
ARCHS="arm64 x86_64" \
ONLY_ACTIVE_ARCH=NO \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO
bash scripts/sign_macos_app.sh
bash scripts/build_macos_dmg.sh
bash scripts/notarize_macos_dmg.sh dist/Taskers-v<version>-universal2.dmg-
Set these env vars before importing the certificate or notarizing:
TASKERS_MACOS_CERTIFICATE_P12_BASE64TASKERS_MACOS_CERTIFICATE_PASSWORDTASKERS_MACOS_CODESIGN_IDENTITYTASKERS_MACOS_NOTARY_APPLE_IDTASKERS_MACOS_NOTARY_TEAM_IDTASKERS_MACOS_NOTARY_PASSWORD
-
scripts/sign_macos_app.shstill falls back to ad hoc signing whenTASKERS_MACOS_CODESIGN_IDENTITYis unset, but public release builds should always use a Developer ID Application identity and notarize the DMG. -
Build the release manifest from the generated assets:
python3 scripts/build_release_manifest.py- Dry-run the leaf crates that do not depend on unpublished workspace siblings:
cargo publish --dry-run -p taskers-domain
cargo publish --dry-run -p taskers-paths- After you bump the workspace to a new unpublished version,
cargo publish --dry-runfor dependent crates will still resolve dependencies from crates.io and fail until the earlier crates are actually published. That failure is expected for:taskers-controltaskers-runtimetaskers-ghosttytaskers-clitaskers
- Use the full local test/smoke suite as the pre-publish validation for those dependent crates, then publish them in order once the earlier versions are live on crates.io.
- Push the release tag so GitHub Actions can assemble the assets and attach them to a draft GitHub release.
- Confirm the draft release tagged
v<version>contains:taskers-manifest-v<version>.jsontaskers-linux-bundle-v<version>-x86_64-unknown-linux-gnu.tar.xzTaskers-v<version>-universal2.dmg
- Publish the GitHub release so the launcher assets are publicly downloadable before publishing the crates.
- Publish the crates to crates.io in dependency order:
cargo publish -p taskers-domain
cargo publish -p taskers-paths
cargo publish -p taskers-control
cargo publish -p taskers-runtime
cargo publish -p taskers-ghostty
cargo publish -p taskers-cli
cargo publish -p taskers- Wait for crates.io to index each published version before publishing the next dependent crate, or Cargo will reject the dependency resolution for the later package.
- Verify the Linux launcher install:
cargo install taskers --locked
taskers --demo- Confirm the published Linux launcher downloads the exact version-matched bundle on first launch.
- Confirm macOS installs from the published DMG and launches correctly after dragging
Taskers.appintoApplications. - Confirm
cargo install taskers --lockedfails on macOS with guidance to use the GitHub Releases DMG. - Confirm
cargo install taskers-cli --bin taskersctl --lockedstill works as the standalone helper path.