A cross-platform mobile app that helps computer users practice the 20-20-20 rule to reduce eye strain and promote eye health.
Eye health experts recommend that for every 20 minutes of screen time, you should:
- Take a 20 second break
- Look at something 20 feet (6 meters) away
While 20-20-20 is easy to remember, it's easy to lose track of time when you're in the flow. ojo provides gentle reminders to give your eyes the break they deserve.
- β±οΈ Dual Timer System - 20-minute work periods and 20-second rest breaks
- π Audio Alerts - Gentle alarm sounds when timers complete
- π¨ Dynamic Theming - Visual theme changes between work and rest modes
- π Multi-language Support - Currently supports English and Spanish
- π± Cross-platform - Built with Flutter for Android, iOS, Web, Windows, and macOS
- β¨ Smooth Animations - Eye-catching animations powered by Rive
- Flutter (SDK ^3.6.1)
- Dart SDK (comes with Flutter)
- For Android: Android Studio / Android SDK
- For iOS: Xcode (macOS only)
- Clone the repository:
git clone https://github.com/bluestemso/ojo_app.git
cd ojo_app- Install dependencies:
flutter pub get- Run the app:
flutter run# Android
flutter run -d android
# iOS
flutter run -d ios
# Web
flutter run -d chrome
# Windows
flutter run -d windows
# macOS
flutter run -d macos# Build APK
flutter build apk --release
# Build App Bundle (for Play Store)
flutter build appbundle --releaseflutter build ios --releaseflutter build web --release- Start Screen - User is greeted by an animated eye and a "Start" button
- First-Time Users - A modal explains the 20-20-20 rule (dismissible)
- Work Period - 20-minute timer with dark theme, showing countdown
- Work Complete - Alarm plays, light theme returns, "Start Rest" button appears
- Rest Period - 20-second timer, encouraging you to look away
- Ready to Work - Alarm plays, "Start Work" button ready for next cycle
work (20 min) β workComplete β rest (20 sec) β ready β work (repeat)
- Flutter - UI framework
- Dart - Programming language
- Material Design 3 - Design system
- provider (^6.1.2) - State management
- flex_color_scheme (^8.1.1) - Advanced theming
- rive (^0.13.20) - Vector animations
- audioplayers (^5.2.1) - Audio playback
- url_launcher (^6.2.5) - External link support
- flutter_localizations - Internationalization
lib/
βββ main.dart # App entry point
βββ flex_theme.dart # Theme configuration
βββ providers/
β βββ timer_provider.dart # State management
βββ screens/
β βββ start_screen.dart # Welcome screen
β βββ timer_screen.dart # Main timer UI
β βββ settings_screen.dart # App settings
βββ l10n/ # Localization files
βββ app_en.arb # English
βββ app_es.arb # Spanish
This project follows Flutter's recommended linting rules:
# Analyze code
flutter analyze
# Format code
flutter format .# Run all tests
flutter test
# Run with coverage
flutter test --coverage- Edit the appropriate
.arbfile inlib/l10n/ - Run the Flutter code generation:
flutter pub get- The localization code is auto-generated
Current Version: 1.0.2 (build 4)
Contributions are welcome! Please feel free to submit a Pull Request.
This project is part of Bluestem Solutions.
Found a bug or have a feature request? Please open an issue.
Want to rate the app? Find us on the Google Play Store.
- Eye health guidelines based on recommendations from optometry professionals
- Built with β€οΈ using Flutter
- Special thanks to the Flutter community for excellent packages
Remember: Your eyes deserve a break. Take care of them! ποΈβ¨
