Back to Portfolio
LifeXL
Photography portfolio, AI-powered Lightbox, Content Dashboard, and Photo Editor for @lifextralarge — Fujifilm X-T50, film simulation recipes, SOOC
Active
66h build · 10k LOC · Since Mar 2026
Tech Stack
Next.js 16 TypeScript Tailwind CSS v4 Vercel Blob Sharp Gemini Flash OpenRouter AI dnd-kit Clipdrop AI rss-parser
About
LifeXL is a photography portfolio and AI-powered photo management platform for @lifextralarge. Showcases Fujifilm X-T50 photography shot with film simulation recipes — no editing, no retouching, no Lightroom. Straight out of camera only. Photos are uploaded via a password-protected admin dashboard, stored in Vercel Blob (cloud CDN), and metadata is tracked in a JSON file.
Architecture
| Layer | Technology |
|---|---|
| Frontend | Next.js 16 App Router, TypeScript strict, Tailwind CSS v4 |
| Photo Storage | Vercel Blob (cloud CDN) |
| Image Processing | Sharp (JPEG quality 90, max 2400px) |
| AI Scoring | Gemini Flash 2.0 (genre-specific rubrics, exposure triangle eval) |
| AI Titles | OpenRouter (Gemini Flash) for title suggestions |
| Auth | Cookie-based HMAC-SHA256 session with signature verification |
Collections
| Collection | Subject |
|---|---|
| Streets | Urban, street photography |
| Places | Travel, cities, architecture |
| Wild | Nature, outdoors, landscapes |
| Faces | Portraits, people |
| Taste | Food, drink, restaurants |
| Motion | Cars, motorcycles, movement |
Key Features
- Admin dashboard with drag-and-drop upload, AI title suggestions, and collection management
- Lightbox — AI-powered photo culling (39 features): RAF parser, EXIF extraction, Gemini Flash scoring v2.0, keyboard navigation, XMP sidecar export, auto-sort to keep/maybe/reject folders
- Photo Editor — Straighten (±15°), Crop (Instagram presets), Heal (local pixel sampling + Clipdrop AI generative inpainting)
- Content Dashboard — Instagram content pipeline: Pick from keep folder, Queue with AI captions/hashtags, Calendar (drag-and-drop scheduling), Grid (3x3 preview), News (RSS photography feeds)
- Two-stage cull — Stage 1: Lightbox culls from shoot. Stage 2: Pick tab selects for Instagram. Portfolio upload stays manual.
- Naming Agent v4 — AI title suggester with content-creator personality matching @lifextralarge voice, auto-collection selection, auto-fill
- AI Scoring v2.0 — Genre-specific rubrics, exposure triangle evaluation, film simulation awareness
- Vercel Blob storage — photos appear on the public site instantly with no redeploy
- 72px vertical side-nav (Burkard-inspired) on desktop, full-screen overlay on mobile
- HMAC auth — Signature-verified proxy, API returns 401 JSON, page routes redirect to login
Gear
- Fujifilm X-T50
- Sigma 10-18mm f/2.8 DC DN
- Fujifilm XF 35mm f/1.2 R WR
- Viltrox AF 56mm f/1.7 XF
- Tamron 18-300mm f/3.5-6.3 VC VXD
Build Log
27 Apr Lightbox file-sort fix: when sorting RAF files into keep/maybe/reject, the same-stem JPEG sidecar now moves with its RAF sibling (was being orphaned in the source folder). Single targeted commit (`ff57b67`).
26 Apr Lightbox stability + perf + scoring rebuild. 9 commits. Stop OOM crash via slice-based JPEG extract in detail/edit (was reading full 40MB RAF per nav). Defensive partial-AI-score render + Gemini response shape validation. Resume now persists FileSystemDirectoryHandle and re-attaches the folder via "Re-grant access" banner. Sync auto-advance (no setTimeout race). Scoring rubric v2.2 — LLM emits 5 weighted dims (emotional×3, light×2.5, comp×2, tech×1.5, moment×1), server computes overall_score deterministically; fixes the ×10 prompt-math bug that produced 460/100 and the run-to-run drift. Strict JSON schema, temperature 0.1, seed 42, reference anchors, CoT-then-score. Web Worker for resize keeps UI responsive during Tier 1. Dexie compound index for IDB lookups. RAW converter at /admin/convert formally abandoned (1.4MB libraw wasm + design doc deleted).
9 Apr Naming Agent v4 — 4 iterations giving the AI title suggester a content-creator personality matching @lifextralarge style. Upload pipeline overhauled: client-side compression, direct Vercel Blob upload bypassing 4.5MB serverless limit. Title auto-fill + auto-select collection. 30 commits total, 26 files changed, +2,079 lines.
9 Apr Session delete for Lightbox (clear IndexedDB). Decision buttons moved below photo (closer to nav arrows). Clipdrop API integrated for AI healing. Node.js + fnm + SSH key set up on new laptop.
9 Apr Two-stage cull pipeline redesign. Stage 1: Lightbox culls from shoot → auto-sorts into keep/maybe/reject folders (files moved, not copied). Stage 2: Content Dashboard Pick tab opens keep folder → select for Instagram → add to queue. Portfolio upload stays manual. Removed auto-upload from Lightbox.
Next Actions
Re-upload original (uncompressed) photos via admin — current ones were resized by sips
Add portrait photo to about page
Consider custom domain
Delete lifexl-photos-v2 blob store (unused duplicate)
+ 6 completed
Active Priorities