# Distribution
How @kortix/sdk ships: npm, the CDN ESM bundle, the window.Kortix script global, version lockstep with platform releases, and the entry-point stability tiers.
Canonical page: https://kortix.com/docs/sdk/distribution
## npm (the default)
```sh
npm install @kortix/sdk
```
The published package is compiled ESM (`dist/`) with full type declarations.
`react` and `@tanstack/react-query` are **optional peer dependencies** — install
them only if you use `@kortix/sdk/react`.
```ts
import { createKortix } from '@kortix/sdk'; // framework-free core
import { useSession } from '@kortix/sdk/react'; // optional React layer
import { createScopedKortix } from '@kortix/sdk/server'; // Node servers (async_hooks)
```
## CDN — no build step
Two browser bundles ship with the package, mirrored automatically by unpkg and
jsDelivr:
**ESM** (`dist/kortix.esm.min.js`, the package's `browser` field) — for
`
```
**IIFE global** (`dist/kortix.global.js` — what a bare
`https://unpkg.com/@kortix/sdk` resolves to, via the package's `unpkg` /
`jsdelivr` fields) — a single `
```
`window.Kortix` **is** the root entry — `Kortix.createKortix`,
`Kortix.classifyTurn`, `Kortix.ApiError`, no namespaces. Streaming works from
the CDN bundles in any modern browser (Safari 16.4+).
> **Warn**
> Don't mix the ESM build and the IIFE global in one page — you'd get two copies of every class, and
> `err instanceof ApiError` across the boundary silently returns `false`. Pick one.
## Versioning — lockstep with the platform
The SDK version is stamped from the platform release at publish time; the SDK
ships **in lockstep with the Kortix platform**. There is no separate SDK
release train — a platform release publishes the matching SDK. Pin a version
or use `^` as you prefer; the API surface follows semver, enforced by a
committed public-surface snapshot asserted in CI (any rename or removal of an
exported name must land as a reviewed, deliberate diff).
## Entry points and their stability tiers
**The root entry is canonical.** Since v2, everything framework-free is
exported from `@kortix/sdk` itself — one flat, discoverable surface. The
supported entry points:
| Entry | Tier | Contract |
| ----------------------------------------------------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `@kortix/sdk` | **canonical** | The full framework-free surface. Runs in browsers, Node ≥ 18, Bun, and edge runtimes. Never imports React or `node:*`. |
| `@kortix/sdk/react` | **supported** | The React hooks layer. The only entry allowed to import React. |
| `@kortix/sdk/server` | **supported** | Node/Bun-only per-request config isolation (`node:async_hooks`). Never bundle into a browser. |
| Legacy subpaths (`/projects-client`, `/turns`, `/files`, …) | **deprecated aliases** | Still work — every legacy subpath re-exports from the root — but are frozen. Import from the root instead. Removal only in a major. |
| Browser store subpaths (`/sync-store`, `/server-store`, …) | **internal** | Plumbing consumed by the Kortix web app. Not on `window.Kortix`, not designed API — don't build on them. |
These guarantees are enforced mechanically, not by convention: an
import-graph tripwire fails the build if a framework or `node:*` import ever
reaches the core, and the public-surface snapshot catches accidental renames
before they reach a release.
## What's in the tarball
`npm pack` contains `dist/` (compiled ESM + `.d.ts` + CDN bundles), `src/`
(readable source for go-to-definition), and the README — nothing else. Repo
docs, examples, tests, and internal tooling never ship to consumers. The
publish pipeline verifies the tarball installs and imports before anything
goes out.