Skip to content
RRingDesk

Flutter SDK · Published on pub.dev

Add expert support without rebuilding your app.

Initialize RingDesk once, attach identity after login, and give customers a direct line to approved mobile agents. The default integration stays out of the way until a support call begins.

  • Minimal draggable controls
  • Android and iOS
  • No client secret
your_app.dart SDK ready
// Keep your existing MaterialApp
builder: (context, child) => RingDeskOverlay(
  controller: support,
  showLauncher: true,
  child: child!,
)
R Support readyDrag anywhere · tap to call
Host UI remains unchanged Identity attaches after sign-in

Quickstart

One controller. One overlay. Your UI stays yours.

Initialize before login, attach customer identity when it becomes available, and let RingDesk render only the launcher and active-call controls.

  1. 01

    Add the published package

    Install the latest compatible RingDesk SDK directly from pub.dev. The current release is 1.0.0.

  2. 02

    Copy two public identifiers

    Get the Developer ID and App code from the developer portal.

  3. 03

    Attach the overlay

    Pass identifiers with --dart-define. Never ship an admin token, private key, or service credential.

flutter pub add ringdesk_flutter_sdk
lib/main.dart Minimal overlay
import 'package:flutter/material.dart';
import 'package:ringdesk_flutter_sdk/ringdesk_flutter_sdk.dart';

late final RingDeskController support;

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  RingDesk.initialize(
    developerId: const String.fromEnvironment('RINGDESK_DEVELOPER_ID'),
    appCode: const String.fromEnvironment('RINGDESK_APP_CODE'),
  );
  support = RingDeskController.initialized();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) => MaterialApp(
    builder: (context, child) => RingDeskOverlay(
      controller: support,
      showLauncher: true,
      child: child!,
    ),
    home: const HomeScreen(),
  );
}

Future<void> onSignedIn(String name, String userId) =>
    support.setCustomer(RingDeskCustomer(name: name, customerId: userId));

Future<void> onSignedOut() => support.signOut();
flutter run --dart-define=RINGDESK_DEVELOPER_ID=YOUR_ID --dart-define=RINGDESK_APP_CODE=YOUR_CODE

Call permissions are automatic by default. Use RingDeskPermissionPolicy.deferred and requestNecessaryPermissions when your app explains permissions first. Screen capture always remains user-triggered.

AI-assisted setup

Ask your AI to integrate it for you.

Copy one carefully constrained prompt into VS Code Copilot, Claude Code, Cursor, Codex, or another coding assistant. It tells even a free or low-cost model what to inspect, what to preserve, and how to prove the integration works.

VS Code CopilotClaude CodeCursorCodex
  • Preserves your current UI and state management
  • Handles login, logout, and delayed identity safely
  • Protects native permission and screen-share consent
  • Requires analysis, tests, and build results
Ready to paste RingDesk integration prompt
01

Inspect first Finds bootstrap, authentication, routing, state management, and native configuration before editing.

02

Integrate narrowly Adds one controller and the minimal overlay without building another customer app.

03

Verify the result Runs formatting, analysis, tests, and supported platform builds before reporting success.

Preview the complete prompt
Integrate the RingDesk Flutter SDK into this existing Flutter application. Make the code changes and validate them; do not only describe the steps.

Before editing:
1. Inspect pubspec.yaml, the application bootstrap, routing, authentication/session lifecycle, current state-management pattern, Android configuration, iOS configuration, and relevant tests.
2. Identify where the signed-in user's stable opaque ID and display name are available. Never use an email address, phone number, or mutable display name as customerId.
3. Check whether ringdesk_flutter_sdk is already declared. If it is missing, run flutter pub add ringdesk_flutter_sdk to install it from pub.dev. Do not add a Git, branch, or local path override. If it is already declared, preserve its compatible version constraint unless dependency resolution proves a change is necessary.

Implementation requirements:
1. Preserve the existing UI, navigation, architecture, and state-management library. Do not create a replacement customer portal, calling screen, or new state-management layer.
2. Initialize RingDesk exactly once after WidgetsFlutterBinding.ensureInitialized using:
   - const String.fromEnvironment('RINGDESK_DEVELOPER_ID')
   - const String.fromEnvironment('RINGDESK_APP_CODE')
   These are public identifiers. Never add an admin token, API secret, service-role key, or private credential to client code.
3. Create one application-lifetime RingDeskController with RingDeskController.initialized(). Put it in the existing root/service/provider lifecycle and dispose it only when that owner is destroyed.
4. Wrap the existing MaterialApp builder child with RingDeskOverlay. Keep the default draggable minimal controls. Use showLauncher: true only if the app has no existing Support button. If it has one, retain that button, create a RingDeskOverlayController, call startCall() from the button, and keep showLauncher: false.
5. Do not require customer data during application startup. After the host login succeeds, call controller.setCustomer with RingDeskCustomer(name: user display name, customerId: stable opaque auth user ID). Await controller.signOut() before completing logout or switching users.
6. Keep the default automatic call-permission policy unless the app already has a permission explanation screen. For a deferred flow, use RingDeskPermissionPolicy.deferred and call requestNecessaryPermissions after that explanation.
7. Never request or start screen capture at startup. App-only and entire-screen sharing must remain user-triggered and must use Android MediaProjection or iOS ReplayKit consent.
8. Android SDK permissions and foreground-service declarations should merge from the plugin. Do not add READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, MANAGE_EXTERNAL_STORAGE, SYSTEM_ALERT_WINDOW, or custom background-start workarounds.
9. On iOS, add a clear NSMicrophoneUsageDescription and the audio and voip UIBackgroundModes. Add a ReplayKit Broadcast Upload Extension, shared App Group, and RTCScreenSharingExtension only if whole-device sharing is required; do not invent identifiers.
10. If file sharing is requested, expose only explicit application-owned absolute directories through RingDeskFileAccessRoot. Do not grant broad device storage access.
11. Keep Developer ID and App code supplied with --dart-define or the project's existing public build configuration. Do not hardcode environment-specific values.

Validation and acceptance criteria:
1. Run dart format on changed Dart files, flutter pub get, flutter analyze, and the relevant Flutter tests. Build Android and iOS without signing when the local toolchain supports them.
2. Add or update tests proving the original home/navigation UI remains present, customer identity attaches after login, logout clears RingDesk identity, and only one RingDesk launcher/control overlay exists.
3. Confirm there are no embedded secrets, no broad storage/overlay permissions, no automatic screen capture, and no unrelated UI or architecture rewrite.
4. Do not claim success when a command fails. Report changed files, commands and results, remaining native/manual steps, and any value I still need to provide.

Paste into your coding assistant, then answer only what it cannot discover itself.

Native foundations

Consent stays visible. Credentials stay scoped.

RingDesk owns the complex platform plumbing while the operating system remains in control of microphone and screen-capture consent.

Authentication model

Two public identifiers. No client secret.

The Developer ID identifies the workspace and the App code identifies its application. RingDesk exchanges them for an installation-scoped capability stored in Keychain or Keystore.

  • Identity can attach after login
  • Agent access requires approval
  • Sign-out revokes local access
Android

Permissions merge automatically

Foreground-service declarations come from the package. Android 14+ offers app-only or full-display capture in its protected system chooser.

App sharing

ReplayKit, inside your app

Add NSMicrophoneUsageDescription plus audio and voip background modes. App-only sharing needs no extension.

Entire screen

One explicit extension

Add a ReplayKit Broadcast Upload Extension, shared App Group, and RTCScreenSharingExtension. The package example provides the host setup.

Coming next

Outbound webhooks are on the roadmap.

Signed, retried lifecycle and artifact events are planned. RingDesk does not emit outbound webhooks today.

Follow the documentation

Platform status

Know exactly what ships today.

Start with the minimal overlay, then adopt headless controllers and composable controls only where your product needs them.

Available now

Flutter SDK on pub.dev

  • Developer portal and application management
  • Agent approval and roster management
  • Published Flutter package for Android and iOS
  • Minimal draggable or fixed overlay
  • App-only and whole-device screen sharing
  • WebRTC audio with TURN fallback
  • Transfer on no answer with a configurable ring timeout
  • Call history and analytics dashboard
02
Integration depth

Custom when needed

  • Headless RingDeskController
  • Composable call controls and history
  • Host, Teams, Webex, and custom themes
  • CallKit and Android Telecom adapters
03
Your release gate

Test on real devices

  • Attach host identity after login when available
  • Complete App Store and Play privacy forms
  • Test microphone, audio routes, and both share modes
  • Never bypass the operating-system capture prompt

Ship your first in-app support flow.

Install the SDK, add one application, approve one agent, and place a real test call from your own app before production rollout.