A beautifully crafted React Native app for building daily coding routines with articles, progress tracking, and community features.
Download and try the live version of this app!
- 📚 Daily Articles: Curated coding articles delivered daily
- 📊 Progress Tracking: Track reading streaks and learning progress
- 🔥 Reading Streaks: Gamified learning experience
- 🌙 Dark/Light Theme: Beautiful adaptive themes
- 📱 Offline Reading: Read articles without internet connection
- 🔔 Push Notifications: Stay notified about new content
- 🎧 Podcast Mode: AI-generated audio versions of articles
- 🌍 Multi-language: Support for multiple languages
- ⭐ Favorites: Save articles for later reading
- 📈 Analytics: Track your learning journey
- 💾 Local Storage: All data stored locally with optional cloud sync
- 🔒 Privacy-First: Your data stays on your device
This app follows a clean architecture pattern with:
- Frontend: React Native with Expo
- State Management: React Context + Hooks
- Local Storage: AsyncStorage with structured data
- Primary Database: Firebase (user data, settings, progress)
- Content Management: RESTful API (articles, notifications)
- Authentication: No authentication required, the app is fully functional without accounts
- Push Notifications: Expo Push Notifications
- Analytics: Firebase Crashlytics for logging errors plus custom read counts and likes (anonymous)
The app uses a hybrid architecture that combines Firebase for user data management with a custom REST API for content management:
Firebase handles: Article content delivery, stats, and push notification tokens.
REST API handles: Article management, content generation (summaries, translations, podcasts), push notifications triggers and admin functions.
- Node.js 18+
- npm or yarn
- Expo CLI (npm install -g @expo/cli)
- iOS Simulator (Mac) or Android Studio
- Clone the repository
- Install dependencies
- Configure environment
- Start development server
-
Create a Firebase project
# Visit https://console.firebase.google.com # Create new project # Enable Authentication, Firestore, and Cloud Messaging -
Configure Authentication
# Enable Email/Password and Google Sign-In # Configure OAuth settings for your domain -
Setup Firestore Database
# Create Firestore database in production mode # Use the database structure provided above -
Get Firebase configuration
# Project Settings > General > Your apps # Copy the config object values to your .env file
The REST API is optional and only needed for content management and advanced features. The app works fully with just Firebase.
When you need the REST API:
- Adding new articles programmatically
- Push notification management
- AI features (podcasts, translations, summaries)
- Administrative dashboards
Implementation options:
-
Use the provided OpenAPI spec
- Implement endpoints from api-spec.yaml
- Focus on articles and notifications endpoints
-
Simple backend options
- Node.js with Express + your preferred database
- Python with FastAPI or Django
- PHP with Laravel or Slim
- Any REST API framework
-
Mock API for development
- Use JSON Server with the provided schema
- Perfect for testing and development
Without the REST API: You can manually add articles directly to Firebase Firestore and the app will work perfectly.
The app uses Firebase Firestore with the following collections and document structure:
The REST API handles content management and administrative functions. See api-spec.yaml for the complete OpenAPI 3.0 specification.
All API endpoints require an access token in the header:
The API supports generating audio versions of articles:
- Asynchronous processing with status tracking
- Multiple language support
- Background generation with webhooks
Multi-language support for articles:
- Supported languages: Italian, Spanish, German, French
- AI-powered translations
- Cached results for performance
Privacy-first analytics system:
- Tracks reading patterns without PII
- Platform-specific metrics (iOS/Android/Web)
- Hashed device identifiers for privacy
- React Native: Cross-platform mobile development
- Expo: Development toolchain and platform
- TypeScript: Type-safe JavaScript
- AsyncStorage: Local data persistence
- React Navigation: Navigation system
- Expo Notifications: Push notifications
- Vitest: Testing framework
The project includes comprehensive testing:
- Unit tests for services and utilities
- Component testing for UI components
- Integration tests for user flows
- Storage and data persistence tests
- Onboarding flow tests
For local development with Expo Go:
Customize Firebase behavior in src/config/firebase.ts:
The app supports custom themes. Modify src/context/ThemeContext.tsx:
- Create components in src/components/
- Add screens in src/screens/
- Update navigation in src/components/Navigation.tsx
- Add Firebase collections if needed
- Update API endpoints if required
- Add types in src/types/
- Write tests for new functionality
The app uses both Firebase and local storage:
We welcome contributions! Please see CONTRIBUTING.md for details.
- Fork the repository
- Create a feature branch (git checkout -b feature/amazing-feature)
- Make your changes
- Add tests for new functionality
- Ensure all tests pass (npm test)
- Commit your changes (git commit -m 'Add amazing feature')
- Push to the branch (git push origin feature/amazing-feature)
- Open a Pull Request
- Follow TypeScript best practices
- Use the provided ESLint configuration
- Write tests for new features
- Update documentation as needed
- Follow existing naming conventions
- Lazy Loading: Components loaded on demand
- Memoization: React.memo and useMemo where appropriate
- Efficient Re-renders: Optimized state management
- Image Optimization: Cached images and assets
- Bundle Optimization: Optimized build output
Monitor app performance with:
- React DevTools
- Flipper integration (for debugging)
- Custom analytics tracking
- Error boundary implementations
- All sensitive data stored securely
- No hardcoded secrets in source code
- Environment variable configuration
- Secure API communication (HTTPS only)
- Input validation and sanitization
- Local-First: All data stored locally by default
- No Tracking: No analytics without explicit consent
- Optional Cloud Sync: Users choose whether to sync data
- Transparent: Clear about what data is collected
- User Control: Users can delete all data anytime
All API requests require an access token:
API responses follow this format:
Be mindful of rate limiting in your backend implementation:
- Implement appropriate rate limits per user/IP
- Return proper HTTP status codes (429 for rate limit exceeded)
- Include retry headers when applicable
"Access token not configured"
- Copy .env.example to .env
- Set EXPO_PUBLIC_ACCESS_TOKEN in your .env file
"Network request failed"
- Check EXPO_PUBLIC_API_BASE_URL configuration
- Verify your backend is running and accessible
- Check device network connectivity
Build failures
- Clear Metro cache: npx expo start --clear
- Delete node_modules and reinstall: rm -rf node_modules && npm install
- Update Expo CLI: npm install -g @expo/cli@latest
TypeScript errors
- Run type checking: npm run type-check
- Check for missing type definitions
- Ensure all imports are correctly typed
- Check the Issues page
- Start a Discussion
- Review existing code for examples
- Install EAS CLI: npm install -g eas-cli
- Configure: eas build:configure
- Build: eas build --platform all
- Eject from Expo (if needed): npx expo eject
- Follow standard React Native build process
- Use Xcode (iOS) or Android Studio (Android)
- Build for web: npx expo export:web
- Deploy static files to any hosting service
- Configure routing for SPA behavior
This project is licensed under the MIT License - see the LICENSE file for details.
- React Native Community: For the amazing framework
- Expo Team: For excellent development tools
- Open Source Contributors: Everyone who has contributed
- The Developer Community: For inspiration and feedback
- Web version optimization
- Enhanced offline capabilities
- Plugin system for custom backends
- Advanced theming system
- Accessibility improvements
- Performance optimizations
- Community features
Made with ❤️ by Edoardo Dusi
If this project helped you, please consider giving it a ⭐️