As a photographer, my focus is on visual qualities - composition, balance, color, feeling - but digital tools only see data. They organize by time, or by metadata like camera model and aperture. Photography is a visual art form, and the relationship a photographer has with their work is aesthetic, not chronological.
I wanted to explore my photography by how it looks, not when it was taken.
Quantifying "Feel"
The first challenge: making "visual quality" into something a tool can work with. I defined four aesthetic dimensions - warmth, contrast, minimalism, and abstractness - each scored 0-100 using image analysis algorithms developed with Claude Code. Together, these provide a coordinate system for visual feel.
I built a proof of concept with a simple filtering interface to validate that the scores matched my own perception. Three dimensions were measurable from pixels alone, but abstractness is inherently subjective - so I built a calibration process trained on my own ratings.
Spatial Modality
The conventional next step would be search and filtering - slider for warmth, slider for contrast, retrieve matches. But aesthetic qualities are most meaningful in relation to other images. What matters is where your visual identity lives in aggregate - which images cluster unexpectedly, how your tendencies have shifted across your body of work.
The point is to see your body of work.
This led naturally to spatial visualization - a plot maps aesthetic similarity to proximity. Introducing a third axis lets you compare three qualities simultaneously. I designed the interface in Figma, then built it as a native macOS app using Swift with SceneKit.

Consequences of Going Spatial
A spatial system created problems that traditional photo tools never face. In each case, the solution meant translating an abstract quality - directionality, complexity, distinguishability, legibility - into something the user could directly manipulate.
Orientation in 3D
As you rotate the graph, axes leave the screen. How do you know what any direction means? I designed floating pill labels at the end of each axis, containing the dimension name and small 3D arrows that rotate live to show directionality. When an axis moves off-screen, the pill tethers to the screen edge - the arrows keep pointing, so no information is lost. This prioritizes direction over measurement, which is what matters when the goal is relative position rather than precise values.
Flattening: Managing Complexity
Comparing three dimensions at once is useful for the big picture, but can make focused comparison more difficult. The flatten mechanic collapses one axis, projecting the 3D cloud into a 2D plane - choosing which two dimensions to focus on. The transition animates smoothly, and the axis pills respond in real time.
The Overlap Problem
Hundreds of images in a constrained space overlap so heavily that individual images are neither legible nor selectable. These are separable problems - you need to see distinct images and act on them - and the solution needs to address both.
My first attempt was a magnetic cursor that dispersed images on hover. This improved legibility but didn't solve targetability - moving the cursor slightly revealed a completely different set of images.
The solution was reframing zoom as a control for distinguishability. I combined a camera zoom with an inverse image shrink, so that pinching adds negative space between images rather than making everything bigger. This also made panning purposeful and the axis pills more useful, since you actually spend time zoomed in, relying on their directional context.
Reflection
None of these problems had existing solutions to reference. They were specific to the product's spatial approach, and had to be identified before they could be solved.
This product lets users find new relationships between their work. Aesthetic similarity becomes proximity, complexity becomes a flatten gesture, and distinguishability becomes a pinch. The translation from abstract quality to a fitting interaction is a design challenge I'll continue exploring.
