EventPulse is a real-time local event discovery app that surfaces upcoming concerts, festivals, meetups, and shows based on the user’s live location.
It integrates real event APIs (Ticketmaster or Eventbrite), AI-generated summaries, and offline favorites — all wrapped in a smooth Expo + React Native experience.
Goal: When a user downloads the app, they instantly see real nearby events, view AI summaries, and experience my engineering quality firsthand — without logging in or setting up anything.
| Category | Library / Tool | Why It’s Chosen |
|---|---|---|
| Framework | Expo SDK 54+ | Simplifies deployment, native modules, OTA updates |
| State | Zustand | Lightweight, modern, and clean state management |
| Storage | react-native-mmkv (Expo-compatible build) | Ultra-fast offline storage for favorites and cache |
| Networking | react-query or axios | Efficient async caching + retry logic |
| Maps | react-native-maps (via Expo config plugin) | Native maps integration for location + events |
| AI Integration | OpenAI API | Real AI summaries and recommendations |
| Animations | react-native-reanimated + moti | High-performance, Expo-ready animations |
| Styling | nativewind | Tailwind-based utility styling for rapid UI |
| Notifications | expo-notifications | Local reminders for saved events |
| Calendar | expo-calendar | Native calendar integration |
| Permissions | expo-location, expo-permissions | Handles GPS + calendar access |
| Charts | victory-native or react-native-svg-charts | Data visualization for insights |
| Testing Jest + Testing Library | Lightweight | test coverage for key flows |
/src
├── api/ # external APIs (Eventbrite, Ticketmaster, OpenAI)
├── components/ # reusable UI components (cards, modals, buttons)
├── features/
│ ├── map/ # map view + location-based event fetching
│ ├── events/ # event list + details
│ ├── ai/ # AI summaries and suggestions
│ ├── favorites/ # offline saved events
│ └── showcase/ # "About this app" for recruiters
├── hooks/ # useLocation, useAIInsights, useEvents, etc.
├── store/ # Zustand stores
├── utils/ # helpers (formatters, error handlers)
├── navigation/ # tab + stack navigation
└── assets/ # icons, images, fonts
Architecture Pattern:🧱 Feature-based modular + Clean layering→ Scalable, testable, and demonstrates modern engineering discipline.
📱 Screen-by-Screen Breakdown
Purpose: Establish visual polish and smooth entry.
- Animated logo (using Moti + Reanimated)
- Fades into Home/Map screen after 1.5s
- Expo splash & font loading
- Animation sequencing (Reanimated)
- Clean transitions
Purpose: Instant “wow” with live data and motion.
- Interactive map using react-native-maps
- Pins for real events near the user’s location
- Bottom sheet showing nearby events list (Reanimated + Gesture Handler)
- Category filter (music, sports, festivals, etc.)
- Native module config via Expo plugin
- Real API data fetching (Eventbrite/Ticketmaster)
- Location permissions via expo-location
- Reactive state with Zustand
- Declarative UI motion
Purpose: Show real API integration + AI augmentation.
- Event banner image, title, venue, time
- AI-generated summary using OpenAI (based on description + tags)
- Buttons: “Add to Calendar,” “Remind Me,” “Open in Maps,” “Save”
- OpenAI integration (custom prompts)
- Native calendar & map linking via Expo APIs
- Local persistence with MMKV
- Error + loading management with React Query
- Data transformation logic
Purpose: Demonstrate persistence, caching, and background jobs.
- List of saved events (stored in MMKV)
- Offline availability
- Option to set reminders via expo-notifications
- MMKV-based data storage
- Persistent Zustand store with middleware
- Notifications via Expo
- Offline UX with fallback UI states
Purpose: Show off intelligent personalization and real-time data processing.
- “AI Suggestions” like:“You seem to like live music — here are top 3 shows this week.”
- Pulls context from favorited events + current city
- Uses OpenAI or HuggingFace for text generation
- Animated list reveal (Moti)
- Prompt design and AI integration
- Context-based content generation
- Async request orchestration
- Advanced animations
- Combining user data + external data meaningfully
Purpose: A meta tab for employers.
- Animated logos for Expo, Zustand, MMKV, Reanimated
- Architecture diagram rendered via SVG
- Buttons: “View Source,” “LinkedIn,” “Portfolio”
- AI-generated summary describing the app
- Self-documenting engineering
- SVG rendering
- Multi-platform linking (mailto, external)
- Modern branding polish
| Skill Area | Feature Demonstrated |
|---|---|
| Expo Expertise | OTA updates, managed workflow, Expo APIs (Location, Calendar, Notifications) |
| State Management | Centralized global store with Zustand + persistence middleware |
| Performance Optimization | MMKV for fast, synchronous reads/writes |
| AI Integration | OpenAI text generation for event insights |
| Real API Workflows | Eventbrite/Ticketmaster live data with error handling |
| Offline-First Design | MMKV cache + background event sync |
| Animation Polish | Reanimated & Moti for transitions |
| Native Integrations | Calendar, Notifications, Deep Linking |
| Data Visualization | Event analytics charts via victory-native |
| Professional Storytelling | Showcase tab + clean architecture |
🧱 Expo-Friendly Data Flow
flowchart TD
A[User Interaction] --> B[Zustand Store]
B --> C[React Query / Axios]
C --> D1[Eventbrite API]
C --> D2[OpenAI API]
B --> E[MMKV Storage]
B --> F[UI Components]
F --> G["Expo Native APIs (Location, Calendar, Notifications)"]
This structure shows scalable separation of concerns, and interviewers will immediately recognize it as a production-grade architecture.
| Phase | Duration | Deliverables | Key Focus |
|---|---|---|---|
| Phase 1: Core Infrastructure | Weeks 1–3 | Expo setup, Zustand store, Maps + Location Foundation, modular setup | |
| Phase 2: Events API Integration | Weeks 4–6 | Fetch + cache real events, Event Details screen Networking, API integration | |
| Phase 3: AI + Offline Mode | Weeks 7–9 | AI summaries, Favorites, MMKV persistence AI, data persistence | |
| Phase 4: UX & Polish | Weeks 10–12 | Animations, Showcase tab, notifications, store build Visual polish, deployability |
- Theme: Dark + glassmorphic
- Primary Colors: #1E293B (slate) + accent gradient per category
- Font: Inter (Expo Google Fonts)
- Layout: Bottom tabs → Map / AI / Favorites / Showcase
- Animations: Smooth fade/slide transitions via Moti/Reanimated
- Interaction: Scrollable bottom sheet with spring animation
- 📱 App on Play Store + App Store (Expo EAS build)
- 💻 Public GitHub repo with modular architecture and clean commits
- 🎥 30-second demo reel (show map, AI insights, smooth transitions)
- 🧾 README with architecture diagram and short tech write-up
- adb devices
- ./gradlew clean
- ./gradle --stop
- ps -A | grep gradle find all running dameons
- sudo kill -9 (Kill the process with this command)
-
Android APK no eas preview environment
-
- APP_ENV=preview npx expo prebuild --clean
-
- APP_ENV=preview npx expo run:android --variant release
-
Dev environment defaults to debug apk
-
- npx expo prebuild --clean
-
- npx expo run:android
- npx eas build -p ios --clear-cache
- npx eas build -p android --clear-cache
-
eas build: This command initiates a new build for your project. By default, it targets the production profile, suitable for app store submissions. -
eas build --profile development --platform [android|ios]: Creates a development build, which is a development client that loads JavaScript from your local machine. This is ideal for active development and debugging. -
eas build --profile preview --platform [android|ios]: Creates a preview build, which is a standalone, installable application (APK for Android, IPA for iOS) without the development client. This is useful for sharing with clients or for internal testing. -
eas build --local: Runs any eas build command on your local machine instead of on EAS servers. This is helpful for debugging build failures or for local testing.
- npx expo start --clear
- npm test
- npm test -- --watch
- npx jest --clearCache
- rm -rf node_modules/.cache
- rm -rf node_modules
- npm cache clean --force
- npm install
- watchman watch-del-all
- rm -fr $TMPDIR/haste-map-*
- rm -rf $TMPDIR/metro-cache
- npx expo start --clear
- npm run reste:cache
- npx expo start --clear
-
A problem occurred evaluating settings 'android'. > A problem occurred starting process 'command 'node'' -
Installation error: INSTALL_PARSE_FAILED_NO_CERTIFICATES posiibly due to running builds (no eas) on simulator then on usb device. The type of usb cable was also an issue for others in link below https://stackoverflow.com/questions/2914105/what-is-install-parse-failed-no-certificates-error
- rm -rf node_modules
- rm package-lock.json
- rm -rf $TMPDIR/haste-map-*
- rm -rf $TMPDIR/metro-cache
- watchman watch-del-all
- npm cache clean -f
- Make sure Android studio is closed
- uninstall any trace from phone
- npm i
- npx expo install --check
- npx expo-doctor
- npx expo run:android
-
Peer deps check
- npm ls react react-test-renderer (had to downgrade this to react 19.1, it wanted react 19.2)