Pintona: a wardrobe app with no build step
Snap your clothes, build outfits, get an honest score from Gemini. A vanilla-JS PWA on Firebase in English, Spanish and Vietnamese, installable on iOS and Android.
Open pintona.vercel.appA mobile-first, no-build Progressive Web App: snap your clothes, build outfits, get an honest AI style opinion.
Status: Deployed, live product at pintona.vercel.app. Core mission: Digital wardrobe + AI styling, shipped as a real installable app, not a demo.
Architecture
Browser (vanilla JS, ES modules, no build step)
├─ Firebase Auth ────────► Google sign-in
├─ Firestore ─────────────► wardrobe items, outfits, board, style profile
├─ Firebase Storage ──────► garment / reference photos
├─ fetch('/api/gemini') ──► Vercel serverless ──► Gemini 2.5 Flash (AI look feedback)
└─ fetch('/api/removebg') ► Vercel serverless ──► background removal
Both serverless routes verify a Firebase ID token before doing any work. No unauthenticated calls to either API.
Key features
- AI styling feedback: Gemini 2.5 Flash rates outfits against a chosen “vibe” and the user’s own style-reference photos.
- Wardrobe management: photo upload, client-side compression, auto-categorization, background removal.
- Today tab: AI picks an outfit of the day using the wardrobe, inspiration board, active vibe, and local weather (Open-Meteo, keyless).
- i18n: full English / Spanish / Vietnamese translation, switchable in-app.
- PWA: installable, offline-aware service worker, works as a real home-screen app on iOS and Android via “Add to Home Screen.”
Performance
| Lighthouse | Score |
|---|---|
| Performance | 97 |
| Accessibility | 100 |
| Best practices | 96 |
| Time to interactive | ~1.2s |
Tech stack
- Frontend: Vanilla JS, ES modules, no bundler. Zero build step by design.
- Auth/Data: Firebase Auth, Firestore, Storage.
- AI: Gemini 2.5 Flash (styling feedback), background removal pipeline.
- Infra: Vercel serverless functions (
/api/gemini,/api/removebg), CSP/security headers. - PWA: Service worker (network-first HTML/JS, stale-while-revalidate for images/fonts), install manifest.
Why no build step
A deliberate choice: zero tooling means zero drift between what’s on disk and what runs. Any file can be opened and understood top to bottom without reverse-engineering a bundle, and deploys are just “copy the files.” Bundling/TypeScript would be a deliberate future migration, not incremental drift.
Need something like this?
Tell me what you do by hand today. I'll reply within two working days with whether I can help and what I'd build first.