Recall is a personal project designed to explore the integration of AI (On-Device + Cloud) into mobile apps while pushing the boundaries of UI design with a Neo-Brutalist aesthetic. It aims to make learning engaging through gamification and automated flashcard generation.
- Dual AI Power:
- On-Device: Uses
flutter_gemmafor local, privacy-focused generation. - Cloud: Integrates with Google Gemini via Firebase for extensive knowledge retrieval and image generation.
- On-Device: Uses
- Fully Responsive: Built with
responsive_frameworkand a customresponsive_scalerto ensure a perfect look on any device size. - Gamified Experience: High-contrast, bold Neo-Brutalist design.
- Smart Notifications: Daily reminders to review your flashcards.
- Secure: Firebase Authentication and Firestore backend.
recall.mp4
- Framework: Flutter
- State Management: BLoC
- AI:
flutter_gemma(Local), Google Gemini (Cloud) - Backend: Firebase (Auth, Firestore)
- UI:
responsive_framework+responsive_scaler, Custom Neo-Brutalist widgets
This project follows Clean Architecture principles structured by Features to ensure scalability, separation of concerns, and maintainability.
lib/
├── core/ # Shared app-wide functionality
│ ├── configs/ # App configuration (e.g. Gemini/HuggingFace keys)
│ ├── database/ # Local persistence and storage
│ ├── network/ # Network abstractions
│ ├── notifications/ # Local push notifications setup
│ ├── theme/ # Neo-brutalist styling & custom colors
│ ├── usecases/ # Base UseCase classes
│ ├── utils/ # Helper extensions and formatting functions
│ └── widgets/ # Common reusable UI components
├── features/ # Feature-based, independent modules
│ ├── auth/ # Authentication feature
│ │ ├── data/ # API clients, DTOs, DataSources
│ │ ├── domain/ # Entities, Repository Interfaces, UseCases
│ │ └── presentation/ # UI Pages, Auth BLoC, Auth Widgets
│ └── recall/ # Core AI flashcard & learning feature
│ ├── data/ # Models, Local/Remote DataSources, AI Services
│ ├── domain/ # Core business logic (Deck, Cards, Repositories)
│ └── presentation/ # UI Pages, DeckBloc, QuizBloc, Feature Widgets
├── injection_container.dart # Dependency Injection setup (GetIt)
└── main.dart # Application entry point
This project uses both local and cloud AI services, which requires specific configuration files.
To use the on-device generation capabilities (Gemma), you need a Hugging Face token.
- Create a file named
config.jsonin the root of your project. - Add your Hugging Face token:
Note: For implementation details, this project refers to the Google AI Edge Gallery.
{ "HUGGINGFACE_TOKEN": "YOUR_HUGGING_FACE_TOKEN" }
- Create a Firebase Project: Go to the Firebase Console and create a new project.
- Add Apps: Add Android and iOS apps to your project. Download
google-services.json(for Android) andGoogleService-Info.plist(for iOS) and place them in their respective folders. - Enable Authentication: Enable Email/Password or your preferred sign-in method.
- Enable Firestore: Create a Firestore database.
- Set Security Rules: Update your Firestore rules to the following to ensure user data privacy:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // Match any document inside the 'users' collection match /users/{userId}/{document=**} { // Allow access ONLY if the user is logged in // AND their Auth ID matches the Document ID allow read, write: if request.auth != null && request.auth.uid == userId; } } } - Enable Blaze Plan (For Image Generation):
- Important: For image generation features, your Firebase project must be on the Blaze (Pay as you go) plan.
Since the project uses config.json for sensitive keys, you must include it in your build commands.
Debug Mode:
flutter run --debug --dart-define-from-file=config.jsonRelease Mode:
flutter run --release --dart-define-from-file=config.jsonBuild APK:
flutter build apk --release --dart-define-from-file=config.jsonThis project is licensed under the MIT License - see the LICENSE file for details.

