elrizwiraswara/flutter_pos
60.0
Adequate · 21 September 2026
11k
lines of production code
Dart
primary language
4
measurements over time
What this system is
This system is a cross-platform Point of Sale (POS) application built with Flutter, designed to manage inventory, process sales transactions, and handle user authentication. It features an offline-first architecture that synchronizes local SQLite data with remote Firebase services, ensuring data consistency across Android, iOS, Windows, macOS, and Linux platforms. The application provides comprehensive tools for product and transaction management, thermal printer integration, and secure user access, all supported by a robust, test-covered codebase.
How it got here
2024 — Cross-platform feature expansion and architecture migration
16 changes.
The project underwent a significant architectural shift to asynchronous initialization and Riverpod state management, while simultaneously expanding platform support for Linux, macOS, and Windows. This period also introduced comprehensive UI features including product and transaction management, authentication flows, and printer connectivity across all supported operating systems.
2025–2026 — Offline-first architecture and UI standardization
21 changes.
The project established a comprehensive offline-first data layer with automatic synchronization and queued actions, supported by standardized domain and repository interfaces. Concurrently, the codebase introduced a suite of reusable UI components and migrated state management to the Riverpod pattern, while adding extensive test coverage for the new architecture.
Features
Added data source interfaces for core domain entities
New abstract interfaces have been introduced to define the contract for data access across the application. These include AuthDataSource for authentication, ProductDatasource for product management, QueuedActionDatasource for background actions, StorageDataSource for image uploads, TransactionDatasource for financial records, and UserDatasource for user profiles. Each interface specifies the methods required to interact with the underlying data layer, establishing a clear separation of concerns and enabling dependency injection for these components.
lib/data/datasources/interfaces · high confidence
Added domain entities for transactions, products, users, and queued actions
Introduced new domain-layer models to support core application features. The update adds \TransactionEntity\ to represent sales and payment records, \ProductEntity\ for inventory items, \UserEntity\ for account data, and \QueuedActionEntity\ for background processing. Each entity includes immutable fields, copy methods, and equality support via the \equatable\ package, enabling consistent data handling across the domain layer.
lib/domain/entities · high confidence
Added iOS Firebase configuration files
The iOS build now includes GoogleService-Info.plist and firebase\_app\_id.json, which provide the necessary Firebase project identifiers (such as the Google App ID and Project ID) to enable Firebase services on iOS devices.
ios · high confidence
Added product management screens and UI components
Users can now view a paginated, searchable list of products, create new products, edit existing ones, and view detailed information for each item. The update introduces the ProductsScreen with infinite scroll and search capabilities, a ProductFormScreen for creating and editing product details, and a ProductDetailScreen for viewing individual product data.
lib/presentation/screens/products · high confidence
Enable macOS platform support for Firebase and device plugins
The macOS build now registers a comprehensive set of plugins, including Firebase services (Firestore, Auth, Crashlytics, Storage), device information, file selection, and connectivity. This enables the app to utilize these capabilities on macOS, aligning the platform's plugin registry with the features already present in the codebase.
macos · high confidence
Implemented app routing and navigation structure
The application now features a complete navigation setup using GoRouter. This includes an authentication guard that redirects unauthenticated users to the sign-in screen and authenticated users to the home screen. The route tree is organized into a splash screen, a main shell containing the home, products, transactions, and account sections, and an error screen that accepts an ErrorScreenParam to display error details.
lib/app/routes · high confidence
Implemented local data sources for products, transactions, users, and queued actions
Added new local data source implementations for Product, QueuedAction, Transaction, and User entities, each providing CRUD operations backed by the local SQLite database. The Transaction data source includes complex logic to manage ordered products and update product stock/sold counts within database transactions, while the others handle standard create, read, update, and delete operations.
lib/data/datasources/local · high confidence
Implemented remote data sources for authentication, user, product, and transaction management
Added new remote data source implementations for handling Firebase Authentication (Google Sign-In, sign-out, and current user retrieval), user profile CRUD operations, product management (including a paginated query with search and sorting), and transaction processing (creating, updating, and deleting transactions with stock updates). These changes introduce the core backend integration layer for the application's data layer.
lib/data/datasources/remote · high confidence
Initial domain layer usecases for authentication, products, transactions, and users
The domain layer's usecase files have been introduced, providing the primary interface for business logic across the application. This includes authentication operations (sign-in, sign-out, get current user), product management (sync, get, create, update, delete), transaction handling (sync, get, create, update, delete), user profile management (get, create, update, delete), as well as queued actions and storage uploads. Each usecase delegates to its respective repository, wrapping results in a standard Result type.
lib/domain/usecases · high confidence
Introduce HomeScreen with scroll pagination and search
A new HomeScreen is added to the app, featuring a scrollable product grid that automatically loads more items as the user scrolls to the bottom (pagination). The screen also includes a search field for filtering products, a pull-to-refresh mechanism, and a sliding panel for the cart. The implementation uses Riverpod for state management and integrates with the existing products and main notifiers.
lib/presentation/screens/home · high confidence
Introduced a new set of reusable UI components
Added a collection of new, consistent UI widgets to the application, including AppButton, AppDialog, AppDropDown, AppEmptyState, AppErrorWidget, AppIconButton, AppLoadingMoreIndicator, AppProgressIndicator, AppSnackBar, and AppTextField. These components provide a standardized look and feel across the app, handling common interactions like form input, navigation, and status feedback.
lib/presentation/widgets · high confidence
Introduced data models for core domain entities
Added new data models for User, Product, Transaction, QueuedAction, and OrderedProduct. Each model includes JSON serialization (fromJson/toJson) and entity conversion (fromEntity/toEntity) methods, enabling the application to persist and retrieve structured data for these entities.
lib/data/models · high confidence
Introduced domain-layer repository interfaces for core entities
The application now defines abstract repository interfaces for managing authentication, products, transactions, user data, storage, and queued actions. These interfaces standardize how the domain layer interacts with data sources, providing methods for syncing, creating, updating, and deleting entities such as users, products, and transactions, as well as handling photo uploads and queued action execution.
lib/domain/repositories · high confidence
Introduced offline-first data layer with automatic sync and queued actions
The data layer in lib/data/repositories has been initialized with new repository implementations for Auth, Product, Transaction, User, Storage, and QueuedAction. These repositories implement an offline-first architecture: they prioritize local data sources and automatically sync with remote sources when connectivity is available. For operations that cannot be performed offline (such as creating or deleting records), the system queues actions locally and executes them once the device is back online, ensuring data consistency and a seamless user experience regardless of network status.
lib/data/repositories · high confidence
Introduces core utility classes and services
Adds a suite of core utilities and services to the application, including a generic Result wrapper for handling success and failure states, a database service for local storage, a ping service for connectivity checks, a printer service for thermal printer support, and various utility classes for logging, formatting, and platform detection.
lib/core · high confidence
Introduction of standardized parameter classes for use cases
The codebase now includes new parameter classes for domain use cases: a generic BaseParams class that supports pagination (limit, offset), sorting (orderBy, sortBy), and filtering (contains), alongside a NoParam class for use cases that require no arguments. This change provides a consistent structure for passing data into use cases, replacing ad-hoc parameter handling.
lib/domain/usecases/params · high confidence
New Account and About screens with printer settings and error handling
The account section now includes a dedicated About screen displaying app versioning and developer credits, alongside an updated Account screen that provides navigation to Profile, Theme, Printer Settings, and About. A new Printer Settings screen enables users to scan for, connect to, and configure thermal printers (supporting USB, Bluetooth, BLE, and Network connection types) and select paper sizes. Additionally, a generic Error screen has been added to handle and display application errors with a 'Back to home' action.
lib/presentation/screens/account · high confidence
New cart panel UI with quantity controls and payment flow
The home screen now features a dedicated cart panel, split into header, body, and footer components. The header displays the product count and a 'Remove All' action. The body lists ordered products with individual quantity adjustment buttons and a total price. The footer provides a 'Pay' button that opens a dialog for payment details (amount, method, customer name, description) and processes the transaction via the new Riverpod-based home notifier.
lib/presentation/screens/home/components · high confidence
New transaction list and detail screens with search and pagination
Users can now view a paginated list of transactions and see detailed information for each one. The transactions screen includes a search bar to filter by transaction ID and supports infinite scrolling to load more records. Tapping a transaction card navigates to a detail view that displays the transaction ID, payment method, customer name, and creation time, and includes a button to reprint the transaction receipt.
lib/presentation/screens/transactions · high confidence
Windows platform support added for key plugins
The Windows build now registers support for ten Flutter plugins, enabling features such as cloud storage and authentication (Firebase), device connectivity, file selection, URL launching, and thermal printer integration on Windows.
windows · high confidence
Behavioural changes
Android package namespace updated and app label renamed
The Android application's package namespace has been changed from 'elriztechnology.com.flutter\_pos' to 'com.elriztechnology.flutter\_pos', requiring the MainActivity class to be moved to the new directory structure. Additionally, the app's display name has been updated from 'flutter\_pos' to 'Flutter POS', and the AndroidManifest.xml has been modified to include the 'android:enableOnBackInvokedCallback' attribute and register the UCropActivity for image cropping functionality.
android · medium confidence
Centralized error handling with automatic navigation to error screen
A new ErrorHandlerBuilder widget has been introduced to centralize Flutter and platform error handling. It configures global error callbacks to log exceptions via the ErrorLoggerService and automatically navigates the user to a dedicated /error screen for non-critical errors, preventing multiple error screens from stacking.
lib/app/error · high confidence
Extracted ProductCard widget for product listings
The product card UI has been extracted into a dedicated \ProductsCard\ widget in \lib/presentation/screens/products/components/products\_card.dart\. This new component renders a product tile including the product image, name, stock and sold counts, and formatted price, with an 'Out of stock' overlay when stock is zero. This change improves code organization by separating the product card logic from the parent screen.
lib/presentation/screens/products/components · medium confidence
Linux platform support for file selection, serial communication, and URL launching
The Linux build configuration has been updated to register the file\_selector, flutter\_libserialport, and url\_launcher plugins. This enables Linux users to select files, communicate with serial devices (such as thermal printers), and open URLs, aligning the Linux platform with the capabilities already present on other platforms.
linux · high confidence
Main screen now manages navigation and offline state handling
The main application shell has been refactored to use Riverpod for state management, introducing a MainScreen widget that controls the bottom navigation bar and routes to Home, Products, Transactions, and Account sections. It also implements new error handling for the first-time app open or login scenarios where an internet connection is required, displaying a WelcomeScreen during loading and throwing an exception if offline.
lib/presentation/screens/main · high confidence
Migrate all presentation providers to Riverpod Notifier/State pattern
The application's state management has been refactored to use the Riverpod Notifier and State pattern across all presentation layers. This introduces explicit state classes (e.g., \AuthState\, \HomeState\, \ProductsState\) paired with corresponding \Notifier\ classes (e.g., \AuthNotifier\, \HomeNotifier\) for managing UI state, form data, and business logic. This change standardizes how the app handles user interactions, data fetching, and UI updates, replacing the previous state management approach with a more predictable, immutable state model.
lib/presentation/providers · high confidence
Migrate app initialization to async startup with Riverpod and Firebase integration
The application's startup process has been refactored to support asynchronous initialization, allowing the app to properly initialize Firebase, the local database, and shared preferences before rendering the UI. The entry point now configures the \ProviderScope\ for the Riverpod state management system and overrides the \sharedPreferencesProvider\ with the initialized instance. This change enables the app to load necessary configuration and state before the \App\ widget is built, ensuring that all dependencies required by the new architecture are ready. Additionally, the main entry point now handles system-level configurations such as screen orientation and system UI overlay styles, which were previously managed elsewhere.
lib · high confidence
Refactored Sign-In Screen to use Riverpod State Management
The Sign-In screen has been refactored to utilize Riverpod for state management, replacing the previous implementation. The \SignInScreen\ widget now integrates with the \authNotifierProvider\ to handle Google sign-in logic, displaying a progress dialog during the authentication process and navigating to the main app upon success or showing an error dialog if the operation fails.
lib/presentation/screens/auth · medium confidence
Test coverage
Added code coverage report for core modules; Added tests for core services; Added unit tests for domain usecases; Added unit tests for local data source implementations; Added unit tests for remote data sources; Added unit tests for repository implementations; Added widget tests for the Sign In screen; Removal of default Flutter widget test.
Dependencies
Updated Android build configuration and Dart dependencies
The Android build system was migrated from Groovy to Kotlin DSL (build.gradle.kts/settings.gradle.kts), updating the Android Gradle plugin to 8.7.3, Kotlin to 2.1.0, and compileSdk to 36. The app namespace was changed to 'com.elriztechnology.flutter\_pos' and the version bumped to 3.1.0. In the Dart layer, the project was updated to support Flutter 3.8.1 and added several new dependencies including Firebase (core, auth, firestore, storage, crashlytics), image handling (image\_picker, image\_cropper), and printer support (unified\_esc\_pos).
(dependencies) · medium 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 61 → 60 (-0.8)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 100 → 93 (-7.2)
- Architecture 97 → 91 (-6.0)
- Maturity 79 → 79 (+0.0)
- Readiness 30 → 31 (+1.7)
- Security 93 → 88 (-5.8)
- Domain Modelling 100 → 100 (+0.0)
Resolved (10)
- Change coupling: product_local_datasource_impl.dart ↔ transaction_local_datasource_impl.dart (lib/data/datasources/local/product_local_datasource_impl.dart)
- Change coupling: product_local_datasource_impl.dart ↔ user_local_datasource_impl.dart (lib/data/datasources/local/product_local_datasource_impl.dart)
- Change coupling: product_remote_datasource_impl.dart ↔ transaction_remote_datasource_impl.dart (lib/data/datasources/remote/product_remote_datasource_impl.dart)
- Change coupling: transaction_local_datasource_impl.dart ↔ user_local_datasource_impl.dart (lib/data/datasources/local/transaction_local_datasource_impl.dart)
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- No exposed public API
- Test reliability not included
- The iOS asset README is thin and only explains how to replace launch-screen assets, with no link to the main project's documentation. (ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md)
- complexity unreadable for .dart, .swift — churn × complexity hotspots could not be measured
- single-maintainer — knowledge-concentration (bus factor) risk
New (68)
- Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (10 lines × 2) (lib/presentation/screens/account/profile_form_screen.dart)
- Duplicated block (11 lines × 2) (lib/data/repositories/product_repository_impl.dart)
- Duplicated block (11 lines × 2) (lib/presentation/providers/products/products_notifier.dart)
- Duplicated block (11 lines × 5) (lib/data/repositories/product_repository_impl.dart)
- Duplicated block (11 lines × 5) (lib/presentation/screens/account/account_screen.dart)
- Duplicated block (12 lines × 2) (lib/data/repositories/product_repository_impl.dart)
- Duplicated block (12 lines × 2) (lib/data/repositories/product_repository_impl.dart)
- Duplicated block (12 lines × 2) (lib/presentation/screens/home/home_screen.dart)
- Duplicated block (12 lines × 2) (lib/presentation/screens/products/product_detail_screen.dart)
- Duplicated block (12 lines × 3) (lib/presentation/screens/account/profile_form_screen.dart)
- Duplicated block (12 lines × 4) (lib/presentation/screens/products/product_detail_screen.dart)
- Duplicated block (13 lines × 2) (lib/data/datasources/remote/storage_remote_datasource_impl.dart)
- Duplicated block (13 lines × 5) (lib/presentation/screens/transactions/transaction_detail_screen.dart)
- Duplicated block (13–14 lines × 2) (lib/presentation/screens/home/components/order_card.dart)
- Duplicated block (14 lines × 2) (lib/presentation/screens/account/profile_form_screen.dart)
- Duplicated block (14 lines × 2) (lib/presentation/screens/products/product_detail_screen.dart)
- Duplicated block (15 lines × 2) (lib/presentation/providers/products/product_form_notifier.dart)
- …and 48 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
elrizwiraswara/flutter_pos 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 21 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 3b61e52815cd5c9150c97cb71ab135896216ee40 — 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-fa71c66cabd8.