Skip to content

ryuheiyokokawa/FilmFrame

Repository files navigation

FilmFrame

FilmFrame viewfinder

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.

Read this first

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.

What it does

  • 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.

Adding your own LUTs

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.

Known issues

  • 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.

Install

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.

Build from source

Requires JDK 21 and the Android SDK (API 35).

./gradlew assembleDebug      # APK at app/build/outputs/apk/debug/
./gradlew installDebug       # build + install on connected device

Built with AGP 8.7.3, Kotlin 2.1.0, Compose, Hilt, CameraX 1.4.x.

On tests

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.

License

MIT. See LICENSE.

About

Native Android camera app with film simulation LUTs, XPan crop, manual controls. Pixel 10 Pro only.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors