Condivisione audio locale offline-first tra dispositivi mobili
Pandemic รจ un'applicazione mobile che permette la condivisione di file audio direttamente tra dispositivi nella stessa area fisica, senza connessione Internet, senza server centrali e senza blockchain.
- Panoramica
- Architettura
- Stack Tecnologico
- Modello di Connettivitร
- Protocollo MVP
- Installazione
- Utilizzo
- Limitazioni di Piattaforma
Gli utenti fisicamente vicini (stesso locale, evento, festival) possono:
- Scoprire altri dispositivi nelle vicinanze
- Sfogliare i metadati audio condivisi
- Scaricare file audio compressi direttamente device-to-device
Questo sistema si comporta come:
- ๐ Un tavolo di scambio digitale
- ๐ป Una radio da locale
- ๐ Volantini digitali che camminano con le persone
NON come:
- โ Un servizio cloud
- โ Una piattaforma streaming
- โ Una rete P2P torrent
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PANDEMIC - ARCHITETTURA โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโ BLE Discovery + GATT โโโโโโโโโโโโโโโ โ
โ โ DEVICE A โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโบโ DEVICE B โ โ
โ โ (HOST) โ (Room info + Hotspot creds)โ (GUEST) โ โ
โ โโโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโ โ
โ โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ LOCAL WI-FI NETWORK โ โ โ
โ โ โ (Venue Router / Phone Hotspot ๐ฑ) โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโผโโโโโโโโโโโ โ
โ โ WebSocket/HTTP โ โ
โ โ Data Transfer โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ LAYER ARCHITECTURE โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ UI LAYER (React Native) โ โ
โ โ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ Home โ โ Host โ โ LAN โ โ Guest โ โ Library โ โ โ
โ โ โ Screen โ โ Mode โ โ Host๐ฑ โ โ Mode โ โ + Player โ โ โ
โ โ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ SERVICE LAYER โ โ
โ โ โโโโโโโโโโโโโ โโโโโโโโโโโโโ โโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ Room โ โ Peer โ โ Transfer โ โ Audio Library โ โ โ
โ โ โ Manager โ โ Discoveryโ โ Manager โ โ + Playback โ โ โ
โ โ โโโโโโโโโโโโโ โโโโโโโโโโโโโ โโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ TRANSPORT LAYER โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ BLE Service โ โ LAN Service โ โ Phone Host Server โ โ โ
โ โ โ - Advertising โ โ - mDNS โ โ - WebSocket (8787)โ โ โ
โ โ โ - Scanning โ โ - Venue client โ โ - File Relay โ โ โ
โ โ โ - GATT Server โ โ - File relay โ โ - GATT credentialsโ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ STORAGE LAYER โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ AsyncStorage โ โ FileSystem โ โ โ
โ โ โ - Metadata Index โ โ - Audio Files โ โ โ
โ โ โ - Room State โ โ - Library folder โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| Layer | Tecnologia | Scopo |
|---|---|---|
| Framework | React Native + Expo | Cross-platform mobile |
| Linguaggio | TypeScript | Type safety |
| Navigazione | expo-router | File-based routing |
| State | Zustand | Gestione stato globale |
| BLE | react-native-ble-plx | Bluetooth Low Energy |
| Network | expo-network | Stato rete e IP |
| Audio | expo-av | Playback audio |
| Storage | expo-file-system | File audio locali |
| Storage | AsyncStorage | Metadati e impostazioni |
| Native iOS | Network.framework, NetService, CoreBluetooth | WS server, Bonjour, BLE |
| Native Android | NsdManager, Java-WebSocket, BLE | mDNS, WS server, BLE |
| Build iOS | EAS Build + TestFlight | Distribuzione iOS |
| Build Android | Gradle + keystore firmato | APK distribuzione |
Adottiamo un MODELLO DUAL-STACK DI NETWORKING LOCALE:
- Bluetooth (BLE) = discovery + coordinazione
- Wi-Fi LAN = trasferimento dati
- Room host = index + coordinatore, NON storage
| Aspetto | BLE | Wi-Fi LAN | Decisione |
|---|---|---|---|
| Discovery | โ Eccellente | โ Richiede rete | BLE |
| Throughput | โ 50-200 KB/s | โ 10-100+ Mbps | Wi-Fi |
| Range | ~10-30m | ~50-100m | Comparabile |
| Battery | โ Basso | BLE per idle | |
| Background iOS | โ Limitato | Foreground | |
| Setup | โ Zero config | BLE piรน semplice | |
| File grandi | โ Impraticabile | โ Ottimale | Wi-Fi |
| Fallback | โ Sempre | โ Dipende | BLE come backup |
- โ WebRTC (richiede IP networking, non funziona su BLE)
- โ TURN / STUN (server esterni)
- โ Mesh relaying (troppo complesso, consuma batteria)
- โ GPS enforcement (privacy, batteria)
FASE 1: CREAZIONE ROOM (HOST)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
HOST
1. User taps "Create Room"
2. Generate: roomId (UUID), sessionToken, ephemeralHostId
3. Get local IP address (if Wi-Fi available)
4. Start BLE advertising: roomId, roomName, hostAddress
5. Start HTTP/WebSocket server on port 8080
6. Initialize room state: peers: [], sharedFiles: []
FASE 2: DISCOVERY (GUEST)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
GUEST
1. User taps "Join Room"
2. Start BLE scanning
3. Discover nearby rooms (sorted by RSSI)
4. Display list to user
5. User selects room
FASE 3: JOIN ROOM (HANDSHAKE)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
GUEST HOST
1. Connect via BLE GATT โโโโโโโโโโโบ
2. Accept connection
3. Request join: { peerId, peerName } โโโโโโโโโบ
4. Generate session token
โโโโโโโโโโโ 5. Response: { sessionToken, hostAddress }
6. Disconnect BLE
7. Connect HTTP/WS to hostAddress โโบ
8. Validate token
9. Add to peers list
โโโโโโโโโโโ 10. Broadcast: PEER_JOINED
FASE 4: METADATA SYNC
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
GUEST HOST
1. Publish shared files โโโโโโโโโโโโโโโโโโโโโโโโบ
2. Aggregate to room index
โโโโโโโโโโโ 3. Broadcast: INDEX_UPDATED
FASE 5: FILE TRANSFER (P2P over LAN)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
GUEST A (requester) HOST GUEST B (owner)
1. Request file: { fileId, ownerId } โโโโบ
2. Lookup owner address
3. Response: { ownerAddress }
โโโ
4. Direct HTTP GET โโโโโโโโโโโโโโโโโโโโโโโโโโบ
5. Stream file
โโโโโโโโโโโโโโโโโโโโโโ (chunked)
6. Save to local storage
7. Notify HOST: TRANSFER_COMPLETE โโโโโโโโโโโโบ
Per scenari senza Wi-Fi (campeggio, aree remote, disastri):
- Transport: BLE GATT
- MTU: ~185โ512 bytes
- Throughput: ~50โ200 KB/s (best case)
- Dimensione file consigliata: โค 1โ3 MB
- UI avvisa: "Modalitร Bluetooth โ trasferimenti lenti"
- Node.js >= 20.x
- npm o yarn
- Expo CLI
- Xcode (per iOS)
- Android Studio (per Android)
# Clona il repository
git clone https://github.com/yourusername/pandemic.git
cd pandemic
# Installa dipendenze
npm install
# Avvia in development
npm start
# Avvia su iOS
npm run ios
# Avvia su Android
npm run androidPer testare BLE e networking locale, รจ necessario un build nativo:
# Prebuild (genera progetti nativi)
npx expo prebuild
# Build iOS
npx expo run:ios --device
# Build Android
npx expo run:android --deviceGenera un APK installabile per distribuzione/test:
# Da android/
export PANDemic_RELEASE_STORE_PASSWORD="YOUR_PASSWORD"
export PANDemic_RELEASE_KEY_PASSWORD="YOUR_PASSWORD"
./gradlew assembleReleaseOutput: release/Pandemic-android-release.apk
# Build via EAS (cloud)
eas build --platform ios --profile production
# Submit a TestFlight
eas submit --platform ios --latestRichiede account Apple Developer (configurato in eas.json).
Come Host:
- Apri l'app
- Tap "Crea Stanza"
- Inserisci un nome per la stanza
- Attendi che altri si connettano
- Condividi file dalla tua libreria
Come Guest:
- Apri l'app
- Tap "Trova Stanze"
- Cerca in "Stanze Vicine (P2P)"
- Seleziona una stanza dalla lista
- Sfoglia i file disponibili
- Scarica i file che ti interessano
Per condividere file tra Android e iOS serve un Venue Host locale (laptop/Raspberry Pi) sulla stessa rete Wi-Fi.
1. Avvia il Venue Host:
cd venue-host
npm install
npm run dev2. Monitora la Dashboard: Apri http://localhost:8787 per:
- Creare/gestire la room (nome, lock, close)
- Caricare file audio come host (Host Library)
- Monitorare peers e file in tempo reale
- Vedere trasferimenti attivi
3. Sui device mobili:
- Connettiti alla stessa rete Wi-Fi del Venue Host
- Apri l'app โ "Trova Stanze"
- Cerca in "Venue Rooms (Wi-Fi Cross-Platform)"
- Tocca la room del venue host per entrare
- Vedi immediatamente:
- Tutti i peer connessi
- File host (se caricati nella dashboard)
- File condivisi da altri peer
- Per condividere: "+ Add" โ Library โ Seleziona file โ "Condividi"
- Per scaricare: Tocca il pulsante download โ File salvato in Library automaticamente
Fallback connessione manuale: Se mDNS non funziona (reti con AP isolation, Android vecchi):
- Tocca "๐ถ Connetti manualmente a Venue Host"
- Inserisci IP del laptop (es.
192.168.1.5) e porta (8787)
๐ Dettagli completi in P2P_README.md
Alternativa senza laptop! Un telefono puรฒ fare da host usando la stessa rete Wi-Fi o il proprio hotspot.
Scenario 1: Stessa rete Wi-Fi
- Host apre l'app โ "Crea LAN Room (Wi-Fi/Hotspot)"
- Inserisce nome stanza โ "Avvia Stanza"
- Guests sullo stesso Wi-Fi vedono automaticamente la stanza in "Trova Stanze"
- Tap sulla stanza โ connessione diretta
Scenario 2: Hotspot dell'Host (nessun Wi-Fi disponibile) ๐ฅ
- Host attiva l'hotspot del telefono (nelle impostazioni di sistema)
- Host apre l'app โ "Crea LAN Room"
- Abilita "Modalitร Hotspot" e inserisce:
- Nome rete (SSID) dell'hotspot
- Password dell'hotspot
- "Avvia Stanza" โ BLE + mDNS + WebSocket server partono
Per i Guests:
- Apri l'app โ "Trova Stanze"
- Vedi la stanza con badge ๐ก e ๐ฅ Hotspot (trovata via BLE)
- Tap sulla stanza โ appare modal con credenziali hotspot
- Premi "Apri Impostazioni Wi-Fi" โ si aprono le impostazioni
- Connettiti all'hotspot dell'host
- Torna nell'app โ premi "Sono Connesso"
- Ora sei nella stanza!
Come funziona sotto il cofano:
- L'host pubblica le credenziali dell'hotspot via BLE GATT (caratteristica leggibile)
- I guests trovano l'host via BLE scanning
- Toccando la stanza, il guest si connette via GATT e legge SSID + password
- Dopo la connessione all'hotspot, il guest si collega al WebSocket server dell'host
Limitazioni:
- iOS/Android non permettono la connessione automatica all'hotspot (serve intervento manuale)
- L'hotspot deve essere attivato manualmente dall'host
La Libreria Audio รจ il punto centrale per gestire i tuoi file audio:
Funzionalitร :
- Import da dispositivo: Importa file audio dalla memoria locale del device
- Download automatico: I file scaricati dalle room vengono salvati automaticamente
- Riordinamento: Riordina i brani manualmente (frecce โฒ/โผ)
- Playback singolo: Tocca un brano per riprodurlo
- Playlist sequenziale: Usa il player globale in basso per riprodurre in ordine
- Persistenza: Tutti i file e l'ordine vengono salvati tra riavvii
Accesso:
- Dalla Home: Tocca "La tua Libreria"
- Dalla Room: Tocca "+ Add" โ si apre la Library (non il file picker del sistema)
- I file condivisi vengono selezionati dalla Library
Player globale:
- Barra player fissa in basso con controlli Play/Pause, Next, Previous
- Auto-avanzamento: quando un brano finisce, parte il successivo
- Progress bar e informazioni brano corrente
- โ Full native support: WebSocket server (Network.framework), Bonjour (NetService), BLE (CoreBluetooth)
- โ Distribuzione via TestFlight (EAS Build)
โ ๏ธ BLE funziona affidabilmente solo in foregroundโ ๏ธ Trasferimenti background inaffidabili- โ Connessione automatica a hotspot impossibile - Apple blocca la connessione programmatica a reti Wi-Fi
- ๐ก Mantieni l'app aperta durante i trasferimenti
- โ Piรน permissivo per BLE
- โ Throughput generalmente superiore
โ ๏ธ Background comunque limitatoโ ๏ธ Hotspot richiede conferma utente -WifiNetworkSuggestionmostra sempre una notificaโ ๏ธ Android 12+ richiede permessi BLE runtime (BLUETOOTH_ADVERTISE,BLUETOOTH_CONNECT)โ ๏ธ mDNS Discovery limitata su Android 10-11 (API 29-30) - La discovery automatica puรฒ essere intermittente o non funzionare. Workaround: usa Hotspot mode o Connessione manuale. Vedi ANDROID_DISCOVERY_ISSUES.md per dettagli tecnici.
- ๐ถ Wi-Fi LAN richiede stessa rete
- ๐ Trasferimenti grandi consumano batteria
- ๐ฑ Tieni lo schermo acceso durante i trasferimenti
- ๐ฅ Hotspot mode: la connessione all'hotspot richiede sempre intervento manuale dell'utente
pandemic/
โโโ app/ # Schermate (expo-router)
โ โโโ _layout.tsx # Root layout
โ โโโ index.tsx # Home screen (con richiesta permessi)
โ โโโ join.tsx # Find rooms (P2P + Venue + LAN Host)
โ โโโ room.tsx # Active room
โ โโโ lan-host.tsx # ๐ฑ Phone Host Mode (crea LAN room da telefono)
โ โโโ library.tsx # Audio library (import, playback, reorder)
โ โโโ settings.tsx # Settings
โโโ src/
โ โโโ components/ # UI components
โ โโโ services/ # Business logic
โ โ โโโ AudioLibraryService.ts # Library management
โ โ โโโ AudioPlaybackService.ts # Playback control
โ โ โโโ BleService.ts # BLE scanning + GATT read
โ โ โโโ P2PRoomServiceAdapter.ts # P2P/Venue adapter
โ โ โโโ native/
โ โ โโโ BleAdvertisingNative.ts # BLE advertising wrapper
โ โโโ stores/ # Zustand stores
โ โ โโโ libraryStore.ts # Audio library state
โ โโโ p2p/ # Native P2P transport (Nearby/Multipeer)
โ โ โโโ transport.base.ts # Abstract interface
โ โ โโโ transport.android.ts
โ โ โโโ transport.ios.ts
โ โ โโโ protocol/ # Room protocol
โ โโโ venue/ # Venue LAN cross-platform
โ โ โโโ types.ts # Venue types
โ โ โโโ discovery.ts # mDNS discovery + advertisement
โ โ โโโ transport.ts # WebSocket transport
โ โ โโโ relay.ts # File relay
โ โโโ lanHost/ # ๐ฑ Phone Host Mode
โ โ โโโ types.ts # LAN host types
โ โ โโโ hostState.ts # In-memory room state
โ โ โโโ PhoneHostServer.ts # Native WS server wrapper
โ โ โโโ wsHandler.ts # WebSocket message handler
โ โ โโโ index.ts # Exports
โ โโโ types/ # TypeScript types
โ โโโ utils/ # Utilities
โ โโโ constants/ # Theme & constants
โโโ venue-host/ # ๐ Local LAN host (Node.js)
โ โโโ src/
โ โ โโโ index.ts # Entry + HTTP server
โ โ โโโ types.ts # Zod schemas
โ โ โโโ room-manager.ts # Room & peer state
โ โ โโโ ws-handler.ts # WebSocket protocol
โ โ โโโ host-state.ts # Persistent state (room, files)
โ โ โโโ dashboard.ts # Web dashboard HTML
โ โ โโโ admin-api.ts # REST API for dashboard
โ โโโ package.json
โ โโโ README.md
โโโ ios-native-modules/ # iOS native module sources (injected by config plugin)
โ โโโ LanHostModule.h/m # WebSocket server (Network.framework) + file write
โ โโโ VenueDiscoveryModule.h/m # Bonjour mDNS (NetService)
โ โโโ BleAdvertisingModule.h/m # BLE GATT server (CoreBluetooth)
โโโ plugins/
โ โโโ withIosNativeModules.js # Expo config plugin for iOS native modules
โโโ android/ # Native Android modules
โ โโโ app/src/main/java/com/pandemic/app/
โ โโโ lanhost/ # WebSocket server (Java-WebSocket)
โ โโโ venue/ # mDNS (NsdManager)
โ โโโ BleAdvertisingModule.kt # BLE GATT server
โ โโโ nearby/ # Nearby Connections
โโโ assets/ # Images, fonts
โโโ app.json # Expo config
โโโ package.json
โโโ tsconfig.json
โโโ P2P_README.md # ๐ P2P + Venue documentation
โโโ README.md
Background: #0A0A0B (nero profondo)
Surface: #141416 (grigio scuro)
Primary: #FF2D6A (magenta neon)
Secondary: #00F5D4 (cyan elettrico)
Accent: #FFB800 (ambra caldo)
Text Primary: #FFFFFF
Text Secondary: #A0A0A5
L'interfaccia รจ ispirata all'atmosfera di un warehouse party:
- ๐ Tema scuro dominante
- ๐ก Accenti neon vibranti
- ๐ญ Stile industriale/underground
- โจ Effetti glow sottili
- Creazione stanze P2P
- Discovery (Nearby Connections / MultipeerConnectivity)
- Join room
- Condivisione metadati
- Libreria audio locale
- Venue Host (Node.js) per AndroidโiOS
- mDNS discovery (Bonjour / NSD)
- WebSocket transport + file relay
- Dashboard web per monitoring
- Connessione manuale fallback
- Host Library (upload file dalla dashboard)
- Room management (create, lock, close)
- Sincronizzazione file migliorata (file visibili anche se caricati prima dell'ingresso)
- Audio Library con playback e riordinamento
- Download automatico in Library con titoli completi
- Phone Host Mode: un telefono puรฒ fare da host (senza laptop)
- WebSocket server nativo in-app (Android: Java-WebSocket, iOS: Network.framework)
- mDNS advertisement da telefono
- BLE GATT per hotspot credentials: scambio SSID/password via Bluetooth
- UI per modalitร hotspot (inserimento credenziali)
- Modal con credenziali + bottone "Apri Impostazioni Wi-Fi"
- Badge ๐ก/๐ฅ per stanze BLE/Hotspot
- Gestione robusta del server WebSocket (SO_REUSEADDR, stop asincrono)
- Auto-reconnect WebSocket con exponential backoff
- Risoluzione mDNS sequenziale (workaround bug Android NSD)
- WiFi Multicast Lock per Android vecchi
- iOS native modules (Objective-C): WebSocket server, Bonjour discovery, BLE advertising
- Expo config plugin per injection automatica moduli nativi iOS
- TestFlight distribution via EAS Build
- QR Code sharing: host genera QR con deep link + credenziali Wi-Fi
- QR Scanner: scansione QR da "Find Rooms" per join diretto
- Native file write (
writeBase64ToFile): scrittura binaria affidabile su iOS - Audio session management: riconfigurazione automatica su iOS
- Content disclaimer: checkbox al primo avvio + nota nella home
- Signed Android APK: distribuzione facilitata
- Resume trasferimenti interrotti
- Notifiche push locali
- Migliorare discovery su Android vecchi (UDP broadcast fallback)
- Cache IP per connessioni manuali ripetute
- Modalitร BLE-only completa (transfer via GATT)
- Playlist condivise
- Anteprima audio streaming
- Compressione audio on-the-fly
- Node.js: consigliato >= 20.x
- Java: Java 17 (Temurin/OpenJDK) per Android/Gradle
- Android Studio (SDK + Platform Tools installati)
- Xcode (per build iOS)
Per configurare velocemente Java 17 sul Mac:
brew install --cask temurin@17
# Aggiungi a ~/.zshrc
export JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATHPer configurare l'SDK Android:
# In ~/.zshrc
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/platform-tools
# In android/local.properties
sdk.dir=/Users/<USERNAME>/Library/Android/sdk-
Solo UI / sviluppo rapido (Expo Go):
npm starte scansione QR da Expo Go- BLE e permessi nativi hanno limitazioni, ma l'UI funziona
-
Dev build Android (consigliato per BLE + permessi completi):
npx expo prebuildJAVA_HOME=$(/usr/libexec/java_home -v 17) npx expo run:android --device
-
Dev build iOS:
npx expo prebuildnpx expo run:ios --device
- Architettura dettagliata:
ARCHITECTURE.md - Testing e scenari QA:
TESTING.md - Setup ambiente:
SETUP_GUIDE.md,QUICK_START.md - Deep linking e routing:
DEEP_LINKING.md - Problemi discovery Android/mDNS:
ANDROID_DISCOVERY_ISSUES.md - Piano P2P (storico):
P2P_IMPLEMENTATION_PLAN.md,P2P_README.md
Questi file sono pensati per nuovi sviluppatori che entrano nel progetto e vogliono una panoramica completa di architettura, protocolli e setup ambiente.
MIT License
Made with โค๏ธ for offline-first, local-first communities.
๐ฆ PANDEMIC - Offline-first. Locale. Peer-to-peer.