All projects
Full Stack · PhotographyPersonal projectPersonal project

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

Overview

A full-stack luxury photography platform focused on bookings, galleries, client albums, administration, authentication, media storage and REST APIs.

Problem

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.

Solution

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.

Architecture

How data moves through the system.

React SPA over a Django REST API with PostgreSQL, Redis and S3-backed media.

  1. 01React SPA
  2. 02Django REST API
  3. 03PostgreSQL / Redis
  4. 04S3-compatible storage
  5. 05Nginx + Vercel
Technology stack
PythonDjango 5.1Django REST FrameworkCeleryReact 19TypeScriptViteTailwind CSS 4Framer MotionPostgreSQL 16RedisJWTdjango-axesdrf-spectaculardjango-storagesS3WhiteNoiseDocker ComposeNginxVercelpytestfactory-boy
Key features
  • 01Photography booking
  • 02Galleries
  • 03Client albums
  • 04Administration
  • 05REST API
  • 06JWT authentication
  • 07S3-compatible media storage
  • 08Brute-force protection (django-axes)
  • 09Async background work (Celery)
Engineering outcomes

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

Data Layer

PostgreSQL 16 for relational data — bookings, galleries, albums, clients — and Redis for caching and background work.

API Layer

Django REST Framework endpoints for bookings, galleries and administration, documented with drf-spectacular.

Media Storage

django-storages with an S3-compatible backend keeps media off the app server; WhiteNoise serves static assets.

Security

JWT for API authentication and django-axes to lock out brute-force attempts.

Background Work

Celery handles asynchronous tasks such as image processing and notifications.

DevOps

Docker Compose runs PostgreSQL, Redis, the backend and Nginx locally; the frontend deploys on Vercel.

Testing

pytest with factory-boy fixtures and coverage reporting.

Challenges
  • 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.
Engineering decisions
  • Media storage belongs off the application server from day one.
  • A well-factored fixture layer (factory-boy) makes testing a media-heavy API fast.