A React Native app for real-time screen broadcasting and recording, similar to Zoom's screen sharing functionality.
- 📱 System-wide Screen Capture - Capture any app on your device (like Zoom)
- 🎬 Real-time Streaming - Stream video chunks to your backend in real-time
- 🎙️ Microphone Audio - Record microphone audio along with screen
- ⏱️ Recording Timer - Track recording duration
- 🌓 Dark/Light Theme - System theme support with manual toggle
- 📊 Status Indicators - Clear visual feedback for recording status
- React Native 0.82.1 (New Architecture)
- TypeScript (Strict mode)
- React Navigation 7.x
- ReplayKit (iOS Broadcast Extension)
- MediaProjection (Android)
MPLiveScreen/
├── android/ # Android native code
│ └── app/src/main/java/com/mplivescreen/
│ └── screencapture/ # Screen capture native module
├── ios/ # iOS native code
│ ├── MPLiveScreen/ # Main app
│ └── BroadcastExtension/ # ReplayKit broadcast extension
├── src/
│ ├── api/ # Network layer (Axios)
│ ├── assets/ # Images, fonts
│ ├── components/ # Reusable UI components
│ │ ├── Button/
│ │ ├── Text/
│ │ ├── Timer/
│ │ ├── StatusIndicator/
│ │ ├── Container/
│ │ └── BroadcastPicker/
│ ├── config/ # App configuration
│ ├── context/ # React Context (Theme)
│ ├── hooks/ # Custom hooks
│ ├── native/ # Native module bridges
│ ├── navigation/ # React Navigation setup
│ ├── screens/ # App screens
│ │ ├── Home/
│ │ ├── Settings/
│ │ └── Splash/
│ ├── theme/ # Theme system
│ ├── types/ # TypeScript types
│ └── utils/ # Utility functions
└── package.json
- Node.js >= 20
- Xcode 15+ (for iOS)
- Android Studio with SDK 33+ (for Android)
- CocoaPods
- Apple Developer Account (for iOS broadcast extension testing)
cd MPLiveScreen
npm installcd ios
pod install
cd ..- Open
ios/MPLiveScreen.xcworkspacein Xcode - Add a new target: File → New → Target → Broadcast Upload Extension
- Name it
BroadcastExtension - Set Bundle Identifier to
com.marketplace.live.screen.broadcast - Add App Group capability to both main app and extension:
- Group ID:
group.com.marketplace.live.screen
- Group ID:
- Copy the Swift files from
ios/BroadcastExtension/to your new target
No additional setup required. The native module is included in the project.
Copy the appropriate .env file:
# For development
cp .env.dev .env
# For staging
cp .env.staging .env
# For production
cp .env.prod .env# Development
npm run ios:dev
# Staging
npm run ios:staging
# Production
npm run ios:prod# Development
npm run android:dev
# Staging
npm run android:staging
# Production
npm run android:prodSee API_DOCUMENTATION.md for backend API specifications.
| Variable | Description | Example |
|---|---|---|
API_BASE_URL |
Backend API base URL | https://vdi-dev.invsta.systems |
API_KEY |
X-API-Key for authentication | your-api-key |
APP_ENV |
Environment name | dev / staging / prod |
| Command | Description |
|---|---|
npm run ios |
Run iOS app |
npm run android |
Run Android app |
npm run start |
Start Metro bundler |
npm run lint |
Run ESLint |
npm run lint:fix |
Fix ESLint errors |
npm run format |
Format code with Prettier |
npm run type-check |
Run TypeScript type check |
npm run clean |
Clean and reinstall dependencies |
npm run pods |
Install iOS CocoaPods |
- System Audio: iOS restricts capturing audio from other apps due to privacy. The app captures microphone audio but not audio from other apps (like Gemini's voice responses).
- Broadcast Extension Memory: The extension has a 50MB memory limit. Video encoding must be efficient.
- Android 10+: System audio capture requires Android 10 or higher.
- Foreground Service: A persistent notification is shown during recording (required by Android).
┌─────────────────────────────────────────────────────────────┐
│ User Taps Start │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┴───────────────┐
│ │
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────────┐
│ iOS │ │ Android │
│ RPSystemBroadcastPicker│ │ MediaProjection API │
│ → Broadcast Extension │ │ → Foreground Service │
└─────────────────────────┘ └─────────────────────────────┘
│ │
└───────────────┬───────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Capture Screen Frames │
│ (1080p @ 60fps target) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Every 5 Seconds: Encode & Upload │
│ POST /api/v1/recordings/{id}/chunk │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Backend Server │
│ Receives chunks → Assembles MP4 │
└─────────────────────────────────────────────────────────────┘
- Follow the existing code style (ESLint + Prettier)
- Use TypeScript strict mode
- Write meaningful commit messages
- Test on both iOS and Android before submitting PR
Proprietary - Invisible Technologies
Made with ❤️ by Invisible Technologies