Inspiration

I built this project because I kept running into the same problem: my desk would slowly turn into a pile of “temporary” clutter, and I’d lose time and focus every time I sat down to work. I wanted something lightweight that could turn decluttering into a quick, repeatable habit—something that starts with the simplest action: take a photo of the mess and get a clear next step.

What I built

I created a mobile app that lets you take a picture of your messy desk, uploads it to the cloud, and then uses AI (Gemini) to analyze what’s in the photo and suggest a declutter plan. The goal is to move from “overwhelmed” to “actionable” in seconds: identify what’s on the desk, group items, and propose a short sequence of cleanup steps.

How I built it

Frontend: Expo (React Native) running in Expo Go on iOS.

Storage: Supabase Storage to upload and store photos.

AI Analysis: A Supabase Edge Function that securely calls the Gemini API (so the Gemini key never touches the mobile app).

Gallery Feed: A simple grid view that lists uploaded photos from the Storage bucket and displays them as a feed.

The flow is:

capture a photo → 2) upload to Supabase Storage → 3) get a public URL → 4) send that URL to an Edge Function → 5) Edge Function fetches the image + calls Gemini → 6) app displays the analysis.

Challenges I faced

Storage + permissions without authentication: I originally designed this around user accounts, but for hackathon speed I removed auth and configured a public upload path. Getting policies right (and understanding the difference between Storage vs Postgres) took time.

Expo platform quirks: Some file APIs behave differently depending on whether you’re running on web or native. I hit errors like missing base64 data from the image picker and “readAsStringAsync not available on web,” which required using the correct Expo file workflow and being careful about platform assumptions.

Networking issues + debugging: “Network request failed” errors were tricky because they can be caused by bad env vars, wrong project URLs, or connectivity. I ended up adding a health-check/debug screen to confirm Supabase reachability before chasing the wrong problem.

Keeping API keys safe: It’s tempting to put an API key in .env and call Gemini directly from the app, but that’s insecure. Routing the request through a Supabase Edge Function was the right pattern, but required setting up secrets and handling image bytes + base64 conversion server-side.

What I learned

This project taught me how to build a complete mobile-to-cloud pipeline: capturing media on-device, reliably converting/uploading files, managing storage access policies, and integrating AI through a secure backend layer. Most importantly, I learned that “it works” isn’t enough—good developer tooling (debug endpoints, logs, health checks) is what turns random errors into a solvable system.

What’s next

If I continue this beyond the demo, I’d reintroduce user authentication, add private buckets and per-user storage rules, save structured analysis results to a database, and improve the UX with before/after comparisons and a checklist mode that turns the AI suggestions into a declutter routine.

Share this project:

Updates