# What changed in spectrum-ts

> 45 changes in spectrum-ts 12 from its official release notes, upgrade guides and advisories: 4 breaking, 2 security, 19 new APIs and options. Each one cited. Sources checked 2026-11-10. HTML: https://unstale.sh/npm/spectrum-ts/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## spectrum-ts 12

### Breaking changes

- Outbound iMessage and WhatsApp Business polls without titles are rejected before sending because those providers require a title. (12.11.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.11.0)
- Spectrum no longer registers SIGINT/SIGTERM handlers or calls process.exit() automatically, allowing host applications to finish graceful shutdown. Standalone scripts that relied on automatic handling should call await app.stop() in their own signal handler. (12.10.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.10.0)
- Webhook signature verification rejects empty secrets with a clear configuration error. (12.8.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.8.0)
- The function is now async, so callers need to await it; verification uses Web Crypto instead of Node-only crypto APIs. (12.8.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.8.0)

### Security

- An OIDC preflight check verifies npm trusted publishing for every publishable package before any version bump, tag, or GitHub release is created. (12.10.1) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.10.1)
- Unsupported native iMessage rows use a small marker instead of leaking raw Advanced iMessage data through custom content, while preserving useful message metadata. (12.7.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.7.0)

### New APIs and options

- iMessage exposes optional verified sender device identity metadata on inbound messages, `space.getMessage()`, and multipart message parts. (12.16.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.16.0)
- WhatsApp Business supports typing indicators through this API. (12.16.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.16.0)
- WhatsApp Business supports starting typing indicators anchored to the inbound message for streams and webhooks. (12.16.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.16.0)
- Supports provider-supplied diagnostic metadata, giving provider authors better visibility into stuck stream work without changing delivery behavior. (12.15.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.15.0)
- iMessage exposes subscription-scoped heartbeat observations for live messages, polls, and groups streams without changing existing message payloads. (12.14.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.14.0)
- Provider authors receive signal in lifecycle.createClient to use for startup I/O and cleaning up partial resources. (12.13.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.13.0)
- Spectrum() accepts a startup-only signal so apps can cancel slow initialization, including project lookup, cloud token requests, and Telegram webhook registration. (12.13.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.13.0)
- Spectrum throws SpectrumStartupCleanupError when cleanup fails, with the original startup failure as the cause. (12.13.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.13.0)
- Adds built-in chat background presets via preset names such as skyDusk; names are type-checked and invalid names fail at runtime before anything is sent. (12.12.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.12.0)
- iMessage delivers native poll creation and option-add events as poll messages, including pollMessageGuid, change, and per-option optionIdentifier values for reliable tracking. (12.11.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.11.0)
- A manual release option allows intentional token-based recovery publishes to skip the OIDC preflight check. (12.10.1) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.10.1)
- asApp() can accept a known layout directly, avoiding a refetch of link metadata when a provider already has the card text. (12.9.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.9.0)
- iMessage native metadata now includes mini app details such as app name, bundle/team IDs, session ID, live state, URL, and decoded card layout. (12.9.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.9.0)
- A portable entrypoint for verifying and parsing native Spectrum webhook deliveries is available across runtimes including Cloudflare Workers, Deno Deploy, Convex, Node, and Bun. (12.8.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.8.0)
- New metadata types are exported so TypeScript users can safely consume the fields after narrowing with imessage.is(). (12.7.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.7.0)
- Inbound messages, space.getMessage(), and native outbound send results expose curated native metadata, including delivery state, formatting, mentions, attachments, reactions, stickers, and system fields. (12.7.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.7.0)
- Provider authors can merge streams whose source list can change while the app is running. (12.6.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.6.0)
- iMessage delivers inbound read receipts as read messages, with the reader in message.sender and the original outbound message in message.content.target. (12.5.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.5.0)
- Exports readSchema from @spectrum-ts/core/authoring for callers that build or validate read content directly. (12.5.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.5.0)

### Behavior and default changes

- For app-created spaces, pass the message to `typing("start", message)` as the typing indicator anchor. (12.16.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.16.0)
- Remote iMessage streams log diagnostics when event mapping or downstream delivery stays pending for 30 seconds, separating mapping from emit and excluding sensitive content. (12.15.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.15.0)
- iMessage inbound mini app cards now come through as Spectrum app content, so they can be handled like other app-style messages instead of falling back to unsupported content. (12.9.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.9.0)
- Read receipt targets are fully built Message objects, exposing the original content and outbound affordances such as edit() and unsend(). (12.5.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.5.0)

### Fixes and other changes

- A cached sender device identity is retained when a later server fetch omits it, preventing metadata refreshes from erasing verified identity data. (12.16.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.16.0)
- Typing indicators quietly skip partial targets or messages Meta cannot use as typing anchors instead of throwing. (12.16.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.16.0)
- Refreshes delivery/read state from the server even when a sent message is cached, while preserving cached content like mini app card sessions. (12.15.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.15.0)
- Return undefined when the refreshed parent does not contain a child, avoiding stale cached fallbacks. (12.15.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.15.0)
- Cleanup for iMessage, WhatsApp Business, Slack, and Fusor cancels active token refreshes, awaits retired lines, and surfaces cleanup errors clearly. (12.13.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.13.0)
- When startup fails after providers create clients, Spectrum rolls those clients back before rejecting instead of leaving partial resources running. (12.13.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.13.0)
- Vote events are correlated with native option identifiers instead of option titles, avoiding missed or mismatched vote events for native polls. (12.11.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.11.0)
- Webhook deserialization preserves incoming poll and poll_option content, giving webhook users the same poll shape as stream users. (12.11.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.11.0)
- The --provenance and --dry-run options are now passed through to npm publish correctly. (12.10.1) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.10.1)
- Release failures now show real OIDC diagnostics instead of vague E404 errors. (12.10.1) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.10.1)
- Streamed iMessage sends return the final nativeText after edits instead of retaining stale first-send metadata. (12.7.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.7.0)
- iMessage and WhatsApp Business cloud clients pick up newly provisioned or removed lines on token renewal. (12.6.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.6.0)
- An empty cloud token payload represents no lines provisioned, rather than leaving stale lines active. (12.6.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.6.0)
- Closing message streams cleans up line observers so old streams are not called during later line updates. (12.6.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.6.0)
- If the Cloud profile check fails, contact sharing stays disabled and retries later without interrupting inbound message streaming. (12.4.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.4.0)
- Contact sharing now re-checks the project profile sync setting, so turning profile sync on or off in Cloud no longer requires a client restart. (12.4.0) — [release notes](https://github.com/photon-hq/spectrum-ts/releases/tag/v12.4.0)
