Release Channels

Stable, canary and LTS dist-tags, lockstep versions, provenance and cutting a release.

Text.js ships on three npm dist-tags. Every package (@textjs/app, @textjs/react, @textjs/core, @textjs/font, @textjs/opencode, create-text-app and eslint-plugin-textjs) is versioned in lockstep, so one version number describes the whole framework.

Channels

Channeldist-tagVersionInstall
Stablelatest1.0.xbun add @textjs/app
Canarycanary1.0.x-canary.Nbun add @textjs/app@canary
LTSlts, v1-ltsPublished once 2.0.0 shipsbun add @textjs/app@lts

Use stable in production. Use canary to try fixes and features the day they land on dev. Once an LTS line exists, use it if you upgrade once a year.

bun create text-app@canary my-console

Stable

Stable releases follow semantic versioning: patches fix bugs, minors add backwards-compatible features, majors may break APIs after a deprecation period. A stable release is promoted from a canary that has passed the full test suite, and is published with npm provenance.

Canary

Every push to dev in the official repository is type-checked, tested and published as the next patch with a -canary.N suffix:

latestdev pushPublished
1.0.0first1.0.1-canary.0
1.0.0second1.0.1-canary.1
1.0.1next1.0.2-canary.0

N continues from the highest canary already on npm, so numbers never repeat. Canary versions are not committed to the repository. Add [skip canary] to a commit message to skip a release.

Canaries are builds of dev, the branch every pull request merges into. They may change or remove unreleased APIs without notice. Pin an exact canary version if you depend on one.

Provenance

Releases are published from GitHub Actions with npm publish --provenance, which links each tarball to the exact commit and workflow that built it. Verify a package with:

npm audit signatures

Cutting a release

Maintainers bump every workspace package in lockstep with the release scripts:

bun run release:version minor   # 1.0.0 → 1.1.0 (also: patch, major, canary, stable, x.y.z)bun run release:publish --tag latest --provenance

release:version rewrites each package.json and the version constants that mirror it (VERSION, the reconciler's rendererVersion), refuses to run when packages have drifted apart, and --dry-run prints the plan. release:publish builds, packs (resolving workspace:*), applies publishConfig, refuses to put a prerelease on latest or a stable version on canary, and skips versions that already exist on npm.

See the Support Policy for how long each release line is maintained.

Edit this page on GitHub