The Challenge
Peach Life Productions is a photography and video studio. Their site is their portfolio — the first thing a prospective client sees. It has to be visually exceptional. But most media-rich sites pay for that with brutal load times, which kills conversions before a visitor ever sees the work.
The brief was straightforward: build a site that looks like a premium studio and loads like a blog post. No WordPress. No page builder. No CMS overhead. Just fast, clean, and completely theirs.
What made this genuinely hard was the volume of content — hundreds of high-resolution images across multiple galleries, plus a full video production reel that needed to be embedded without tanking performance on every page load.
01 — Image volume & format
Hundreds of photos across weddings, portraits, commercial, and events galleries — each needing to serve in the best format the visitor’s browser supports.
02 — Video without the weight
A video production studio has to show video. Embedding YouTube naively loads its entire tracking and player infrastructure on every page — even pages with no video.
03 — Booking friction
The client needed a way for visitors to book sessions directly from the site, without a clunky redirect to a third-party page that breaks the brand experience.
04 — No backend, no budget
Everything had to run as a static site on Netlify. No server. No database. No ongoing infrastructure cost beyond the domain.
The Approach
We built the site on Vite with a custom EJS templating layer — a setup that gives us the speed and modern tooling of Vite with the ability to write reusable HTML partials across a multipage site. No React. No hydration cost. Just HTML, CSS, and vanilla JavaScript that ships as-is.
Each technical decision came down to one question: does this make the experience better for the visitor, or does it just make it easier for us to build? If the answer was only the latter, we didn’t do it.
Technical Decisions
The problems we solved and how we solved them.
Problem: YouTube kills page performance
A standard YouTube embed loads ~500KB of JavaScript, iframes, and tracking scripts on page load — whether or not the visitor ever clicks play.
Solution — YouTube facade pattern: We display the video’s thumbnail image pulled directly from YouTube’s CDN. The actual embed only loads when the visitor clicks play. Pages with video load as fast as pages without — until the visitor actively wants to watch.
Problem: High-res images in three formats
Modern browsers support AVIF and WebP — formats that can cut image size by 50–80% over JPEG. But older browsers don’t support them. Serving one format means either penalising modern browsers or breaking old ones.
Solution — Runtime format detection: We generate AVIF, WebP, and JPEG versions of every image at build time using Sharp. At runtime, JavaScript probes what the browser supports and silently serves the best version — AVIF first, WebP second, JPEG as the fallback. Visitors never see this happen.
Problem: Gallery browsing across hundreds of images
A flat gallery grid with no interaction model means visitors are either scrolling endlessly or clicking to a new page, losing their place each time.
Solution — Modal carousel with mixed media: A single lightbox carousel handles images, YouTube embeds, and local video in one unified component. Keyboard, mouse, and touch swipe all work. No library — built entirely in vanilla JavaScript, so there’s no framework overhead.
Problem: Booking redirects break the experience
Sending a visitor to an external booking page at the moment they’re ready to book is a conversion risk. Brand continuity disappears and the visitor loses context.
Solution — TidyCal embedded in a modal: The booking calendar loads inside a full-screen modal on the site itself. The visitor never leaves the page. The calendar only loads when the booking button is clicked — zero impact on initial page load.
Problem: Git and Netlify can’t handle a 4GB image repo
Committing hundreds of high-res images directly to git caused the repository to balloon past 4GB. GitHub rejected pushes and Netlify builds failed before they even started.
Solution — Git LFS for binary assets: We migrated all image and video assets to Git Large File Storage. LFS stores binary files separately from the repository history, keeping the git repo lean while still giving Netlify access to all assets at build time.
The Stack
The entire site is vanilla HTML, CSS, and JavaScript — compiled by Vite, templated with EJS, deployed to Netlify’s global CDN. There is no runtime server. No database. No JavaScript framework to hydrate.
What the visitor downloads is exactly what the browser needs to render the page. Nothing more.
- Vite 5
- EJS templating
- Git LFS
- Netlify CDN
- Vanilla JS
- CSS custom properties
- Sharp (image optimisation)
- YouTube facade
- TidyCal
- Web3Forms
- Google Analytics 4
- Schema.org JSON-LD
Results
Peach Life Productions launched in July 2026. Performance data and conversion metrics are being tracked and will be published here as the numbers come in.
What we can say now: the site passes Core Web Vitals, loads in under 2 seconds on a mid-range mobile connection, and serves a full gallery of professional photography without a single render-blocking resource.
This case study will be updated with real traffic, conversion, and performance data at the 60-day and 6-month marks.
For another fully custom, high-performance build, see how we built Posh Limousines of Atlanta’s booking infrastructure, or read how a fast, foundational site helped Duke’s Professional Cleaning Services rank #8 on Google in 90 days.
Need a site that carries your work without slowing it down?
Whether you're a photographer, videographer, or any creative professional — if your site is the product, it needs to perform like one. We'd love to talk about what that looks like for you.
