Inspiration

I'm a photographer, and one thing I always struggled with was knowing where to start with editing. There's no shortage of general advice — adjust your exposure, lift your shadows — but none of it tells you whether those adjustments actually serve the story you're trying to tell or the brand you're shooting for. Generic editing tips don't exactly know your visual identity. I built Nireti because I wanted something that did.

What it does

Nireti is an AI-powered photo editing assistant for beginner photographers and small brand owners. You give it a project brief and optionally your brand website. It extracts your visual direction (genre and traits), researches editing conventions for that genre, merges those conventions with your specific brand traits, and then analyzes each of your photos against that context. It returns precise slider suggestions: exposure, shadows, highlights, contrast, temperature, saturation (focused on these 6 effects for now) with a plain-language reason for each one. Nothing is applied automatically. You stay in control. You can apply the suggestions, adjust the sliders manually, crop and pan, undo, redo, or reset. When you're done, you export all your edited photos at once.

How we built it

Nireti is built with Reflex, a Python full-stack web framework that handles both the UI and backend in a single codebase. The AI pipeline runs on Nvidia's Nemotron models via the Nebius Token Factory. Nemotron Nano handles brand direction extraction, while Nemotron Super handles convention merging. The Nemotron Vision model receives the actual photo alongside the brand context and technical image measurements; that is the brightness, shadow percentage, highlight clipping, color channel averages, and returns the edit suggestions. Tavily handles web extraction from the brand URL and genre convention research. Image rendering is done non-destructively with Pillow and NumPy: the original image is never modified, and edits are stored as slider values that are applied on the fly at display time, and only rendered to full resolution at export.

Challenges we ran into

The biggest learning curve was the image rendering pipeline. This was my first time working with image manipulation in code, so understanding what NumPy was actually doing to the pixel arrays; how masks work, how channel math translates to visible colour shifts. That took real time to get right. A seemingly small bug, a + 0.15 instead of * 0.15 offset left in the temperature calculation, produced a warm cast on every imported photo that took a while to trace back to its source. Also getting Reflex's reactive state to behave correctly with nested lists and background tasks also required careful handling. Outside of those, the Nemotron endpoints were straightforward to spin up.

Accomplishments that we're proud of

The UI layout came together in a way I'm genuinely proud of, with the settings page feeding cleanly into the model pipeline, the suggestions panel showing up with a reason in plain language, the before-and-after toggle, the filmstrip. But what I'm most proud of is that the idea actually works. It's one thing to have a concept; it's another to see it running in real time, analyzing a real photo, and returning suggestions that are actually grounded in your brand direction rather than generic editing rules.

What we learned

Two things stood out. First, how much you can do with Python for image manipulation — Pillow and NumPy together are surprisingly powerful, and I'll be carrying that forward. Second, Reflex. I came in unsure how to handle the UI for the project and when I found Reflex, I wondered how the reactive state model would hold up for something this dynamic, and it handled it well. I'll be reaching for it again.

What's next for Nireti

The immediate next step is getting real photographers to use it and collecting honest feedback on the quality of the edit suggestions. The pipeline is solid but there's still room to get more out of the models — better prompting, tighter convention merging, more nuanced suggestions for edge cases. That feedback loop is what comes next.

Built With

Share this project:

Updates

Submission history