Personal finance & peer-to-peer payment app
A fully-featured mobile UI prototype for a digital wallet and P2P payment experience β built with Expo SDK 56, React 19, and TypeScript.
- π³ Virtual Debit Card β card details, lock/unlock, PIN management, boosts, virtual card for online use, card design customization
- π€ Send & Receive Money β contact-based P2P transfers with confirmation flow
- π° Deposit & Cash Out β link bank accounts, deposit funds, withdraw to bank
- π Transaction History β filterable activity feed (sent, received, payments, deposits, withdrawals)
- π¦ Banking Dashboard β balance overview, linked accounts, direct deposit setup
- π QR Code Payments β scan to pay or display personal QR code
- π Security & Privacy β card lock, PIN, security alerts, login history, blocked users
- βοΈ Account Management β profile editing, notifications, language, currency, statements, data export
- π Dark / Light Theme β polished theme system with signature green accent (
#00D632) - π± Cross-Platform β runs on iOS, Android, and Web
| Splash | Home | Activity | Banking | Profile |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
| Send Flow | Card Management | QR Code |
|---|---|---|
![]() |
![]() |
![]() |
| Category | Technology |
|---|---|
| Framework | Expo 56 + React Native 0.85 |
| Language | TypeScript 6.0 |
| Navigation | Expo Router v4 (file-based, typed routes) |
| Styling | React Native StyleSheet + dynamic theme via useThemeColors |
| State | Zustand 5 + AsyncStorage persistence |
| Icons | Lucide React Native + Expo Symbols |
| UI Effects | Expo Blur, Expo Linear Gradient, Expo Haptics |
| Images | Expo Image, Expo Image Picker |
| Testing | Jest + jest-expo |
| React Compiler | Enabled (experimental) |
# Clone the repository
git clone https://github.com/ekimkael/cashmate.git
cd cashmate
# Install dependencies
npm install --legacy-peer-deps
# Start the development server
npm startNote:
--legacy-peer-depsis required becauselucide-react-nativedeclares a peer dependency on React 16β18, while this project uses React 19.
npm run ios # iOS simulator
npm run android # Android emulator
npm run web # Web browserNote: This is a UI prototype. All data is mocked locally β no backend or network calls are made.
cashmate/
βββ app/ # Expo Router β file-based routing
β βββ (tabs)/ # Bottom tab navigation
β β βββ (home)/index.tsx # Home / Dashboard
β β βββ (activity)/index.tsx # Transaction history
β β βββ (banking)/index.tsx # Card & account management
β β βββ (profile)/index.tsx # Settings & profile
β βββ auth/ # Authentication screens
β β βββ login.tsx
β β βββ register.tsx
β β βββ forgot-password.tsx
β βββ send/ # P2P send money flow
β βββ request/ # Request money flow
β βββ deposit.tsx # Deposit flow
β βββ cashout.tsx # Cash out flow
β βββ card.tsx # Card management
β βββ [utility screens] # Settings, help, privacy, etc.
β
βββ components/ # Reusable UI components
β βββ ui/
β βββ balance-card.tsx
β βββ action-button.tsx
β βββ num-pad.tsx
β βββ contact-item.tsx
β βββ transaction-item.tsx
β βββ hstack.tsx
β
βββ hooks/ # Custom React hooks
β βββ use-amount-input.ts # Numeric keypad state (send, request, deposit, cashout)
β βββ use-haptic-navigation.ts # Haptic feedback + router.push
β βββ use-require-user.ts # Auth guard with auto-redirect
β
βββ store/ # Zustand global state
β βββ user-store.ts # User session & balance
β βββ transaction-store.ts # Transaction history
β βββ app-store.ts # App readiness & persisted preferences
β βββ theme-store.ts # Dark / light theme toggle
β
βββ types/ # TypeScript type definitions
βββ mocks/ # Seed / demo data
βββ constants/ # Colors, theme tokens
βββ assets/ # Fonts, images, icons
βββ app.json # Expo configuration
βββ package.json
Four Zustand stores, all persisted to AsyncStorage:
user-store
βββ user: User | null
βββ setUser(user)
βββ updateBalance(amount)
βββ logout()
transaction-store
βββ transactions: Transaction[]
βββ addTransaction(tx) # also calls updateBalance
app-store
βββ isAppReady: boolean
βββ notifications: boolean
βββ soundEffects: boolean
βββ hapticFeedback: boolean
βββ setAppReady()
βββ togglePreference(key)
theme-store
βββ isDark: boolean
βββ toggle()
| Hook | Purpose |
|---|---|
useAmountInput |
Numeric keypad state shared across send, request, deposit, cashout |
useHapticNavigation |
Haptic feedback + router.push β used across all tab screens |
useRequireUser |
User guard with auto-redirect to /auth/login if not authenticated |
Expo Router uses a file-based convention. Every file in app/ maps to a route. Tabs are grouped under app/(tabs)/. Authentication screens live in app/auth/. Typed routes are enabled β all router.push calls use the Href type from expo-router.
Mock Data (mocks/data.ts)
β
βΌ
Zustand Stores βββββββββ User interactions
β
βΌ
Screen Components βββΊ Expo Router navigation
This is a UI prototype. Planned features for future versions:
- Real Authentication β JWT / OAuth 2.0, biometric login
- REST / GraphQL API β replace mock data with a real backend
- Live Payments β integrate Stripe or a payment processor
- Push Notifications β transaction alerts, security events
- Biometric Security β Face ID / fingerprint for card actions
- Internationalisation β multi-language support (i18n)
- E2E Tests β Detox test suite
Contributions are welcome! Please read through the workflow before opening a PR.
main β stable, production-ready releases (protected)
develop β default integration branch β open PRs here
feature/* β new features (branch from develop)
fix/* β bug fixes (branch from develop)
# 1. Fork & clone
git clone https://github.com/<your-handle>/cashmate.git
# 2. Create a feature branch from develop
git checkout develop
git checkout -b feature/my-feature
# 3. Install dependencies
npm install --legacy-peer-deps
# 4. Commit using Conventional Commits
git commit -m "feat(send): add amount validation"
# 5. Push and open a PR targeting develop
git push origin feature/my-featureThis project uses Conventional Commits:
| Prefix | Use for |
|---|---|
feat |
New feature |
fix |
Bug fix |
style |
UI / style changes |
refactor |
Code restructuring |
chore |
Tooling, config, deps |
docs |
Documentation |
test |
Tests |
Distributed under the MIT License. See LICENSE for details.
Made with β€οΈ by ekimkael







