Index04

Apature

A keyboard-first contact sheet for photojournalists.

Active development

Rust / Python / egui

v0.1.1Updated 24 Oct 2026

Card in. Cull. Caption. Send. The Apature contact sheet in the dark appearance with a storm-damage assignment open.
Project
Apature
Type
Photo workflow app
Status
Active development
Role
Developer
Platform
macOS / Linux / Windows
Started
October 2026
Languages
Rust 95% / Python 3%
Built with
egui
Source
Public
License
Apache-2.0
Last push
24 Oct 2026

01

Why I made this

Honestly, I made this to see what I could do. I love Photo Mechanic and I use it on deadline, but I was curious what I could build myself, so I rebuilt the loop I actually use every week: card in, cull, caption, export, send. Along the way I added a few things it doesn't have, like hashed verification of every copy, day chips before you ingest, and delivery with a sent ledger, and I kept the things it gets right, like the keys and the variables.

Where I want this to go is onboarding. Getting into photojournalism shouldn't mean a cold start with software that assumes you already know the workflow. I plan for Apature to teach the loop as you use it, the same loop you would run in Photo Mechanic, so that someone picking it up for the first time can learn the job and the tool together. I don't like gatekeeping. I'd like the people already in the industry to see this as an effort to bring more people in, and to show that it isn't that hard. Sometimes it's the software and the experience, not the person.

Who knows where it goes from here. This is the first version, I'm still learning Rust, and it shows in places. Don't go crazy about it; tell me what breaks and what you'd want next.

02

What was hard

  • Never touching an original. Ratings, captions, rotation and crops all live in an XMP sidecar next to the file, written the way Photo Mechanic and Lightroom read it, so a card ingested by Apature still opens anywhere.
  • Trusting a copy. Every file is hashed with SHA-256 at every destination before the card is marked done, and a ledger remembers each card so it is never copied twice.
  • Metadata that survives the desk. A JPEG leaves with EXIF, XMP and IPTC-IIM all in agreement, including the fields old newsroom systems still read.
  • Feeling like a Mac app from an immediate-mode UI. Native menus, a menu bar extra, the system trash sheet, separate windows for Ingest, Settings and Preview, Reduce Motion and text scaling, all on top of egui.
  • Delivery that does not lose a photo. FTP, FTPS, SFTP and plain folders share one path: upload to a temporary name, rename on success, retry with a reconnect, and record every send per photo.

03

A quick look

The Ingest window: a card with day chips, the naming template with a live example of the resulting file name, and the transfer speed.

Ingest: day chips, a live example of every name the template produces, and verified copies.

    The caption pad with the assignment, code replacements and Photo Mechanic style variables.

    Captions: the assignment pad, code replacements and the variables Photo Mechanic users already know.

      The crop tool over a frame, with the crop stored in the sidecar rather than in the file.

      Crop and rotate are stored in the sidecar. The original is never modified.

        The export sheet with presets per outlet, JPEG or JPEG XL, and delivery to a folder or server.

        Export presets per outlet, then deliver to a folder, FTP, FTPS or SFTP.

          04

          What it does

          • Ingest from a card or any folder: day chips before you copy, a live example of every name, SHA-256 verification at every destination, a ledger so a card is never copied twice, a backup destination, eject when verified, and Live Ingest for a watched folder.
          • Cull on the sheet: ratings, colour classes, tags, filters, sort, tabs, burst stacks, compare up to four frames, a loupe, 1:1 with one shared magnification, a view-only exposure boost, rotate and crop stored in the sidecar.
          • Caption with an assignment pad, code replacements, Photo Mechanic's variables, keywords, GPS, recent values and save-to-selection.
          • Export JPEG or JPEG XL with presets per outlet, EXIF, XMP and IPTC-IIM kept, then deliver to a folder, FTP, FTPS or SFTP with passwords in the Keychain, retry, and a per-photo sent ledger.
          • Two appearances, six accent colours, Reduce Motion, text scaling, higher contrast, focus rings, and a menu bar extra with live status.
          • Receive over Wi-Fi: an FTP server inside the app so a phone or a camera can send frames straight into Live Ingest. No WT-7 needed.
          • A welcome that teaches the loop one step at a time, tips the first time each screen opens, and an import from Photo Mechanic for your templates and code replacements.
          • Runs on macOS, Linux and Windows from the same Rust core.
          • Updates checked against GitHub Releases, once a day or on demand.
          • No accounts, no analytics, and originals that are never modified.

          05

          Releases

          06

          Credits

          Anything that came from someone else, or that inspired me, is credited here and in the app.

          • Photo Mechanic by Camera Bits: the loop, the keys and the variables this is built around.
          • egui by Emil Ernerfeldt and contributors (MIT or Apache-2.0): the user interface.
          • My own photojournalism assignments, shot on a Nikon Z 6 II: the test material for every release.