Operate your live app without waiting for another release.
One console to kill a broken feature, force a minimum version, target an in-app message, and swap remote UI — across Web, Flutter, iOS and Android. The SDK keeps enforcing its last known state offline and picks up new decisions on the next successful sync.
checkout_v2 off. Each device applies the change on its next successful sync.The 60-second control room
Video summary / transcript summary
An operator opens the CtrlApp dashboard, kills a broken checkout control, forces a minimum app version, targets an in-app message to a segment, and reviews the audit trail — all from one console, without shipping a new build.
The change reaches each device on its next successful sync. Devices already offline keep enforcing their last cached state and pick up the new decision as soon as they reconnect.
Everything you need to operate a live app
From incident response to engagement, CtrlApp gives your team the same day-two control surface a mature ops team would build in-house.
Respond
Kill a broken control, block a session, or force a minimum version. Supported state changes are recorded; rollback is available where the history model supports it.
- Per-control kill
- App-wide session block
- Force update
- Audit trail
Engage
Push notifications, in-app messages, and an inbox. Segment by version, locale, geo, or custom traits.
- Push
- In-app messages
- Inbox
- Segments & schedules
Configure
Remote UI controls, config values, forms, and localization — updated from the dashboard, not the app store.
- UI controls
- Remote config
- Forms
- Localization
Observe
Analytics, health signals, and webhooks so you know what happened and why — before your users tell you.
- Events
- Health
- Webhooks
- Operator tools
Detect. Decide. Act. Verify. Recover.
A clear runbook for the moments that matter. No fake countdowns — real delivery is bounded by network and app foreground state.
- 01Detect
Analytics, health signals, or a webhook surfaces a broken feature.
- 02Decide
Pick the right lever: kill the control, block the session, or force an update.
- 03Act
Operator toggles the change with a required audit note. Reason and diff are logged.
- 04Verify
Devices apply the new decision on next sync. Offline devices keep enforcing the cached state and update on reconnect.
- 05Recover
Roll back from the audit history. Previous state and reason are one click away.
Reach the right users on the right device
Compose a campaign, target it by segment, locale, app version or geo, schedule it, and measure it — from the same dashboard your incident tools live in.
Drop in the SDK. Read one flag.
Sources live in this repo today — vendor via a local path or module. Public registry releases (npm, pub.dev, Maven, SPM, NuGet) are on the roadmap.
import { Ctrl } from "@ctrlapp/sdk";
const ctrl = Ctrl.init({
apiKey: "ck_sdk_...",
deviceId: getOrCreateDeviceId(),
});
await ctrl.register();
await ctrl.load();
ctrl.startPolling();
if (ctrl.flag("checkout_v2").isOn) {
showNewCheckout();
} else {
showClassicCheckout();
}
ctrl.track("checkout_v2", "impression");Honest capture protection, per platform
Only OS-level primitives can actually block screenshots. Web is best-effort masking — we say so, in the product and in the docs.
| Platform | What CtrlApp does | Coverage |
|---|---|---|
| Android | FLAG_SECURE blocks OS screenshots and recent-apps thumbnails. | Native only |
| iOS | Capture masking + background snapshot overlay while the app is inactive. | Native only |
| Web | Best-effort CSS mask. Browsers cannot block OS screenshots. | Web · best-effort |
Real plans, real limits
The four active plans in the platform today. Private beta — the catalog may evolve before GA, but these are the numbers the product uses right now.
- 1,000 devices
- 5,000 pushes / mo
- 10,000 devices
- 50,000 pushes / mo
- 10,000 devices
- 500,000 pushes / mo
- 100,000 devices
- 5,000,000 pushes / mo
Answers, not marketing
Operate your app like an incident room, not a release train.
CtrlApp is in private beta. Create an account and connect an SDK today.