Something Is Going On
I’m still working on this, but I’m heading in the right direction. I realize that every blog post should have a title so that my RSS flow feed looks great. ๐
I’m still working on this, but I’m heading in the right direction. I realize that every blog post should have a title so that my RSS flow feed looks great. ๐
Asking Claude Code to suggest new features and improvements for my photo-sharing app is a lot of fun. Reviewing the list, I see several valid suggestions. However, as a “product manager”, I must decide what gets implemented and what does not. It’s kind of a power trip. You know “A thousand no for each yes”? ๐
Well, maybe not, but here’s a description of my recently created photo-sharing webapp. And I have many more ideas to improve this.
A modern, full-stack travel photo gallery built with Next.js 15, featuring intelligent photo management, interactive maps, and seamless cloud storage integration.
/feed.xml/admin and sub-routes require authenticationexif-parser library for metadata extractionioredis for Redis connectionsalbums keyphotos:{albumId} keysBLOB_READ_WRITE_TOKEN: Vercel Blob accessKV_REDIS_URL: Redis connection string{
id: string; // album_timestamp_random
title: string; // "Japan 2025"
description: string; // Trip description
date: string; // ISO date "2025-01-15"
createdAt: number; // Unix timestamp
visibility: "public" | "unlisted" | "private";
}
{
id: string; // photo_timestamp_random
albumId: string; // Reference to album
blobUrl: string; // Vercel Blob URL
caption?: string; // Optional description
uploadedAt: number; // Unix timestamp
metadata?: {
gps?: {
latitude: number;
longitude: number;
altitude?: number;
};
camera?: {
make?: string; // "Canon"
model?: string; // "EOS R5"
lens?: string;
};
capture?: {
dateTaken?: string; // When photo was taken
exposureTime?: string; // "1/1000"
fNumber?: number; // 2.8
iso?: number; // 100
focalLength?: number; // 50mm
};
dimensions?: {
width: number;
height: number;
};
orientation?: number;
};
}
/admin โ Vercel auth redirectThe Vercel KV Marketplace integration provides a standard Redis URL, which works better with the ioredis package. This offers more flexibility and standard Redis features.
The random featured photo and map interactions require JavaScript. Client-side rendering provides the most interactive experience while keeping the codebase simple.
Separating photo management from display keeps each view focused and performant. The upload page stays lightweight for quick uploads, while the manage page provides detailed controls.
For a photo gallery, the access patterns are simple (list albums, list photos). Redis provides sub-millisecond reads and sufficient storage for metadata, while Vercel Blob handles the large files. This eliminates the need for PostgreSQL/MySQL.
voyages-photo-gallery/
โโโ app/
โ โโโ admin/
โ โ โโโ manage/[albumId]/ # Photo management page
โ โ โโโ upload/[albumId]/ # Photo upload page
โ โ โโโ page.tsx # Admin dashboard
โ โโโ api/
โ โ โโโ admin/
โ โ โ โโโ albums/
โ โ โ โ โโโ [albumId]/ # Update/delete album
โ โ โ โ โโโ route.ts # Create album
โ โ โ โโโ photos/
โ โ โ โ โโโ route.ts # Delete photo
โ โ โ โโโ upload/
โ โ โ โโโ route.ts # Upload photos
โ โ โโโ albums/
โ โ โ โโโ route.ts # Get all albums (public)
โ โ โโโ photos/
โ โ โ โโโ route.ts # Get all photos (public)
โ โ โโโ auth/ # Login/logout
โ โโโ feed.xml/
โ โ โโโ route.ts # RSS feed generation
โ โโโ layout.tsx # Root layout with Analytics
โ โโโ page.tsx # Public gallery homepage
โ โโโ globals.css # Global styles
โโโ components/
โ โโโ AlbumSection.tsx # Collapsible album component
โ โโโ GridLayoutToggle.tsx # Layout switcher
โ โโโ Lightbox.tsx # Photo viewer
โ โโโ WorldMap.tsx # Interactive map
โโโ lib/
โ โโโ db.ts # Redis database functions
โโโ types/
โ โโโ index.ts # TypeScript type definitions
โโโ middleware.ts # Auth protection
โโโ package.json # Dependencies
This project demonstrates:
Perfect for developers learning modern full-stack web development!
MIT License - Feel free to use this as a learning resource or starting point for your own projects.
Built with Claude Code - AI-assisted development for rapid prototyping and feature implementation.
Technologies: Next.js 15 โข React 19 โข TypeScript โข Tailwind CSS โข Vercel โข Redis โข Leaflet
Built by: AI enthusiasts exploring the intersection of modern web development and AI-assisted coding
This weekend, I wanted to work on my next YouTube video, but I fell into this “photo-sharing website for my close family and friends” rabbit hole. It took most of the day to refine that I completely forgot about my video. ๐คฆ๐ปโโ๏ธ
Miniroll: what a great idea, and a well-designed one above all. Is it for me? I don’t know. I barely update my blogroll on Micro.blog. I’ll certainly keep an eye on the changelog to see where it’s going, and who knows…
Looking at my Micro.blog timeline summary I see this bad interpretation of my words in a recent post about updating my Nikon camera firmware from 1.21 to 3.0. ๐คท๐ปโโ๏ธ๐คฆ๐ปโโ๏ธ
“Please, add a map of all the places I visited based on photo metadata”. “Add animation across the site to make it more dynamic, nothing too fancy”. “Please, add support for progressive web app and make sure to set the favicon with the provided image”. “Add support for swipe gestures (ledt and right) while glancing at individual image”. “Add a counter of how many images are stored in each album”.
Are you getting it?
This is simple web app development in 2026 built using Claude Code, Vercel, Next.js and Tailwind CSS. ๐คฏ
Out of curiosity, yesterday I asked ChatGPT what the latest firmware release was for my Nikon Z f camera: 3.0 (it was at 1.21)! I applied the 110 mb binary update right on time for my upcoming trip. Yes, I know, my camera needs a little cleanup, too.
Thinking about the upcoming trip to Egypt, I realized I still didn’t have a good solution for sharing photos and comments beyond the usual social networks. Drawing on my experience from the past few weeks deploying web applications on Vercel, I decided to try the same by building a website for sharing and viewing photos. The additional complexity here is that the viewing portion is separate from the photo upload section. Therefore, I need to protect this feature with a password. Additionally, image storage must be optimized to minimize costs and provide a pleasant, flexible viewing experience. I’m using Vercel-only blog storage and Redis for metadata store.
In less than 2 hours, I built a fully functional application with Claude Code and Vercel. Impressive.
How long will it take Apple to fix the Apple Watch setup process involving restoring from previous backups? It’s been an issue for many people for years! My setup process when I upgraded from Series 6 to Series 8 was hindered by this issue. Same when I upgraded from Series 8 to Series 10. Either the backup found wasn’t recent, or there was no backup to restore from. Michael Tsai is one such person. Anyone at Apple is setting up a new watch? ๐ค