Releases and versioning
Every site deploy and every installer release carries a version and a build number. Agents manage both automatically on every deploy, so the user never has to think about them.
Policy
- Build number: goes up on every deploy. heremyapp assigns site builds itself (1, 2, 3, ...). For installers the
build is the app's own build number (for example
CFBundleVersion), which you increase before building. - Version: Semantic Versioning
MAJOR.MINOR.PATCH, bumped by what changed since the previous release:
| Bump | Apps and installers | Landing pages | Example |
|---|---|---|---|
| major | Incompatible or large changes: removed features, a new minimum OS, data or file formats older versions cannot read, a paid upgrade | Redesign or rebrand | 1.4.2 → 2.0.0 |
| minor | New features or improvements: dark mode, a new setting, a new integration, noticeably faster | New sections, pages or languages | 1.4.2 → 1.5.0 |
| patch | Fixes: bug and crash fixes, hotfixes, translation fixes | Updating release info (version, size, notes), typos, broken links, small style fixes | 1.4.2 → 1.4.3 |
When a release mixes changes, use the largest bump that applies: bug fixes plus dark mode is minor.
Decide the bump yourself from the changes you made or can see (your edits, git diff, git log). Do not ask the user
to pick a version; tell them the result in your report. Use a pre-release such as 2.0.0-beta.1 only when the user asks
for a beta.
Before every deploy: check the current versions
curl -sS --fail-with-body "$API/spaces/my-app/versions" -H "$AUTH"{"policy":"Every deploy gets the next build number automatically. ...",
"site":{"live":{"deployment_id":"dep_5adj...","version":"1.4.2","build":17,"notes":"Fix typo","created_at":"..."},
"latest":{"deployment_id":"dep_5adj...","version":"1.4.2","build":17,"notes":"Fix typo","created_at":"..."},
"next":{"build":18,"patch":"1.4.3","minor":"1.5.0","major":"2.0.0"}},
"artifacts":[{"filename":"MyApp.pkg","latest":{"id":"art_3kq9...","version":"1.2.0","build":"45","status":"active"},
"live":{"id":"art_3kq9...","version":"1.2.0","build":"45"},
"next":{"patch":"1.2.1","minor":"1.3.0","major":"2.0.0","build":"46"}}],
"contact_status":"provided"}site.liveis what visitors see now;site.latestis the newest deploy (they differ after a rollback). Next numbers always continue fromlatest.- For each installer file,
latestis the highest version ever published (including deleted ones, whose numbers cannot be reused) andliveis what thelatestdownload link serves now. contact_statustells you whether to ask the user for contact details (see Landing page checklist).
Deploy a site with its version
Add bump (and a one-line notes summary) to the deploy URL. curl's --url-query encodes the values for you:
tar -czf - -C dist . | curl -sS --fail-with-body -X POST "$API/spaces/my-app/deployments" \
--url-query "bump=minor" --url-query "notes=Add Japanese page" \
-H "$AUTH" -H "content-type: application/gzip" --data-binary @-- curl older than 7.87 has no
--url-query: put the values in the URL instead and percent-encode the notes, for example"$API/spaces/my-app/deployments?bump=minor¬es=Add%20Japanese%20page". - The response includes
versionandbuild. Withoutbump, heremyapp bumps the patch version. - Send
version=X.Y.Zinstead ofbumpto set an exact version; it must be higher than the current one (409 version_not_increasinglists suggestions). - The first deploy of a space is
1.0.0, build 1. - Every page of the live site carries
X-Heremyapp-VersionandX-Heremyapp-Buildheaders, so you can confirm the new version is live:
curl -sIL https://heremyapp.com/ACCOUNT/my-app | grep -iE "^x-heremyapp-(version|build)"Release an installer with its version
- Read the app's current version and build from the project:
- Xcode:
MARKETING_VERSIONandCURRENT_PROJECT_VERSIONbuild settings (CFBundleShortVersionStringandCFBundleVersion). With Apple Generic Versioning:agvtool what-marketing-version,agvtool what-version. - Electron or Node:
versioninpackage.json; a build number if the project keeps one.
- Xcode:
- Work out the new numbers from
artifacts[].latest(the published release):- Version: bump the published version by the policy above. If the project's version is already higher than that (the user or an earlier step set it and it was never published), keep the project's version.
- Build: one more than the published build, or the project's build if that is already higher.
- Build numbers compare part by part as numbers (
46 < 47,1.2.9 < 1.2.10). Keep one format per app.
- Write them into the project (for example
agvtool new-marketing-version 1.3.0andagvtool new-version -all 46, or edit the build settings), then build, sign and notarize. - Register the installer with
version,buildandnotes(Installers). heremyapp rejects a version or build that does not increase (version_not_increasing,build_not_increasing, with suggestions). - Update the version, size and release notes shown on the landing page, and deploy the site (usually
bump=patch, orminorif you added content).
The landing page should show the app's version (from the installer). The site's own version tracks changes to the page itself.