A React Native mobile app built with Expo Router for discovering and curating local political and civic events. Features card-based browsing with advanced gesture interactions (swipe, flip, delete) and saved events management.
- 🤖 AI-Powered Discovery: Find civic events using Perplexity AI (via OpenRouter)
- 📍 Location-Based Search: GPS-enabled event discovery in your area
- 🎴 Card Interface: Tinder-style swipe interface for browsing events
- 💾 Save Events: Curate your personal collection of events
- 🖼️ Dynamic Images: Event images powered by Unsplash API
- ⚡ Smooth Animations: 60fps gesture-driven animations with Reanimated
- 🌙 Dark Mode: Sleek dark theme interface
Before you begin, ensure you have the following installed:
- Node.js (v16 or higher)
- npm (comes with Node.js)
- Xcode (latest version) - Required for iOS development
- Download from the Mac App Store
- After installation, open Xcode and install Command Line Tools
- iOS Simulator - Installed with Xcode
- Expo CLI - Will be installed with dependencies
- macOS (required for iOS development)
- At least 8GB RAM (16GB recommended)
- 10GB+ free disk space
git clone https://github.com/DaInfernalCoder/ballot.git
cd ballotnpm installCreate a .env.local file in the root directory:
OPENROUTER_API_KEY=your_openrouter_api_key_here
UNSPLASH_ACCESS_KEY=your_unsplash_access_key_here
SUPABASE_URL=your_supabase_url_here
SUPABASE_KEY=your_supabase_key_hereNote: If you don't configure API keys, the app will fall back to 3 sample events.
The app is optimized for iPhone 16 Pro for best results.
Option A: Start development server first (Recommended)
npm startThen press i to open in iOS simulator, or scan the QR code to open on a physical device.
Option B: Direct iOS launch with iPhone 16 Pro
npm run iosThis command is configured to automatically launch with iPhone 16 Pro simulator.
Option C: Choose a different simulator
# List available simulators
xcrun simctl list devices available
# Start Expo with a specific device
expo start --ios --device-id="DEVICE_ID_HERE"- The simulator will launch automatically
- The app will open and request location permissions
- Grant location access for the best experience
- Start discovering civic events in your area!
- Swipe Right: Save event to your collection
- Swipe Left: Dismiss event
- Tap Card: Flip to see event details
- Scroll Vertically: Browse through events
- View your saved events
- Swipe Left: Delete saved event
- Tap Card: View detailed information
# Start development server
npm start
# Run on iOS (iPhone 16 Pro)
npm run ios
# Run on Android
npm run android
# Run on web browser
npm run web- Framework: React Native 0.81.5 with Expo ~54.0.18
- Routing: Expo Router ~6.0.13 (file-based routing)
- Language: TypeScript (strict mode)
- Animations: react-native-reanimated ~4.1.1 (60fps native thread)
- Gestures: react-native-gesture-handler ~2.22.1
- State Management: Context API + useReducer
- Storage: AsyncStorage (event caching & persistence)
- AI: OpenRouter API with Perplexity Sonar Pro model
- Images: Unsplash API for dynamic event imagery
The app currently focuses on manual testing. Test infrastructure is not yet implemented.
# Build for iOS production
eas build --platform ios --profile production
# Submit to App Store
eas submit --platform ios --profile production# Build for Android production
eas build --platform android --profile production
# Submit to Google Play Store
eas submit --platform android --profile production# Export web app
npx expo export --platform web
# Deploy to EAS Hosting
eas deploySimulator not found:
# Open Xcode and install iOS simulators
xcode-select --installiPhone 16 Pro not available:
# Open Xcode > Settings > Platforms
# Download iOS 18.0+ runtimeMetro bundler issues:
# Clear cache and restart
npm start -- --clearBuild errors:
# Clean and reinstall
rm -rf node_modules package-lock.json
npm installIf events aren't loading:
- Check
.env.localfile exists - Verify
OPENROUTER_API_KEYis set correctly - Restart the development server after changing environment variables
- CLAUDE.md: Comprehensive technical documentation for AI assistants
- USAGE_GUIDE.md: Detailed swipe-to-delete usage guide
- backend.md: Backend integration notes
This is a personal project, but suggestions and feedback are welcome!
This project is private and not currently licensed for public use.
- Expo: For the amazing React Native framework
- OpenRouter: For unified AI model access
- Perplexity: For powerful search capabilities
- Unsplash: For beautiful event imagery
For issues or questions, please open an issue on the GitHub repository.
Built with ❤️ using React Native and Expo