A dopamine-driven productivity planner designed for users with ADHD
Focus Quest is a dopamine-driven productivity planner designed specifically for users with ADHD. It focuses on overcoming executive dysfunction, time blindness, and task initiation paralysis through gamification and low-friction interactions.
- Anti-Shame Design: No guilt trips, just progress
- Low Friction: Create tasks in seconds, not minutes
- Gamification: Earn XP, level up, unlock achievements
- Dopamine Optimization: Visual feedback, streaks, and instant gratification
- Local-First & Cloud Sync: Data lives on your device, with optional cloud backup
- Quest Management: Anti-shame, low-friction task creation with categories and energy levels
- Sub-Quests: 5-minute micro-tasks to combat overwhelm
- Focus Mode: Pomodoro-style timer with strict mode, pause tracking, and state persistence
- Cloud Sync: Secure Google Sign-In with cross-device synchronization (Firestore)
- Progress System: XP, leveling, streaks, and achievements
- Smart Notifications: Persistent timer alerts and pause reminders
- Personalized Experience: Dynamic time-based greetings and user display name
- Theme Support: Light/Dark mode with persistent preference
- Multi-Platform: Fully responsive design for Android, iOS, macOS, Linux, Windows, and Web
The project follows a Local-First with Cloud Sync architecture. The local Sembast database acts as the single source of truth for the UI to ensure instant reactivity, while a background SyncService handles data synchronization with Cloud Firestore.
For a detailed breakdown of the system architecture, module breakdown, and technical stack, please refer to:
lib/
├── core/
│ ├── theme/
│ ├── constants/
│ ├── utils/
│ └── widgets/
├── features/
│ ├── auth/ # Login, Sign up, Auth State
│ ├── tasks/ # Quests, SubQuests, Brain Dump
│ ├── journal/ # Daily Reflection, Mood
│ ├── timer/ # Focus Mode, Pomodoro, Session Tracking
│ ├── profile/ # XP, Level, Stats, Heatmap
│ └── settings/ # Sync Controller, Theme Toggle
├── l10n/ # Localization ARB files
├── models/ # Quest, FocusSession, JournalEntry, UserProgress
├── providers/ # State Management
└── services/ # Sembast, Firestore, Notifications, Audio/Haptics
- Flutter SDK (3.0 or higher)
- Dart SDK (3.0 or higher)
- Platform-specific requirements:
- Android: Android Studio, SDK 21+
- iOS: Xcode 13+, macOS
- Web: Chrome (for development)
- Desktop: Platform-specific toolchains
-
Clone the repository
git clone https://github.com/yourusername/focus_quest.git cd focus_quest -
Install dependencies
flutter pub get
-
Generate localization files
flutter gen-l10n
-
Run the app
# For development on your default device flutter run # For specific platforms flutter run -d chrome # Web flutter run -d macos # macOS flutter run -d android # Android flutter run -d ios # iOS
# Android APK
flutter build apk --release
# Android App Bundle
flutter build appbundle --release
# iOS
flutter build ios --release
# macOS
flutter build macos --release
# Web
flutter build web --release
# Windows
flutter build windows --release
# Linux
flutter build linux --release- Features Overview - Detailed feature breakdown
- High-Level Design (HLD) - System architecture and technical stack
- Theme System - Theming implementation guide
- Contributing Guidelines - How to contribute
- Firebase Configuration - Firebase setup (optional)
This project uses Flutter's official localization system with ARB (Application Resource Bundle) files.
The following setup has been completed for this project:
dependencies:
flutter_localizations:
sdk: flutter
intl: ^0.20.2flutter:
generate: truearb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dartimport 'package:flutter_localizations/flutter_localizations.dart';
import 'package:focus_quest/l10n/app_localizations.dart';
MaterialApp(
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [
Locale('en'),
Locale('es'),
],
// ...
)Follow these steps to add new translatable strings:
Edit lib/l10n/app_en.arb:
{
"@@locale": "en",
"appTitle": "FocusQuest",
"@appTitle": {
"description": "The application title"
},
"welcomeMessage": "Welcome to FocusQuest!",
"@welcomeMessage": {
"description": "Welcome message shown on the home screen"
}
}Note: The
@<key>entries are metadata (description, placeholders) and are only needed in the template file (app_en.arb).
Edit lib/l10n/app_es.arb:
{
"@@locale": "es",
"appTitle": "FocusQuest",
"welcomeMessage": "¡Bienvenido a FocusQuest!"
}Run Flutter build or generate command:
flutter gen-l10nOr simply run your app — Flutter auto-generates on build:
flutter runThe generated files will appear in lib/l10n/:
app_localizations.dartapp_localizations_en.dartapp_localizations_es.dart
import 'package:focus_quest/l10n/app_localizations.dart';
// In your widget:
Text(AppLocalizations.of(context)!.welcomeMessage)For dynamic values, use placeholders:
{
"questsCompleted": "You completed {count} quests today!",
"@questsCompleted": {
"description": "Message showing number of completed quests",
"placeholders": {
"count": {
"type": "int",
"example": "5"
}
}
}
}{
"questsCompleted": "¡Completaste {count} misiones hoy!"
}Text(AppLocalizations.of(context)!.questsCompleted(5))Create lib/l10n/app_<locale>.arb (e.g., app_fr.arb for French):
{
"@@locale": "fr",
"appTitle": "FocusQuest",
"welcomeMessage": "Bienvenue sur FocusQuest!"
}Update main.dart:
supportedLocales: const [
Locale('en'),
Locale('es'),
Locale('fr'), // Add new locale
],flutter gen-l10nFor plural forms, use the ICU message format:
{
"itemCount": "{count, plural, =0{No items} =1{1 item} other{{count} items}}",
"@itemCount": {
"description": "Shows the number of items",
"placeholders": {
"count": {
"type": "int"
}
}
}
}Text(AppLocalizations.of(context)!.itemCount(items.length))-
Always add descriptions to your template ARB file (
app_en.arb) — they help translators understand context. -
Use meaningful keys — prefer
welcomeMessageovermsg1. -
Keep translations in sync — when adding a key to
app_en.arb, add it to all other locale files. -
Test all locales — verify translations display correctly, especially for longer text that might overflow UI elements.
-
Use placeholders for dynamic content — never concatenate translated strings.
This project is a starting point for a Flutter application.
For help getting started with Flutter development, view the online documentation.