Fuji Recipes is a native, local-first Android companion app for Fujifilm camera owners. It lets you collect and edit film simulation recipes, write them directly to the camera's C1–C7 custom slots, browse and download JPEG/RAF files from the card, analyze camera JPEGs without copying them first, and use the camera's processor to develop RAW files from your phone. Everything works over USB-C, completely offline with zero cloud dependencies.
About this project: I am not a professional photographer — just a Fujifilm camera owner and developer with insomnia :D. This app was vibecoded first and foremost as a personal project for personal use, experimentation, and entertainment, but shared openly with the public because, why not! :)
It is provided completely free and "as is". While I cannot make any commercial promises or guarantees, I am very happy to receive feedback, collaborate with fellow Fuji owners, and update/fix issues as they arise!
- 📥 Installation
- 📱 Screenshots
- 🌟 Highlights
- 📸 Camera Compatibility & Testing
- 🔌 Camera USB Modes & Workflows
- 🧪 Testing & Feedback
- 🛠️ Building & Developing
- ☕ Open Source Acknowledgements
- 📜 Legal Disclaimer & Trademarks
Grab the latest APK from the Releases page and install it on your phone.
"App blocked to protect your device" / Play Protect warning: Since this app is distributed directly via GitHub Releases rather than the Google Play Store, Android's Play Protect has no install history for it and will warn that it "hasn't seen this app from this developer before." This is expected for any app sideloaded outside Play — it's not a sign of malware, just a reputation check Play Protect can only build up through Play Store distribution.
To install anyway: on the warning screen, tap More details → Install anyway.
You don't have to take my word for it. Point any AI coding assistant (Claude, ChatGPT, Gemini, etc.) at this repository and ask it to independently verify the app's behavior — the source code is public, so it can check for itself rather than trusting this README.
Example prompt:
Review the source code at https://github.com/justbondarenko/fuji-recipes-app. I'm about to sideload the released APK and want an independent safety check before I do.
First, confirm you actually fetched and read files from that URL — don't guess. If you can't browse live URLs, say so explicitly instead of assuming the repo is empty or has no source code, and tell me what you'd need me to paste instead (e.g. AndroidManifest.xml, build.gradle.kts).
Once you've confirmed access, answer:
1. Does the app request or use INTERNET or any network-related permission? Search the manifest and codebase for any networking code (HTTP clients, sockets, analytics/crash-reporting SDKs, ad SDKs).
2. What permissions does AndroidManifest.xml declare, and is each one justified by what the app actually does (e.g. USB access for the camera connection, storage for saving recipes)?
3. Does the app collect, log, or transmit any personal data, camera contents, or device identifiers anywhere?
4. Are there any obfuscated, minified, or suspicious code paths that don't match what's described in the README?
5. Overall, is there any risk to me in installing this app — to my data, my device, or my camera — and if so, what exactly is it?
Give me a plain verdict: is this app safe to install, based only on what's in the repository?
Because the app is 100% offline with zero network access, any AI that actually reads the source will confirm there's no code path capable of sending data anywhere — there's simply no networking code to send it with.
Some AI chat tools can't actually browse a URL you give them. When that happens, instead of saying "I can't access this," they can confidently claim the repo has no source code, no manifest, etc. — which is wrong, not a real finding. The source is genuinely public (app/src/main/AndroidManifest.xml, app/build.gradle.kts, and the rest of app/src/). In practice, Claude and ChatGPT seem to actually fetch and explore the repository, while Gemini has been observed just implying/guessing at an answer instead of checking. If you get a "no code found" response, either enable that AI's live browsing/search mode and retry, or git clone the repo yourself and paste the relevant files directly into the chat.
See the app in action: screenshot tour — the recipe library, recipe views, photo analysis, camera sync, custom slots, downloads, and clean-up, each screen explained.
- ⚡ Direct USB-C Camera Sync: Connect your camera to your phone via USB-C. The app launches automatically on connection, reads your current
C1–C7custom slot states, and writes full recipe parameter sets directly to the camera body in seconds. - 📥 Import Directly from Camera: Read existing custom slot recipes off the camera body and save them straight into your offline phone library.
- 📷 Browse and Download the Camera Card: The dedicated Photos tab lists JPEG and RAF files independently, with thumbnails, capture dates, file sizes, RAW/JPEG filters, multi-selection, and batch download to a folder chosen through Android's system picker. The camera card is read-only; the app does not delete, rename, or move its files.
- 🧪 RAW Development Lab: The Lab tab is a full editing surface on the camera's own RAW processor. Start from the documented defaults or from a recipe in your library, change any parameter, and the preview re-renders by itself — the RAF is uploaded once per session, so each further render costs a profile write rather than another transfer. The Lab takes the whole screen while you develop, lays the photo beside the controls in landscape, and saves the full-resolution JPEG from a single button.
- 🔎 Analyze JPEGs Straight from the Camera: Open Analyze, choose photos from the connected camera, and run the existing Fujifilm EXIF extraction and recipe matching flow without first importing the files through another gallery app.
- 🎞️ In-Camera RAW Development: Start from a recipe, choose a RAF from the phone, apply the recipe to the camera's native
0xD185conversion profile, let the camera render the JPEG, preview it, and save it through Android's document picker. The app preserves camera-native profile fields it does not own. - 🔄 Background Camera Downloads: Batch downloads run in an Android connected-device foreground service and continue while the app is minimized or the phone is locked. An ongoing notification shows progress and offers cancellation; Android 16 can promote it to a Live Update. If the process is killed, the Photos screen reports the interrupted batch and lets the user keep completed files or remove the incomplete file.
- 🔋 Mode-Aware Camera Status: The Camera screen reports the current connection mode, camera battery level, firmware and serial number, plus shutter count and lens when the body exposes them. Slot controls appear only in a mode that can reach them.
- 🧰 Camera Diagnostics: Share a detailed camera capability report. This makes it possible to investigate untested bodies without pretending they are compatible.
- 📸 Extract Recipe from Photos: Pick straight-out-of-camera Fujifilm JPEGs (single or multiple in batch) to decode their embedded MakerNote EXIF metadata. The app extracts the exact film simulation, tone curves, and white balance settings, presents them in a swipeable card carousel, and lets you attach photos directly to matching recipes or save new ones.
- 📲 System Share Sheet Action: Share any photo directly from Google Photos, Gallery, or Files via the "Extract recipe" share sheet action to inspect recipe settings on the fly.
- 🔍 Highlight Matching & Likely Recipes: When analyzing photos, the app compares decoded parameters against your entire library, highlighting exact matches or surfacing likely recipe candidates with percentage similarity and specific differences.
- 🧹 Duplicate Detection & Clean-Up: Intelligent review flow detects duplicate and conflicting recipes during camera or file imports, allowing you to easily resolve collisions, replace older versions, or skip duplicates to keep your library clean.
- 📝 Create from Pasted Text: Copy recipe text from websites (like Fuji X Weekly), forums, or notes. The built-in parser automatically identifies parameters and pre-fills the recipe editor.
- ✅ Batch Edits in the Library: Long-press any recipe to start selecting, then delete the whole selection or set one rating across it from the floating toolbar. Each batch is a single write to the library rather than one per recipe.
- ⚖️ Side-by-Side Recipe Comparison: Compare any two recipes in your library to inspect exact parameter differences side by side.
- 🗂️ Comprehensive 27-Parameter Engine: Full support for Fujifilm recipe parameters across sensor generations — Film Simulations (Provia to Reala Ace), Grain Size/Effect, Color Chrome FX & FX Blue, Smooth Skin, Highlight/Shadow tone curves (0.5 steps), Clarity, and 2D White Balance shift with Kelvin temperature.
- 🧭 Tools Under More, Settings on Every Screen: The bottom bar's last item is More — maintenance, backup and restore, and about. Display preferences moved to their own Settings page, reached by the round settings button each screen carries (in the search row on the recipe list).
- 🔒 100% Offline & Private: Declares zero
INTERNETpermissions. Your recipes live exclusively in app-private storage on your phone (filesDir/library.json). No accounts, no cloud sync, and no tracking. - 📦 Lossless Export & Import: Export your library as a single
.jsonfile or a.ziparchive using Android's Storage Access Framework and system share sheet. - 🎨 Material 3 Expressive UI: Built with Material You Dynamic Color adapting fluidly to your device theme, expressive spring motion, and dark/light mode support.
Camera communication is handled via PTP (Picture Transfer Protocol) over USB Host mode.
The camera features in this branch were developed against and manually tested with a Fujifilm X-T50. Compatibility is feature-specific: standard PTP media operations may exist on other bodies, but custom slots, camera properties, and RAW profile layouts are Fuji-specific and can differ by model or firmware.
| Feature | Required camera mode | Verified support |
|---|---|---|
| Browse, analyze, and download JPEG/RAF files | USB CARD READER |
X-T50 hardware |
| Read/write C1–C7, reports | USB RAW CONV. / BACKUP RESTORE |
X-T50 hardware |
| In-camera RAW development (RAF from the phone) | USB RAW CONV. / BACKUP RESTORE |
X-T50 hardware; an X100VI 625-byte profile adapter is present but not hardware-tested by the author |
| Background downloads and Live Updates | USB CARD READER |
Android foreground service; promoted Live Update requires Android 16 and system approval |
The compatibility list below describes custom-slot support, not a blanket guarantee for every camera feature:
- 🟢 Tested & Verified on Hardware: Fujifilm X-T50 (the only body I personally own)
- 🟡 Expected custom-slot support (untested on hardware — feedback welcome!):
- X-Trans V bodies (X-T5, X100VI, X-H2, X-H2S, X-S20, X-M5, X-E5)
- X-Trans IV bodies (X-T4, X-T3, X-T30, X-T30 II, X-Pro3, X-S10, X-E4, X100V)
- GFX 100-series (GFX100 II, GFX100, GFX100S, GFX100S II)
- 🔴 Known Hardware Limitations (Custom slot writing not supported by camera firmware):
- X-Trans III & older (X-Pro2, X-T2, X-T20, X-E3, X-H1, X100F)
- Bayer CMOS & GFX 50-series (X-T100, X-T200, X-A series, GFX 50S, GFX 50R, GFX50S II, XF10) (These camera bodies lack custom slot write registers in their firmware; recipe library management and photo EXIF extraction still work normally.)
💬 Feedback & Collaboration: If you own an untested Fujifilm camera body and would like to help verify compatibility or report issues, please open an issue on GitHub! I'm happy to update and fix anything that comes up.
The app uses two camera connection modes because Fujifilm exposes card files and recipe/conversion properties through different USB interfaces.
| Camera mode | Use it for |
|---|---|
USB CARD READER |
Browse the card, download JPEG/RAF files, or analyze camera JPEGs |
USB RAW CONV. / BACKUP RESTORE |
Read/write C1–C7, inspect camera details, share a report, or render a RAF with a recipe |
On the camera, the setting is normally under MENU / OK → SET UP (Wrench) → CONNECTION SETTING → USB MODE. The app reports the detected mode without treating a useful Card Reader connection as an error. Screens hide controls that the current mode cannot support and explain which mode they need.
📱 See it: camera connection screens
- Connect a USB-C to USB-C cable between your Android phone and camera.
- The phone will prompt you to open Fuji Recipes automatically via the USB device attach intent.
- Allow USB access when Android asks. Notification permission is optional for the transfer itself, but it is needed to see background progress.
- The ongoing notification identifies the connected state with a memory-card icon in Card Reader mode and a camera icon in RAW Conversion mode. During a download it switches to the transfer icon and progress state.
Changing USB mode may make the camera disconnect and reconnect. Where appropriate, the app keeps the pending workflow and resumes after the correct mode returns.
📱 See it: browsing and downloading the card
- Set the camera to
USB CARD READERand connect it. - Open the Photos tab. The app scans JPEG and RAF objects on the card and shows progress for large cards.
- Filter by All, JPEG, or RAW, select any files, then tap Download.
- Choose a destination folder with Android's folder picker. The app writes each camera file independently and leaves the card unchanged.
The foreground service keeps a large batch running while the app is minimized or the screen is locked. Keep the camera connected and powered until it completes. Cancellation is available both in the Photos screen and its notification.
If Photos opens while the camera is in another mode, the screen shows only the Card Reader instructions and a Refresh button. Refresh reopens the camera connection after you change its setting.
📱 See it: the Analyze tab
- Connect in
USB CARD READERmode. - Open Analyze and choose the camera source.
- Select one or more JPEGs from the card and analyze them.
Only the selected JPEGs are copied into the app's temporary cache. From there, the existing Fujifilm MakerNote parser and RecipeMatcher produce the same settings, exact matches, likely matches, and differences shown for phone photos.
📱 See it: the recipe action menu · a rendered result
RAW development lives in the Lab tab, third in the bottom bar. Open it directly, or reach it from a recipe's Develop RAW menu item, which seeds it with that recipe.
- Choose a RAF from the phone. That is the only thing the empty Lab asks for — everything else appears once there is a file to act on. From then on the Lab takes the whole screen: the bottom bar hides, and the header carries back, the file name, Recipes and the camera status.
- Leave the documented defaults, or tap Recipes to start from one in your library.
- Connect the camera in
USB RAW CONV. / BACKUP RESTOREmode. Plugging it in is enough — the app opens the session itself, and the Lab shows a Connect button only for the case where it did not notice. The first preview renders as soon as both the RAF and the camera are there: the app uploads the RAF and the patched native profile, waits for the camera processor, downloads the result, and cleans up the temporary camera object. - Change any parameter and the preview re-renders by itself, 900 ms after the last edit, one render at a time, with a small loading indicator in the photo's corner. The RAF is uploaded once per session — later renders only send a new profile, so trying a different film simulation costs a render rather than another multi-megabyte transfer. After two consecutive failures automatic rendering pauses and an Update preview button appears to retry.
- Film simulation, dynamic range and white balance open as menus; white balance groups its Auto, Fluorescent and Custom variants.
- Pinch to zoom the preview in place, drag to pan, double-tap to go back — grain and sharpness do not survive being fitted into a phone-sized pane. In landscape the photo takes 60% of the width and the controls the remaining 40%.
- The Save button writes the full-resolution JPEG. There is no separate full-resolution render: asking for the file is what asks for the render, the picture shows Rendering while it runs, and the document picker opens when it lands.
- Back ends the session and returns to the empty Lab, asking first if there are edits or renders not yet saved as a JPEG.
The parameter panel shows only what the camera's RAW processor will act on, so every control on it changes the picture. D-range priority, the monochromatic colour pair and the ISO recommendations are not drawn here — they belong to the recipe form — and the Lab never writes back to your recipes.
The RAF is always uploaded from the phone: RAW Conversion mode accepts a RAF as a host upload, and the app does not ask the camera to develop a card handle in place. To develop something still on the card, download it first from the Photos tab in Card Reader mode.
RAW recipe mapping is deliberately model-specific. The verified X-T50 adapter applies film simulation, exposure compensation, dynamic range, grain, Color Chrome effects, white balance and shift, Kelvin temperature, highlight/shadow tone, color, sharpness, high-ISO noise reduction, and clarity. Camera-native fields without a verified recipe mapping are preserved. An unknown profile is captured for calibration and conversion stops before the app guesses at its layout.
📱 See it: custom slots · More tab
Connect in USB RAW CONV. / BACKUP RESTORE mode, then:
- Writing a recipe: Open any recipe → tap Write to camera → choose target slot (
C1throughC7) → confirm write. - Reading from the camera: In the Camera tab or via More → Backup & Restore → Import from camera, read all custom slots from the body into your library.
- Inspecting the body: The Camera tab shows the camera model, battery and connection mode, with any available firmware, serial, shutter-count, and lens details.
- Sharing a diagnostic report: Use Camera tools → Share report to export supported operations, properties, mode, details, and slot readings for compatibility investigation.
Any feedback, bug reports, and compatibility test results are welcome!
- Found a bug or tested a new camera model? Please open an issue on GitHub with your camera model, firmware, phone model, Android version, selected USB mode, and the feature you tested.
- Direct contact & social links: Open the in-app About screen (More → About) for direct email and contact links.
- Android Studio Ladybug (2024.2.1+) or newer
- JDK 17 (or Android Studio bundled JBR)
- Android SDK Platform 37 (
compileSdk = 37,minSdk = 29) - An Android device with USB Host mode support (API 29+ / Android 10+)
# Clone the repository
git clone https://github.com/justbondarenko/fuji-recipes-app.git
cd fuji-recipes-app
# Run all unit tests
./gradlew testDebugUnitTest
# Assemble debug APK
./gradlew :app:assembleDebugThe compiled APK will be at:
app/build/outputs/apk/debug/app-debug.apk
adb install -r app/build/outputs/apk/debug/app-debug.apkWireless Debugging:
Because the phone's USB-C port is occupied by the camera during hardware testing, use Wireless ADB (adb pair and adb connect) for live logcat inspection and debugging.
The Build workflow posts every finished run — succeeded, failed or cancelled — to a Telegram chat, with the branch, the commit and an Open run button that goes straight to the run page. It is optional: with no secrets set the notification step says so in the log and the build carries on, so a fork needs no setup.
🗄️ fuji-recipes-app
✅ Build succeeded
main
💬 ba69768 Lead the Telegram message with the repository
Run #84 by justbondarenko
[ 🔗 Open run ]
To switch it on, add two repository secrets under Settings → Secrets and variables → Actions:
0 comments
log in to comment.