{"id":50866659,"url":"https://github.com/byvfx/floki","last_synced_at":"2026-06-15T02:05:03.879Z","repository":{"id":362332447,"uuid":"1257943955","full_name":"byvfx/floki","owner":"byvfx","description":"Floki — a fast, GPU-accelerated Rust GUI for inspecting and A/B-comparing multi-layer OpenEXR files. Built for VFX/compositing TDs with native exposure, channel isolation, histograms, and pixel-perfect diffing on wgpu.","archived":false,"fork":false,"pushed_at":"2026-06-11T17:58:15.000Z","size":637,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T19:24:59.162Z","etag":null,"topics":["color-management","compositing","egui","exr","gpu","image-viewer","lut","ocio","openexr","rust","vfx","vulkan","wgpu"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/byvfx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-03T06:22:37.000Z","updated_at":"2026-06-11T17:58:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/byvfx/floki","commit_stats":null,"previous_names":["byvfx/exr-analyzer","byvfx/floki"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/byvfx/floki","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byvfx%2Ffloki","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byvfx%2Ffloki/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byvfx%2Ffloki/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byvfx%2Ffloki/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/byvfx","download_url":"https://codeload.github.com/byvfx/floki/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/byvfx%2Ffloki/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34344441,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["color-management","compositing","egui","exr","gpu","image-viewer","lut","ocio","openexr","rust","vfx","vulkan","wgpu"],"created_at":"2026-06-15T02:05:03.272Z","updated_at":"2026-06-15T02:05:03.868Z","avatar_url":"https://github.com/byvfx.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Floki\n\n[![Rust](https://img.shields.io/badge/Rust-1.70+-orange.svg)](https://www.rust-lang.org)\n[![egui](https://img.shields.io/badge/GUI-egui-blue)](https://github.com/emilk/egui)\n[![wgpu](https://img.shields.io/badge/wgpu-Native-green.svg)](https://wgpu.rs)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n**Floki** is a fast, hardware-accelerated Rust GUI application tailored for Technical Directors, Compositors, and LookDev Artists who need to deeply inspect and compare multi-layered OpenEXR files. \n\nPowered by `egui`, `wgpu`, and the pure-Rust `exr` crate, it allows you to instantly view dense pixel data, isolate color channels, explore unbounded floating-point histograms, and perform pixel-perfect A/B diffing natively on your GPU.\n\n---\n\n## Key Features\n\n### Hardware-Accelerated Rendering\n* **Vulkan/Metal/DX12 Backend:** All image exposure scaling, gamma correction, sRGB mapping, and A/B difference matte compositing are executed via custom WGSL shaders on the GPU.\n* **CPU Fallback:** Automatically drops down to multithreaded CPU rendering if a graphics card or driver is unavailable.\n\n### Deep Inspection\n* **Precision Pixel Sampling:** Hover over any pixel to reveal exact floating-point values (R, G, B, A) regardless of bit-depth (F16, F32, U32).\n* **Persistent Swatches:** `Shift + Click` on the image to drop a permanent color swatch into your toolbelt for cross-referencing.\n* **Metadata Explorer:** Cleanly displays embedded EXR attributes (like V-Ray/Arnold custom tags), layers, and bounding box data in collapsible panels for both Image A and Image B simultaneously.\n* **Dual Contact Sheets:** Instantly view all AOVs (Arbitrary Output Variables) and layers as a scrollable grid of thumbnails. If a second image is loaded, view dual synchronized contact sheets side-by-side or seamlessly toggle between them.\n\n### Advanced A/B Comparison\nLoad a Reference Image (Image B) to unlock advanced visual diffing:\n* **Wipe:** Split-screen slider for boundary checks — with adjustable center, rotation angle, and divider-line opacity for wipes at any orientation.\n* **Side-by-Side:** View Image A and Image B glued together in a continuous panorama. They share the same camera for synchronized panning and zooming.\n* **Diff Matte:** Renders `|A - B| * multiplier` to easily spot fractional floating-point discrepancies in your render pipelines.\n* **Composite:** Blend A over B directly in-viewport with selectable blend modes (Over, Under, Add, Multiply, Screen).\n* **Blink Mode:** Press `Spacebar` to strobe between Image A and Image B at an adjustable interval.\n\nComparison controls follow a two-tier toolbar: the everyday controls stay on a single row, while the active mode's parameters slide into a contextual second row only when needed.\n\n### Image Analysis\n* **Dynamic Luminance Histogram:** Real-time histogram mapped to Exposure Values (EV stops). Effortlessly spot floating-point highlights over `1.0` using the Logarithmic view.\n* **Dual Histogram Mode:** When comparing two images, the histogram overlays a translucent Red graph (Image B) on top of the White graph (Image A) so you can visually align black levels.\n* **Channel Isolation:** Quickly isolate `R`, `G`, `B`, `A`, or view `RGB` composite with single-key shortcuts.\n\n### Color Management\n* **3D LUT Support:** Load Adobe `.cube` 3D LUTs and apply them in real time on the GPU as a display transform, alongside the built-in Exposure/Gamma/sRGB controls (OCIO config path is also configurable).\n\n### Batch Tooling\n* **EXR Header Converter:** Bulk-rename channels across an entire directory to standard RGBA — available both as an in-app Tools window and a headless `convert_dir` CLI, parallelized across CPU cores via `rayon` with live progress and cancellation.\n\n### High-Performance UI\n* **Immediate-Mode UI:** Built on `egui` for a responsive, minimal-overhead interface.\n* **Light / Dark / System Themes:** Switch the interface theme from the **Theme** menu; the `System` option tracks your OS light/dark setting live. Your choice persists across sessions.\n* **Recent Files for A \u0026 B:** `File ▸ Open Recent A` / `Open Recent B` reload a recent EXR straight into the main or reference slot.\n* **Persistent State:** Remembers your UI layout, recent files list, theme, and preferences across sessions.\n* **Software Tone Mapping:** Apply Exposure, Gamma, and sRGB transforms instantly without altering the underlying raw data.\n\n---\n\n## Keyboard Shortcuts\n\n| Shortcut | Action |\n|----------|--------|\n| `F` | Frame Image (Reset Zoom \u0026 Pan to fit screen) |\n| `R` | Isolate Red Channel |\n| `G` | Isolate Green Channel |\n| `B` | Isolate Blue Channel |\n| `A` | Isolate Alpha Channel |\n| `C` | View Full RGB (Color) |\n| `1` | View Image A (when B is loaded) |\n| `2` | View Image B (when B is loaded) |\n| `Space` | Toggle Blink Mode (Strobes between A and B) |\n| `Shift + Click` | Sample pixel and save to swatch palette |\n| `Scroll Wheel` | Zoom in/out at cursor |\n| `Click + Drag` | Pan Image |\n\n---\n\n## Installation \u0026 Building\n\nMake sure you have [Rust and Cargo](https://rustup.rs/) installed on your system.\n\n```bash\n# Clone the repository\ngit clone https://github.com/byvfx/floki.git\ncd floki\n\n# Build and run the app in release mode (Highly recommended for EXR parsing speed)\ncargo run --release\n```\n\n## Debugging \u0026 Logging\n\nThe app initializes [`env_logger`](https://docs.rs/env_logger), so runtime logging is\ncontrolled by the `RUST_LOG` environment variable. Launch the app from a terminal so\nlog output (written to `stderr`) is visible.\n\n```powershell\n# PowerShell — watch the EXR Header Converter work through a batch\n$env:RUST_LOG = \"floki=debug\"\ncargo run --release\n```\n\n```bash\n# bash / zsh\nRUST_LOG=floki=debug cargo run --release\n```\n\nUseful levels (prefix the target with `floki=` to filter out noisy `wgpu`/`eframe` logs):\n\n| `RUST_LOG` value | What you see |\n|------------------|--------------|\n| `floki=info` | Conversion start line, final summary (`N of X files converted`), and any errors |\n| `floki=debug` | The above plus a line per converted file and any layer left unchanged by the rename guard |\n| `info` | Everything at info level, including `wgpu`/`eframe` startup |\n| `floki=info,wgpu=warn` | App info logs while silencing graphics-backend chatter |\n\n\u003e **Note:** During batch conversion, files are processed in parallel across CPU cores, so\n\u003e per-file log lines appear interleaved/out of order. The count in the final summary is\n\u003e authoritative.\n\n## Architecture\n\n- **`main.rs`**: Application entry point and `eframe` initialization.\n- **`app.rs`**: Core application state, menu bars, persistence logic, and layout scaffolding.\n- **`exr_loader.rs`**: Background threading and parsing of `OpenEXR` data structures using the `exr` crate.\n- **`gpu/mod.rs`**: Hardware-accelerated drawing backend leveraging `wgpu` pipelines and WGSL shaders.\n- **`viewer.rs`**: The heavy lifter. Handles canvas drawing, image scaling, pixel sampling, UI interaction, and falling back between GPU and CPU paths.\n- **`tools.rs`**: The multi-threaded EXR Header Converter (batch channel renaming via `rayon`), with progress reporting and `RUST_LOG` logging.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbyvfx%2Ffloki","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbyvfx%2Ffloki","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbyvfx%2Ffloki/lists"}