Inspiration

There is a lot of political unrest going on in the world today's national actions being an example. A lot of people want to show up and speak out about what’s happening in the world right now. But there’s also real fear. Surveillance, tracking, and data collection have made protesting feel more risky than it should be.

Technology has gotten more powerful, and sometimes it feels like that power isn’t on our side. We wanted to flip that. Instead of relying on centralized systems that can monitor or control communication, we built something that keeps it local and in the hands of the people using it.

Activistly is about taking the same kind of technology that has grown so advanced and using it to build trust instead of fear. Giving power back to the people.

What it does

Activistly is a mobile app that allows people at an event to communicate directly using peer-to-peer connections instead of the internet.

Here’s how it works:

  • Organizers create an event and generate a 6-digit access code.
  • Participants join using that code.
  • Organizers can send broadcast alerts to everyone in the event.
  • Participants can message organizers directly.
  • There is a panic button feature designed to quickly notify the group in an emergency.
  • A crowd map uses location and proximity data to help visualize where people are clustered.

There’s no centralized server and no accounts required. Everything is handled locally between devices. This keeps people safe and the fear out of protesting.

How we built it

We built Activistly using React Native with Expo.

For peer-to-peer communication, we used Google Nearby Connections through expo-nearby-connections. That allows devices to connect over Bluetooth without internet access. We used:

  • React Native
  • Expo (SDK 54)
  • Expo Router
  • TypeScript
  • React Navigation
  • react-native-maps
  • expo-location
  • AsyncStorage for local state

We also used EAS Build to create a development build because some of the Bluetooth functionality doesn’t work properly in Expo Go.

Challenges we ran into

The biggest challenge was Bluetooth. Expo Go doesn’t fully support the Nearby Connections API, so we had to move to a development build earlier than expected.

Permissions were also tricky. Getting Bluetooth, Wi-Fi, and location permissions working consistently across devices took a lot of trial and error.

Peer-to-peer networking is also unpredictable. Connections can drop. Devices don’t always discover each other immediately. We had to design around instability and make the experience feel usable even when connections weren’t perfect.

Accomplishments that we're proud of

We’re proud that we actually got device-to-device communication working. In theory, the idea of decentralized communication is rally appealing but in practice setting it up can be difficult. We’re also proud of:

  • Building a working broadcast system for organizers
  • Designing a messaging structure that prevents chaos
  • Adding a panic feature
  • Testing demo on our own devices

What we learned

We learned that offline-first development forces you to think differently. You can’t rely on a backend to clean things up. We also learned how much UX matters in high-stress scenarios. Clear structure is more important than feature density. Additionally, we learned that Bluetooth networking is far more complex than traditional API-based apps.

What's next for Activistly

If we continue building this, we would focus on:

  • Strengthening encryption
  • Improving automatic reconnection between devices
  • Expanding the mesh networking capabilities
  • Polishing the panic workflow
  • Scaling testing with larger groups
  • We also want to explore how this could be used beyond protests. For example, for community festivals, volunteer coordination, or any local gathering where reliable communication matters.

Built With

  • asyncstorage
  • easbuild
  • expo(sdk54)
  • expo-location
  • exporouter
  • google-nearby-connections
  • javascript
  • react-native-maps
  • react-navigation
  • reactnative
  • typescript
Share this project:

Updates