This is a step-by-step guide for making a release build and pushing it to GitHub.
- Update CHANGELOG.md under
## [Unreleased]. - Run one:
npm run release:patchnpm run release:minornpm run release:major
- Push commit + tag:
git pushgit push origin vX.Y.Z
- Verify the GitHub Actions run for tag
vX.Y.Zis green (all jobs), then do a quick sanity check.
CLI alternative (no browser, using GitHub CLI):
gh auth statusgh run list -L 10 --workflow release-assets.ymlgh release view vX.Y.Z
Where to find:
- High-level policy: docs/RELEASES.md
- This checklist: docs/RELEASE_CHECKLIST.md
- User-facing changelog: CHANGELOG.md
- Generated release notes (per release): docs/RELEASE_NOTES.md
- You are on the right branch (usually
master). - You can run the app locally:
npm start - AppImage toolchain is available (see scripts/README.md).
This repo intentionally keeps some things local (debug dumps, personal scripts, etc.).
- Repo-shared ignores live in
.gitignore(tracked and pushed to GitHub). - Personal/host-specific ignores should NOT go into
.gitignore. Use one of:.git/info/exclude(applies only to your clone)- your global git ignore file (e.g.
~/.config/git/ignore)
You typically want:
- a short commit subject (used on GitHub commit list)
- an optional longer body (details)
Example:
- Subject:
release: v0.12.2 - Body: a few bullet points, one per major change.
The repository release flow is driven by scripts/release.mjs (via npm run release:*), which:
- bumps versions in
package.json(+package-lock.json) - moves the current CHANGELOG.md
## [Unreleased]section into a dated## [X.Y.Z] - YYYY-MM-DDentry - creates an annotated git tag
vX.Y.Z - requires a clean git working tree (no uncommitted changes)
Manual (optional):
- Append local devlog entry:
node scripts/chat-log.mjs -m "your message" --notes "optional notes"
- Edit CHANGELOG.md:
- Ensure
## [Unreleased]exists. - Add a new
## [X.Y.Z] - YYYY-MM-DDsection right under it.
- Ensure
This flow bumps the version, updates release docs, commits, and creates a tag:
-
Ensure the working tree is clean.
-
Run one of:
npm run release:patchnpm run release:minornpm run release:major
-
Push commit and tag:
git pushgit push origin vX.Y.Z
Notes:
- The user-facing release notes are the CHANGELOG.md entry for
vX.Y.Z. - Tag pushes trigger GitHub Actions (including
.github/workflows/release-assets.yml) which builds and uploads artifacts to the GitHub Release for that tag.
Tip: if you don’t want to use the browser, you can confirm the release and attached assets via:
gh release view vX.Y.Z
git push origin mastergit push origin vX.Y.Z
Release notes are now generated automatically from CHANGELOG.md:
- workflow:
.github/workflows/release-assets.yml - source: section
## [X.Y.Z] - ...that matches the pushed tagvX.Y.Z
What this means:
- Keep
## [Unreleased]accurate before runningnpm run release:*. - After tag push, the workflow creates/updates the GitHub Release body from that changelog section.
- Assets are uploaded by CI in the same workflow.
Manual rebuild/re-upload (if needed):
- run workflow
release-assets.ymlwith:ref: vX.Y.Zpublish: true
If you see errors about FUSE (/dev/fuse) or runtime download:
- You can run AppImage-based tools without FUSE via:
APPIMAGE_EXTRACT_AND_RUN=1
appimagetoolmay need a runtime file (runtime-x86_64).- Place it at:
dist/appimage/runtime-x86_64 - Then rebuild using
appimagetool --runtime-file dist/appimage/runtime-x86_64 ...
- Place it at:
Some contributors keep optional convenience scripts under scripts/local/ (gitignored).
They are not required for the release process.
Before publishing, quickly verify that opening an .abc file from the OS shell/file manager
routes into ABCarus correctly (especially when one instance is already running).
- Linux (AppImage / desktop entry):
- Double-click an
.abcin file manager. - Expected: ABCarus opens that file.
- If ABCarus is already open: no second UI instance; existing window focuses and opens the requested file.
- Double-click an
- Windows (portable / installer build):
- Use "Open with ABCarus" on a
.abc. - Expected: file opens directly; repeated open requests route to the same running instance.
- Use "Open with ABCarus" on a
- macOS (
.dmgapp):- Open
.abcfrom Finder ("Open with ABCarus"). - Expected: existing app instance receives file-open event and opens requested file.
- Open
Failure hints:
- If app opens but wrong file is loaded, inspect startup argv handling in
src/main/index.js(parseCliOptions, second-instance flow). - If file association exists but nothing opens, verify platform launcher metadata (
.desktopon Linux, app registration on Windows/macOS).