Release FrameSeq#
FrameSeq can publish both npm packages from a version tag through GitHub Actions and npm Trusted Publishing. The workflow uses short-lived OpenID Connect credentials, so the repository does not need a long-lived npm write token.
One-time npm configuration#
Configure a Trusted Publisher separately for both packages:
@pride7/frameseqcreate-frameseq
On each package's npm Settings → Trusted Publisher page, use:
Provider: GitHub Actions
Organization or user: pride7
Repository: frameseq
Workflow filename: publish.yml
Environment: leave empty
Allowed action: npm publish
The workflow is stored at .github/workflows/publish.yml. Both packages may trust the same workflow file.
Prepare a release#
Update all four version references:
- the root
package.jsonversion; - the root
package-lock.jsonpackage versions; packages/create-frameseq/package.json;FRAMESEQ_VERSIONinpackages/create-frameseq/index.mjs.
The standalone StackBlitz project's @pride7/frameseq dependency in examples/playground/package.json must also match the new framework version. Move the relevant Changelog entries from Unreleased into a dated version section.
Run the local gate:
npm run release:tag-check -- v0.16.0
npm run release:check
Commit and push the release changes before creating the tag, and let CI pass on them. CI runs release:check in four groups side by side, as node scripts/test-suite.mjs core, studio (with pack:check), app, and exports, and node scripts/test-suite.mjs studio runs one group locally.
Publish from a tag#
Create a tag that exactly matches the root package version:
git tag -a v0.16.0 -m "FrameSeq 0.16.0"
git push origin v0.16.0
The workflow then:
- verifies that the tag, framework version, creator template, and playground dependency agree;
- waits for CI to have passed on the tagged commit, the run of its push to
mainor else the one the tag starts, rather than runningrelease:checka second time, and stops if it failed; - publishes
@pride7/frameseqandcreate-frameseqin separate jobs.
The two publish jobs are independent. If one transiently fails, rerun only its failed job from GitHub Actions rather than creating another tag.
Verify the registry#
npm view @pride7/frameseq version
npm view create-frameseq version
Do not move or recreate a published version tag. npm package name-and-version pairs cannot be reused.
The desktop app#
The same version tag starts the Desktop app workflow (.github/workflows/app.yml), which builds the FrameSeq app on each platform and attaches it to the GitHub release of that tag, creating the release when it does not exist yet:
| Runner | Builds |
|---|---|
windows-latest |
FrameSeq-Setup-<version>-win-x64.exe with Inno Setup, and the portable FrameSeq-<version>-win-x64.zip |
macos-latest |
FrameSeq-<version>-mac-arm64.dmg and FrameSeq-<version>-mac-x64.dmg |
ubuntu-latest, ubuntu-24.04-arm |
FrameSeq-<version>-linux-x64.tar.gz and FrameSeq-<version>-linux-arm64.tar.gz |
Each job runs node scripts/app-bundle.mjs --platform <platform> --arch <arch>. The script packs the package as npm would, installs its production dependencies and the optional typesetters for the target with npm install --os --cpu, downloads the Node.js release named by --node and checks it against the published checksums, adds a headless browser for macOS and Linux, builds the Studio's window from desktop/ with Rust, and writes the launchers and the installer. The window is built on the system it is for, which is why Linux on ARM has a runner of its own; the Intel Mac's is cross-compiled on Apple silicon. Run it locally to try a build; without Inno Setup, Windows gets only the zip, and away from macOS the Mac app is zipped instead of put in a disk image.
The release job attaches the apps to the release with SHA256SUMS.txt, which lists the SHA-256 of each, so that a download can be checked against it.
Run the workflow by hand from GitHub Actions to build the apps without a release; they are then kept as workflow artifacts. The apps are not signed or notarised yet.
Updates to the app#
An installed app updates itself from the package published to npm, without the release's downloads, when nothing it ships around FrameSeq has to change; see Updates. What it ships around FrameSeq is its runtime: Node.js, desktop/, scripts/app-bundle.mjs, and scripts/app-launch.mjs. node scripts/app-runtime.mjs prints the runtime's fingerprint, and the build writes it into the app. The publish job stamps it into the published package.json as appRuntime (node scripts/app-runtime.mjs --stamp), so nothing needs bumping by hand. An app takes a published version only when the version's appRuntime is its own, its dependencies satisfy the version's, and its Node.js satisfies engines. So a release that changes the window, Node.js, or a dependency reaches existing apps as a new download, and any other release updates them in place.