Photo Sharing
Content & Social · React + Node (Express) · 17 @molecule/* packages
Flickr-like photo community with albums, galleries, and EXIF — with built-in Stripe-backed subscription tiers
Try it
Opens instantly. Runs on sample data, so changes reset on reload.
What is inside
Screens (15)
- Landing
/ - Login
/login - Signup
/signup - ForgotPassword
/forgot-password - ResetPassword
/reset-password - Explore
/explore(signed in) - PhotoDetail
/photos/:id(signed in) - Albums
/albums(signed in) - MyPhotos
/my-photos(signed in) - Upload
/upload(signed in) - Favorites
/favorites(signed in) - Settings
/settings(signed in) - AlbumDetail
/albums/:id(signed in) - Profile
/u/:handle(signed in) - Galleries
/galleries(signed in)
Data model (13 tables)
- album_photos — id, album_id, photo_id, sort_order, created_at
- albums — id, owner_id, title, description, cover_photo_id, photo_count, visibility, created_at, …
- comments — id, resourceType, resourceId, userId, parentId, body, editedAt, createdAt, …
- devices — id, createdAt, updatedAt, userId, name, pushPlatform, pushSubscription, hasPushSubscription
- favorites — id, user_id, photo_id, created_at
- follows — id, followerId, targetType, targetId, createdAt, updatedAt
- galleries — id, owner_id, title, description, cover_photo_id, visibility, created_at, updated_at, …
- gallery_photos — id, gallery_id, photo_id, sort_order, created_at
- photos — id, owner_id, album_id, title, description, caption, original_url, large_url, …
- payments — id, createdAt, updatedAt, userId, transactionId, productId, platformKey, data, …
- reactions — id, resourceType, resourceId, userId, type, createdAt, updatedAt
- resource_tags — id, tagId, resourceType, resourceId, createdAt
- tags — id, name, slug, color, description, createdAt, updatedAt
API (6 handlers)
- albums
api/src/handlers/albums.ts - galleries
api/src/handlers/galleries.ts - photos
api/src/handlers/photos.ts - preferences
api/src/handlers/preferences.ts - profiles
api/src/handlers/profiles.ts - uploads
api/src/handlers/uploads.ts
Subscription tiers
free / pro / team — gated by: maxAlbums, maxPhotos, advancedFeatures, canExport, retentionDays
Built from 17 @molecule/* packages
@molecule/api-database-postgresql@molecule/api-email-templates@molecule/api-emails-mailgun@molecule/api-entitlements@molecule/api-image-sharp@molecule/api-payments-stripe@molecule/api-resource-comment@molecule/api-resource-follow@molecule/api-resource-payment@molecule/api-resource-reaction@molecule/api-resource-tag@molecule/api-resource-user@molecule/api-uploads-s3@molecule/app-billing-react@molecule/app-gallery-photoswipe@molecule/app-image-crop@molecule/app-virtual-scroll
Required secrets
DATABASE_URLPostgreSQL connection stringS3_BUCKETS3 bucket for photo uploadsS3_ACCESS_KEY_IDS3 access keyS3_SECRET_ACCESS_KEYS3 secret key
The @molecule/* packages are Apache-2.0. The app you build from this template is yours to export and self-host. Licensing