Luxury Photography Website
Bookings, galleries, client albums and a documented API for a luxury photography brand.
Framer Motion-powered SPA for a luxury brand
Premium experience
From site request to confirmed session
End-to-end bookings
Private galleries delivered through the API
Client albums
A full-stack luxury photography platform focused on bookings, galleries, client albums, administration, authentication, media storage and REST APIs.
A photography studio needs a premium online presence that also does real work: clients book sessions, galleries and private client albums are delivered after shoots, and the studio manages everything from one place without stitching together plugins.
A React 19 SPA on top of a Django REST API. Bookings flow from the site to the studio, galleries and client albums are served through the API, media lives on S3-compatible storage, and administration stays in one authenticated place.
How data moves through the system.
React SPA over a Django REST API with PostgreSQL, Redis and S3-backed media.
- 01React SPA
- 02Django REST API
- 03PostgreSQL / Redis
- 04S3-compatible storage
- 05Nginx + Vercel
- 01Photography booking
- 02Galleries
- 03Client albums
- 04Administration
- 05REST API
- 06JWT authentication
- 07S3-compatible media storage
- 08Brute-force protection (django-axes)
- 09Async background work (Celery)
Framer Motion-powered SPA for a luxury brand
Premium experience
From site request to confirmed session
End-to-end bookings
Private galleries delivered through the API
Client albums
S3-backed storage with JWT-gated access
Secure media
PostgreSQL 16 for relational data — bookings, galleries, albums, clients — and Redis for caching and background work.
Django REST Framework endpoints for bookings, galleries and administration, documented with drf-spectacular.
django-storages with an S3-compatible backend keeps media off the app server; WhiteNoise serves static assets.
JWT for API authentication and django-axes to lock out brute-force attempts.
Celery handles asynchronous tasks such as image processing and notifications.
Docker Compose runs PostgreSQL, Redis, the backend and Nginx locally; the frontend deploys on Vercel.
pytest with factory-boy fixtures and coverage reporting.
- Delivering private client albums without exposing media to unauthorised requests.
- Coordinating background image work so uploads never block the request path.
- Running a PostgreSQL container, Redis and backend together in a reproducible local setup.
- Media storage belongs off the application server from day one.
- A well-factored fixture layer (factory-boy) makes testing a media-heavy API fast.