Remote control
for deployed apps.
Switch any client app into read-only, limited, or locked mode in real time — without touching the codebase. One signal. Zero data risk. Full recovery.
import DeadFuse from "@surelle-ha/dead-fuse"; DeadFuse.activate({ projectId: "acme-dashboard", token: "prod-token-here", onReadonly: () => showBanner(), onLocked: (msg) => lockScreen(msg), });
Works with any frontend framework
One dashboard.
Instant control.
A lightweight pub/sub architecture connects your dashboard to every deployed client app in real time — no redeployment needed.
Create a project
Add your client app to the dashboard. Get a project key and generate instance tokens for each deployment.
Embed the SDK
npm install once. Call DeadFuse.activate() with your credentials and define your state callbacks.
Deploy & connect
The SDK opens a realtime channel. Your client app receives the current state instantly on startup.
Flip the switch
Change state from the dashboard. All connected clients respond within milliseconds. No redeployment.
Dashboard
Admin UI · REST API
Client App
dead-fuse SDK · Any framework
Eight states.
Total coverage.
From a friendly warning banner to a full lockdown — every scenario a freelancer faces is built in.
ACTIVEFull access. App runs normally.
onActive()WARNINGSends a warning message to all clients.
onWarning(msg)READONLYBlocks writesBlocks all write operations automatically.
onReadonly()LIMITEDCustom partial restriction via handler.
onLimited()LOCKEDBlocks writesFull block. Writes intercepted + custom UI.
onLocked(msg)EXPIREDBlocks writesContract ended. Triggers expiry handler.
onExpired()SLEEPBlocks writesApp temporarily paused.
onSleep()SELF_DESTRUCTBlocks writesFully custom — you define what happens.
onSelfDestruct()Built on trust,
not pressure.
DeadFuse is designed for professional, ethical client relationships. It never destroys data. It always allows recovery.
Install once.
Control forever.
One package, two lines of config, infinite control.
$ npm install @surelle-ha/dead-fuse # or $ pnpm add @surelle-ha/dead-fuse
import { useEffect } from "react"; import DeadFuse from "@surelle-ha/dead-fuse"; export function App() { useEffect(() => { DeadFuse.activate({ projectId: globalThis._importMeta_.env.VITE_FUSE_PROJECT_ID, token: globalThis._importMeta_.env.VITE_FUSE_TOKEN, onLocked: (msg) => showLockScreen(msg), }); return () => DeadFuse.deactivate(); }, []); }
Simple, honest pricing.
No seats. No per-client fees. Just projects.
Free
For solo freelancers getting started.
- ✓ 2 projects
- ✓ All 8 states
- ✓ Realtime sync
- ✓ GitHub login
- × Priority support
- × Custom domain
Pro
For active freelancers with multiple clients.
- ✓ 25 projects
- ✓ All 8 states
- ✓ Realtime sync
- ✓ GitHub login
- ✓ Priority support
- ✓ Custom domain
Agency
For studios managing clients at scale.
- ✓ Unlimited projects
- ✓ All 8 states
- ✓ Realtime sync
- ✓ GitHub login
- ✓ Priority support
- ✓ Up to 5 team members
Take control of your
client relationships.
Deploy in minutes. Free plan includes 2 projects.