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 yet — you replace the installation the same way you made it:
- 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 —serveauto-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.