Skip to main content

Overview

Release notes for shipdit, newest first. Upgrade steps for breaking releases are in Migration guides.
TypeScript SDKBreaking
Unreleased

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…
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.
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.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 shows the full signal handler. Once the server has drained:

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 and the createClient reference.