Passion Lens: Discover the Passion Hidden in Your Photographs
This is a submission for Weekend Challenge: Passion Edition.
What I Built
When the challenge has a theme about our passions, mine was clear. I love photography. I picked up a camera more than 10 years ago, and I guess I've done my part to reinforce the stereotype that every frontend developer is secretly a photographer. To me, photography is a story, a feeling, a moment, a landscape. That's why i love landscapes and street photography.
The project's idea is simple: what the pictures you take say about you? What if you have a personal photography expert that let you capture the essence and learn something new about yourself?
You just upload a photo, share where it was taken and why it matters to you, and choose your storytelling voice: documentary, cinematic, poetic, or travel journal.
Passion Lens uses Google Gemini to analyze the visible composition alongside the photographerโs own context. It creates:
- A title and three moods
- A personal memory
- Visual observations grounded in the photograph
- Composition notes
- A reflection on what the photograph may reveal about the photographerโs passions
The experience is designed to feel reflective rather than transactional.
Once the memory is ready, the user can listen to it through ElevenLabs narration or download the complete memory as a PDF.
Passion Lens begins with a photograph, but its real subject is the person behind the camera.
Demo
๐ Try Passion Lens
The demo flow:
- Upload a photograph.
- Add a location and a few personal words.
- Select a storytelling style.
- Generate the memory.
- Explore Geminiโs story, moods, visual observations, and passion reflection.
- Listen to the narrated memory.
- Download the finished memory as a PDF.
Code
๐ป View the source code on GitHub
How I Built It
Passion Lens uses React, TypeScript, Vite, and Framer Motion on the frontend, with an Express server handling the AI integrations.
Google Gemini
The uploaded photograph and the photographerโs written context are sent as a multimodal request to Gemini.
Gemini returns a structured JSON response containing:
titlemoodsvisualDetailsstoryphotographerInsightpassionProfile
Using a response schema made the output predictable enough to drive the designed memory interface directly.
The prompt explicitly tells Gemini not to invent events, identities, relationships, professions, destinations, or emotions that cannot be observed. If a person appears in the photograph, the model describes only visible details. I tried many prompts, but it still vastly makes up things sometimes. :/
ElevenLabs
ElevenLabs turns the generated story into spoken narration.
The photograph slowly brightens and moves while narration is playing, making the memory feel alive without distracting from the story.
Memory Experience
The final card asks:
What does this photograph reveal about you?
This is where Passion Lens moves beyond โAI writes a story about my photo.โ It begins helping the photographer understand why certain moments attract their attention.
PDF Export
The browser generates a downloadable PDF with jsPDF.
It includes the photograph, title, location, moods, story, Composition Notes, and passion profile. This gives the user something lasting to keep or share after the experience ends.
Technical Stack
- React
- TypeScript
- Vite
- React Router
- Framer Motion
- Express
- Google Gemini API
- ElevenLabs API
- jsPDF
- Multer
Challenges and Lessons
A memory should feel personal and evocative, but an image model should not quietly invent facts about someoneโs life. Separating user-provided emotional context from model-observed visual details helped preserve that boundary.
Structured Gemini output was another important decision. Instead of parsing free-form prose, the application receives a defined object that can be safely mapped into different parts of the interface.
Prize Categories
Best Use of Google AI
Gemini is the central intelligence behind Passion Lens. It combines multimodal image understanding with the photographerโs context to produce grounded visual observations, a personal narrative, Composition Notes, and a carefully framed passion profile.
Best Use of ElevenLabs
ElevenLabs transforms each generated story into an intimate narrated memory. Voice makes the result feel less like generated text and more like revisiting a moment.
Whatโs Next
The current MVP analyzes one photograph at a time.
The next step is persistence: allowing users to build a private collection of memories. Passion Lens could then identify recurring subjects, environments, colors, emotions, and composition choices across the collection.
That is the larger promise of the project:
Your photographs do not only show where you have been. Together, they may reveal what you keep searching for.

Top comments (4)
Super cool project Alexandra! Got a nice memory save for myself now, ty ๐
Thank you, hope you enjoyed it ๐
Oh!! what a project ๐ฎ really i like it!โค๏ธ
Thank youuuuu โค๏ธ