# SDK versioning

The first package of each language gets your config's `firstVersion`. After that, each package's version is worked out from the last one, the registry's diff between their versions, and the names the SDK exports. The biggest bump that applies wins.

| What changed | Bump |
| --- | --- |
| A breaking change in the diff, or a changed operationId (a renamed method) | Major |
| An exported name is gone from the SDK | Major |
| Any other change in the diff, such as a new operation or a deprecation | Minor |
| A new exported name | Minor |
| No diff to compare with | Minor, compared by exported names only |
| Only a removed description, or nothing | Patch |

[Breaking changes](../registry/breaking-changes) lists every kind of change the diff finds.

## Below 1.0.0

As semver does for versions below `1.0.0`, a major change moves the minor number, and anything else the patch: `0.3.2` becomes `0.4.0` or `0.3.3`.

## The same input, the same package

The same config and the same registry version give the same package and version again, so a re-run never moves the version.

## Previews

A preview from the SDK panel is versioned so it can't be mistaken for a release: `0.0.0-preview.7` for TypeScript and `0.0.0.dev7` for Python, for registry version 7. A preview can be made from the sample document; a package to publish can't.

## Where this comes from

- `app/sdk/_lib/version.ts`
- `app/sdk/_lib/builds.ts`
- `app/registry/_lib/diff.ts`
