Skip to Content

SDK notes

Behaviour of the SmartSpectra SDK that shaped Glint, including two issues.

Measured against @smartspectra/node-sdk 3.5.0 in November 2026. The raw notes are in docs/sdk-notes.md in the repository.

Camera exposure lock

Once running, the renderer SDK sets the camera's exposure, white balance and focus to manual so that the picture stays steady. It never sets them back. On Linux that setting is held by the camera driver and outlives the app, so the next session, in any app, can start almost black.

Glint works around it by owning the MediaStream: it sets the camera to automatic, waits 1.5 seconds for the exposure to settle, hands the stream to the SDK, and sets it back to automatic before releasing it.

If the SDK opens the cameraSession startscamera as foundautoSDK runninglocks exposure, whitebalance and focusmanualApp exitsnothing restoresthe camerastill manualNext sessionany app: startsalmost blackstill manualWhen Glint owns the streamGlint opens itsets continuous,waits 1.5 sautoSDK gets streamuseMediaStream,then locks as beforemanualSession endssets continuous,then releasesautoNext sessionstarts fromautomaticauto
The band under each step is the camera's exposure mode. On Linux the driver holds that setting after the app exits, so the fix is to hand the camera back in automatic mode.

Reported upstream as SmartSpectra#19.

Temporary model errors

On first use, a session failed when Presage's server answered 503 Model not available for phasic-bp-inference and expressions-inference. A retry a few minutes later worked. Glint requests only PULSE_RATE rather than the whole cardio bundle, which removes the blood-pressure model from that failure path.

The same error is tracked in SmartSpectra#18, where we added our data.

Things the documentation does not make obvious

TopicDetail
Expression scoresA list of {type, confidence}, with confidence from 0 to 100, not 0 to 1.
Breathing trace stabilityThe trace has no confidence of its own. stable comes from the breathing-rate confidence. Samples arrive long before they are stable.
Sandboxed preloadA sandboxed preload cannot require the SDK's preload, so Glint bundles it in with esbuild.
API keyThe renderer SDK sends the key itself, so it is in renderer memory during a session.

On this page