A minimal, fast, and distraction-free ebook reader built with Flutter, designed for language learners, students, and knowledge workers.
Core differentiator: Instant dictionary lookup + inline notes while reading β making it a blend of Kindle, language learning, and research notes.
- EPUB & PDF support via
epub_viewandsyncfusion_flutter_pdfviewer - Reader themes: Light, Dark, and Sepia
- Adjustable font size for comfortable reading
- Reading progress bar with position memory (resume where you left off)
- Smooth scrolling with iOS-style bouncing physics
- Chapter navigator sidebar with auto-hide (slide-in TOC for EPUBs, page navigator for PDFs)
- Grid view of all uploaded books with cover images
- Sort by recently read
- Upload EPUB/PDF files directly from your device
- Custom book covers via image picker
- Progress indicator on each book
- Add notes directly from the reader via the AppBar
- Notes are linked to specific books
- View, edit, and delete all notes from the dedicated Notes tab
- Synced to Firestore in real-time
- Tap a word in the PDF reader to instantly look up its definition
- Uses the free Dictionary API
- Save words to your vocabulary list directly from the popup
- Highlight text passages with color options (Yellow, Green, Blue)
- Highlights saved to Firestore per book
- Automatically saves words you look up
- Review your vocabulary list in a dedicated tab
- Each word is linked back to the book it was found in
Flutter Android App
β
Firebase Services
ββ Firebase Storage β store ebook files
ββ Firestore β metadata, notes, highlights, vocabulary
ββ Firebase Auth β user authentication
lib/
βββ core/
β βββ theme/ # App themes & reader themes
β
βββ models/
β βββ book.dart # Book metadata model
β βββ note.dart # Note model
β βββ highlight.dart # Highlight model
β βββ vocabulary.dart # Vocabulary word model
β
βββ services/
β βββ firebase_service.dart # Firestore & Storage CRUD
β βββ auth_service.dart # Firebase Authentication
β βββ cache_service.dart # Local file caching
β βββ dictionary_service.dart # Dictionary API lookups
β
βββ features/
β βββ auth/ # Login & registration screens
β βββ library/ # Book grid, upload, providers
β βββ reader/ # EPUB & PDF reader screens
β β βββ epub_reader_screen.dart
β β βββ pdf_reader_screen.dart
β β βββ reader_settings.dart
β β βββ add_note_sheet.dart
β β βββ chapter_sidebar.dart
β βββ dictionary/ # Word lookup popup
β βββ notes/ # Notes list screen
β βββ vocabulary/ # Vocabulary list screen
β βββ settings/ # App settings
β
βββ main.dart
- Riverpod (
flutter_riverpod) β lightweight, compile-safe, and reactive
Database ID: ebook-reader
Edition: Standard
Location: nam5
Mode: Native
| Collection | Purpose |
|---|---|
books |
Book metadata & reading progress |
notes |
User notes per book |
highlights |
Text highlights per book |
vocabulary |
Saved dictionary lookups |
Firestore requires composite indexes for queries that filter and sort on different fields. Create these indexes via the Firebase Console (Firestore will provide direct links in the debug console if they're missing):
| Collection | Fields |
|---|---|
books |
user_id (Asc) + last_read (Desc) |
notes |
user_id (Asc) + created_at (Desc) |
vocabulary |
user_id (Asc) + created_at (Desc) |
ebooks/
βββ {user_id}/
βββ {book_id}.epub
βββ {book_id}.pdf
βββ {book_id}_cover.jpg
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}| Package | Purpose |
|---|---|
flutter_riverpod |
State management |
firebase_core |
Firebase initialization |
cloud_firestore |
Database |
firebase_storage |
File storage |
firebase_auth |
Authentication |
| Package | Purpose |
|---|---|
epub_view |
EPUB rendering |
syncfusion_flutter_pdfviewer |
PDF rendering |
| Package | Purpose |
|---|---|
path_provider |
Local file paths |
flutter_cache_manager |
Ebook file caching |
file_picker |
Book upload from device |
image_picker |
Custom cover images |
google_fonts |
Typography (Inter) |
http |
Dictionary API calls |
uuid |
Unique ID generation |
intl |
Date formatting |
shared_preferences |
Theme persistence |
- Flutter SDK
^3.11.1 - A Firebase project with Firestore, Storage, and Auth enabled
-
Clone the repository:
git clone https://github.com/sachinksamad1/ebook-reader.git cd ebook_reader -
Configure Firebase:
- Create a Firebase project
- Create a Firestore database (Native mode, Database ID:
ebook-reader) - Enable Firebase Storage and Authentication
- Add your
google-services.json(Android) toandroid/app/
-
Install dependencies:
flutter pub get
-
Run the app:
flutter run
Select file β Upload to Firebase Storage β Save metadata to Firestore β Display in Library
Select book β Download from Storage β Cache locally β Render in reader
Select text β Extract word β Call Dictionary API β Show popup β Optionally save to vocabulary
The project uses GitHub Actions for automated Android releases.
- Update the version in
pubspec.yaml(e.g.,version: 1.0.1+2). - Add entry to
CHANGELOG.mdwith the new version and its changes. - Commit and Push these changes to
main. - Create a Git Tag matching the version (e.g.,
v1.0.1+2):git tag v1.0.1+2 git push origin v1.0.1+2
The Build & Release workflow will automatically:
- Build the Android APK in release mode.
- Create a new GitHub Release with the APK attached.
- Use the content from
CHANGELOG.mdfor the release notes.
This project is for personal use.