Bluetooth/WiFi peer-to-peer messaging for protest organizers and participants. Works completely offline — no internet connection, no shared WiFi network, and no cellular service required. Everything runs over airplane mode.
- Event Creation & Management - Organizers create events with 6-digit access codes
- Bluetooth P2P Messaging - Off-grid communication via Google Nearby Connections, no WiFi needed
- Broadcast Messages - Organizers blast messages to all connected participants
- Panic Button - Emergency alert system that notifies everyone instantly
- Crowd Map - Live map showing participant locations with GPS + proximity estimation
- Privacy-First - No accounts, no cloud, all communication is local and ephemeral
- Two iPhones running iOS 16 or later
- A Mac or PC with Node.js 18+ installed
- Bluetooth enabled on both phones (no WiFi, no internet, no shared network required)
- Open the App Store on each iPhone
- Search for "Expo Go"
- Install the app (it is free)
Open a terminal and run:
cd /path/to/Activistly
npm installnpx expo startThis will display a QR code in your terminal.
-
On iPhone 1 (the Organizer):
- Open the Camera app
- Point it at the QR code displayed in your terminal
- Tap the Expo Go banner that appears to open the app
-
On iPhone 2 (the Protestor):
- Do the same thing -- scan the QR code with the Camera app
- Tap to open in Expo Go
Note: If the QR code does not connect, press
sin the terminal to switch to tunnel mode, then re-scan.
When the app opens on each phone, it will ask for permissions. Accept all of them:
- Bluetooth - Required for P2P communication
- Location - Required for the crowd map feature
- Local Network (iOS) - Required for Bluetooth device discovery (no actual network connection needed)
- Type an event name (e.g., "March for Justice")
- Tap "Create an Event"
- Note the 6-digit access code shown in the popup (e.g.,
482931) - Tap OK to dismiss
- Tap "Start Event (Organizer)"
- The phone is now advertising via Bluetooth and waiting for participants
- Tap "Join an Event"
- Wait a few seconds -- the organizer's event should appear under "Available Events"
- Type the 6-digit access code in the text field
- Tap "Join" next to the event name
- You are now connected to the organizer
Messaging:
- On the organizer phone, type a message and tap "Send Blast" -- it appears on the protestor's screen
- On the protestor phone, type a message and tap "Send" -- it appears on the organizer's screen
Panic Button:
- On either phone, tap "PANIC ALERT"
- Optionally type an emergency description
- Tap "Send Alert" -- the other phone shows an emergency popup
Crowd Map:
- On either phone, toggle "Show me on map" to ON
- Optionally toggle "Share my GPS" to ON
- Tap "View Crowd Map" to see participants on a live map
expo-nearby-connections requires a development build (not just Expo Go) to use native Bluetooth APIs. If Bluetooth features do not work in Expo Go, you need to create a development build:
# Install EAS CLI
npm install -g eas-cli
# Log in to Expo
npx eas login
# Create a development build for iOS
npx eas build --profile development --platform iosThis generates an installable .ipa file. Install it on both iPhones via:
- Download the build from the link EAS provides
- Or use
npx eas build:run -p iosif you have a simulator
For testing on real iPhones with full Bluetooth support:
# Register your devices first
npx eas device:create
# Build for internal distribution
npx eas build --profile development --platform ios --localThen install the build on each iPhone using the QR code or link provided by EAS.
Once the development build is installed, start the dev server with:
npx expo start --dev-clientScan the QR code from within the installed development build (not Expo Go).
| Problem | Solution |
|---|---|
| QR code does not connect | Press s in terminal for tunnel mode and re-scan |
| Bluetooth not working | You need a development build, not Expo Go (see above) |
| Event not appearing in discovery | Make sure both phones have Bluetooth ON and are within ~30 feet |
| Location not showing on map | Tap "Show me on map" and grant location permission when prompted |
| App crashes on launch | Run npm install again, then npx expo start --clear |
- React Native + Expo SDK 54
- expo-nearby-connections (Google Nearby Connections API)
- expo-location + react-native-maps
- TypeScript