Luma is an iOS-first camera, library, and editing app built with Flutter for product UI and native Swift for capture, preview rendering, and high-resolution image processing. The repository focuses on a custom AVFoundation camera stack, a Core Image film simulation pipeline, an internal Isar-backed library, and a non-destructive editor/export flow.
Created and maintained by Chris Bryant, Luma is intentionally developed in public and kept safe for open collaboration through documented ownership, manual-only distribution workflows, and conservative secret-handling rules.
Luma is currently tracked as v3.0.0 (Build 1) Beta.
- custom AVFoundation camera implementation with native preview rendering
- real-time Core Image film simulation pipeline with seven built-in looks
- shared
CIContextreuse across preview, still capture, and editor rendering - multi-frame processed capture, RAW workflows, and Apple ProRAW / 48MP support on supported hardware
- internal library with Isar metadata, thumbnail generation, favorites, ratings, and capture metadata
- native editor rendering bridge for preview, export, and iOS share flows
Version 3.0.0 (Build 1) is the current repository baseline for the rebuilt imaging stack and the next manual TestFlight-ready repo state.
- rebuilt camera flow around
ios/Runner/CameraViewController.swift - shared film simulation and render pipeline in
ios/Runner/LumaFilmSimulation.swift - preview reliability improvements, histogram throttling, and look-switch synchronization fixes
- startup hardening for release/TestFlight cold launches on iOS
- refreshed GitHub workflows so CI stays active while distribution remains manual-only and opt-in
- improved gallery responsiveness and capture/save reliability for the next beta cycle
The most important recent release fix is the iOS release/TestFlight splash-screen hang. The root cause was an eager Isar.initializeIsarCore(download: false) call before runApp(). In release builds, dead-code stripping removed IsarCore FFI symbols that DynamicLibrary.process() expected, so the app failed before Flutter rendered its first frame.
The fix keeps launch free of database work before runApp() and retains IsarCore symbols in the iOS release linker settings. That keeps cold launch behavior aligned across Debug, Release, and TestFlight while preserving the gallery's Isar-backed metadata layer.
- custom native camera preview and controls driven from Flutter via method/event channels
- focus, AE/AF lock, zoom presets, exposure bias, flash mode, and format selection
- HEIC, JPEG, RAW, RAW+HEIC, RAW+JPEG, and Apple ProRAW capture support
- 48MP ProRAW targeting on supported devices
- multi-frame processed capture path with bracket alignment support
Built-in looks are defined natively and surfaced in Flutter with stable IDs:
originalslateemberbloomdriftvalemono
Preview rendering and still rendering share the same look definitions so saved output stays aligned with the live camera look. The render path uses shared CIContext reuse and per-render CIFilter construction to avoid mutable filter reuse across queues.
Luma maintains an internal library instead of mirroring the entire system photo roll.
- metadata is stored with Isar in
lib/features/library/ - originals, processed outputs, RAW companions, and thumbnails live under the app library root
- thumbnail generation and recovery run in the background
- gallery filters support recents, favorites, RAW, edited, imported, ratings, and search workflows
- the viewer surfaces capture metadata and routes directly into the editor/export path
The editor is non-destructive and replays settings through the native renderer.
- preview rendering uses the native Core Image pipeline
- edits preserve original assets while recording adjustment metadata
- crop, rotation, straighten, preset blending, and parameter-based adjustments are supported
- export and share flows are bridged through native iOS code for full-resolution output
lib/features/camera/— camera UI, Riverpod state, method-channel bridge, look picker, histogram, capture UI, and gallery entry pointslib/features/library/— Isar-backed metadata, library repository/controller, thumbnail services, and viewer flowslib/features/editor/— non-destructive editing UI and native-renderer integrationlib/features/export/— export and share helpers on top of the renderer pipelinetest/— Dart-side unit and widget coverage for camera, library, and editor behavior
ios/Runner/AppDelegate.swift— app bootstrap, plugin registration, and native Flutter channelsios/Runner/LumaCameraPlugin.swift— Flutter bridge for the native camera surface and controlsios/Runner/CameraViewController.swift— session lifecycle, device control, preview, capture orchestration, RAW / ProRAW, and metadata packagingios/Runner/LumaPreviewProcessor.swift— live preview processing pathios/Runner/LumaFilmSimulation.swift— film profiles plus the shared film render pipeline for preview and stillsios/Runner/LumaLUTLoader.swift— LUT generation and cachingios/Runner/LumaFrameAligner.swift— frame alignment for processed multi-frame captureios/Runner/NativeRenderer.swift— editor preview rendering and full-resolution exportios/Runner/LumaCIContext.swift— shared Core Image context and color-space configuration
- Flutter stable
3.41.x - Xcode with iOS SDKs and command-line tools installed
- CocoaPods available on the machine
- a physical iPhone for camera validation; the simulator cannot exercise camera hardware paths
flutter pub get
cd ios && pod install && cd ..flutter run -d <ios-device-id>For local Xcode debugging, open ios/Runner.xcworkspace, select a physical iPhone, and choose either Debug or Release run configuration depending on the path you want to validate.
These commands are safe for local and CI validation and do not upload or distribute builds:
dart format --set-exit-if-changed lib test
flutter analyze
flutter test
flutter build ios --release --no-codesignThe repository keeps GitHub automation intentionally conservative.
- Linux CI checks formatting, static analysis, and tests on every push / pull request to
main - macOS validation performs
pod installand an unsigned iOS release build - TestFlight upload automation is manual-only, requires explicit confirmation, and is guarded in both GitHub Actions and Fastlane
- normal pushes and tags do not upload anything to App Store Connect
- Project ownership is defined in
.github/CODEOWNERSand the Git history remains attributable to Chris Bryant. - Contribution expectations and safe development rules live in
CONTRIBUTING.md. - Luma is available under the MIT License in
LICENSE.
- Luma is currently iPhone-only
- the iOS simulator cannot validate live camera behavior
- Apple ProRAW and 48MP capture depend on supported hardware and current session format availability
- signed App Store / TestFlight delivery still requires Apple certificates, provisioning assets, and App Store Connect credentials on the build machine
v3.0.0 (Build 1)— Beta milestone with native camera pipeline refinements, film simulation stability updates, gallery performance improvements, startup-fix carry-forward, and improved capture/save reliabilityv2.0.0-beta— rebuilt camera, film simulation, library, and editor pipeline with the iOS startup hang fixv1.0.1— editor, gallery, and preview interaction refinements0.1.0— first beta milestone
Detailed beta notes live in RELEASE_NOTES_v3_beta.md, with archived v2 notes in RELEASE_NOTES_v2_beta.md and additional tester guidance in docs/BETA_CHECKLIST.md and docs/BETA_NOTES.md.
If you want to contribute, start with CONTRIBUTING.md, use the bug-report template for reproducible issues, and keep all changes free of signing assets, private credentials, and release artifacts.