> ## Documentation Index
> Fetch the complete documentation index at: https://docs.useshipd.com/llms.txt
> Use this file to discover all available pages before exploring further.

# TypeScript SDK changelog

> Release notes for shipdit, the TypeScript SDK for servers, browsers, and React.

## Overview

Release notes for [`shipdit`](/sdks/node), newest first. Upgrade steps for breaking releases are in [Migration guides](/migrations).

**shipdit 0.4.0**

### Breaking changes

**`endpoint` and `streamEndpoint` were removed from `createClient`.** The client always connects to `https://edge.useshipd.com`. To get realtime updates, pass `stream: true`, which opens a `wss://ws.useshipd.com` connection. Passing either removed option throws:

* ``shipdit: `endpoint` was removed…``
* ``shipdit: `streamEndpoint` was removed…``

```ts theme={null}
// Before
createClient<FlagDefinitions>({
  sdkKey: process.env.SHIPD_SDK_KEY!,
  endpoint: "https://edge.useshipd.com",
  streamEndpoint: "https://ws.useshipd.com",
});

// After
createClient<FlagDefinitions>({
  sdkKey: process.env.SHIPD_SDK_KEY!,
  stream: true,
});
```

**Server `identify()` no longer changes evaluation context.** In `shipdit` (server), `identify()` now only records an identify event. It no longer sets the user for later evaluations and no longer fetches remote traits, so one request's identity can't leak into another request on a shared client. Pass context to each evaluation. Server `reset()` is also a no-op, preserving the shared anonymous id and leaving subscribers untouched. Browser clients (`shipdit/client`) and React are unchanged.

```ts theme={null}
// Before: later evaluations on this client used usr_8f2k19
shipd.identify({ userId: "usr_8f2k19", traits: { plan: "pro" } });
shipd.isEnabled("new-checkout");

// After: pass the user to each evaluation
shipd.identify({ userId: "usr_8f2k19", traits: { plan: "pro" } }); // event only
shipd.isEnabled("new-checkout", { userId: "usr_8f2k19", attributes: { plan: "pro" } });
```

**Timestamp comparisons now require valid dates and explicit timezones.** Ordered comparisons (`gt`, `gte`, `lt`, `lte`) follow one grammar shared with the Go SDK: `YYYY-MM-DD` (midnight UTC), or a date-time with a required `Z` or `±hh:mm` zone. Zone-less date-times, lenient formats such as `2026-01-02 10:00`, and impossible dates such as `2026-02-30` now compare as strings instead of through `Date.parse`, so results no longer depend on the server's timezone. See [How values compare](/flags/targeting#how-values-compare).

Dashboard preview uses this grammar as soon as the dashboard deploys; production changes only when you upgrade the SDK or Convex component. The edge serves snapshots and does not evaluate rules. Review date-based rules before upgrading; older SDKs can disagree with preview.

### Added

* `stream` option (default `false`) enables realtime updates with a WebSocket implementation. Node.js 20 callers supply the `WebSocket` option; Node.js 22+ provides one globally.
* `overrides.streamEndpoint` replaces the WebSocket gateway used when `stream` is `true`.
* `overrides.unsafeEndpoint` replaces the edge origin. It is unsafe and meant for shipd development and test environments only, because that URL receives your SDK key.
* `close()` returns a promise that resolves after pending events are delivered, delivery fails, or the timeout passes. It includes events recorded during an in-flight send. It never rejects. `close({ timeoutMs })` bounds the wait (default 5 seconds) and then aborts pending sends.

For an HTTP server, stop accepting requests and drain active handlers within a deadline before closing the SDK. The [migration guide](/migrations/shipdit-0-4#3-optionally-await-close) shows the full signal handler. Once the server has drained:

```ts theme={null}
await shipd.close();
```

### Changed

* Evaluation events from server clients carry the `userId` of the context passed to each evaluation.
* Event batches are capped at 100 events per request, the edge's limit, so a backlog after an outage is delivered instead of rejected.
* `overrides.unsafeEndpoint` and `overrides.streamEndpoint` must be absolute URLs without credentials, a query, or a fragment; `createClient` throws otherwise and warns when an SDK key would be sent in plaintext to a non-local host.

See [Upgrade to shipdit 0.4](/migrations/shipdit-0-4) and the [`createClient` reference](/reference/sdk#createclient).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.