Projects
Explore my portfolio of projects across different technologies.
An AI-powered image search app that uses Gemini Vision AI to extract tags, objects, scenes, and colors, making any image searchable by keywords.

Imagine uploading hundreds of images to a platform and needing to find one specific photo later. Without metadata, you're scrolling endlessly. Traditional file naming is tedious and inconsistent. What if every image could describe itself the moment it's uploaded?
Searchable Images is a full-stack web application that brings AI-powered intelligence to image management. When you upload an image, Google's Gemini Vision AI automatically analyzes it and extracts rich metadata — a description, tags, detected objects, scene types, and dominant colors. All of this metadata becomes instantly searchable, so finding any image is as simple as typing a word.

This project was built during my internship at SAGER, a company specializing in ultra-HD aerial mapping and geospatial technology. The goal was to prototype how AI vision models could be integrated into SAGER's platform — enabling their team to upload aerial and satellite imagery and have it automatically categorized and searchable, rather than manually tagging thousands of photos.
The workflow is straightforward:
Upload — Drag and drop images (or click to browse). The app accepts JPG, PNG, GIF, and WebP formats, up to 10 images at a time.
AI Analysis — Each image is sent to Google's Gemini 2.5 Flash model, which analyzes the visual content and returns structured metadata: a natural language description, relevant search tags, identified objects, scene classification, and dominant colors.
Search — Type anything into the search bar. The app searches across all AI-generated metadata fields — tags, objects, scenes, colors, and descriptions — to find matching images instantly.

When you click on any image, a detail view reveals everything the AI extracted:

This structured approach means you don't need to know the exact filename — searching "blue" finds pools, skies, and ocean photos. Searching "outdoor" finds parks, backyards, and street scenes. The AI connects the dots.
The application is built with a modern stack designed for performance and security:
Frontend
Backend & Database
images (file metadata and storage paths) and image_metadata (all AI-generated data — tags, objects, scenes, colors, and descriptions)AI Integration
Security

The data model is intentionally simple but effective:
images
├── id (UUID)
├── user_id (references auth.users)
├── storage_path
├── file_name
├── content_type
├── size
├── url (signed URL)
└── created_at
image_metadata
├── id (UUID)
├── image_id (references images)
├── description (text)
├── tags[] (text array)
├── objects[] (text array)
├── scenes[] (text array)
├── colors[] (text array)
└── created_at
Using PostgreSQL arrays for tags, objects, scenes, and colors (instead of separate junction tables) keeps queries simple while GIN indexes maintain fast lookups across all fields.
Supabase was the right choice here because it consolidates what would normally require three separate services:
This meant I could focus on the AI integration and user experience rather than stitching together infrastructure.
This project was one of two full-stack deliverables I built during my AI Engineering internship at SAGER. The company works with ultra-HD aerial and satellite imagery, and the challenge was clear: how do you make thousands of aerial photos searchable without manual tagging?
Searchable Images was the proof of concept — demonstrating that a vision AI model could be plugged into an upload pipeline to automatically generate searchable metadata. The approach validated that Gemini could reliably extract meaningful tags, objects, and scene descriptions from diverse imagery, making it viable for integration into SAGER's production platform.
| Layer | Technology |
|---|---|
| Framework | Next.js 15 (App Router) |
| Language | TypeScript |
| Styling | TailwindCSS 4 |
| AI Model | Google Gemini 2.5 Flash |
| Database | Supabase (PostgreSQL) |
| Auth | Supabase Auth |
| Storage | Supabase Storage |
| Security | Row Level Security (RLS) |
| Upload | React Dropzone |
| Icons |
| Lucide React |