Inspiration

I build plugins and macros for DaVinci Resolve, and I shoot and grade my own work. Every shoot ended the same way: a card full of Log footage that looks like grey soup in Finder, and no way to tell one clip from another without opening an editing app and scrubbing a timeline. I was opening a 3 GB application just to remember what I had shot.

The tools that solve this are either built into an editor — so you have to open the editor — or they are asset managers priced for facilities. Nothing sat in between: a small app that shows the footage correctly, lets you find it, and hands it off without touching the files.

Awards this project is entered for

Grand Prize — a finished product, not a prototype. macOS shipped 3 September, iPad on 12 September. Built solo, as a first Swift project, alongside other work.

Build in Public — the failures went out too, not just the wins. Every trap I hit is written up in the repository with an ID and a link to the code.

#HAMM (Hardest Acronym to Monetize Meaningfully) — an offline tool for a narrow professional audience, monetized with no ads, no data to sell, and no paywall on the core feature. The free tier limits library size, not capability.

Design — keyboard-first, because a selection tool that forces you to the mouse is a failed selection tool. The colour is the interface: the app is judged on whether the picture is right.

Peace Prize — nothing leaves your machine. Footage, file names, folder paths and search terms stay on the device. Search runs on-device through Core ML. The network is used for the purchase check and anonymous usage statistics, and nothing else.

What it does

See it in the right colour. Divecut reads each clip's metadata and applies the matching Log-to-Rec.709 conversion on the GPU. It converts 17 Log formats across ten manufacturers — Sony S-Log2/3, Canon Log/2/3, Panasonic V-Log/V-Log L, Fujifilm F-Log/F-Log2, Nikon N-Log, ARRI LogC3/LogC4, RED Log3G10, Blackmagic Film Gen5, DJI D-Log, Apple Log/Apple Log 2 — plus HLG, which takes the same path to 709. Fifteen of those are implemented from the manufacturers' published transfer functions and gamut matrices; V-Log L shares V-Log's curve, and Apple Log 2 is currently approximated with Apple Log's. DJI D-Log M has no published formula, so the app says so and lets you assign a LUT instead of guessing.

When a file carries no colour metadata — which is common — you assign the format once and it is remembered.

Find it by what you saw. A Google SigLIP 2 model runs on-device through Core ML. Type "water splashing over rocks" and it finds the clip and jumps to the second it happens. Embeddings are stored as Float16 and searched with Accelerate. Nothing leaves the machine.

Cull it from the keyboard. Rate, flag, mark in and out points, add to a tray. No mouse required — a selection tool that forces you to the mouse is a failed selection tool.

Hand it off still in Log. A Workflow Integration plugin puts your selects on a DaVinci Resolve timeline as the original files, trimmed to the ranges you marked. The Log-to-Rec.709 conversion travels as a colour group, never baked into the picture — so you start grading from the real file, not from a cooked copy.

It never modifies your footage. Divecut stores references and its own metadata in SQLite. No transcoding, no proxies, no sidecar files written next to your clips.

How I built it

Swift and SwiftUI, with AppKit only where SwiftUI could not reach. The colour pipeline is Metal — I have written OFX plugins with Metal shaders for years, so this part was familiar ground. The database is SQLite through GRDB in WAL mode. Search is Core ML plus a hand-rolled vector search on Accelerate. The Resolve integration talks to the app over an authenticated localhost server with an ephemeral port, a token, and Host header validation.

This was my first Swift project. I had no boilerplate and no muscle memory for the language, and I built it alongside other work. The colour science and the Resolve side were the parts I already knew; Swift, SwiftUI and the App Store were the parts I learned in public, one commit at a time.

Monetization with RevenueCat

RevenueCat SDK 5.82.0 handles the offering, the purchase, and restore; the paywall UI is native so it matches the rest of the app.

  • Free forever — every feature, up to 100 clips in the library
  • Pro — $6.99/month or $49.99/year, unlimited library, with a 7-day free trial
  • One purchase covers macOS and iPad on the same Apple Account

The free tier is not a crippled demo. The limit is on library size, not on what the app can do — judges can exercise the whole product without paying, and the 7-day trial unlocks the rest.

Challenges I ran into

Apple's review was my best QA session. Ninety minutes after submitting I had eight questions back. Recording the walkthrough to answer them surfaced two real bugs I had missed for weeks. It also cost me five days, because replying to a rejection does not put the app back in the queue — you have to resubmit.

Getting the colour right, not just plausible. I compared my transform against Resolve's own DRT and against Sony's official LUT and found my exposure constant was off. Correcting it took the average ΔE76 from 12.1 to 4.36.

Knowing when a clip is actually Log. Manufacturers hide this in different places — Sony in an encrypted MakerNote, Apple in a logs atom, some not at all. Where the file says nothing, guessing is worse than asking.

What I learned

Shipping is a separate skill from building. The last two weeks were almost entirely store metadata, review notes, privacy manifests, and localisation into seven languages — none of which is programming, and all of which decides whether anyone ever sees the app.

I also learned to write down the thing I got wrong, immediately, in a place I will read again. The repository has a knowledge file of every trap I hit, with an ID and a link to the code. It is the most useful artefact I produced apart from the app.

What's next

iPad shipped on 12 September, alongside macOS since 3 September — one purchase covers both. Faster indexing on large libraries. And the feature people keep asking for: send to more than one timeline, and back again.

Built With

  • coreml
  • davinci-resolve
  • grdb
  • ipados
  • macos
  • metal
  • revenuecat
  • sqlite
  • swift
  • swiftui
Share this project:

Updates

Submission history