You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A React Native Expo rideshare app built for African communities. No Stripe. No cash. No commissions.
Pay via M-Pesa (TinyPesa) for Kenya and Paystack for all other African countries.
When a driver accepts your ride, both driver and passenger see animated "Win Win!" bubbles and hear a jingle.
Screenshots
Driver App
Home (Online Toggle)
Registration (4-Step)
Car Customization
Subscription
Driver Community
Safety Center
Passenger App
Home & Map
Book a Ride
Seat Selection
Price Negotiation
Confirm + WinWin Bubble
Passenger Community
Admin Dashboard (Moderator)
Overview
Safety Alerts
Driver Management
Payments
Admin is a moderator only. Admins can view and resolve safety alerts, verify drivers, and see payment logs. They cannot modify ride data or user profiles.
Features
Driver Side
Registration — Name, phone, email, tax ID, driver's license photo (base64), passport photo, areas covered (54 African countries + counties)
Online/Offline Toggle — On the home screen; only online drivers appear on the passenger map
Ride Requests — Accordion notification bar drops from top with a 15-second hourglass countdown, non-optional vibration, and the countdown-driver-jingle.mp3 sound
Car Customization — Choose from 10 colors; tap car to play Beep Beep or Win Win jingle (optional per driver setting)
Community — All drivers joined automatically; post and read discussions
Safety — Report incidents anonymously (identity hidden from other users, visible to admin)
Passenger Side
Book a Ride — Search destination, view nearby drivers on map (real GPS when available)
Seat Selection — Choose Shotgun, Back Left, or Back Right before confirming
Price Negotiation — Max 2 rounds; 45-second countdown timer with tick sounds in the last 10 seconds; price auto-locks if timer expires
Confirm Ride — Driver car icon shown; tap it to cycle through colors and play Beep Beep
Arrival Alert — Passenger jingle plays from 10 seconds before driver arrives (for visually impaired users); optional vibration toggle
Payment — M-Pesa (Kenya) or Paystack (other countries); webhook auto-confirms; animated success overlay with confetti
Community — Unlocks after 5 completed WinWin rides; progress bar shown until unlocked
Safety — View alerts, report incidents; identity not disclosed
Payment System
Country
Provider
Method
Kenya
TinyPesa
M-Pesa STK Push
All other African countries
Paystack
Mobile money / card
Foreigners (no mobile money)
Paystack
Card, $20 refundable deposit
Stripe
Never
Not used anywhere
Payment confirmation happens via webhook (/(api)/payment/webhook). The app polls the webhook endpoint every 3 seconds and shows an animated success overlay when confirmed.
Notification System
Both driver and passenger get an accordion notification bar that slides down from the top of the home screen:
Role
Triggers
Driver
New ride request (15s hourglass + non-optional vibration + jingle)
# 1. Install dependenciescd winwin-app
npm install
# 2. Set up environment variables
cp .env.example .env.local
# Fill in your keys# 3. Run database schema# Copy database/schema.sql and run against your NeonDB instance# 4. Start the app
npx expo start
# 5. For webhook testing (local dev), use ngrok:
ngrok http 8081
# Then set PAYSTACK_WEBHOOK_URL and TINYPESA_CALLBACK_URL to your ngrok URL + /(api)/payment/webhook