A design-led AI experiment: upload a bouquet photo and get a cinematic floral breakdown, with numbered markers and specimen details for every flower the model can see. Started at a Cursor build event, refined over dozens of passes into a live public demo.
A self-initiated AI experiment. It started at a Cursor build event in Sydney with about an hour on the clock, and grew over dozens of passes into a live public demo with validation, shared history and its own usage gate.
Everything: the concept, UX and UI direction, interaction design, the AI workflow, the build, deployment and iteration.
Figma for direction, Cursor for the build. React + Vite on the front, Gemini for recognition, Vercel API routes behind it, Upstash KV for shared history.
Live public demo, desktop-first. Mobile is still to come.
What if you could upload a bouquet photo and get a cinematic, sci-fi floral breakdown in seconds?
The visual direction is a techy HUD language applied to something as soft and organic as flowers. A photo goes in, the scan runs, and the bouquet comes back as an annotated specimen sheet.

Upload a bouquet image, the model identifies the visible flowers, and the UI overlays numbered markers with specimen details: species, common context, and a confidence figure.
Non-floral uploads are rejected with a clear floral-only prompt. It keeps the experience constrained to its intended use instead of pretending to analyse whatever it is given.
Visitors can browse scans from previous users, so the demo feels alive and social rather than a private sandbox that resets for every visitor.
After the free scans are used, an access code is required to continue. It protects the API from abuse and keeps a public AI demo sustainable to run.
Only valid floral scans count toward the shared totals and history.
Each user flow, captured from the working demo. Pick one to watch it run.
I did not start this because I found a market gap. I make floral bouquets, and I wanted a way to present that work in my portfolio that could carry the story and detail of each arrangement. A standard gallery grid flattens all of that.
Around the same time I attended a Cursor build event at Dovetail in Sydney, with roughly an hour to build something AI-integrated. I went in with the bouquet idea, and the rough version that came out of that hour worked. People responded to it and genuinely liked the uniqueness of it, and it stopped being a fun hack and became something I wanted to keep refining.
I did not want AI-generated visuals deciding the look of the product. Left to drive, the output drifted generic. So I designed the direction in Figma first, a techy HUD language for something as soft and organic as flowers, partly inspired by the portfolio of a Switzerland-based product designer (sutera.ch). Then I iterated in Cursor for dozens of passes until the build matched the intent.
The big takeaway: AI is powerful when you have direction and mediocre when you let it drive. People keep saying design and dev will be replaced by it. My experience was that the tools sped me up precisely because I knew what I was aiming for.
Upload a bouquet image, the model identifies the visible flowers, and the UI overlays numbered markers with specimen details: species, common context, and a confidence figure.
This project taught me more from its constraints than from its features.
I had heard about quotas and token limits, but I did not feel them until they interrupted the build. Free tiers forced me to learn practical AI economics: what to run locally, what to call once, and when precision is worth paid usage.
Model output can be semantically right and visually noisy. Anchors and bounding boxes kept missing the flowers, so I moved to a numbered pin system that stays legible even when the geometry is imperfect.
I expected a one-click launch and got environment and workflow friction instead. The app was usable locally well before it was reliably public, and that gap shaped what the finished version could realistically be.
React + Vite
Gemini (Flash family) for classification, detection and annotation output
API key moved off the client into server environment variables
Vercel API routes for analysis, usage, access codes and shared history
Upstash KV for the shared counters and history
Public on Vercel
I came out of this with a different way of working. Move fast to a rough prototype, then iterate in tight loops instead of treating each prompt as a final answer. The interface only started to feel right once I brought my own visual judgement to the pixels, the states and the micro-details, and held every pass to a standard of consistency. Quality came from dozens of small decisions, a lot of patience, and honestly a lot of Cursor credits.
The constraints stopped being afterthoughts and became part of the brief: deployment friction, API limits, usage guardrails, and a deliberate desktop-first scope. Mobile is still to come.
Thanks for the feedback, encouragement and honest critique along the way: