An agent that writes its reasoning in the margin

You're not behind on your photos. Your tool is behind on your life.

Six hundred frames, twenty-five minutes, every reason in a single line of mono in the gutter. Apple Memories hides the algorithm. Frame writes it down.

contact-sheet · 2026-05-15_Zoo_Afternoon · 612 framesshowing 24 / 612
kept · burst-of-8 · eye sharpest
hero · climax
removed · utility · receipt
removed · utility
24 / 612 visible1 kept · 1 hero · 2 utility
612 frames · 80 kept · 8 hero · 2 removed · Sony A7 IV + iPhone · 25 min
Three things every tool gets wrong

The receipt in your memory video
is not a bug. It's the design.

MUSEUM GIFT SHOPPLUSH LION ........... 18.50JUICE BOX ............. 3.00SANDWICH ............ 12.50TOTAL: $34.00
Apple Memories pick · zoo day 2026-04-22
Pain 01 · Apple Memories
It picks the receipt because it scores aesthetic, not narrative role.

Memories looked at this frame, saw a well-exposed, sharp, centrally-composed document, and surfaced it as a “discovered moment.” It is correct on every axis a pixel statistician cares about. It is wrong on the only axis the photographer cares about.

Frame's counterFrame's role classifier flags this frame as utility · receipt. It never enters the keeper pool, regardless of exposure score. The lion-roaring frame, three rows down, is auto-marked as hero · climax — and surfaces first.
frame 1 · pre-laughframe 6 · keeperframe 8 · postGoogle picks frame 1. Frame picks frame 6.
burst-of-8 · 2026-05-15
Pain 02 · Google Photos
It collapses an 8-frame burst into one — and picks the wrong frame every time.

Google's “Top Shot” reduces a burst by visual hash and almost always picks frame 1. But frame 1 is the moment before the laugh; the keeper face is in frame 6. Visual hash cannot tell a mid-laugh from a pre-laugh.

Frame's counterFrame's burst collapser is pose-aware: it scores eye-state, mouth-open, gaze direction, and head pose separately, then picks the keeper by the rubric your genre asked for. Left-looking and right-looking frames go in different sub-groups; eye-closed during a kiss is not penalized.
fence detected · severity 0.7
leopard · zoo · 200mm f/2.8
Pain 03 · Lightroom + Aftershoot
Four hours to cull six hundred zoo photos — because no tool detects the fence.

Aftershoot is the leading AI culler for pros. It flags blur, blinks, expression, sharpness. It does not, in any version, detect chain-link fences, glass reflections, or wire across a subject. So you pixel-peep every elephant frame at 100%. You keep frames with a hairline wire across the leopard's flank that you would have rejected if you'd noticed.

Frame's counterFrame's zoo-genre weight includes a fence/cage/glass penalty: severity × proximity to subject, computed against the subject mask. Zoo days are also the only genre that triggers soft cleanup — generative remove on detected wire segments, never on faces.
Genre is the master switch

A zoo day and a wedding
are not the same product.

EXIF tells Frame which kind of day this was — focal-length distribution, burst rate, face count, location variance. The weights below come from photographer interviews; the file you fed in has its own row.

Genre · auto-detected from EXIFeye-sharpnessbehavior-peakfence penalty
Family · zoo day0.300.250.20
Family · birthday0.250.300.00
Wedding · group0.150.200.00
Wildlife · portfolio0.450.300.00
Travel · cityscape0.200.200.00
A reader · beta cohort 2026-Q2

“Apple Memories made one of these for our zoo day. It picked a photo of the museum gift-shop receipt.Frame surfaced the lion roaring at three in the afternoon, and the kid laughing on my husband's shoulders. I sent it to my mother before bed.”

Sarah · marketing director, Copenhagen · Sony A7 IV · 612 frames last Sunday
Parent beta · cohort 2026-Q2

Get on the list. We ship by genre.

Tell us how many frames you tend to come home with and which genres dominate. We seed beta cohorts that way — family-zoo first, then travel, then wedding.

privacy by default · unidentified minors never auto-shared