ctrlapp 0.1.5
ctrlapp: ^0.1.5 copied to clipboard
Remote kill-switch, feature flags, forced update, forms and inbox for Flutter, plus diagnostics, device-integrity checks, push permission and hosted login.
CtrlApp Flutter — Changelog #
0.1.5 — 2026-10-24 #
- Forced and recommended updates now work. The dashboard's "Availability &
versions" settings (update required below, update recommended below, store
links, title and text) were sent to the app but never read. The package now
reads them:
CtrlApp.instance.updateholds the settings for this app version, andCtrlApp.instance.blockreturns aforce_updatedecision (or awarnfor a recommended update) when one applies, so the same screen that handles the kill switch handles updates. The last update decision is kept on the device, so a required update still shows when the app opens offline. A rule-based block or force-update from the dashboard still wins over these settings.
0.1.4 — 2026-10-21 #
-
In-app messages are shown by the package. Modals, banners and ads sent from the dashboard now appear automatically with ready-made designs that follow your app's
Theme. Customize withCtrlApp.init(messageUi: ...): colors, translated text, your own builders, orenabled: falseto draw nothing. Before, every app had to listen tomessagesand draw them itself. -
Countdown ads. Set "Must watch for (seconds)" on an ad in the dashboard: the close button and the back button are locked until the timer ends, then the ad is never shown again. If the person leaves early it is shown again next time. Every showing is counted as a view, and distinct devices as viewers.
-
New designs: full-screen interstitial ad with a countdown ring, bottom banner ad, and
CtrlAppInlineAd(a "Sponsored" card for lists). -
CtrlAppMessagenow carriescreative(button text, background color, countdown) andvariant.ackMessageacceptsviewedandcompleted. -
CtrlApp.instance.addTags([...])/removeTags([...])put tags on this device so campaigns and flags can target groups your app knows about. -
New dependency:
url_launcher(to open an ad's link). -
iOS: a reinstall keeps the same device. The device id is now kept in the Keychain (this device only), so deleting and reinstalling the app no longer creates a second device in the dashboard. Existing installs keep their id.
-
Device Integrity now works out of the box.
CtrlApp.initdetects root / jailbreak, emulator / simulator, debugger and developer-mode signals and registers them, so the dashboard's allow / warn / block rules apply. Before this, nothing sent these signals and the rules never triggered. Opt out withCtrlApp.init(..., reportIntegrity: false). -
CtrlApp.instance.integrityDecisionexposes the verdict (allow,warnorblock, and which signal caused it) so your app can show a warning. Ablockalso setsisBlocked. -
Android: much better emulator detection. It now catches emulators that copy a real phone's brand and model (by their x86 image), QEMU kernel flags and device files, VirtualBox / Genymotion / Nox / BlueStacks images. Chromebooks are not mistaken for emulators. Root detection also looks for Magisk and KernelSU leftovers, and test-keys builds count as rooted, not as emulators.
-
Android: developer mode is now read from the right setting (it never detected anything before), and a debugger or tracer (gdb, Frida) attached to the process is detected.
-
iOS: more jailbreak checks (rootless jailbreaks under
/var/jb, Filza, injected Substrate / libhooker / Frida libraries).
0.1.3 — 2026-10-17 #
- Replaced the example app with a small, readable one that shows the kill-switch, a feature flag, remote config and text, an experiment and event tracking. Run it with your own API key (see example/README.md).
- Removed the example's extra audio dependency.
0.1.2 — 2026-10-17 #
- Rewrote the README for people new to CtrlApp: what it does, three steps to start, and examples that match the real API.
- Removed badges and links that pointed at an unrelated GitHub repository.
0.1.1 — 2026-10-17 #
No functional changes. First release published through the automated
pipeline (production branch to pub.dev); it also confirms the package is
owned by the ctrlapp.dev publisher.
0.1.0 — 2026-10-17 #
First public release.
Features #
- Remote kill-switch — block the app, or any single feature, from the CtrlApp dashboard; enforced from the local cache when offline.
- Feature flags and remote config with typed accessors, plus forced update / minimum-version checks.
- Screen Capture Protection (opt-in, default off).
- Android —
FLAG_SECUREapplied on the main thread with latest-policy-wins ordering; ownership-aware so a host-setFLAG_SECUREis never cleared. - iOS — per-plugin instance mask controller (no global singleton).
Overlays installed while
UIScreen.isCapturedreports active capture/mirroring and before app-switcher snapshots (willResignActive). Multi-window / multi-scene aware.
- Android —
- Diagnostics and error capture (opt-in): breadcrumbs, redaction, bounded
queue, global
FlutterError/ platform handler chaining, debug overlay. - Device integrity signals (jailbreak, root, emulator/simulator, debugger, developer mode), device info and installation telemetry.
- Push permission bridge (
CtrlAppPush) for iOS and Android 13+. - Live block watch (
CtrlAppBlockWatch) to apply a kill-switch to an app that is already open. - Hosted social login and app session (
package:ctrlapp/auth.dart) with a pluggable secure session store. - Low-level
CtrlAppClientwith HTTP and mock transports. - Zero Firebase dependencies in your Dart code.
Behavior #
init()throwsStateErroron mismatchedapiKey/baseUrlre-initialization; same-identity re-init is idempotent.dispose()is idempotent and releases native enforcement before closing stream controllers.- Strict argument contract on the
ctrlappMethodChannel: int / string / null / non-boolean arguments are rejected with aBAD_ARGFlutterError. - Defaults to
https://ctrlapp.dev; passbaseUrlto use another host.
Truthful limitations #
- iOS: Apple provides no supported API to prevent still screenshots.
The plugin does not use SecureTextField hacks, DRM, canvas tricks, or
private APIs.
userDidTakeScreenshotNotificationis a post-event signal only.