Latent — a 35mm film canister and an SD card joined by a loop of film

Latent

Film experience, digital process.

You load a can of film, shoot a roll, and you cannot look at what you got: nothing is developed until the can comes out. Then the card goes into the computer, and every frame is developed as the film it was actually shot on — grain, halation, colour and all.

Why this exists

Film is a better way to take photographs than I am at describing. It is slow, and the slowness is the point: thirty-six frames on a roll, each one costing real money, each one meaning something. You commit. You wait. You find out days later what you actually did.

That intent and purposefulness is what I want. What I do not want is the bill.

What a roll of 36 frames costs, in Europe, today
Film stockDevelop + scanA rollPer frame
Consumer colour negative €11€13€24€0.67
Professional colour negative €20€26€46€1.28
The same frame, on Latent ——€0€0

Film and processing prices as listed by European retailers and labs in 2026: a 36-exposure roll of Kodak Gold 200 at about €11, Portra 400 at about €20; develop-and-scan from €13 (Mori Film Lab) to €26 (Studio Baxton), with push processing around €2 per stop. Latent's marginal cost is zero: the card and the software are already there, and the camera is one you own.

Filming your way through a year — say fifty rolls — is between €1,200 and €2,300 of consumables. The same year on a digital camera is a few hundred frames' worth of disk. That gap is the whole reason film feels the way it does, and it is why almost nobody shoots it casually.

The obvious answer, and why it wasn't good enough

There are film simulation systems for digital SLRs already. I have tried a few, and they don't go far enough, for reasons that turn out to be structural rather than a matter of effort.

Latent takes the opposite position on all three. The camera does almost nothing. The computer does everything.

How it works

Four steps, and only the middle two happen in the camera.

  1. 1 Fill your bag

    On the computer, choose films and write them to the card. Twelve cans, or thirty-six, any mix you like. That is your bag of films, and it is a list rather than a limit — the catalogue runs to 129 stocks.

    $ latent fill-bag /media/card \
        --stock kodak_portra_400:3 \
        --stock ilford_hp_5_plus_400:1 \
        --stock fuji_velvia_50:2
  2. 2 Load a can

    In the camera, open the bag. Up and down choose the film, left and right set the rating — how far you are pushing it — and set loads it. Each row shows the effective ISO, because that is the number that matters when you have rated a film two stops up.

    The camera's bag of cans: a list of loadable films with their effective ISO
    The whole interface. There is no menu, no histogram, no settings screen.
  3. 3 Shoot, and don't look

    The camera counts frames and sets the film's ISO. That is all it does — it never touches the image. With review locked you cannot check your work, and there is nothing developed to check anyway.

    The camera's overlay: the film name, the frame count and the effective ISO
    A roll in progress. Past the nominal count the counter simply stops — some cans hold a frame or two more, and you find out when one arrives.
  4. 4 Unload, then develop

    Taking a can out spends it, even with frames left on it. That is the film-camera rule, and it is why a partly-shot roll is a finished roll. Then the card goes into the computer and the film happens: the look, the grain, the halation, at full resolution from the RAW.

    $ latent develop /media/card --out ~/Pictures
    rating on the card: +2
      IMG_0100.CR2  kodak_portra_400  shot +2 dev +2 → kodak_portra_400_++
      IMG_0101.CR2  kodak_portra_400  shot +1 dev +1 → kodak_portra_400_+
      IMG_0102.CR2  kodak_portra_400  shot +1 dev +1 → kodak_portra_400_+
    developed 3 of 3

What it does that a filter doesn't

Grain, halation, softness

A colour lookup table is a three-dimensional cube of colour — RGB in, RGB out, with no notion of space. It cannot carry grain, because grain is a texture rather than a colour. Camera noise cannot supply it either: noise depends only on exposure, so it cannot tell Tri-X 400 from Portra 400 from HP5 Plus, which differ most obviously in exactly that.

So Latent adds them, per film, at full resolution — and measures rather than guesses how much each needs.

Push and pull, done properly

A push is underexposure followed by overdevelopment, and only the camera can do the first half. Rating a 400 film at 1600 makes the camera meter for 1600: the frame gets two stops less light and carries the noise of it. That is the push. A computer can add contrast afterwards, but not the noise of light that was never gathered.

So the rating is set in the camera and recorded per frame, and the development is chosen afterwards — which is what a photographer actually does.

The shelf reporting that a rating is beyond the camera's ISO range
And when the film cannot be rated that far, it says so rather than quietly applying a different number.

A real roll, with the surprise left in

A can holds twelve, twenty-four or thirty-six frames, and it is a real roll: it can hold a frame or two more than the counter admits, and the camera will never tell you. Unload it early and it is spent.

The cost of film, the freedom of digital

Every film in the bag is a real one, with its real speed and its real character. None of them cost anything to shoot. Use thirty-six frames to get one photograph, or shoot three hundred, and the bill is the same.

Photographs

Being added. In the meantime the interface above is the real thing — drawn at the camera's actual resolution, with the coordinates the module uses.

Where it is

Computer side
Working and tested. 129 film stocks, push and pull, grain, halation. Develops RAW frames end to end.
Camera side
Built for the Canon 7D and its dependencies verified. Not yet run on a camera.
Grain calibration
Being measured now, from printed step wedges shot at every ISO.

Which is to say: it is a work in progress, and the parts that are finished are finished properly rather than plausibly.