Qix app icon — a keyboard keycap with a camera lens

File photos at the speed of typing.

Qix gets pictures out of Apple Photos and into a plain, beautifully organized folder tree — culled, keyworded, rated, and renamed — without your hands leaving the keyboard.

The Qix main window: folder sidebar, thumbnail grid of a Japan trip, and metadata inspector
⌨️

Keyboard-first, genuinely

The entire triage loop — navigate, compare, rate, keyword, file — works without the mouse. Every screenshot on this site was taken by driving Qix through its own keyboard interface.

📁

Your files, plain on disk

The library is just folders of standard files. Keywords, ratings, and captions are written into the files themselves. No database, no sidecar city, no lock-in — Finder and exiftool see everything.

🛡️

Never destroys data

Nothing is ever deleted — only moved to the macOS Trash. Nothing is overwritten, ever. Cross-disk moves verify a hash before touching the source. Everything is undoable with ⌘Z.

🤖

Agent-ready

An embedded MCP server gives AI agents Qix's own command layer — search, inspect, keyword, file — with every safety rail intact, and every agent edit undoable from the keyboard.

Fly anywhere with two keystrokes.

Press g and type a few letters — jap is enough to reach Trips/Japan 2025. Press m instead and the same fuzzy palette moves the selection there, optionally renaming files by your pattern as they file. Recent destinations float to the top; a folder that doesn't exist yet is offered for creation.

Filing a shoot stops being a drag-and-drop workout and becomes a sentence you type.

Animation: pressing g, typing 'jap', and jumping to the Japan 2025 folder

Cull bursts side by side.

Qix spots bursts automatically — consecutive shots seconds apart from the same camera get a subtle group outline. Press c to compare them 2×2 or 3×3 with synchronized zoom and pan, mark rejects with x, and commit. Keepers stay; rejects go to the Trash — pair-atomically, as one undo entry.

Culling mode comparing four birthday burst shots, one marked rejected

Search the whole library as you type.

Press ⌘F and write queries like kw:travel rating:>=4 2025 or camera:x-t5 -food. Results land in the same grid, so you can rate, keyword, move, or open them like anything else. Press r to reveal a hit in its home folder.

Search runs on an in-memory metadata index — it keeps up with every keystroke.

Library search for kw:travel rating:>=4 showing results across trip folders

Metadata that lives in the files.

Ratings are standard XMP stars that Lightroom and Photos understand. Keywords go into the files as XMP subjects (plus legacy IPTC where the format supports it), with frequency-ranked autocomplete built from your own library. Captions sync all three metadata families the MWG way.

Press t, tag the whole selection, press 15 to rate. Every write is verified by reading it back.

Animation: pressing t and adding a keyword with autocomplete

Live Photos stay whole.

A Live Photo is two files pretending to be one. Qix treats the pair as a single item everywhere — move it, rename it, trash it, and both members travel together with basenames in sync, or nothing happens at all. Hold Space in the viewer to play the live video.

A lone .mov whose image went missing gets flagged, never silently adopted.

The viewer showing a Live Photo with the filmstrip below

Rename by pattern, preview first.

⌘R opens batch rename: date and sequence tokens, favorite patterns on ⌘1⌘9, and a live old → new preview of the whole selection. Conflicts are highlighted and block commit. Numbering continues from what's already in the folder, so 018 follows 017 even across sessions.

The batch rename dialog with a live preview of new filenames

The rules Qix will not break.

These are not settings. They're invariants, encoded as tests that must never regress:

  1. No file is ever deleted — only moved to the macOS Trash, where you can get it back.
  2. No file is ever overwritten. Every write goes to a temp file and lands with an atomic rename.
  3. Live pairs are atomic. Both members or neither; basenames stay in sync. A fuzz test hammers this with randomized operations.
  4. Imports are verified before they're recorded — a half-written file is never marked as imported.
  5. Caches are disposable. Delete every cache and you lose nothing but speed. The filesystem is the only ground truth.
  6. External changes abort cleanly. Every operation re-checks its targets at the last moment; if something else moved your file, Qix stops rather than guesses.
  7. Photos.app is read-only territory. Qix never modifies your Photos library. Ever.

See the whole picture.

From first import to a filed, keyworded, rated library — the manual walks the full workflow.

Open the manual