# Portfolio Ideas ## 🧑‍💻 Developer - **Internationalization (i18n)** — Multi-language UI support (DE/EN). Extend YAML config with locale files - **ISR / Stale-While-Revalidate** — Replace `force-dynamic` with Incremental Static Regeneration + on-demand revalidation ## 📸 Photographer - **Photo stories / Essays** — Vertical scroll format with images + text interspersed, like a photo essay. Portfolio differentiator - **Map view** — Minimal world map from EXIF city/country data, each dot links to an album. Mapbox GL or Leaflet - **Collections by camera/lens** — Auto-generate virtual albums from EXIF data ("Shot on Leica Q3", "Summilux 35mm") - **Client proofing** — Let clients favorite/select photos in password-protected galleries. Extends existing password gate - **Download originals** — Button in lightbox to download full-res, proxied through server (keeps Immich hidden). Unlocks client delivery - **Before/After slider** — Drag-to-reveal comparison component for retouching/editing showcases - **Print shop integration** — "Buy Print" button linking to external print-on-demand service or contact form with photo reference - **Watermarking** — Server-side watermark overlay on proxied images (corner logo, center text, or diagonal). Configurable in YAML - **Curated homepage feed** — Hand-picked "best of" sequence across all albums, like an Instagram highlights page - **Photo of the Day** — Auto-rotate hero image daily from a designated favorites album. Gives visitors a reason to return - **EXIF analytics page** — Visual breakdown of shooting patterns: most-used focal lengths, aperture distribution, camera body stats - **Color palette extraction** — Show dominant colors per photo/album as subtle accents. Art direction + bespoke feel - **Timeline / Year view** — Chronological scroll of all work by year/month, showing progression over time - **Search by EXIF** — Filter entire portfolio by camera settings ("everything at f/1.4", "all black & white") ## 👤 User / Visitor - **Slideshow mode** — Auto-advance through photos (3s/5s/10s). Great for exhibitions and ambient display - **Photo sharing** — "Copy link" button in lightbox with toast notification - **Keyboard shortcut hints** — `?` button revealing available shortcuts (arrows, Esc, F for fullscreen) - **Fullscreen API** — Chrome-free immersive viewing in lightbox - **Pinch-to-zoom** — Touch gesture zoom in lightbox for detail viewing - **Progressive loading animation** — Ken Burns zoom/pan on ThumbHash placeholders while loading ## 🏆 Quick Wins (High Impact / Low Effort) | Idea | Effort | Impact | |------|--------|--------| | Slideshow mode | Low | High — exhibition ready | | Fullscreen API in lightbox | Low | Medium — immersive | | Monochrome toggle | Low | Medium — Leica vibes | | Download originals | Low | High — client delivery | | ISR caching | Medium | High — performance | | Photo of the Day | Low | Medium — return visits | | Before/After slider | Medium | Medium — editing showcase | | Photo stories/essays | High | Very high — differentiator | | Map view | Medium | High — wow factor | | Client proofing | High | Very high — business tool | | EXIF analytics | Medium | Medium — gear-nerd appeal | ## ✅ Already Implemented | Feature | Notes | |---------|-------| | Image CDN / Edge caching | `Cache-Control: immutable` on `/api/image` proxy | | OG image generation | Dynamic OG images via `/api/og` | | Hero image carousel | Crossfade carousel from `gallery.yaml` hero images | | EXIF metadata display | Print-style captions on photo grid hover | | Per-album password protection | Cookie-based auth gate per subpage | | Asset ID obfuscation | AES-encrypted tokens in public URLs | | Rate limiting | On image proxy endpoint | | YAML-based config | `gallery.yaml` replaces env-var config | | Playwright E2E tests | Basic test suite in `e2e/` | | Fade-in animations | Intersection Observer based | | Theme toggle (dark/light) | Persisted via cookie | | Scroll-to-top button | Appears on scroll | | Footer with social links | Configurable via `gallery.yaml` | | Image count badges | On subpage cover tiles | | Custom cursor (crosshair) | On photo grid items | | About page | Markdown-driven with portrait + gear | | Content Security Policy | CSP + security headers in `next.config.ts` | | Album descriptions | Uses Immich's built-in album description field |