Framework
A photography workspace that clusters a shoot, ranks what remains against composition and your own keeps, then sequences the frames that belong together.
- Type
- Web App
- Role
- Creative Technologist
- Built
- -
- Updated
- -
- Source
- GitHub
Tech stack
- Next.js
- React
- TypeScript
- AI
- Computer vision
- Supabase
The difficult part of photography isn’t taking 500 photographs. It’s knowing which five matter.
Which five frames belong.


The card is full
- Duplicates.
- Soft frames.
- The same moment, three ways.
- Two different pictures in one folder.
Taking the photograph got cheap. Deciding which one belongs in the edit did not. Framework starts when the card comes out of the camera.
It clusters, then ranks, then waits. A sharp frame is a fact. Whether it is the frame is the photographer’s call, and the software is not allowed to collapse those into one number.
Signals stay separate
Technical quality, visual structure, and what the picture is of are different questions. Sharpness, exposure, composition, color, people, architecture. None of them is allowed to collapse into one quality score.
type FrameSignals = { technical: { sharpness: number exposure: number blur: number } visual: { composition: string color: string contrast: string } subject: string[]} // No single score. A recommendation is a set of reasons.The keep is the training signal
A generic model can prefer the sharper frame. The photographer may keep the other one. That choice is the data.
Recommendation, decision, preference, a more personal next recommendation. Explanations stay attached, so the model is not pretending the choice was objective.
Recommendation
↓
Photographer keeps or rejects
↓
Preference signal
↓
A more personal next passSequence after the edit
Ranking is not a story. After the shortlist, frames are arranged for continuity, color, subject, and pace. The contact sheet, the reject pile, and the comparison view exist so that sequence has something real to follow.
The hard part
Taste is not a score
The hard question was whether software can learn a photographer’s eye without announcing that the eye is objective. A technically imperfect frame is often the one that matters.
Solution
Recommendations are decision support. Signals stay separate. The keep, not a generic grade, is what the model is allowed to learn.
Trade-offs
| Decision | Choice | Why |
|---|---|---|
| Quality | Several signals | Technical quality and artistic value are not the same fact. |
| Taste | Learn from keeps | A universal photography score is someone else’s eye. |
| Volume | Cluster, then rank | Hundreds of frames start as groups, not a single sort. |
| Story | Sequence after selection | A gallery is not a leaderboard. |
What I’d change
- A RAW-native path, and a way through Lightroom.
- Stronger personal embeddings.
- Collaborative curation, and publishing a sequence as a gallery.
In the edit
Why isn’t there a score out of ten?
A technically clean frame and the frame you would print are often different pictures. Sharpness, subject, and composition stay listed beside each other. The recommendation is those reasons, written out.
Does it sequence the whole card?
Only after the cut. Continuity, color, and pace are arranged from the frames that were kept. A contact sheet of five hundred is not a story.
Whose eye is it learning?
Yours. If the model prefers the sharper frame and you keep the other one, that choice is the training signal. A universal “good photograph” is someone else’s taste.
