by oogabooga13 | 2025-12-07 16:00:34+00:00
OP here!

Some context on why this exists and the decisions behind v1.0:

The Problem I'm a photographer, and my workflow was broken. I'd come back from a shoot with hundreds of RAW files and face two anxiety-inducing tasks: culling the duds and naming the keepers. I'm folder-first—file names matter because they follow the image everywhere: Affinity, Da Vinci, Apple ‘Motion’ layer stacks, client handoffs. A properly named file is searchable on any system without special software.

I wanted to point the computer at a source folder, point it at a destination, and have it handle everything in between. Locally. No internet. No uploading terabytes to someone else's servers.

The Journey [ Screenshots and more at https://oaklens.art/dev ] This started as a ~300 line CLI script on an M4 MacBook Air. After a few rounds of deep research (shoutout to Gemini for helping me break through some implementation walls), I had something that actually worked for my daily workflow. But I wanted to keep the low overhead of the terminal while making it more accessible. Enter the TUI—with two aesthetic modes: "Warez" (demoscene callbacks for those who appreciate that energy) and "Pro Mode" (clean HUD + stats for studio environments). F12 toggles between them. Fully open source (MIT).

Technical Decisions:

1. No Prompt Boxes: I didn't want to "chat with my photos." FIXXER treats the VLM as a headless reasoning engine. You press Auto, it applies logic—naming, culling, grouping—without you ever typing a prompt.

2. Native RAW Support: Most AI photo tools assume JPEGs. FIXXER works directly with RAW files (.RW2, .CR3, .NEF, .ARW, 40+ formats) via rawpy. We extract embedded thumbnails when available or do half-size demosaic in memory—no temp files, no export step. Straight from camera to AI pipeline.

3. Why Qwen2.5-VL: We tested Bakllava, Llava, Phi-3-Vision. Phi-3 failed hard on structured JSON outputs. Qwen was the only model consistent enough for production—good spatial awareness, reliable JSON, runs well on 24GB unified memory.

4. Graceful Degradation: Local-first means dependencies can fail. Semantic burst detection uses CLIP embeddings, falls back to imagehash. Quality culling uses BRISQUE (essential for not flagging bokeh as blur), falls back to Laplacian variance.

5. Hash Verification: Every file move is SHA256 verified with JSON sidecar audit trails. This eliminates the blind trust problem—you get cryptographic proof that your files arrived intact.

Flexible Workflows FIXXER is modular. The full Auto workflow chains burst detection → quality culling → AI naming → archive, but each feature works independently. Just want to group bursts? Run that alone. Just want quality tiers? Cull button. For the simplest use case, there's Easy Archive: point it at a folder of images, and it AI-names everything and sorts them into keyword-based folders. That's it.

AI Critique Mode: Beyond organization, FIXXER can analyze any image (RAWs included) and return structured creative feedback: composition score, lighting critique, color analysis, and actionable suggestions. It outputs JSON you can save alongside your files. This is v1—future versions will offer critique tiers based on depth and processing time. Configuration & Tuning The default thresholds (burst sensitivity, culling strictness) are tuned for my workflow, but everything is exposed in ~/.fixxer.conf. If the burst detection is too aggressive or the culling too lenient for your specific camera/lens combo, you can tweak the engine parameters directly to dial it in.

What's Next (v2) Dry run mode currently shows you exactly what will happen before any bits move. v2 will let you edit individual AI names in the preview before executing.