Versioning
graphpg follows semantic versioning from 1.1.0, the first published release. Releases are tagged vX.Y.Z; each publishes the container image (ghcr.io/mihailtd/graphpg:X.Y.Z, :X.Y, :X, :latest) and a GitHub Release. The changelog lists what each one changes.
- Patch (
1.1.x): fixes. Nothing that worked as documented stops working. - Minor (
1.x.0): additions. New fields, arguments, routes, error codes, config keys and features, with defaults that leave existing deployments as they were. - Major (
x.0.0): anything that can break a client, a deployment or a database that worked with the previous version.
What the version covers
For the same database and the same graphpg.yaml, a minor or patch upgrade serves the same API:
- The GraphQL schema: type, field, argument, enum value and input names (and the rules deriving them from database names: singulars and plurals, camelCase, clash resolution), nullability, and the root fields each table, view and function gets.
- The REST API: routes, query parameters, headers, status codes, the shape of bodies and of the OpenAPI document.
- Errors:
extensions.codevalues (BAD_USER_INPUT,SCHEMA_CHANGED,<Type>ErrorCodevalues, ...) and the HTTP status of each. - Configuration:
graphpg.yamlkeys, their meaning and defaults; command-line commands and flags; environment variables. - Behaviour the database relies on: the session settings authenticated requests set (
role,request.jwt.claims, the prefix and mappings), the transaction each request runs in, and what graphpg creates in the database (only in dev mode: its DDL event trigger). - Telemetry names: metric names and attributes, and span names, which dashboards and alerts depend on.
New things may appear in a minor version: a new root field, argument, enum value or error code. Clients must tolerate them (an unknown enum value or error code, a new field in a REST body), as GraphQL and HTTP clients generally do.
What it does not cover
- The SQL graphpg generates, its plans and performance: they improve in any release.
- Log messages, the text of error messages (the codes are covered), and the content of dev-mode-only output (
X-Debug-SQL,extensions.sql). - The Rust crate's API (
graphpgas a library): it is the server's implementation, not a supported interface. - Behaviour that was a vulnerability: a security fix may refuse what a request could do before (for example the global ID of another type in a key argument), in a patch release.
- A database that changed: renaming a table renames its type. Pin the API with
export.pin(see configuration) to make such a change fail at startup instead of reaching clients.
Deprecation
Something the next major version removes or changes is deprecated first, in a minor version: marked @deprecated in the GraphQL schema and deprecated: true in the OpenAPI document, logged as a warning at startup when a configuration uses it, and listed in the changelog. It keeps working until the next major version.
Supported PostgreSQL
The test suite runs against PostgreSQL 18. Dropping a PostgreSQL version is a major change.