Ramiro Labs / Full-stack MVP
Refract — Private Media Library
2K items on Free, zero media stored server-side, by design
I built Refract, a media player for rediscovering photos and video from Google Drive and Dropbox, without uploading a byte to a third-party server.
- React
- TypeScript
- Node.js
- PostgreSQL
- Prisma
- Stripe
- Google Drive API
- Dropbox OAuth
- Google Gemini
- UploadThing
- Vercel

Problem
Most people have years of photos and videos scattered across Google Drive, Dropbox, and old hard drives, and almost never look at them. Most media apps solve this by uploading everything to their own servers to make search and shuffle work, a privacy tradeoff most people quietly resent. The alternative is living inside the cloud provider's own mediocre interface.
There was a gap: a genuinely good media browser that works across sources, surfaces random memories through shuffle playback, and never touches anyone's files server-side.
The additional constraint that shaped the entire architecture: users had to be able to trust it with personal photos. That meant the server could never store media content, only the lightweight metadata needed to find and play files from their original location.
Approach
The core architecture decision, metadata-only server storage, drove everything else. The server stores file IDs, names, MIME types, and thumbnail URLs. The actual photos and videos stay in Google Drive, Dropbox, or the user's device. Playback fetches directly from the original source on demand.
The Power tier is priced for libraries up to 200,000 items. To keep reads fast at that range without a database query per request, I designed a three-tier metadata storage system: a hot index in Vercel KV for small lookups, gzip-compressed JSON chunks in Vercel Blob for bulk data, and a local filesystem fallback in development.

The shuffle player is the heart of the product: a full-screen, distraction-free viewer with configurable intervals and auto-hiding controls. AI-powered search (Google Gemini 2.0 Flash) lets users run natural language queries like "sunset at the beach" and surfaces results by expanding the query into visual keywords matched against indexed metadata, with results cached in IndexedDB to minimize API costs.
Subscription tiers (Free → Pro at $4.99/mo early adopter → Power at $19.99/mo) are managed through Stripe with a customer portal, usage metering, and promotional code support.
Outcome
The metadata-only architecture holds regardless of library size. Media never touches the server, whether someone connects 200 items or 20,000. The AI search system generates 5–10 visual keyword tags per query and returns results in under two seconds on a warm cache.
The tiered subscription model with an early-adopter pricing lock ($4.99/mo for the first 200 Pro subscribers) creates a direct path to initial revenue while the user base grows.
Technical highlights
- Privacy by design: metadata-only architecture, no media bytes ever stored server-side
- AI search: Gemini 2.0 Flash tag expansion with IndexedDB caching
- Multi-source: Google Drive (OAuth), Dropbox (PKCE), and direct uploads via UploadThing
- HEIC/HEIF support: progressive loading via Web Worker (thumbnail → full resolution)
- Scale: 3-tier storage (Vercel KV hot index → Blob chunks → /tmp), designed for the Power tier's 200K-item ceiling without per-request DB queries
Tech stack
- React
- TypeScript
- Node.js
- PostgreSQL
- Prisma
- Stripe
- Google Drive API
- Dropbox OAuth
- Google Gemini
- UploadThing
- Vercel
Need an app that doesn't hoard your users' data?
If privacy-by-design is not an afterthought for you, rather a requirement, send a short brief. I'll reply within 2 business days.
Start a brief