A native Android camera app that applies film simulation LUTs (Fuji, Kodak, Cinestill, Pixel 2 XL HDR+ recreation) live to the viewfinder and to captures. Includes XPan-style panoramic crop, manual controls, RAW/DNG export, focus peaking, horizon level, and a few other things.
This was vibe-coded by a software engineer who knows nothing about Kotlin or Android, but understands enough to be dangerous. Run at your own risk.
Tested only on a Pixel 10 Pro. It probably works on other Pixel 10 family devices. It will probably break in interesting ways on anything else (different sensor characteristics, different camera capabilities, different CameraX behavior). I'm not going to fix that.
This is published in case it's useful to someone — as a working reference, as a starting point to fork, or just to grab the APK and try it. I don't plan to maintain it actively, take feature requests, or support other devices.
- Film simulations — FilmFrame originals (Standard, Chrome, Vivid, Mono, Portrait Hi/400), Fuji Superia 400, Kodak (Portra 160/800, Gold 200, Ektar 100, Tri-X 400), Ilford HP5, Cinestill 800T, plus a Pixel 2 XL HDR+ tone-mapping recreation. Live preview via an OpenGL CameraEffect; same LUT applied to the saved frame.
- Aspect ratios — Full sensor, XPan (65:24), 2.39, 3:1, 16:9, 1:1. Letterbox overlay in the viewfinder.
- Manual controls — ISO, shutter speed, manual focus with distance slider, EV compensation, white balance, metering modes.
- RAW / DNG — GPU RAW processing pipeline with DNG export when the device supports it, JPEG fallback otherwise.
- Overlays — Histogram, GPU focus peaking (LoG), sensor-fused horizon level, rule-of-thirds and golden-ratio grids.
- Film grain — Luminance-weighted, animated per frame in preview.
- Settings persist across launches.
The app accepts both Hald CLUT .png files and 33-grid .cube files. Drop a
LUT into app/src/main/assets/luts/, add a corresponding entry in
FilmSimulation.kt, and rebuild.
- Focus peaking sucks. It "works" in the technical sense — there's a LoG
edge detector running on the GPU and it lights up edges in purple — but the
threshold tuning is bad and it's noisy enough that I don't trust it for
actual manual focus. I decided not to worry about it for now. If you fork
this and care, the shader is in
LutPreviewEffect.kt.
Grab the APK from the latest release and sideload it. You'll need to allow your browser or file manager to install unknown apps.
Debug build, unsigned for production. Don't expect Play Store-grade polish.
Requires JDK 21 and the Android SDK (API 35).
./gradlew assembleDebug # APK at app/build/outputs/apk/debug/
./gradlew installDebug # build + install on connected deviceBuilt with AGP 8.7.3, Kotlin 2.1.0, Compose, Hilt, CameraX 1.4.x.
There aren't any, deliberately. This is a one-off project for a single device that I'm not planning to refactor. Unit tests would just be maintenance overhead I'd never reap value from. The CI build is the only "test": it proves the thing still compiles and produces an APK. If you fork and start making real changes, you'll probably want to add some.
MIT. See LICENSE.
