-
-
Glass Box critique: five-axis scores + reasoning, grounded in photography principles (Gemini · Agent Builder)
-
Live field coaching on iOS — Iris reads the viewfinder against your practice brief and signals the moment to shoot. SwiftUI · Field agent
-
Home — persistent portfolio memory; every frame remembered, skills trending.
-
My Work — semantic search + similar photos via MongoDB Atlas Search & Vector Search.
-
Mentor — portfolio-aware chat; the ADK orchestrator answers from your library
-
Organize — human-in-the-loop: Triage proposes, you approve (pending_approvals).
-
Practice — assignments that target your weakest skill.
-
Print Sales (working-pro persona) — AI-drafted listings, you approve each before it saves.
-
Settings — switch persona (hobbyist ↔ pro), see exactly what Iris remembers, you stay in control.
-
Nine ADK agents, one orchestrator · Gemini 3.1 Pro · MongoDB Atlas via MCP.
-
Verified at runtime — agents read MongoDB via MCP (mongodb.mcp.find → portfolio_entries), traced in Cloud Trace.
-
Logo
Inspiration
I photograph seriously and ship AI projects in parallel. Both reward the same loop — practice, reflection, refinement — but most AI photo tools optimize a different one: cull faster, edit faster, deliver faster. Few ask whether you are becoming a better photographer.
Three earlier projects sharpened the gap:
- AI Photography Coach — Gemini multimodal critique; track winner in the Google + Kaggle Gen AI Intensive. Strong per-photo feedback, no memory of who you are.
- RAG Photography Tutor — local-first tutoring with FAISS and a principles corpus. It taught rules, not the learner.
- L.E.N.S. — voice-first coaching for photographers with vision impairment — a population mainstream tools ignore. Each hit the same wall: no memory of the photographer. Iris is a clean-slate build for this hackathon — those projects shaped the thinking, not the code.
Every tool I tried started fresh each session. A real mentor remembers your weak spots, aesthetic, and growth. Iris treats that continuity as architecture, not chat history.
Why this hackathon: Skill growth happens over months. Iris goes beyond chat — critique, practice planning, backlog organize, print drafts — under your approval. MongoDB fits: one Atlas cluster for documents, vectors, text search, and MCP-native reads traceable in production logs.
What it does
Iris adapts to who you are and remembers what you have made. Three personas are first-class in the orchestrator — tool filtering + sub-agent composition, not tone tweaks:
| Persona | Focus | Agent composition |
|---|---|---|
| Hobbyist | Skill development | Coach → Reflection → Planner; Triage for backlog |
| Working pro | Commercial outcomes | Same memory + Print Sales Strategist (HITL) |
| Vision impairment | Creative expression | Visual Describer; Field Coach describe-before-score (agent + tests shipped; web/iOS picker on roadmap) |
Demo path: hobbyist and working pro on web and iPhone. Persona isolation verified in tests/test_persona_isolation.py.

Five scored dimensions with inspectable reasoning — not a black-box grade.
Five agentic capabilities:
- Mentor Copilot — portfolio search, aesthetic profile, conversational Q&A
- Live Field Coach — real-time composition cues on iPhone: hints, optional TTS, rule-of-thirds grid, CoreMotion horizon guide, ready-to-capture checkpoint
- Backlog Triage — tag and dedupe proposals; never applies without approval
- Print Sales Strategist — marketplace listing drafts for working pros; publish behind HITL
- Visual Describer — scene narration for the vision-impairment persona (agent layer shipped)
HITL is the product pattern: Iris proposes; you approve. Assignments, organize tags, print listings, and bulk deletes wait for an explicit yes.
Web + iOS: Shoot or upload → Glass Box critique persists to MongoDB. Practice proposes assignments from portfolio gaps. My Work supports natural-language search (Gemini expansion → Atlas Search) and vector similar photos. iOS adds live field coaching on the same API memory.
How I built it

Web + iOS → FastAPI on Cloud Run → nine Google ADK agents → Gemini, Agent Builder Data Store, MongoDB Atlas, GCS.
Gemini + Google ADK
- Gemini 3.1 Pro — Coach multimodal critique (structured JSON), Planner, Reflection, Mentor, library query expansion
- Gemini 2.5 Flash — live field coaching frames on iPhone
- Nine
LlmAgentinstances — orchestrator + Coach, Mentor, Planner, Reflection, Field Coach, Triage, Print Sales, Visual Describer; enumerated from the live ADK graph viascripts/dump-agent-graph.py(proof-05-agent-graph.png,docs/compliance-proof/evidence/agent-graph.txt) - Persona-filtered
AgentToollists — hobbyist cannot invoke Print Sales; vision-impairment gets Visual Describer, not Triage — enforced at the tool level, not in prompts alone
Production: FastAPI on Cloud Run. Agent Engine scaffold exists for a future cutover; the live demo uses Cloud Run today.
Agent Builder grounding
Coach critiques call Discovery Engine against a principles Data Store with five curated documents (composition, lighting, technique, creativity, subject impact). ground_in_data_store_principles injects citations into the Glass Box prompt. Live probe: GET …/health/grounding-probe returns source: discovery_engine. Local principles/*.md is dev fallback only.
Critique path: upload → Coach (Gemini) → grounded principles → portfolio entry + multimodal embedding in Atlas.
MongoDB Atlas + MCP (partner track)
| Primitive | MongoDB feature |
|---|---|
| Portfolio + critiques | Flexible documents |
| Similar photos | Atlas Vector Search (Vertex embeddings, 1408-d) |
| NL library search | Gemini expansion → Atlas Search (glass_box_search) |
| Aesthetic profile | On-read aggregation |
| Agent-native reads | MongoDB MCP Server on Cloud Run |
Reads: production portfolio paths use MongoDB MCP (mcp_reads.py → Streamable HTTP → Atlas). Writes: PyMongo after HITL gates.

Cloud Trace span mongodb.mcp.find on portfolio_entries — a real MCP read in production, not a mock. Reproduce: scripts/verify-hackathon-stack.sh.
Every claim is verifiable at runtime — traces, logs, agent graph, grounding probes — in the proof package linked below.
Why MongoDB — and why not the alternatives
Iris's memory layer needs five things at once: flexible documents, vector similarity, full-text search, on-read aggregation, and agent-native access. Most stacks deliver these by stitching services together. Atlas delivers all five in one cluster — and exposes them to agents through the official MCP Server.
| Need | Iris on MongoDB Atlas | Typical alternative | Trade-off avoided |
|---|---|---|---|
| Evolving photo + critique records | BSON documents | PostgreSQL JSONB | rigid migrations as the critique schema grows |
| Similar-photo search | Atlas Vector Search (1408-d) | Pinecone / pgvector | a separate vector service to sync |
| NL library search | Atlas Search (Lucene) | Elasticsearch | a third system + index pipeline |
| Aesthetic profile | Aggregation pipeline | app-side joins | pulling compute into the app |
| Agent reads | MongoDB MCP Server | custom REST per agent | hand-rolling + securing an agent data API |
A split stack (Postgres + Pinecone + Elasticsearch) is perfectly viable — but it means three services, three SDKs, and sync glue, and you still have to build the agent access layer yourself. For a solo-built agentic app, that surface area is the enemy. At ~10K photos, Atlas Flex runs roughly $5–10/month vs $75+/month for the split stack — and because reads go through the MCP Server, every agent query is a traced, governed call instead of a bespoke endpoint.
HITL + training signal
Irreversible actions flow through pending_approvals with frozen proposals. User score overrides feed load_prompt_with_user_overrides so future Coach invocations respect your calibration.
Clients: React + Vite on Firebase Hosting; native SwiftUI iOS (AVFoundation, live coach, horizon overlay, critique radar). XMP sidecar export into Lightroom.
Challenges I ran into
The wallpaper problem. An early build looked multi-agent but was not — Coach, Planner, and Reflection were Python services in FunctionTool wrappers. Fix: nine real LlmAgent instances, verified by dump-agent-graph.py and phase-gate scripts.
Cross-AI verification. Adversarial code review caught MCP treated as optional and persona routing done only in prompts.
MCP as production read path. Partner credibility required mongodb.mcp.find in Cloud Logging, not a local demo. OpenTelemetry spans (mongodb.mcp.*) are part of the submission story.
Live coach on device. Encoding every video frame blocked the camera queue. Fix: interval snapshots, rate-limited Flash calls, composition-lock checkpoint.
iOS under deadline. Signing and screen-recording friction cost calendar days; the field demo uses pre-recorded takes with voiceover.
Design
Glass Box, not black box. Five dimensions with explicit reasoning — users see why lighting scored 6/10.
HITL as visible UI. Approve / Reject cards for organize, print, and assignments. Nothing auto-applies.
Mobile-first field coaching. Horizon guide, ready-to-capture lock, optional TTS, post-capture radar chart.
Photography aesthetic. Darkroom palette, amber accents, serif critique type.
Complement, not replace. XMP sidecar into Lightroom; Iris fits mentor-and-evolve while Aftershoot fits cull-and-deliver.
Accomplishments I'm proud of
- Nine verifiable ADK agents with persona filtering in code
- MongoDB MCP load-bearing on Cloud Run — judge-reproducible proof in-repo
- End-to-end hobbyist loop: assignment → iPhone field coach → Glass Box → reflection → web library
- HITL with a training-signal loop, not audit-only logs
- Native iPhone field path on the same Cloud Run API as web
What I learned
- Multi-agent claims must survive
grepand executable phase gates - Partner integration must match the pitch — MCP in the production read path
- Personas are architectural (different sub-agents), not tone presets
- Backend trace evidence helps judges more than another UI screenshot
Market & commercialization
Photography education is a durable, paid market — millions of hobbyists buying courses and critique, plus working pros and institutions. Iris monetizes across the same personas it already serves:
- Hobbyist — consumer subscription: unlimited critique, practice plans, and progress memory.
- Working pro — tools tier: print-listing drafts, client-ready exports, portfolio analytics.
- Institutions (B2B) — photography schools, university art programs, and workshops license Iris as a coaching layer. Every student gets persistent, grounded feedback between sessions; instructors get progress dashboards.
Why it compounds for MongoDB: Iris's growth is measured in stored artifacts. Every active photographer adds documents, embeddings, and search load — usage that scales Atlas consumption directly. Tenant isolation is already per-user at the document level, so onboarding an institution is provisioning, not re-architecting. And Iris doubles as a reference implementation for agentic memory on Atlas — a pattern MongoDB can point other AI builders toward.
Beyond photography — a reusable agentic-memory pattern
The defensible part isn't the photography; it's the architecture: persona-filtered agents over a grounded knowledge base, with persistent multimodal memory and human-in-the-loop writes. Swap the principles corpus and the scoring rubric, and the same agent mesh coaches a different skill:
- Creative: music practice, culinary plating, design portfolios, creative writing.
- Professional: medical-imaging training, sports form analysis, manufacturing QA review.
Each new domain reuses the orchestration, the HITL gates, and the MongoDB memory layer unchanged — only the grounding documents and rubric change. That is what makes it plug-and-play, and what makes the Atlas-backed memory the durable core rather than a swappable detail.
What's next
- Public launch — iOS App Store release and open web sign-ups beyond the seeded demo account
- Vision-impairment iOS onboarding and VoiceOver polish
- ARKit on-device subject tracking
- Agent Engine production cutover (scaffold in-repo)
- Instructor persona and B2B licensing for schools and workshops
Links
- Web app: https://iris-photo-mentor.web.app
- GitHub: prasadt1/iris-photography-mentor
- Proof package (traces, logs, agent graph, grounding): PROOF-PACKAGE.md
- Architecture & rubric map: hackathon-compliance.md
- API health: https://practice-companion-api-l6kusl5xcq-uc.a.run.app/health
- Grounding probe: https://practice-companion-api-l6kusl5xcq-uc.a.run.app/health/grounding-probe
Built With
- agent
- agent-engine
- arkit
- atlas-search
- atlas-vector-search
- avfoundation
- cloud-run
- fastapi
- firebase
- firebase-hosting
- gemini
- google-adk
- google-cloud
- mcp
- model-context-protocol
- mongodb
- mongodb-atlas
- python
- react
- swift
- swiftui
- typescript
- vertex-ai
- vite
Log in or sign up for Devpost to join the conversation.