nativemind_call

Native media layer of NativeMind calls, built on Andrey Bekhtold's handmade WebRTC code (without AI, 2025-04): video goes into Flutter textures (Android SurfaceProducer + EglRenderer, iOS FlutterTexture), so call tiles compose under overlays and scroll without PlatformViews; hardware codecs on a shared EGL context; his WebRTC configuration and call audio session on both platforms. Part of the NativeMind framework; plugs into the call screens of nativemind_deals through NmCallPort.

0.1.0 status. Android is tested on a device (loopback: camera → WebRTC → texture, hardware VP8). The iOS (Swift) part has not been compiled yet (no macOS in CI); build it with pod install + flutter build ios before relying on it. The app supplies the signalling (SDP / ICE); LiveKit rooms are served by nativemind_deals/livekit.dart instead.

Install

dependencies:
  nativemind_call: ^0.1.0
import 'package:nativemind_call/nativemind_call.dart';

final call = NmNativeCall.instance;
await call.requestPermissions();
final me = await call.createClient(iceServers: [NmCallIceServer(urls: ['turn:turn.example.org:3478'], username: u, credential: p)]);
me.onOffer.listen(signalling.sendOffer);            // your signalling
me.onIceCandidate.listen(signalling.sendCandidate);  // null = end of candidates
await me.createOffer();
// remote answer / candidates: me.handleRemoteSdp(sdp); me.addIceCandidate(c); me.setReadyToSendIceCandidates(true);

// The call screens of nativemind_deals draw tiles through NmCallPort.videoTile:
final port = NmNativeCallPort(client: me, activeCall: info, onAccept: accept, onHangUp: hangUp);

NmLoopbackCall is Andrey's demo: two peer connections in one process (A sends the camera, B receives); see example/.

Platforms: Android (minSdk 24, webrtc-sdk 125.6422.07 — an app that also has flutter_webrtc gets that plugin's newer build of the same artifact), iOS 13+ (WebRTC-SDK pod ≥ 125.6422.07; add NSCameraUsageDescription and NSMicrophoneUsageDescription). There is no earlier package to migrate from; DealApp calls still run on LiveKit (NmLiveKitCallPort) until a P2P signalling backend exists.

Handmade authors

Author Role In this package
Andrey Bekhtold DealApp (Dilap) team lead; network, VPN, video calls, native Kotlin / Swift / KMP; without AI (confirmed by the CTO) Android PeerConnectionClient (+ adapters), iOS WebRTCManager, WebRTCStatus, WebRTCClientType, Debug.swift (byte-identical); his WebRTC configuration and loopback demo, ported

Share of his code: 458 of 1 395 plugin lines (33 %; native Kotlin / Swift 36 %), the rest is the plugin glue by Claude Code (Pigeon host, texture renderers, Dart API) — PROVENANCE.md.

License

NativeMindNONC (see LICENSE), as the whole NativeMind framework. WebRTC (webrtc-sdk) is a runtime dependency under its own BSD-3-Clause license (see NOTICE).

Libraries

nativemind_call
Native media layer of NativeMind calls on Andrey Bekhtold's handmade WebRTC code: NmNativeCall creates NmNativeCallClients (Android PeerConnectionClient / iOS WebRTCManager), NmCallVideoView shows their Flutter textures, NmNativeCallPort is the NmCallPort of nativemind_deals over them, NmLoopbackCall is Andrey's two-peer loopback demo.