An unofficial Scrypted plugin that connects SimpliSafe indoor and doorbell cameras to your Scrypted server. The plugin handles OAuth authentication, discovers every camera on your account, and exposes live video, snapshots, and motion events to the rest of your smart home.
- Discovers SimpliSafe cameras and registers them as Scrypted camera devices automatically.
- Streams video from both camera generations: the legacy SimpliSafe cloud endpoint (H.264 + AAC over FLV) and the WebRTC/LiveKit transport used by newer cameras.
- Two-way audio (talk-back) on LiveKit cameras, exposed through the Scrypted
Intercominterface and usable from HomeKit. - Emits motion events in real time, and reports doorbell presses as a
BinarySensoron doorbell models. - Maintains OAuth refresh tokens on your behalf and recovers gracefully from rate limits and transient API errors.
- Optional verbose logging and device cleanup tools to help with troubleshooting.
SimpliSafe ships two different streaming stacks, and the plugin picks one per camera based on the capabilities the API advertises:
| Legacy cameras | Newer cameras (LiveKit) | |
|---|---|---|
| Transport | SimpliSafe cloud FLV endpoint | WebRTC via LiveKit |
| Scrypted interfaces | VideoCamera |
RTCSignalingChannel, Intercom |
| Two-way audio | No | Yes |
LiveKit cameras deliberately do not advertise VideoCamera — the FLV endpoint returns nothing
for them, so getVideoStream throws and only the WebRTC path works. Scrypted's WebRTC/rebroadcast
plugins layer a VideoCamera mixin on top of RTCSignalingChannel, which is what downstream
consumers such as HomeKit and Home Assistant actually use.
- A running Scrypted server (local or hosted) with permission to install custom plugins.
- A SimpliSafe account with at least one camera (SimpliCam or Video Doorbell Pro) and the ability to log in with two-factor authentication.
- Node.js 18+ if you plan to build or develop the plugin locally.
- Search for
@kylewhirland you'll see the scrypted-simplisafe plugin
- Install dependencies
npm install
- Build the plugin bundle
npm run build
- Deploy to your Scrypted server
- For one-off testing, run
npm run scrypted-deploy-debugornpm run scrypted-vscode-launchto push the bundle to the Scrypted instance defined in.vscode/settings.json. - For production, run
npm run scrypted-deployto upload the compiled bundle.
- For one-off testing, run
- Open the Scrypted Admin Console, enable the SimpliSafe Cameras plugin, and complete authentication (see below).
Once authenticated, the plugin will enumerate your cameras and create one Scrypted device per camera. Every device implements Camera, Settings, Online, and MotionSensor. The streaming interface depends on the camera generation (VideoCamera for legacy, RTCSignalingChannel + Intercom for LiveKit — see Camera generations), and doorbell models additionally implement BinarySensor.
SimpliSafe requires OAuth sign-in through their hosted login page. The flow mirrors the process documented by the homebridge-simplisafe3 project and follows these steps:
- In the Scrypted Admin Console, open Plugins → SimpliSafe Cameras → Settings.
- Copy the Login URL value and open it in a desktop browser (Chrome works best).
- Sign in with your SimpliSafe credentials and complete any email or two-factor prompts.
- After approval, SimpliSafe tries to redirect to a custom URI such as
com.simplisafe.mobile://.... Most browsers block the navigation:- In Chrome: press
Cmd+Option+J/Ctrl+Shift+Jto open DevTools, switch to the Console, and copy the full redirect URL from the error message. - Avoid Safari 15.1+—it hides the redirect URL entirely. Mobile browsers are also unsupported.
- In Chrome: press
- Paste the entire redirect URL (including
com.simplisafe.mobile://...) into the Authorization Redirect URL field in the plugin settings and click Save. - The plugin exchanges the authorization code for tokens, stores the refresh token, and refreshes camera data. Watch the Authentication Status field for confirmation.
- Refresh Token: Paste a known-good refresh token if you performed the flow elsewhere. Leave blank to rely on the redirect URL flow.
- Account Number: Required only when your SimpliSafe login holds multiple monitoring plans. Enter the numeric account ID you want the plugin to use.
- Debug Logging: Toggle verbose logs while diagnosing issues.
If authentication fails, reset the Authorization Redirect URL field and repeat the steps above. The login URL can be reused; a fresh redirect URL is required for every attempt.
- Camera live streams offer multiple resolutions based on the SimpliSafe quality settings. Scrypted clients will automatically pick the best match.
- Motion events arrive via SimpliSafe's realtime websocket and map to the
MotionSensorinterface. Doorbell presses arrive on the same websocket and map toBinarySensor, so automations can distinguish a press from motion without scripting. - Talk-back on LiveKit cameras publishes a microphone track back to the camera over the existing WebRTC session. SimpliSafe expires a LiveKit session roughly every 10 minutes; the plugin pre-warms a replacement and rolls over, deferring the swap while talk-back is active so audio is not cut off mid-sentence.
- The plugin caches camera metadata to survive short-term API outages. Toggle debug logging to review what the SimpliSafe API is returning.
- Set the environment variable
SIMPLISAFE_DEV_CLEAN=1when runningnpm run dev:logsto remove stale Scrypted device entries created during development.
If a legacy camera (such as an SS001 SimpliCam) streams in Scrypted but HomeKit closes live view immediately or displays a failed-camera icon, try these settings on that camera's HomeKit settings page:
- Set RTP Sender to FFmpeg.
- In Debug Mode, enable Transcode Video.
- Save the settings, close the Home camera view, and open it again. Check that the video continues moving, then close and reopen it to verify a fresh session.
These are settings in Scrypted's HomeKit plugin. Installing or updating this SimpliSafe plugin does not apply them automatically. Keep the change scoped to the affected camera; there is no need to remove the camera, reset authentication, or repeat HomeKit pairing.
This combination restored sustained HomeKit playback for a physical SS001 whose direct FLV stream decoded successfully. FFmpeg RTP delivery alone did not resolve that case. Transcoding adds CPU and memory use during viewing, so use it as a compatibility workaround and check the server's resources. To undo the workaround, clear Transcode Video and restore the previous RTP Sender value (normally Default).
See Scrypted's HomeKit troubleshooting guide
for transcoding and network checks. A successful HTTP response or an API status of online
does not establish that a camera is delivering decodable video. If the camera also fails
in the SimpliSafe app, restore its power/network connection before changing HomeKit settings.
npm run scrypted-vscode-launch– Build and deploy the plugin to the Scrypted host defined in.vscode/settings.json, then attach the VS Code debugger.npm run dev:logs– Continuously stream Scrypted logs for rapid troubleshooting (requiresSIMPLISAFE_DEV_CLEAN=1to enable automatic cleanup).npm run scrypted-debug– Launch a debug session against the configured Scrypted instance without deploying.
src/main.ts– Core plugin implementation: OAuth manager, API client, camera device classes, and realtime event handling.src/livekit.ts– WebRTC/LiveKit transport for newer cameras: signalling, track forwarding into Scrypted's peer connection, keyframe caching for snapshots, session rollover, and the talk-back publisher.src/types– Type stubs for third-party libraries used during snapshot extraction.
Pull requests that improve stability, add new device types, or enhance logging are welcome. Please open an issue describing your use case before submitting significant changes.

