YALLA LIVE - MOBILE VOICE MVP DEPLOYMENT 1) Upload the full project and point the domain document root to /public. 2) Copy .env.example to .env and fill MySQL + APP_URL + APP_KEY. 3) Run: php artisan key:generate --force php artisan migrate --seed --force php artisan storage:link 4) Make storage/, bootstrap/cache/ and storage/logs writable by PHP. 5) The current voice engine is WebRTC P2P with Laravel HTTP signaling/event polling. This is intentionally compatible with shared hosting. 6) Public STUN servers are enabled by default. For difficult mobile/NAT networks, configure a TURN server: WEBRTC_TURN_URL=turn:your-turn-server:3478 WEBRTC_TURN_USERNAME=... WEBRTC_TURN_CREDENTIAL=... 7) WebSocket is architected as an optional upgrade. Shared hosting cannot keep a persistent WebSocket daemon alive reliably. Leave WEBSOCKET_URL empty on shared hosting; the app automatically uses the realtime HTTP fallback. On a VPS, connect a WebSocket/SFU layer later without changing the room, gifts, wallet, or ad APIs. 8) The room supports three fixed ad slots: top, middle, bottom. 9) Every verified ad impression stores country, CPM, room, host, viewer snapshot, slot and revenue split. Host ad earnings are credited to earnings_balance and the earnings ledger. 10) Country CPM defaults are seeded in ad_country_rates. Admin can read/write rates through: GET /admin/ad-rates POST /admin/ad-rates 11) Host ad analytics: GET /api/rooms/{room}/ad-stats Creator earnings: GET /api/earnings IMPORTANT SHARED HOSTING LIMITATION The application server is NOT used as an audio relay. Audio travels browser-to-browser over WebRTC. This keeps bandwidth/CPU requirements low on shared hosting. When traffic grows, move only the realtime media/signaling layer to a VPS/SFU and keep Laravel/MySQL as the business backend.