JLCStudio
Loading the studio0%
JLCStudio

Case study · 2026

noahdacosta.co.za

Noah da Costa Photography

Cinematic portfolio and self-service CMS for a Pretoria sports and wildlife photographer.

  • Next.js
  • TypeScript
  • Tailwind CSS
  • Supabase
  • Sharp
  • Resend
  • Vercel
  • Cloudflare

The brief

The problem

Noah da Costa is a Pretoria-based sports, wildlife, and photoshoot photographer who was running on a basic Adobe Portfolio template. He needed two things at once: a fast, cinematic portfolio that shows his work at its best and funnels visitors to a booking form, and a self-service admin tool that a non-technical person could rely on daily — uploading and reordering photos after every shoot, from his phone, without calling a developer.

A hard constraint ran through the whole project: operate at near-zero ongoing cost using free database and storage tiers, while still feeling premium.

The approach

What was built

Three distinct engineering problems were solved.

An optimise-on-upload image pipeline ensures camera originals (5–15 MB) are never stored raw. Every upload is downscaled in the browser, then reprocessed server-side — resized to a max 2,400px edge, re-encoded to WebP at around 80% quality, with real dimensions and a tiny blur-placeholder hash saved to the database. Only the optimised file lands in storage, served through Next.js Image and Vercel's edge cache. Upload routes are transactional: if the database insert fails after a file is already stored, the orphaned file is rolled back automatically.

A single Next.js app serves two domains: the public portfolio at noahdacosta.co.za and the admin CMS at cms.noahdacosta.co.za. Middleware inspects the request host — admin traffic is rewritten into a hidden route tree gated behind a Supabase session, while the public domain cannot reach admin routes at all. Auth is defence-in-depth: the session is re-verified inside every privileged handler, not just at the edge.

A justified-rows gallery with zero layout shift: because each photo's width and height is stored at upload time, the gallery packs photos into rows — every row stretched to fill the container while preserving each image's aspect ratio. Exact space is reserved before images load so there is no reflow. Drag-to-reorder lets Noah control his gallery sequence without touching code.

The result

The outcome

Noah is actively using the site to win photography bookings and grow his online presence.

The work

Noah da Costa Photography — screenshot 1
Noah da Costa Photography — screenshot 2
Noah da Costa Photography — screenshot 3

Want a site built this carefully?

Every JLC Studio build gets the same treatment — engineered from scratch, no shortcuts.

Start a project