FilmKit Fujifilm Camera Skill
Skill by ara.so — Daily 2026 Skills collection.
FilmKit is a browser-based, zero-install preset manager and RAW converter for Fujifilm X-series cameras. It uses WebUSB to communicate via PTP (Picture Transfer Protocol) — the same protocol as Fujifilm X RAW STUDIO — so the camera's own image processor handles RAW-to-JPEG conversion. It runs entirely client-side (hosted on GitHub Pages) and supports desktop and Android.
What FilmKit Does
- Preset Management: Read, edit, and write custom film simulation presets directly on-camera (slots D18E–D1A5 via PTP
GetDevicePropValue/SetDevicePropValue) - Local Preset Library: Save presets locally, drag-and-drop between camera and local storage
- RAW Conversion & Live Preview: Send RAF files to the camera, receive full-quality JPEGs back
- Preset Detection: Loading a RAF file auto-detects which preset was used to shoot it
- Import/Export: Presets as files, links, or text paste
- Mobile Support: Works on Android via Chrome's WebUSB support
Requirements
- Chromium-based browser (Google Chrome, Edge, Brave) on desktop or Android — WebUSB is required
- Fujifilm X-series camera connected via USB (tested on X100VI; likely works on X-T5, X-H2, X-T30, etc.)
- Linux udev rule (if running Chrome in Flatpak):
Reload rules after adding:
Installation / Setup (Development)
FilmKit is a static TypeScript app. To run locally:
Build for production:
The built output is a static site — no server required. Open in Chrome at http://localhost:5173 (or wherever Vite serves it).
Architecture Overview
PTP over WebUSB
FilmKit speaks PTP (Picture Transfer Protocol) directly over USB bulk transfers. Key operations:
Preset Property Codes
Fujifilm X-series cameras expose film simulation parameters as device properties in the range 0xD18E–0xD1A5:
Native Profile Format
The camera's native d185 profile is 625 bytes and uses different field indices/encoding from RAF file metadata. FilmKit uses a patch-based approach:
Key Code Patterns
WebUSB Connection
Sending a PTP Command
Reading a Preset Property
Writing a Preset Property
HighIsoNR Special Encoding
HighIsoNR uses a non-linear proprietary encoding — do not write raw values directly:
Conditional Writes (Monochrome Film Simulations)
Monochrome film simulations reject Color property writes — guard against this:
RAW Conversion Flow
Preset Import/Export Format
Presets are exported as structured data (JSON or encoded strings). When importing:
Capturing USB Traffic for New Camera Support
To help add support for a new Fujifilm X-series camera:
- Install Wireshark with USBPcap
- Capture on USB bus:
USBPcap1:\\.\USBPcap1 - Filter:
usb.transfer_type == 0x02(bulk transfers = PTP traffic) - Perform these actions in X RAW STUDIO while capturing:
- Profile read (connect and let app read camera state)
- Preset save (change all preset values, save to a slot)
- RAW conversion (load RAF, convert with a preset)
- Save each capture as
.pcapng - Open a GitHub issue with: camera model, firmware version, all three
.pcapngfiles, and the parameter values used
Troubleshooting
WebUSB Not Available
- Must use Chrome or Chromium-based browser (Firefox does not support WebUSB)
- On Android, use Chrome (not Firefox for Android)
- Check
chrome://flags— ensure "Disable WebUSB" is not enabled
Camera Not Detected
- Ensure the camera is in USB mode (MTP or PTP, not Mass Storage)
- On Linux without Flatpak: check that your user is in the
plugdevgroup:sudo usermod -aG plugdev $USER - On Linux with Flatpak Chrome: add udev rule for vendor
04cband reload
Permission Denied on Linux
PTP Transaction Errors
- Ensure no other app (X RAW STUDIO, Capture One, etc.) is connected to the camera simultaneously
- Only one WebUSB consumer can hold the interface at a time
- Disconnect and reconnect the camera if the interface gets stuck
Preset Write Rejected
- Writing
Colorproperty on a monochrome film simulation will be rejected — this is expected behavior (see conditional writes above) - Writing
Color Temperaturerequires WB mode set to0x0012first HighIsoNRmust use the non-linear encoded value, not the raw user-facing value
Debug Log
In the FilmKit UI, scroll to the Debug section at the bottom of the right sidebar → click Copy Log → paste into a GitHub issue for bug reports.
Key Links
- Live App: https://filmkit.eggrice.soy
- Protocol Reference:
QUICK_REFERENCE.md - Related Projects: rawji, fudge, libgphoto2
- Fuji X Weekly Presets: https://fujixweekly.com/


