Skip to content
CAI
Software that uses CAICheck a score

fossasia/magic-epaper-app

67.9

Adequate · 19 September 2026

41.2k

lines of production code

Dart

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

Magic ePaper is a cross-platform application for Android, iOS, Windows, Linux, and macOS that enables users to design and print custom content onto e-paper displays via NFC. The system provides tools for creating and editing templates such as badges, calendars, and contact cards, utilizing a Rust-backed image processing pipeline for high-quality dithering and color conversion. It supports bulk generation from CSV data and allows direct writing of NDEF records, including app launchers and vCards, to compatible hardware.

How it got here

2025 — Multi-platform initialization and core feature development

29 changes.

The project established native support across Android, iOS, Windows, Linux, and macOS while implementing the core application shell and state management. Key features developed include NFC read/write capabilities with vCard support, an image library with editing tools, and a suite of customizable card templates. The work also included setting up localization infrastructure, securing build secrets, and adding comprehensive test coverage.

2026 — Native canvas and Rust integration

15 changes.

This period focused on establishing a native canvas editor for creating and editing designs, supported by a new Rust-based image processing backend for dithering. The work also introduced bulk card generation from CSV files, expanded NFC command console capabilities, and added support for new Goodisplay and Waveshare e-paper displays.

Features

Add NFC command console for raw hex and APDU interactions

A new command console screen has been added to the app, allowing users to interact directly with NFC tags via a text-based interface. Users can connect to and disconnect from tags, view tag information, and send raw hex commands (transceive) or read specific blocks from ISO15693 tags. The console supports commands like 'help', 'connect', 'disconnect', 'info', 'tx \<hex\>', 'readblock \<n\>', and 'clear', providing a low-level tool for debugging and testing NFC interactions.

_lib/command\console · high confidence

Add sticker vault with offline caching and recent items to the native canvas editor

The native canvas editor now includes a sticker vault feature, allowing users to browse, search, and insert icons from categories like Popular, Faces, and Weather. The implementation includes an offline SVG cache that stores icons on disk for faster access and a 'recent stickers' list that persists the last 24 used items via shared preferences. A recent fix ensures stickers re-render correctly when the canvas background color changes.

_lib/native\_canvas/sticker\vault · high confidence

Added Rust build integration via Cargokit

The \rust\_builder\ module now includes the Cargokit toolchain, providing the necessary glue code to seamlessly build Rust crates within Flutter projects. This addition introduces the build scripts and Dart tooling required to compile Rust code for Android (via Gradle), iOS/macOS (via CocoaPods), and Linux (via CMake), enabling the integration of native Rust libraries into the application.

_rust\builder · high confidence

Added app launcher data model and selection service for NFC interactions

The NFC screen now includes a dedicated data model and service to handle app launching via NFC tags. A new \AppData\ class stores application details such as name, package name, and optional icon, while the \AppLauncherService\ provides a curated list of common applications (e.g., Chrome, Gmail, WhatsApp) and utilities for validating package names and searching the app list. This enables the NFC feature to target specific installed apps for launching or writing data.

_lib/ndef\_screen/app\nfc · high confidence

Android app initialization with NFC support and branding

The Android application has been initialized with the package ID \magic.epaper\ and branded as "Magic ePaper". This includes the addition of launcher icons, a splash screen, and the necessary AndroidManifest permissions for NFC, internet access, and image reading. The native MainActivity now implements silent NFC reader mode handling and exposes MethodChannels for managing NFC settings and reader states, supporting the app's core hardware interaction capabilities.

android/app · high confidence

Bulk card generation from CSV files

Users can now import data via CSV to generate multiple cards at once. The new bulk workflow includes a CSV import screen with automatic column mapping and the ability to rename columns, a generation process that supports photos from URLs, data URIs, or local paths, and a results screen where generated badges can be edited, saved to the library, or transferred to a device. The system includes a custom CSV parser that handles BOM and line endings, and supports predefined templates (Employee ID, Price Tag, Event Badge) as well as dynamic templates inferred from column content.

_lib/card\templates/bulk · high confidence

Image library persistence and management provider

The image library provider now handles local storage of saved images, including saving new images as PNG files, loading and filtering the image list, and clearing all stored data. It manages directory creation for persistent storage and maintains metadata in a JSON file, with error handling and logging integrated throughout the lifecycle.

_lib/image\library/provider · high confidence

Initial Linux desktop platform support

This change adds the initial Linux desktop platform support for the application. It introduces the necessary CMake build configuration, GTK-based native entry points, and application window management (including title bar and default size) to enable running the Flutter app on Linux desktop environments.

linux · high confidence

Initial Windows desktop support for Magic ePaper

This change introduces the native Windows runner for the Magic ePaper application, enabling users to install and run the app on Windows 10 and 11. The implementation includes a CMake build configuration, a Win32 window wrapper that handles high-DPI scaling and system theme integration (dark/light mode), and a resource script that embeds the application icon and version metadata. Users will see a properly scaled window with the correct title and icon, and the app will respect the user's system theme preference.

windows · high confidence

Initial app shell with multi-provider setup and route definitions

The application now initializes with a structured entry point that integrates Rust libraries, manages locale and developer options state via providers, and defines the core navigation routes including display selection, NFC read/write screens, a command console, and an FAQ section.

lib · high confidence

Initial localization infrastructure and partial translations for Magic ePaper

The app now supports internationalization via Flutter AppLocalizations, introducing a new \lib/l10n\ directory with ARB translation files for multiple languages. Full translations are provided for English, Hebrew, and Hindi, while partial translations exist for Russian and Traditional Chinese, and placeholder files are created for German, Greek, Spanish, French, Indonesian, Italian, Japanese, Malayalam, Burmese, Norwegian, Portuguese, Brazilian Portuguese, Tamil, Telugu, Ukrainian, Vietnamese, and Simplified Chinese. This change enables the app to display UI strings in the user's preferred language, covering core NFC operations, image editing, and settings.

lib/l10n · high confidence

Initial macOS platform support added

This change introduces the native macOS project structure for the app, including the Xcode workspace, build configurations, and entitlements for sandboxed file access. It establishes the core application entry points (AppDelegate and MainFlutterWindow) and defines the app identity (bundle ID, name, and icon assets), enabling the Flutter application to run as a native macOS desktop app.

macos · high confidence

Initial web app entry point and manifest configuration

Added the foundational HTML entry point and web manifest for the Flutter web application. The index.html file configures the base href for routing, sets up iOS-specific meta tags and icons, and loads the Flutter bootstrap script. The manifest.json file defines the app's display properties, theme colors, and icon assets for progressive web app support.

web · high confidence

Introduce NDEF read/write screen with vCard and app launcher support

Added a new NFC screen and supporting services that enable users to read, write, and clear NDEF tags. The implementation includes models for NFC operation results and tag info, and services for managing NFC sessions and checking availability. Key features include writing vCard contact data, app launcher records (for Android), URLs, and text to NDEF tags, as well as reading and parsing various NDEF record types. The write service also handles specific initialization commands for IsoDep badges with YZRCOS chips.

_lib/ndef\screen/services · high confidence

Introduce core data models and canvas controller for image library and native canvas

This change adds the foundational data structures and state management for the image library and native canvas features. In the image library, it introduces \ImageProperties\ to expose image metadata (size, dimensions, format) with formatted display helpers, and \SavedImage\ to manage saved assets with support for serializing/deserializing metadata such as canvas documents, QR tags, and template data. In the native canvas, it defines \CanvasDocument\, \CanvasElement\, and \Stroke\ models with JSON serialization to persist and restore canvas state, and introduces \CanvasController\ to manage drawing operations (strokes, elements), selection, and undo/redo history. Additionally, \CardLayoutSeeder\ and related layout utilities are added to generate template-based canvas elements from layer specifications.

_lib/image\_library/models, lib/native\canvas/models · high confidence

Introduce dedicated Image Library screen with management and editing capabilities

Adds a new ImageLibraryScreen that serves as a central hub for viewing, searching, and managing saved images. Users can now preview images, rename them, delete them (with confirmation dialogs), and clear all images at once. The screen integrates with the image editor and specific template forms (QR Tag, Weather, Contact Card, Restaurant Menu), allowing users to re-edit previously saved designs directly from the library.

_lib/image\library · high confidence

Introduce native canvas editor with template support

Adds a new lightweight in-house canvas editor component (\NativeCanvasEditor\) that allows users to create and edit designs using various templates, including QR codes, weather snapshots, restaurant menus, and contact cards. The editor supports drawing, erasing, and customizing elements like text, stickers, and barcodes, and integrates with the image library for re-editable designs.

_lib/native\canvas · high confidence

New Image Library UI components with localization and error handling

The Image Library screen now features a redesigned interface built from new widget components, including a responsive app bar with delete mode and 'Clear All' functionality, a searchable grid of image cards, and dedicated empty and error states. All user-facing text is now localized via AppLocalizations, and the image cards include graceful error handling for missing files, displaying a placeholder instead of crashing.

_lib/image\library/widgets · high confidence

New Image Library services for saving, editing, and managing saved images

The image library now includes dedicated services to handle image lifecycle operations. Users can save images with applied filters (including Floyd-Steinberg, Bayer, Sierra-2, and Burkes dithering) and flip options, with the ability to rename, delete, or clear all saved images. Saved images retain metadata such as the filter used and canvas document data, enabling them to be re-edited later from the library. The service layer also provides localized feedback via snackbar notifications for all save, rename, delete, and clear actions.

_lib/image\library/services · high confidence

New NDEF NFC read and write screens with vCard and app launcher support

The app now includes dedicated NDEF NFC screens for reading and writing tags. The new NFCWriteScreen allows users to write text, URLs, Wi-Fi credentials, and vCard contact details to NFC tags, and additionally supports writing app launcher data to open specific applications on the target device. The NFCReadScreen provides functionality to read NDEF records, verify written data, and clear tag contents. Both screens feature a shared base state for managing NFC availability checks and lifecycle events, and include UI components like the AppLauncherCard for selecting apps and NFCVCardWriteCard for contact data entry.

_lib/ndef\screen · high confidence

New NDEF screen UI with NFC status, read/write, and vCard support

The NDEF screen now features a redesigned interface built from new widget components: an NFC status card that displays device availability (available, disabled, or not supported) with a refresh action; an NFC read card for scanning tags with verify and clear options; an NFC write card supporting text, URL, and Wi-Fi credentials; and a vCard form for writing contact information. The UI uses localized strings, consistent spacing and color constants, and provides visual feedback during read/write operations.

_lib/ndef\screen/widgets · high confidence

New NFC controller for reading and writing NDEF records

The NFC controller for the NDEF screen has been implemented, enabling users to read NDEF tags and write various record types including text, URLs, Wi-Fi credentials, app launchers, and vCards. The controller manages NFC availability checks, handles read/write/clear operations through dedicated services, and provides localized status messages for user feedback.

_lib/ndef\screen/controller · high confidence

New UI widgets for display selection, configuration, and NFC transfer

The app introduces a suite of new view components to enhance the user experience when selecting and configuring e-paper displays. Users can now browse devices via the new DisplayCard widget, which visualizes display specs, color support, and beta status. A new ConfigurableEpdDialog allows users to define custom display presets with specific dimensions and color palettes. To support new hardware, dedicated transfer dialogs have been added for both Waveshare and Goodisplay NFC protocols, providing real-time progress updates and error handling during image transmission. The navigation drawer and common scaffold have also been updated to integrate these new workflows and improve overall app structure.

lib/view/widgets · high confidence

New badge canvas widgets and barcode editor

Added new UI components for the badge canvas feature, including BadgeCanvasView for rendering badge elements, BadgeColorPicker for selecting badge colors, and EditableElement for interactive manipulation of canvas items. Also introduced BarcodeEditor, a widget allowing users to create and scan barcodes (QR, Data Matrix, etc.) with format-specific validation, and StrokePainter for rendering hand-drawn strokes on the canvas.

_lib/native\canvas/widgets · high confidence

New card templates and barcode scanning capability

The card templates section now includes several new template types: a Calendar template with month, week, and day views; a Contact Card template supporting vCard and link QR modes; an Employee ID template; an Entry Pass Tag template; and a QR Tag template. Additionally, a new barcode scanner utility has been added, allowing users to scan barcodes from the camera or gallery to populate fields in templates like the Contact Card and Employee ID.

_lib/card\templates · high confidence

New informational screens and enhanced image editing tools

The app now includes dedicated About Us and FAQ screens to provide user support and contact information, alongside a new Buy Badge screen for hardware orders. The image editing workflow has been significantly expanded with a new image crop screen supporting aspect ratio locking, a dynamic text fit editor that auto-scales text to canvas dimensions, and a comprehensive display selection screen that allows users to filter and sort e-paper devices by brand, color count, and size. Additionally, the settings screen now features a language selector for English and Hindi, and a developer options toggle to gate advanced command console access.

lib/view · high confidence

New provider layer for state management and persistence

The application introduces a new set of provider classes in lib/provider to manage core state and persist user preferences. LocaleProvider now handles the selection and saving of the app language via SharedPreferences, ensuring the chosen locale persists across restarts. DeveloperOptionsProvider manages the visibility of the developer command console, also persisting its toggle state. ImageLoader centralizes image handling, including picking from the gallery, cropping, decoding off the main thread, and saving/loading the last finalized image. ColorPaletteProvider tracks the current color palette, and GetIt locator is configured to register these providers and app localizations for dependency injection.

lib/provider · high confidence

New utility helpers for image picking and responsive card layouts

Added \image\_picker\_util.dart\ to provide a unified workflow for selecting, cropping, and saving images from the device camera or gallery. Introduced \responsive\_layout\_util.dart\ to manage layout parameters for various card types (Employee ID, Price Tag, Event Badge, Entry Pass) across different screen dimensions, ensuring consistent visual presentation on varying display sizes.

_lib/card\templates/utils · high confidence

Support for Waveshare 4-color (G) NFC e-paper displays

Users can now flash images to Waveshare 4-color (G) NFC e-paper displays, including the 2.13-inch G variant. This change introduces a new image codec that converts images into the specific black, white, yellow, and red color indices required by these devices, alongside a dedicated NFC protocol and service layer to handle the transfer. The existing black-and-white display support remains unchanged and is handled by the separate standard protocol.

lib/waveshare · high confidence

Support for new Goodisplay and Waveshare e-paper displays

The app now supports a range of new Goodisplay and Waveshare e-paper displays, including 1.54-inch, 2.13-inch, and 4.2-inch models in black-and-white, 3-color, and 4-color variants. These new devices are integrated with a dedicated NFC transfer dialog and utilize the UC8253 driver for image processing and display updates.

lib/utils · high confidence

iOS project scaffolded for Magic ePaper with UISceneDelegate and permission declarations

The iOS native layer has been initialized as a new Xcode project for the Magic ePaper app. This includes configuring the app to use UISceneDelegate (via Info.plist and AppDelegate) for modern scene management, adding standard Flutter runner assets (app icons, launch screen), and declaring required user permissions for camera and photo library access. The project structure also includes a basic unit test target and CocoaPods integration for dependency management.

ios · high confidence

Behavioural changes

Automated decryption of encrypted signing secrets for Android and iOS builds

The build process now automatically decrypts and extracts platform-specific signing artifacts (Android keystores and iOS secrets) during the preparation phase. New shell scripts (\prep-android-key.sh\ and \prep-ios-key.sh\) use OpenSSL to decrypt encrypted tar archives stored in the repository, extracting the contents into the respective \android/\ and \iOS/\ directories. A \.gitignore\ file has been added to ensure that the decrypted secrets and encrypted archives are not committed to version control, securing the signing keys used for app distribution.

scripts · high confidence

Centralize app constants into dedicated modules

The application's hardcoded values have been organized into specific constant files to improve maintainability and consistency. API endpoints for Open-Meteo are now defined in \api\_constants.dart\. UI spacing, sizing, and font metrics are managed via the new \Dimens\ class in \dimens.dart\, replacing scattered hardcoded values. User-facing text, including NFC operation messages and UI labels, is centralized in \string\_constants.dart\. Asset paths for images and icons are consolidated in \asset\_paths.dart\, and color definitions are re-exported from the theme layer via \color\_constants.dart\ for backward compatibility.

lib/constants · high confidence

Image dithering logic migrated to Rust with new algorithms and gamma correction

The image processing pipeline for dithering has been moved from the previous implementation to a new Rust module (rust/src/api/simple.rs), exposing nine dithering methods (Floyd-Steinberg, False Floyd-Steinberg, Stucki, Atkinson, Threshold, Halftone, Bayer, Sierra-2, and Burkes) and three color modes (Black & White, Black & White Red, and Black & White Red Yellow) via flutter\_rust\_bridge. This migration includes a behavioral change where grayscale values are now gamma-corrected (using a factor of 1.5) before dithering to improve visual quality, and the bridge code has been regenerated to match the flutter\_rust\_bridge 2.13.0 version.

rust · high confidence

Introduce image library utility helpers for dates, device mapping, filters, and sources

New utility classes have been added to the image library to improve metadata handling and display. DateUtils provides human-readable relative date formatting for older images, while EpdUtils resolves e-paper display models from metadata, including support for known aliases and custom device reconstruction. FilterUtils extracts filter names from image metadata, and SourceUtils maps image sources (imported, editor, unknown) to consistent labels and colors.

_lib/image\library/utils · high confidence

Redesigned image library dialogs with consistent theming and localization

The image library dialogs (preview, rename, save, properties, and delete confirmations) have been completely rewritten to use a unified, modern design system. All dialogs now support full localization via AppLocalizations, display accurate image metadata and counts, and enforce consistent max-width constraints for better responsiveness. The delete confirmation dialog now supports both single and batch deletion with image previews, while the rename and save dialogs properly manage text controllers to prevent memory leaks. The clear-all confirmation dialog provides a distinct, high-visibility warning for bulk removal.

_lib/image\library/widgets/dialogs · high confidence

Test coverage

Added integration test for Rust library initialization; Added integration tests for app screenshots and barcode workflow; Added test coverage for new and existing card templates; Added tests for canvas document serialization and card layout logic; Added tests for text editor validation, Waveshare image codec, and app scaffolding.

Dependencies

Android Gradle wrapper upgraded to version 9.7.1

The Android build system now uses Gradle 9.7.1 (via the wrapper) instead of the previous version. This update ensures the project builds with the latest Gradle release, which may include performance improvements, bug fixes, and new features in the build toolchain.

android/gradle · high confidence

Initial project scaffolding and dependency lockfiles

This change introduces the foundational build configuration and dependency manifests for the Magic E-paper Label Customization App. It establishes the Android build environment (including the \magic.epaper\ namespace, Java 17, and Gradle 9.4.0), sets the iOS/macOS deployment targets (iOS 15.6, macOS 12.0), and defines the Flutter SDK constraint (3.47.4). It also adds the Rust FFI plugin (\rust\_lib\_magicepaperapp\) using Cargokit and \flutter\_rust\_bridge\ 2.13.0, along with the corresponding \pubspec.lock\ and \Cargo.lock\ files that pin the application's Dart and Rust dependencies.

(dependencies) · high confidence

Updated flutter\_rust\_bridge code generation to version 2.13.0

The automatically generated Rust-Flutter bridge files in lib/src/rust have been regenerated using flutter\_rust\_bridge version 2.13.0. This update refreshes the underlying FFI and WebAssembly binding implementations (including frb\_generated.dart, frb\_generated.io.dart, and frb\_generated.web.dart) to align with the new codegen version, ensuring compatibility with the Rust library interface while maintaining the existing image processing API surface.

lib/src · 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 68.

Lenses

  • Code Health 84
  • Architecture 99
  • Maturity 62
  • Readiness 72
  • Security 64
  • Domain Modelling 100

Changes since last survey

  • 300 commits — 226 feature/other, 74 fixes

By area

  • (repo) — 84 commits
  • (root) — 36 commits
  • lib/card_templates — 30 commits
  • lib/image_library — 23 commits
  • lib/view — 19 commits
  • .github/actions — 14 commits
  • lib/l10n — 13 commits
  • lib/util — 13 commits
  • lib/native_canvas — 11 commits
  • .github/workflows — 8 commits
  • android/app — 5 commits
  • lib/waveshare — 5 commits
  • android/settings.gradle — 4 commits
  • lib/utils — 4 commits
  • lib/command_console — 3 commits
  • lib/constants — 3 commits
  • lib/ndef_screen — 3 commits
  • assets/images — 2 commits
  • ios/Runner — 2 commits
  • lib/provider — 2 commits

Notable commits

  • fix: Fix: App menu icon not clearly visible (#381)
  • fix: Fix: read and write protected IsoDep badges with YZRCOS chip (#440)
  • fix: Merge branch 'main' into fix/waveshare-transfer-orientation
  • fix: Merge pull request #562 from bhavjsh/fix/waveshare-transfer-orientation
  • fix: chore: fix iOS screenshot creation
  • fix: fix imports
  • fix: fix: bump Gradle to 8.14 and iOS deployment target to 15.6 for screenshot tests (#587)
  • fix: fix: NFC transfer resilience, faster finish, and reposition recovery
  • fix: fix: Padding between Filter: label and the All chip (#370)
  • fix: fix: Prevent Saving Blank Canvas Images to Library (#397)
  • fix: fix: Prevent transfer on unsupported NFC (#493)
  • fix: fix: UISceneDelegate adoption Flutter migration (#509)
  • fix: fix: add error handler for missing image files in ImageCardWidget (#435)
  • fix: fix: add max width constraint to clear all dialog (#613)
  • fix: fix: add mounted check before setState in ConfigurableEpdDialog to prevent crash (#465)
  • fix: fix: add mounted check before setState in ImagePropertiesDialog to prevent crash (#454)
  • fix: fix: add mounted check before setState in WaveshareTransferDialog to prevent crash (#458)
  • fix: fix: add mounted checks before setState/handleWriteResult calls in NDEFScreen to prevent crash (#461)
  • fix: fix: add mounted checks before setState/handleWriteResult calls in NFCWriteScreen to prevent crash (#460)
  • fix: fix: app open when a nfc device is detected from the phone (#536)
  • …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

fossasia/magic-epaper-app 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 b8c5d8666e362d77f524bcb09f68b0d239ca8c3a — 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.