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

# March 17, 2026 — v1.3.0 (BoundCamera + lag fixes)

Major client-SDK ergonomics refactor and three independent fixes for UI lag that accumulated under long-running sessions.

### New

* **`cam(id)` bound accessor** — `manager.camera(id)` returns a `BoundCamera` with every API method pre-bound to the camera ID. Callers no longer repeat `cameraId` on every invocation:
  ```typescript theme={null}
  const cam = manager.camera(id);
  await cam.setProperty("iso", { value: "0x320" });
  await cam.afShutter();
  ```
* **`CameraManager`** now drives discovery polling with auto-reconnect, `autoConnect`, and event-driven updates. Replaces the older ad-hoc `CameraClient` + manual polling pattern.

### Fixed

* **Poll stacking under idle** — `setInterval` had no in-flight guard, so polls queued after the browser woke and saturated the 6-connection pool. Added `isPolling` flag in `CameraManagerCore.poll()`.
* **Property-refresh connection exhaustion** — `refreshProperties` fired 12 parallel `getProperty` GETs; after \~2 minutes all connections were held. Replaced with a single `getAllProperties` call plus a mutex (`isRefreshingRef`) against concurrent bursts.
* **Ghost SSE callbacks after reconnect** — `EventStream.off()` removed handlers from an internal map but not from the native `EventSource`. Added `nativeListenerMap` so `off()` reaches both layers.
* **ISO duplicate entries in `getAllProperties`** — SDK returns two ISO rows (one read-only, no values; one writable). Server-side dedup now prefers the entry with values/writable.
