Your screenshots, filed by AI before you even look for them. A native macOS menu bar app I designed, engineered, and shipped solo. AI is not a feature here. It is the material.
My desktop was a graveyard of Screenshot 2026-01-14 at 3.42.17 PM.png. So was every designer's and developer's I asked. The screenshot is the fastest capture tool we have, and the worst retrieval tool. I wanted the filing to happen at the moment of capture, with zero effort, and I wanted to build it myself with AI at every layer.
Snapsort lives in the menu bar, not the dock. No window to manage, no app to remember. It watches, sorts, and gets out of the way. That position drove every choice after it: native Swift over Electron for instant launch and tiny footprint, a 5-step onboarding, a global hotkey for search, and a first-sort celebration so the value lands in the first minute.
The pipeline is hybrid by design. A 2,787-line local classifier built on Apple Vision and OCR handles the easy majority: free, instant, and nothing leaves the Mac. Only files scoring below a 0.75 confidence gate queue for a cloud vision model, worst first, so every API call earns its cost.
One provider abstraction speaks to four APIs plus any OpenAI-compatible endpoint, so local models are welcome too. Images resize to an 800px edge before upload. Rate limits honor Retry-After with a cooldown clock. Keys live in the Keychain, validated on entry.
Classification quality lives or dies in the prompt, so I treated it like shipped UI: 387 lines, versioned, and loaded from a file at runtime so I can iterate without recompiling. It opens with cardinal rules, guards against hallucination explicitly, and ends with a strict JSON contract because its output becomes real folder names on a real file system.
RULE 1: GROUND TRUTH IS THE IMAGE
Classify only what you can SEE. If a brand mark is not visible, the brand is unknown.
RULE 2: BRAND BEATS GENERIC
"Stripe" beats "Dashboard". "Figma" beats "App UI".
ANTI-HALLUCINATION GUARD
When you cannot identify the brand AND cannot confidently identify the
content type, set folder to "Unsorted" with confidence ≤ 0.5.
"Unsorted" is honest; a wrong guess is not.
OUTPUT FORMAT (STRICT)
Return ONLY this JSON. No markdown fences. No commentary.
{"category":"...","folder":"...","confidence":0.0-1.0,"description":"snake_case_tokens"}
The image alone is not enough context, and too much context invites hallucination. Every input the model receives is deliberate, weighted, and bounded.
This is where UX craft matters most in AI products. Snapsort acts on a user's file system, so every action is consented, disclosed, and reversible.
"Unsorted" is honest; a wrong guess is not.
From the production prompt: uncertainty as a first-class UX stateI ran a beta with 15 developers and designers, the exact audience the classifier serves. Their real screenshot libraries became my eval set. Every misclassification was traced to its cause and became a permanent rule in the prompt or the local classifier.
The entire build ran through CLI agents: Claude Code as the daily driver, with the prompt, the local classifier, and the provider layer iterated conversationally and verified by hand. Then the unglamorous last mile: code signing, notarization, a DMG pipeline, a landing page, and launch. Search shipped too: a natural-language query parser with date filters, one global hotkey away.
Snapsort is my argument that a senior product designer today should shape the prompt, the pipeline, the trust model, and the pixels as one continuous craft. I research it, design it, build it, eval it, and ship it.