Skip to content
CAI
Software that uses CAICheck a score

ethereal-developers/OpenScan

58.1

Adequate · 19 September 2026

14.1k

lines of production code

Dart

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

OpenScan is a Flutter-based mobile application designed for capturing, processing, and organizing physical documents. It features a pure-Dart computer vision pipeline for live document detection, edge cropping, and perspective correction, eliminating native dependencies for improved stability. The system supports six specialized image filters, manages document libraries with a normalized database schema, and provides export capabilities in multiple formats and resolutions. Additionally, it includes a comprehensive settings interface, multi-language support, and an interactive tutorial to guide users through the scanning workflow.

How it got here

2020–2021 — OpenScan v3.0.0 rewrite and migration

12 changes.

This period focused on the comprehensive v3.0.0 rewrite of the OpenScan application, featuring a complete overhaul of the scanning pipeline, camera integration, and user interface. The work involved migrating the Android build infrastructure to modern standards, reorganizing the project structure, and implementing a new normalized database schema with a warm-white design system.

2022 — UI redesign and feature expansion

8 changes.

This period focused on a comprehensive redesign of the application's user interface, introducing new navigation structures, themed widgets, and interactive tutorials. It also expanded core functionality by adding six document-specific scanning filters, a detailed export system, and support for five additional languages.

2023–2026 — Pure Dart scanning pipeline and UI overhaul

12 changes.

The project replaced its native OpenCV dependencies with a pure Dart computer vision pipeline, introducing live document detection, auto-capture, and a stabilized scanning overlay. This core rewrite was accompanied by a centralized settings system, a unified OS-themed design system, and extensive test coverage across UI, image processing, and integration flows.

Features

Added Greek, Hindi, Hungarian, Polish, and Tamil language support

The app now supports five new languages: Greek (el), Hindi (hi), Hungarian (hu), Polish (pl), and Tamil (ta). This update adds the corresponding localization resource files (ARB) and generated Dart localizations classes, allowing users to view the interface in their preferred language alongside the existing English support.

lib/l10n · high confidence

Initial app entry point and camera integration

The application now initializes with a new entry point in lib/main.dart that loads user settings, detects available device cameras, and launches the main UI. This setup integrates a dynamic theming system that responds to user preferences for light/dark modes and accent colors, while also configuring localization support and restricting device orientation to portrait. A global camera description list is established in lib/config/globals.dart to make camera data accessible across the app.

lib · high confidence

Introduce live document detection with auto-capture and overlay smoothing

Adds a new live-scan capability that detects document boundaries in real-time via a background isolate, smoothing the overlay to prevent jumping and enabling automatic capture when the document is held stable. This includes a new \LiveScanController\ for isolate-based processing, an \AutoCaptureDetector\ for stability logic, and a \QuadSmoother\ to filter noise and handle detection jumps, all integrated into the \LiveScanScreen\ for a continuous scanning experience.

_lib/view/screens/live\scan · high confidence

Introduces DirectoryCubit for document and page management

A new DirectoryCubit and its associated state class have been added to manage document metadata, image ordering, and page storage. This component handles creating directories, importing images from the gallery or live scans, reordering pages, and persisting image data to the database, providing the core logic for organizing scanned documents.

lib/logic · high confidence

Introduces six document-scanning filter modes

The scanner now offers six document-specific color modes—Original, Auto, Lighten, Grayscale, Black and White, and Whiteboard—replacing previous photo-style filters. These modes are implemented in the core image filter library and include optimized processing for previews and full-resolution saves, allowing users to enhance scanned documents with features like auto-leveling, background whitening, and adaptive thresholding.

_lib/core/image\filter · high confidence

New action bar for the page preview screen

A new bottom action bar has been added to the page preview interface, providing users with quick access to crop, delete, apply filters, and rescan actions. The bar features a fixed-dark design that remains consistent across themes to ensure high contrast against the scanned content, and all labels are localized using the app's internationalization system.

lib/view/Widgets/preview · high confidence

New export bottom sheet and reusable popup menu widget

The app now features a dedicated export bottom sheet that allows users to configure export format (PDF, JPG, PNG), quality presets (ultra-low to high), and page size (A4, Letter, Legal), with the quality scale based on compression resolution rather than file size estimates. This sheet handles the export process, including progress tracking and success/failure states, and supports selective page export. Additionally, a new reusable custom popup menu button widget has been added to standardize menu interactions across the interface.

lib/view/Widgets/view · high confidence

New interactive tutorial walkthrough with localized, theme-aware mockups

The app now includes a new tutorial that guides users through the core scanning workflow (scan, pages, adjust, organize, export, privacy). Instead of static screenshots, the tutorial uses interactive, code-generated mockups that reflect the app's current design tokens, meaning they automatically adapt to light/dark mode and accent color changes. The tutorial text is fully localized, supporting English, Tamil, and Hindi, ensuring the guidance is accessible to a wider audience.

lib/view/Widgets/demo · high confidence

Removals

Removed openscan Flutter boilerplate files

The openscan directory no longer contains the default Flutter project structure, including the main application entry point, the sample counter UI, the README, and the associated widget tests. This change removes the redundant boilerplate code from this location, likely as part of a broader reorganization where Flutter files were moved to a parent directory.

openscan · high confidence

Behavioural changes

Centralized app settings management

A new AppSettings singleton has been introduced in the core settings module to manage and persist user preferences, including theme mode, accent color, auto-capture, capture sound, keeping originals, default filters, library sort order, and gesture strip avoidance. This change centralizes configuration logic, replacing scattered preference handling with a unified ChangeNotifier that persists values to SharedPreferences and notifies listeners to rebuild the UI when settings change.

lib/core/settings · high confidence

Cropper overlay now respects user accent color

The cropper widget's visual overlay has been updated to dynamically follow the application's chosen accent color. A new PolygonPainter component draws the crop selection handles and connecting lines using the provided accent color, ensuring the cropping interface matches the user's theme rather than using hardcoded colors.

lib/view/Widgets/cropper · high confidence

Database schema migration and improved document naming

The app has migrated its local storage from a legacy 'table-per-document' structure to a normalized schema with separate \documents\ and \pages\ tables, ensuring a smoother upgrade path for existing users. Additionally, the default naming convention for new documents has been updated to use a filesystem-safe format (e.g., \OpenScan-YYYY-MM-DD-epoch\) that avoids illegal characters on external storage, and export files are now consistently named after the document itself rather than generating new timestamps.

lib/core/data · high confidence

Document scanning pipeline rewritten in pure Dart

The core computer vision pipeline for document scanning has been replaced with a pure Dart implementation, removing the dependency on native OpenCV libraries. This change introduces a new edge detection and contour-finding algorithm that runs entirely within the app, utilizing isolates for performance. Users will experience a more stable live-scan overlay that reduces jumping between detections by clustering and scoring candidate quads, and faster capture-to-storage times by consolidating image decoding, warping, and encoding into fewer, more efficient passes. The new pipeline also handles image normalization and compression with specific quality and size caps for stored pages and originals.

lib/core/cv · high confidence

Introduction of a unified OS design system for UI components

The application now uses a new shared component library (os\_components.dart) that enforces a warm-white, single-accent design system. This introduces standardized widgets like OSButton and OSChip, which derive their colors and typography from the central OS theme tokens, ensuring consistent styling across the interface and simplifying future theme updates.

lib/view/Widgets/os · high confidence

New app routing and data models for image management

The application now uses a centralized routing configuration in \appRouter.dart\ to manage navigation between screens such as Home, Crop, Preview, and Settings, ensuring consistent navigation flows. Additionally, new data models (\models.dart\) define how directories and images are stored, introducing support for tracking original image paths and unfiltered versions to allow non-destructive editing and re-cropping from the source capture.

lib/core · high confidence

New loading overlay and redesigned rename dialog

The app now displays a dedicated loading overlay (a card with a spinner and localized text) instead of a bare spinner, providing clearer feedback that the app is working. Additionally, the file rename dialog has been rebuilt to follow the new design system, featuring a single input field that auto-selects the existing name for easy replacement, along with validation for empty names and special characters.

lib/view/Widgets · high confidence

OpenScan v3.0.0 release notes and project restructuring

This change introduces the v3.0.0 changelog, which details a full rewrite of the scanning pipeline, camera, and UI. Key user-facing updates include live document detection with automatic cropping, six new document filter modes, and enhanced camera controls like pinch-to-zoom and manual exposure. The app now processes pages instantly as they are captured rather than waiting for the session to end, and edge detection has been reimplemented in pure Dart, removing the OpenCV dependency. The interface features a new warm-white design system with light/dark themes, and the tutorial has been rebuilt as an interactive walkthrough. Additionally, the project structure has been reorganized by moving Flutter files to the parent directory, updating the license to BSD 3-Clause, and refining linting and localization configurations.

(repo-wide) · high confidence

Rebuilt crop screen with pure Dart document detection and rotation fixes

The crop screen has been rewritten to replace the previous OpenCV-based pipeline with a pure Dart implementation, eliminating the gallery crash associated with the native dependency. This change introduces a magnifier tool for precise edge adjustment, ensures that rotating the document correctly updates both the on-screen polygon and the final saved page, and improves reliability by falling back to manual adjustment if automatic detection fails or times out.

lib/view/screens/crop · high confidence

Redesigned UI with warm-white, single-accent design system

The app's visual identity has been rebuilt around a warm-white palette with a single accent color, replacing the previous theme structure. This change introduces a new design token system (OSColors, OSSpace, OSRadius, OSMotion) and typography scale, enforcing a flat aesthetic with 1px outlines instead of shadows and zero elevation for most surfaces. Users will see updated colors, rounded corners (12dp for cards/buttons, 28dp for FABs), and consistent accent-based theming across light and dark modes, with specific fixed-dark styling for camera and preview chrome.

lib/core/theme · high confidence

Redesigned app screens with new navigation, theming, and filter controls

The app's user interface has been rebuilt across the Home, View, Preview, Filter, Settings, About, and Demo screens. The Home screen now serves as the library entry point with document sorting and selection capabilities, while the View screen manages document details with in-place renaming and page reordering. A new Preview screen supports pinch-to-zoom and double-tap-to-zoom with improved scroll synchronization. The Filter screen introduces six document-specific modes with background processing and caching. The Settings screen now allows users to configure scanning behaviors, theme modes, and default filters. The About screen displays developer credits and app version, and the Demo screen provides a guided tutorial with fixed dark theming.

lib/view/screens · high confidence

Removal of legacy Flutter v1 Android embedding files

The AndroidManifest.xml, MainActivity.kt, and launch\_background.xml files for the openscan Android app have been removed. These files contained the configuration for the legacy Flutter v1 embedding (including the io.flutter.app.FlutterApplication base class and explicit flutterEmbedding metadata), indicating a migration away from the older embedding system to the newer v2 embedding approach which no longer requires these specific boilerplate files.

openscan/android · high confidence

Stabilized live document detection overlay with smooth animations

The live scan preview now features a continuous, smoothed detection overlay that prevents the visual guide from jumping between equally-good detections. A new \LiveQuadPainter\ renders the detected document edges using the user's chosen accent color, while a \QuadTween\ interpolates between detection frames to ensure corners slide smoothly at screen refresh rate rather than snapping. Additionally, the capture acknowledgement animation has been refined: instead of a full-screen white flash, a light fill rises from the bottom edge of the detected quad upwards, clipped to the document shape, providing clearer visual feedback that the shot was captured.

_lib/view/Widgets/live\scan · high confidence

Standardized Android Activity to Flutter's Base Class

The Android application entry point (MainActivity) now extends FlutterActivity instead of the previous implementation. This change aligns the native Android component with the standard Flutter embedding pattern, ensuring consistent lifecycle management and integration with the Flutter engine.

android/app/src/main/java · high confidence

iOS project structure reorganized to root ios directory

The iOS native project files, including the Xcode project, workspace, and Runner configuration, have been moved from the openscan/ios subdirectory to the top-level ios directory. This structural change simplifies the repository layout and aligns with standard Flutter project conventions, ensuring that the iOS build configuration and assets are located in the expected root-level directory.

ios · high confidence

Test coverage

Added localization validation tests; Added on-device integration tests for core scanning and document flows; Added test coverage for the pure-Dart computer vision pipeline; Added tests for UI screens and live-scan detection logic; Added tests for document image filters and utility functions; Added tests for document naming and file operations.

Dependencies

Gradle wrapper upgraded to version 9.1.0

The Android build system now uses Gradle 9.1.0 (previously 5.6.2), as reflected in the updated distribution URL in the gradle-wrapper.properties file. This upgrade ensures compatibility with newer Android Gradle Plugin versions and modern Java/Kotlin toolchains required for current Android development standards.

android/gradle · high confidence

Major Android build infrastructure and dependency upgrade

The Android build system has been upgraded to Android Gradle Plugin 9.0.1, Kotlin 2.3.20, and Java 17, with the compile and target SDK versions raised to 36. The project migrated to the modern Gradle plugin management DSL, adopted the \com.ethereal.openscan\ namespace, and enabled R8 code shrinking for release builds. On the Dart side, the app was updated to support Dart SDK 3.10.0 and upgraded core dependencies including camera (0.12.0+2), bloc (8.1.4), and open\_filex (4.7.0).

(dependencies) · 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

Baseline

  • First survey — no prior run to compare against. CAI 58.

Lenses

  • Code Health 94
  • Architecture 96
  • Maturity 57
  • Readiness 36
  • Security 100
  • Domain Modelling 100

Changes since last survey

  • 300 commits — 244 feature/other, 56 fixes

By area

  • (root) — 61 commits
  • lib/view — 44 commits
  • lib/screens — 37 commits
  • (repo) — 31 commits
  • android/app — 27 commits
  • lib/presentation — 22 commits
  • lib/core — 20 commits
  • android/scanlibrary — 16 commits
  • lib/Utilities — 15 commits
  • lib/l10n — 10 commits
  • fastlane/metadata — 5 commits
  • lib/logic — 4 commits
  • android/openCVLibrary3413 — 3 commits
  • android/build.gradle — 1 commit
  • android/gradle — 1 commit
  • assets/github-sign.png — 1 commit
  • lib/Widgets — 1 commit
  • lib/main.dart — 1 commit

Notable commits

  • fix: Add on-device flow tests, and fix two bugs they found
  • fix: Add pinch-zoom, tap-to-focus/expose, camera switch, and manual exposure controls to live scan; fix preview zoom-swipe interaction
  • fix: Added version, Bug Fix: Unselect images on close In-Progress: Delete selected images
  • fix: Bug Fix, Page Transition
  • fix: Bug Fix: Ordering selection
  • fix: Bug Fixes TODO: Snackbar Bug
  • fix: Bug Fixes, PDF saved Dialog
  • fix: Changed Filename for selected images TODO: Need to fix snackbar bug
  • fix: Crop fixed
  • fix: Fix #34
  • fix: Fix #37 thanks to @tiagoclc
  • fix: Fix #40 - remove all occurrance of / in filename
  • fix: Fix Android build for Java 21 / AGP 8.6 / Kotlin 2.2
  • fix: Fix all analyzer warnings and remove stale TODOs
  • fix: Fix exposure +/- always increasing on Android
  • fix: Fix image compression
  • fix: Fix live-scan camera not reopening after backgrounding
  • fix: Fix opencv sdk versions in build.gradle
  • fix: Fix perspective crop screen UI bugs
  • fix: Fix recrop bug and refactor
  • …and 280 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

ethereal-developers/OpenScan 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 19 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 841d25ace0c9634b9919ac5da44a866e411c17cf — 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-13a154b7f5d1.