Skip to content

ekimkael/cashmate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

36 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ’Έ CashMate

Personal finance & peer-to-peer payment app

Expo SDK React Native React TypeScript License: MIT Version PRs Welcome

A fully-featured mobile UI prototype for a digital wallet and P2P payment experience β€” built with Expo SDK 56, React 19, and TypeScript.


Features

  • πŸ’³ 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

Screenshots

Splash Home Activity Banking Profile
Send Flow Card Management QR Code

Tech Stack

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)

Getting Started

Prerequisites

  • Node.js β‰₯ 20
  • npm β‰₯ 10
  • Expo Go on your device, or an iOS/Android simulator

Installation

# 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 start

Note: --legacy-peer-deps is required because lucide-react-native declares a peer dependency on React 16–18, while this project uses React 19.

Running on a specific platform

npm run ios       # iOS simulator
npm run android   # Android emulator
npm run web       # Web browser

Note: This is a UI prototype. All data is mocked locally β€” no backend or network calls are made.


Project Structure

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

Architecture

State Management

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()

Custom Hooks

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

Routing Pattern

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.

Data Flow

Mock Data (mocks/data.ts)
       β”‚
       β–Ό
  Zustand Stores  ◄──────── User interactions
       β”‚
       β–Ό
  Screen Components  ──►  Expo Router navigation

Roadmap

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

Contributing

Contributions are welcome! Please read through the workflow before opening a PR.

Branch Strategy

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)

Workflow

# 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-feature

Commit Convention

This 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

License

Distributed under the MIT License. See LICENSE for details.


Made with ❀️ by ekimkael

About

πŸ’Έ CashMate β€” Personal finance & P2P payment app built with Expo SDK 56, React 19 and TypeScript

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors