Upgrading
How an application team moves to a new TesseraQL release. Two things carry a version: the
tesseraql CLI you installed (getting-started.md), and the framework
version your app builds against (the tesseraql.version property in the scaffolded
pom.xml, plus the resolved module closure in modules.lock). Keep them on the same
release — the scaffold pins them together, and this page keeps them together through an
upgrade. Shipping a new version of your application into a running stack is a different
move: see hosting.md’s deploy section.
Compatibility before 1.0
Section titled “Compatibility before 1.0”TesseraQL is pre-1.0: backward compatibility is not yet a goal, so a minor release may change Java APIs, YAML contracts, and generated artifacts without a deprecation period. Every notable change — breaking ones called out explicitly — is recorded per release in CHANGELOG.md (Keep a Changelog format, semantic versioning). Read the entries for the whole span you are crossing, not just the latest version, before touching anything.
Learning a release exists
Section titled “Learning a release exists”- The CLI tells you. Every CLI run prints a one-line notice to stderr when a newer
release is available —
A newer TesseraQL is available: <latest> (current <yours>)with the download link. The check is passive: the notice comes from a small per-user cache (under~/.tesseraql/), a background thread refreshes that cache at most once every 24 hours from the GitHub Releases API, and a failed check is silently ignored — it never slows or breaks a command. It is disabled in CI, and you can silence it withTESSERAQL_NO_UPDATE_NOTIFIER=1. - GitHub releases. Each release at https://github.com/ingcreators/tesseraql/releases carries the distribution archives, the per-OS app images, and release notes.
Upgrading the CLI
Section titled “Upgrading the CLI”There is no self-update command — you upgrade the installation the same way you made it:
- Homebrew:
brew upgrade tesseraql(the tap’s formula is bumped by every release). - Scoop:
scoop update tesseraql(the bucket’s manifest likewise). - WinGet:
winget upgrade ingcreators.TesseraQL. Stop any runningtesseraqlfirst (adevsession, say): it holds the installed files open, and WinGet cannot replace them. Each release opens a pull request tomicrosoft/winget-pkgs, and WinGet offers the new version once that pull request has passed its validation and merged, which can be hours after the release. Afterwinget uninstall ingcreators.TesseraQL, thePATHentry WinGet added can stay behind (winget-cli#6160): remove the…\WinGet\Packages\ingcreators.TesseraQL_…\tesseraqlentry from your userPATHby hand. - Distribution archive: download the new
tesseraql-cli-<version>-dist.zip(or.tar.gz), unpack it, and point yourPATHat the newbin/. - App image: download and replace the jpackage image for your OS.
Verify with tesseraql --version. The install channels are described in
getting-started.md.
Upgrading an app
Section titled “Upgrading an app”-
Bump the wrapper pom. Set
tesseraql.versionin the scaffoldedpom.xmlto the new release, so the Maven/CI path builds against the same version the CLI runs. The framework artifacts resolve from Maven Central, with nothing to configure. -
Refresh
modules.lockif the app declarestesseraql.modules. Framework module coordinates declared without a version (the normal form, e.g.io.tesseraql:tesseraql-pdf) resolve through the BOM at the CLI’s own version, so after a CLI upgrade the resolved closure no longer matches the committed lock andtesseraql devrefuses to start until it does:Terminal window tesseraql modules resolve --app .Commit the rewritten
modules.lock— the version bump and the lock refresh belong in the same change. Third-party coordinates (JDBC drivers) keep their pinned versions. -
Lint and test with the new CLI:
Terminal window tesseraql lint --app .tesseraql test --app .Pre-1.0 releases may tighten lint rules or change YAML contracts; findings here are the changelog entries landing on your app. Fix what they name before going further.
Database concerns
Section titled “Database concerns”- Framework tables migrate themselves. The framework’s own schema (sessions, operations, and the other framework-managed tables) is migrated automatically when the runtime starts, through Flyway with a per-component history table. The migrations are idempotent and take Flyway’s lock, so concurrent node startups serialize; there is no manual step. This is one reason to roll staging first: the first boot of a new version is what applies its framework schema changes.
- App migrations are unchanged. Your own
db/migrationscripts run exactly as before —devauto-applies them, or runtesseraql migrate/ the Maven goal explicitly. A framework upgrade never rewrites app migrations. - Embedded database directories are safe. A persistent
--embedded-dbdirectory is pinned to the PostgreSQL version that initialized it, so a CLI upgrade that bumps the default binary never leaves existing data unopenable.tesseraql embedded-db info ./pgdatashows where a directory stands and prints the upgrade procedure when one applies — see deployment.md.
Pre-flight checklist
Section titled “Pre-flight checklist”Before an upgrade reaches production:
- Read CHANGELOG.md for every version between the one you run and the one you are adopting; note the breaking changes.
- Upgrade the CLI, bump
tesseraql.version, and refreshmodules.lockin one change. tesseraql lint --app .andtesseraql test --app .pass with the new version.- If the app is shared with other teams,
tesseraql admission --app .still exits 0 (admission.md). - Roll staging before production, through the ordinary promotion loop
(promotion.md) —
tesseraql release-diffagainst the deployed baseline shows what the upgrade changes in routes, contract, and migrations.
- getting-started.md — the install channels and the dev loop.
- promotion.md — the dev → staging → prod pipeline the upgrade rides.
- deployment.md — container deployment and the embedded database lifecycle.