A React Native mobile app for managing gifticons with expiry date reminders.
- OCR Recognition: Automatically extract expiry dates from gifticon images using ML Kit
- Push Notifications: Receive reminders before your gifticons expire
- Local Storage: All data stored locally using SQLite
- Cross-Platform: Works on both iOS and Android
- Framework: React Native with Expo SDK 53
- Routing: Expo Router (file-based routing)
- Database: expo-sqlite
- OCR: @react-native-ml-kit/text-recognition
- Notifications: expo-notifications
- State Management: Zustand
- Error Tracking: Sentry
- Ads: Google AdMob
This project follows Feature Sliced Design (FSD) architecture:
src/
├── entities/ # Business entities (read operations)
├── features/ # Business logic (CUD operations)
├── widgets/ # Composed UI blocks
└── shared/ # Shared utilities, hooks, services
- Node.js 18+
- npm or pnpm
- Expo CLI
- iOS Simulator (Mac) or Android Emulator
-
Clone the repository
git clone https://github.com/boaz-hwang/app-sample-repo.git cd app-sample-repo -
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env.local # Edit .env.local with your values -
Start the development server
npx expo start
| Variable | Description |
|---|---|
EXPO_PUBLIC_SENTRY_DSN |
Sentry Data Source Name for error tracking |
SENTRY_AUTH_TOKEN |
Sentry auth token for source maps |
SENTRY_ORG |
Sentry organization name |
SENTRY_PROJECT |
Sentry project name |
eas build --profile development --platform ios
eas build --profile development --platform androideas build --profile production --platform all├── app/ # Expo Router pages
│ ├── (tabs)/ # Tab navigation screens
│ └── _layout.tsx # Root layout
├── src/
│ ├── entities/ # Domain entities
│ ├── features/ # Feature modules
│ ├── widgets/ # UI widgets
│ └── shared/ # Shared code
│ ├── db/ # Database utilities
│ ├── hooks/ # Custom hooks
│ ├── services/ # Services (OCR, notifications)
│ └── ui/ # UI components
├── assets/ # Static assets
└── app.json # Expo configuration
MIT