JideGuru/FlutterEbookApp
36.4
Weak · 23 September 2026
27.1k
lines of production code
Dart
with JavaScript
5
measurements over time
What this system is
OpenLeaf is a cross-platform Flutter application designed for reading and exploring digital books, supporting Android, iOS, Web, and major desktop platforms. The system provides a unified reading experience with features for browsing genres, managing downloads and favorites, and persisting user preferences. It leverages a modern architecture utilizing Riverpod for state management and auto\_route for navigation, while integrating DRM capabilities and local storage for offline access.
How it got here
2020 — OpenLeaf rebrand and modernization
13 changes.
The project was rebranded to OpenLeaf, accompanied by a comprehensive modernization of the codebase. This included migrating state management to Riverpod, updating build configurations for Android and iOS, and upgrading dependencies to support newer Dart and Flutter versions.
2022–2023 — multi-platform and state management migration
18 changes.
This period focused on expanding the application's reach by adding desktop and web platform support for Flutter, alongside a comprehensive migration of the codebase to Riverpod for state management. The team also implemented auto\_route for navigation and reorganized feature modules to improve code structure and maintainability.
Features
Add dark and light theme assets to the reader widget
The reader widget now includes JSON files defining dark and light theme color schemes, allowing the component to adapt its visual appearance to the user's system or app-wide theme settings.
_packages/iridium/reader\widget · high confidence
Add mno\_commons and mno\_lcp packages with utility classes and LCP DRM API
The \packages/iridium/components/commons\ directory now contains the \mno\_commons\ package, providing shared utilities such as \Href\ for URI generation, \Try\ for success/failure encapsulation, \JSONable\ for JSON manipulation, and various extensions for strings, files, and data types. Additionally, the \packages/iridium/components/lcp\ directory introduces the \mno\_lcp\ package, which offers a Dart layer for implementing LCP DRM, including the necessary native library integration for Android and iOS.
packages/iridium/components · high confidence
Added Android and HTTP request/response handler implementations
New handler classes have been introduced to support Android and HTTP request processing. For Android, \AndroidRequest\ and \AndroidResponse\ wrap \WebResourceRequest\ and \WebResourceResponse\ respectively, providing a unified interface for server-side logic. For standard HTTP, \HttpRequest\ and \HttpResponse\ wrap \io.HttpRequest\ and \io.HttpResponse\, exposing standard HTTP headers and status codes. These additions enable the server to handle requests from both Android-specific contexts and general HTTP clients.
packages/iridium/components/server/lib/src/blocs/server/handlers/android, packages/iridium/components/server/lib/src/blocs/server/handlers/http · high confidence
Added Linux desktop platform support for Flutter
Added the Linux desktop platform files for the Flutter application, including the CMake build configuration, GTK application entry point, and generated plugin registrant for the url\_launcher\_linux plugin, enabling the app to be built and run on Linux desktops.
linux · high confidence
Added Windows desktop platform support
The application now supports the Windows desktop platform. This includes the necessary CMake build configurations, a native Windows runner to host the Flutter view, and generated plugin registrants for \permission\_handler\_windows\ and \url\_launcher\_windows\. Users can now build and run the app on Windows.
windows · high confidence
Added macOS platform support for the Flutter app
The macOS build target has been added to the project, enabling the application to run on Mac computers. This includes the necessary Xcode project configuration, Swift source files for the app delegate and main window, and the generated plugin registrant that registers Flutter plugins such as path\_provider, share\_plus, shared\_preferences, sqflite, and url\_launcher on the macOS platform.
macos · high confidence
Added web app manifest and HTML entry point for the Flutter web build
The web directory now includes the standard Flutter web entry point (index.html) and the web app manifest (manifest.json). This enables the application to be installed as a progressive web app (PWA) on mobile devices and provides metadata such as the app name, theme color, and icon assets required for a complete web deployment.
web · high confidence
Introduces common application layer with theme, data, and presentation components
The app now includes a shared 'common' module that centralizes core functionality. This includes a theme service that persists and manages the user's light/dark mode preference, along with local data sources and repositories for managing downloads and favorites using Sembast. The app's main entry point is now defined in \app.dart\, which configures the Material app with the selected theme and integrates a \Logman\ observer for network logging. Additionally, reusable UI widgets for displaying books and an animated page splitter are provided for the rest of the application.
lib/src/common · high confidence
New Explore and Genre screens with pagination support
The app now includes a new Explore screen that displays a feed of books, with a split-view layout on larger screens. Users can navigate to a Genre screen to view books within a specific category, featuring infinite scroll pagination that loads more items as the user scrolls to the bottom of the list.
lib/src/features/explore/presentation · high confidence
Removals
Removed legacy home and main screen components
The previous implementation of the home screen and the main application shell (including the bottom navigation bar and page view structure) has been removed from the codebase. This cleanup eliminates the old navigation and layout structure, indicating a shift in how the application's primary screens and navigation are organized.
lib/screen · high confidence
Behavioural changes
Home data layer refactored to use Riverpod and clean repository structure
The home feature's data layer has been restructured to use Riverpod for dependency injection, replacing the previous provider-based approach. A new HomeRepository class has been introduced to handle fetching popular and recent book feeds, with a corresponding auto-disposable provider for the repository. The data module now exports the repository via a dedicated repositories barrel file, consolidating the data access logic.
lib/src/features/home/data · high confidence
Introduce new home screen with responsive layout and feed loading
The home screen now displays a responsive layout that adapts to screen size: large screens show a split view with a main feed and navigation, while small screens use a single-column scrollable feed. The new \HomeFeedNotifier\ loads popular and recent feeds, and the UI handles loading, error, and data states with pull-to-refresh and animated transitions.
lib/src/features/home/presentation · high confidence
Introduced ExploreRepository for fetching genre feeds
Added a new ExploreRepository class and its provider in the explore feature's data layer. The repository exposes a getGenreFeed method that processes URLs and returns book data, wired via a Riverpod auto-disposable provider that watches a Dio client.
lib/src/features/explore/data · high confidence
Introduced Riverpod-based state management and UI for the book details screen
The book details feature now uses a new \BookDetailsNotifier\ (powered by Riverpod) to manage and fetch book data, replacing the previous state management approach. The \BookDetailsScreen\ has been updated to consume this provider, enabling features like dynamic favoriting and sharing. This change also includes the necessary export files (\notifiers.dart\, \presentation.dart\) to integrate the new presentation layer into the app's feature structure.
_lib/src/features/book\details/presentation · high confidence
Migrated Downloads and Favorites screens to auto\_route
The Downloads and Favorites features have been refactored to use the auto\_route package for navigation. This introduces @RoutePage() annotations on the DownloadsScreen and FavoritesScreen, enabling declarative, type-safe routing within the application. Users will experience consistent navigation behavior as these screens are now integrated into the centralized route configuration rather than relying on previous navigation mechanisms.
lib/src/features/downloads, lib/src/features/favorites · medium confidence
Migrated app navigation to auto\_route
The app's navigation system has been migrated to use the auto\_route package, replacing the previous routing implementation. This change introduces a new tab-based navigation structure for the main application, featuring a responsive layout with a bottom navigation bar on small screens and a navigation rail on large screens. The settings section has also been restructured to use auto\_route, including dedicated screens for licenses and settings. A debug overlay button has been added to the main tabs screen for easier access to the debug page.
lib/src/features/tabs · high confidence
Migrated book details data layer to Riverpod
The book details data layer has been refactored to use Riverpod for state management and dependency injection, replacing the previous provider-based approach. The BookDetailsRepository now utilizes the flutter\_riverpod package and exposes a Provider.autoDispose for dependency injection, integrating with the app's common utilities and HTTP client setup.
_lib/src/features/book\details/data · high confidence
Migrated state management from Provider to Riverpod
The application's state management has been migrated from the Provider package to Riverpod. In the main entry point, the app now initializes a ProviderScope to manage the global state, replacing the previous MultiProvider setup. This change also includes the removal of the custom MyApp widget and the direct instantiation of the App widget within the ProviderScope, simplifying the app's initialization and state management architecture.
lib · high confidence
Project renamed to OpenLeaf with expanded documentation
The project has been renamed from 'flutter\_ebook\_app' to 'OpenLeaf' (as shown in README.md). The README has been significantly expanded to include feature lists, screenshots, plugin usage, and author details. Additionally, an Apache 2.0 LICENSE file was added to the repository, and the .gitignore was updated to exclude .local and .gradle directories.
(repo-wide) · high confidence
Removed AppProvider state management class
The AppProvider class, which previously managed application state such as theme selection and navigation keys, has been removed from the codebase. This eliminates the use of ChangeNotifier for managing global app settings like light/dark mode and system UI overlays.
lib/providers · high confidence
Removed hardcoded theme and utility constants
The file lib/util/consts.dart, which previously defined app-wide color constants and light/dark theme configurations, has been removed. This eliminates the centralized theme definitions and the generic 'map' utility function that were previously exported from this location.
lib/util · high confidence
Reorganize feature modules into data/presentation exports
The codebase for the book details, explore, and home features has been restructured to expose their internal data and presentation layers via barrel files. This change consolidates the public API for each feature, making it easier to import and use the components associated with these sections of the app.
_lib/src/features/book\details, lib/src/features/explore, lib/src/features/home · medium confidence
Splash screen migration to auto\_route and updated UI
The splash screen has been refactored to use the auto\_route library for navigation, replacing the previous manual Navigator.pushReplacement with a typed route transition. Additionally, the splash screen UI has been updated to display the app icon image instead of the previous text and icon layout.
lib/src/features/splash · high confidence
Updated Android manifest and permissions for storage and network access
The Android application configuration has been updated to support modern Android storage and network requirements. The main manifest now declares permissions for external storage access (including MANage\_EXTERNAL\_STORAGE and READ/Write permissions) and media location, while also specifying the application name dynamically and enabling cleartext traffic for specific domains via a new network security configuration. Additionally, the legacy Apache HTTP library is included as an optional library, and the MainActivity class has been simplified by removing manual Flutter engine registration.
android/app · high confidence
Updated iOS workspace configuration
The iOS workspace configuration has been updated to include the 'Pods' project, ensuring that CocoaPods dependencies are correctly linked within the Xcode workspace. Additionally, a new 'IDEWorkspaceChecks.plist' file was added to track workspace integrity checks.
ios/Runner.xcworkspace · high confidence
iOS app renamed to OpenLeaf with updated build and network settings
The iOS application name has been changed from 'flutter\_ebook\_app' to 'OpenLeaf' in the Info.plist. The build version strings have been updated to use 'MARKETING\_VERSION' and 'CURRENT\_PROJECT\_VERSION' instead of Flutter's default placeholders. Additionally, the configuration now disables minimum frame duration on phones, allows arbitrary HTTP traffic via NSAppTransportSecurity, and updates supported interface orientations to include portrait modes while removing specific iPad orientation constraints.
ios/Runner · high confidence
iOS build configuration updated to support CocoaPods and modern Xcode standards
The iOS project has been updated to use CocoaPods for dependency management, replacing the previous manual framework embedding with an automated '\[CP\] Embed Pods Frameworks' build phase. This change introduces a 'Pods' group containing configuration files for debug, release, and profile builds, and updates the Xcode project file version to 54 (LastUpgradeCheck 1430) to align with newer Xcode standards.
ios/Runner.xcodeproj · high confidence
iOS minimum OS version increased to 11.0
The iOS deployment target has been raised from 8.0 to 11.0, meaning the app will no longer support iOS versions prior to 11.0.
ios/Flutter · high confidence
Test coverage
Disabled default widget smoke test
The default Flutter counter widget smoke test in test/widget\_test.dart has been commented out, effectively disabling the automated verification that the app's counter increments correctly. This reduces test coverage for the main application entry point.
test · high confidence
Dependencies
Updated Flutter dependencies and build configuration
The project has been upgraded to support Dart 3.0 and Flutter 3.3+, requiring a migration to null safety. Key dependency updates include adding \auto\_route\ for routing, \dio\ for network calls, \riverpod\ for state management, and \sebast\ for local storage. The Android build configuration was updated to use Gradle 7.2.2 and Kotlin 1.7.10, with the minimum SDK raised to 23 and compile SDK to 33. Additionally, the iOS platform was updated to target iOS 14.0.
(dependencies) · high confidence
Updated Gradle wrapper to version 7.5
The Gradle wrapper has been upgraded from version 5.6.2 to 7.5. This change updates the underlying build tooling, which may affect build performance, compatibility with newer Android/Java versions, and the behavior of Gradle tasks.
android/gradle · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 37 → 36 (-1.0)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 49 → 50 (+0.6)
- Architecture 100 → 97 (-2.4)
- Maturity 38 → 51 (+12.3)
- Readiness 20 → 25 (+4.5)
- Security 75 → 56 (-19.5)
- Domain Modelling 100 → 100 (+0.0)
- Accessibility 66 → 34 (-31.9)
Resolved (31)
- Coverage not included — suite not readable by the collector
- Critical CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- Critical CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- Critical CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- Critical CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (pubspec.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- High vulnerability: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- …and 11 more
New (187)
- (anonymous) (cognitive 17) (packages/iridium/components/navigator/assets/xpub-js/Gestures.js)
- (anonymous) (cognitive 17) (packages/iridium/components/navigator/assets/xpub-shared-js/jquerymobile-swipeupdown.js)
- (anonymous) (cyclomatic 16) (packages/iridium/components/navigator/assets/xpub-shared-js/jquerymobile-swipeupdown.js)
- (anonymous)::currentLocation (cognitive 17) (packages/iridium/components/navigator/assets/xpub-js/xpub_location.js)
- (anonymous)::openPage (cognitive 26) (packages/iridium/components/navigator/assets/xpub-js/xpub_navigation_reflow_layout.js)
- (anonymous)::openPage (cyclomatic 19) (packages/iridium/components/navigator/assets/xpub-js/xpub_navigation_reflow_layout.js)
- CfiNavigationLogic (cyclomatic 138) (packages/iridium/components/navigator/assets/xpub-js/utils/cfi_navigation_logic.js)
- CfiNavigationLogic::MNOGetFirstVisibleRange (cognitive 19) (packages/iridium/components/navigator/assets/xpub-js/utils/cfi_navigation_logic.js)
- CfiNavigationLogic::MNOGetLastVisibleRange (cognitive 19) (packages/iridium/components/navigator/assets/xpub-js/utils/cfi_navigation_logic.js)
- CfiNavigationLogic::findPageByRectangles (cognitive 16) (packages/iridium/components/navigator/assets/xpub-js/utils/cfi_navigation_logic.js)
- CfiNavigationLogic::getFirstVisibleMediaOverlayElement::traverseArray (cognitive 22) (packages/iridium/components/navigator/assets/xpub-js/utils/cfi_navigation_logic.js)
- ClassTooLong: MediaType (packages/iridium/components/shared/lib/src/mediatype/mediatype.dart)
- Critical CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- Critical CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- Critical CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- Critical CVE: [GHSA redacted] (packages/iridium/components/navigator/assets/_scripts/yarn.lock)
- DecorationGroup (cognitive 21) (packages/iridium/components/navigator/assets/_scripts/src/decorator.js)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no licence statement (README.md)
- Documentation: no usage examples (README.md)
- …and 167 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
JideGuru/FlutterEbookApp was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 23 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit b09736833197a9cfb3de39ffe8db2f7c1508056a — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-955b9cee9818.