
Transform your screen time into real-world adventures
Features β’ Getting Started β’ Architecture β’ Development β’ Testing β’ Contributing
UnQuest is a gamified mobile application that encourages users to disconnect from their phones and engage with the real world through story-driven quests, challenges, and social adventures. By transforming daily activities into epic quests, UnQuest makes digital detox fun and rewarding.
- π Story Quests: Immersive narrative-driven adventures with branching paths, audio narration, and location-based challenges
- β¨ Custom Quests: Create personalized challenges tailored to your goals and lifestyle
- π₯ Cooperative Quests: Team up with friends for multiplayer challenges with real-time coordination
- π Character Progression: Earn XP, level up, maintain streaks, and unlock achievements
- πΊοΈ Interactive Map: Discover points of interest and track your quest journey
- π Leaderboards: Compete with friends and the community
- π Smart Reminders: Customizable notifications to help you stay on track
- π Premium Features: Enhanced quest options, advanced statistics, and exclusive content
- Node.js (v18 or higher)
- pnpm (v8 or higher)
- Expo CLI
- React Native development environment
- iOS Simulator (Mac only) or Android Emulator
-
Clone the repository
git clone https://github.com/yourusername/unquest.git cd unquest
-
Install dependencies
pnpm install
-
Set up environment variables
cp .env.example .env.development # Edit .env.development with your configuration
-
iOS Setup (Mac only)
cd ios && pod install cd ..
-
Start the development server
pnpm start
-
Run the app
# iOS pnpm ios # Android pnpm android
- Framework: React Native 0.75 + Expo SDK 52
- Language: TypeScript
- Navigation: Expo Router (file-based routing)
- State Management: Zustand with MMKV persistence
- API Layer: Axios + TanStack Query
- Styling: NativeWind (Tailwind for React Native)
- Testing: Jest + React Native Testing Library + Maestro
- CI/CD: GitHub Actions + EAS Build
unquest/
βββ src/
β βββ api/ # API clients and hooks
β βββ app/ # Expo Router screens and navigation
β β βββ (app)/ # Main app tab navigation
β β βββ auth/ # Authentication flows
β β βββ onboarding/ # Onboarding screens
β βββ components/ # Reusable UI components
β βββ hooks/ # Custom React hooks
β βββ lib/ # Utilities and services
β β βββ auth/ # Authentication logic
β β βββ navigation/ # Navigation resolver
β β βββ services/ # Business logic services
β βββ store/ # Zustand state stores
β βββ types/ # TypeScript type definitions
βββ assets/ # Images, fonts, and static files
βββ .github/ # GitHub Actions workflows
βββ docs/ # Additional documentation
Users can experience the app and complete quests before creating an account, reducing friction and improving conversion.
Quests continue running when the app is backgrounded, using native background task APIs for accurate time tracking.
Zustand stores with MMKV persistence provide fast, synchronous state access with automatic persistence.
Complex routing logic centralized in navigation-state-resolver.ts
ensures users are always on the correct screen based on auth status, onboarding progress, and active quests.
# Development
pnpm start # Start Expo dev server
pnpm ios # Run on iOS simulator
pnpm android # Run on Android emulator
# Environment-specific builds
pnpm ios:staging # iOS with staging environment
pnpm android:production # Android with production environment
# Code Quality
pnpm lint # Run ESLint
pnpm type-check # TypeScript type checking
pnpm test # Run Jest tests
pnpm test:watch # Run tests in watch mode
pnpm check-all # Run all checks (lint, type-check, tests)
# Building
pnpm build:production:ios # Production iOS build
pnpm build:production:android # Production Android build
- File naming: Use kebab-case (e.g.,
quest-timer.ts
) - Component structure: Functional components with hooks
- Imports: Use absolute imports via
@/
alias - State management: Prefer direct Zustand actions over hooks when possible
- Testing: Co-locate test files with components (
.test.tsx
) - Styling: Use NativeWind classes, avoid inline styles
- Create a feature branch from
main
- Make your changes following the code style guidelines
- Run
pnpm check-all
before committing - Write clear, descriptive commit messages
- Open a pull request with a detailed description
# Run all tests
pnpm test
# Run tests in watch mode
pnpm test:watch
# Run tests with coverage
pnpm test:ci
# Run specific test file
pnpm test src/app/index.test.tsx
# E2E tests with Maestro
pnpm e2e-test
- Unit Tests: Business logic and utilities
- Component Tests: UI components with React Native Testing Library
- Integration Tests: API interactions and state management
- E2E Tests: Critical user flows with Maestro
Current test coverage: ~40% (improving to 60%+ for critical paths)
- Lazy Loading: Components and screens loaded on demand
- Image Optimization: Cached and compressed images
- State Management: Direct Zustand subscriptions for real-time updates
- List Virtualization: FlatList for long scrollable content
- Memoization: React.memo and useMemo for expensive computations
- Environment variables properly managed and excluded from version control
- JWT-based authentication with secure token storage
- API request/response validation
- No hardcoded credentials or sensitive data
- Regular dependency updates and security audits
We welcome contributions! Please see our Contributing Guide for details on:
- Code of Conduct
- Development setup
- Submitting pull requests
- Reporting issues
- Feature requests
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with Expo and React Native
- UI components inspired by NativeWind
- State management powered by Zustand
- API layer built with TanStack Query
For questions, suggestions, or support, please open an issue on GitHub or contact the maintainers.
Built with β€οΈ for digital wellness
Website β’