Case study · 2026
noahdacosta.co.zaNoah 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.
Want a site built this carefully?
Every JLC Studio build gets the same treatment — engineered from scratch, no shortcuts.