The Debuta mobile app is built with Expo (SDK 55) and React Native 0.83. It uses Expo Router for file-based navigation, Socket.io for real-time messaging, andDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/desarrolladorandres2026-gif/Native-tailwind/llms.txt
Use this file to discover all available pages before exploring further.
react-native-webrtc for peer-to-peer video and audio calls. This guide walks you through everything you need to get the app running locally — from installing Node dependencies to choosing the right run target for your workflow.
Prerequisites
Before you begin, make sure the following tools are installed on your machine:Node.js 18+
Required for running the Metro bundler and build scripts. Check with
node -v.Expo CLI
Install globally:
npm install -g expo-cli or use npx expo directly.Android Studio / Xcode
Needed only if you want to run the app on an emulator or simulator. Expo Go works without either.
Expo Go (optional)
Install Expo Go on a physical device for quick iteration without a native build. Video calls are not available in Expo Go.
Installation
Install dependencies
package.json, including Expo SDK 55, React 19, Socket.io client 4, react-native-webrtc, and styled-components.Environment Variables
All environment variables exposed to the app must be prefixed withEXPO_PUBLIC_ so that Expo’s bundler injects them at build time.
.env
How EXPO_PUBLIC_API_URL works
The api.ts service and SocketContext both use the same resolution logic:
components/services/api.ts
npx expo start without setting EXPO_PUBLIC_API_URL, the app automatically reads Metro’s hostUri and constructs the correct LAN IP for you. This means physical devices on the same Wi-Fi network will connect to your backend with no manual IP configuration.
If you are using the Android emulator, your backend must be reachable on
http://10.0.2.2:3000. Set EXPO_PUBLIC_API_URL=http://10.0.2.2:3000 in your .env or start your backend on that interface.Running the App
Available npm scripts
| Script | Command | Description |
|---|---|---|
start | expo start | Start Metro bundler (prompts for platform) |
android | expo run:android | Build and run on connected Android device or emulator |
ios | expo run:ios | Build and run on connected iOS device or simulator |
web | expo start --web | Start the web target (native-only modules stubbed) |
lint | expo lint | Run ESLint via eslint-config-expo |
test | jest | Run the test suite |
test:watch | jest --watch | Run tests in watch mode (re-runs on file change) |
test:coverage | jest --coverage | Run tests with coverage report |
Why Video Calls Require a Development Build
Debuta usesreact-native-webrtc for peer-to-peer audio and video calls. This library ships a native module — compiled C++ code that must be linked into the iOS or Android binary. Expo Go does not include this module, so WebRTC is stubbed out when running in Expo Go and will show an alert if a call is attempted.
To create a development build you only need to run the native build command once. After that, Metro hot-reloads still work as normal.
app.json declares all required permissions for both platforms:
- Android:
RECORD_AUDIO,CAMERA,MODIFY_AUDIO_SETTINGS,BLUETOOTH,INTERNET,ACCESS_NETWORK_STATE,CHANGE_NETWORK_STATE,ACCESS_WIFI_STATE,FOREGROUND_SERVICE - iOS:
NSCameraUsageDescription,NSMicrophoneUsageDescription(viainfoPlist)
Running Tests
jest-environment-node. The test environment is configured via babel.config.js, which applies babel-preset-expo along with TypeScript and class-property transforms.
Babel and Metro Configuration
babel.config.js uses babel-preset-expo as the base preset and adds three additional Babel plugins:
babel.config.js
metro.config.js extends the default Expo Metro config with a custom resolver that replaces react-native-webrtc and react-native-incall-manager with an empty module stub when bundling for the web platform, preventing build errors from native-only imports.