ARTDANTECH
Performance teardownOptimization engagementLet's Talk

Nina Carducci

A performance and SEO teardown of a Paris photographer's site — what was broken, what we fixed, what we deliberately left alone, and why restraint was the whole engagement.

Overview

A photographer in Paris was losing wedding inquiries to competitors who shot worse work. The reason had nothing to do with photography. Her site looked beautiful, opened slowly, and was effectively invisible to anyone typing "wedding photographer Paris" into Google. This is the teardown of what we found, what we shipped, and why the right move was to fix the foundations without touching a single pixel of the design.

The engagement

Performance, SEO and accessibility intervention on an existing photographer portfolio. No redesign, no rebuild, no migration — just the technical work that the original build skipped.

The client

Nina Carducci — portrait and wedding photographer based in Paris. A strong visual identity already in place. A site that was actively hiding it from the people who would have hired her.

The diagnosis

Mobile LCP over 4 seconds. Zero structured data. A heading hierarchy Google couldn't parse. Accessibility failures on contrast and keyboard navigation. The site was beautiful and invisible at the same time.

The outcome

Sub-second LCP on mobile. Schema.org entity graph in place. Lighthouse scores in the 90s across the board. The visual identity untouched — and finally findable.

For a wedding photographer, every position on the first page of Google is the difference between a booked Saturday and an empty one. SEO isn't a vanity metric on this kind of business. It's the booking calendar.


Audit findings

Before touching anything, we ran the site through Lighthouse, WebPageTest, Wave and a manual crawl. Here's what came back — the kind of forensic detail most agencies summarize as "we improved performance and SEO" because the specifics expose how much was actually wrong.

Performance — every Core Web Vital was failing.

  • LCP (Largest Contentful Paint) over 4 seconds on simulated 4G. The hero image was a full-resolution JPEG served at desktop dimensions even on mobile, with no srcset and no modern format fallback.
  • Render-blocking CSS in the critical path. A 180KB stylesheet loaded synchronously in the <head>, delaying first paint by hundreds of milliseconds.
  • No image lazy loading. Every gallery image — dozens of them — was downloaded on initial page load whether the visitor scrolled to them or not.
  • Cumulative Layout Shift above the "good" threshold. Images without explicit dimensions caused content to jump as the page assembled.

SEO — the site was invisible to entity-aware search.

  • Zero structured data. No JSON-LD, no LocalBusiness schema, no Person entity. Google had no machine-readable way to understand that this was a photographer in Paris available for hire.
  • Heading hierarchy that made no sense. Multiple <h1> tags on the same page, sections marked with <div> instead of <section>, no semantic landmarks. Google's crawler had to guess at the page structure.
  • Missing Open Graph tags. Every share on Facebook, LinkedIn or WhatsApp produced a generic preview with no image and a fallback title. Free distribution, thrown away.
  • No alt attributes on portfolio images. Both an accessibility failure and a missed SEO opportunity — image search is a real traffic source for photographers, and these images carried zero textual signal.

Accessibility — failures that were also conversion failures.

  • Color contrast on the navigation and CTAs below the WCAG AA threshold. Hard to read for anyone with mild visual impairment, and a known conversion drag even for users with perfect vision.
  • Keyboard navigation broken at the gallery. Tab order skipped interactive elements entirely.
  • Form labels missing or visually hidden without proper ARIA support.

What we shipped

We worked through the audit in priority order — biggest impact first, lowest risk first when impact was tied.

The image pipeline, rebuilt from scratch. Every image converted to AVIF with WebP fallback, sized via responsive srcset for mobile and desktop, lazy-loaded below the fold, given explicit width/height to eliminate CLS. The hero image preloaded with fetchpriority="high" to crush LCP. Result: LCP under one second on simulated 4G, CLS effectively zero.

Critical CSS inlined, the rest deferred. The above-the-fold styles were extracted and inlined in the <head>. The remaining stylesheet was loaded asynchronously. First paint moved from hundreds of milliseconds to immediate.

A complete JSON-LD entity graph. LocalBusiness for the studio, Person for Nina herself, Service entries for portrait, wedding and event photography, all chained with proper @id references so Google can resolve them as a single coherent entity. This is the work that turns "another photography site" into "the photographer who shows up when someone searches her specialty in her city."

Semantic HTML restoration. Single <h1> per page, proper <section>, <article>, <nav> and <main> landmarks, heading hierarchy that descends logically. The site went from a wall of <div>s to a document Google can actually read.

Open Graph and Twitter Card tags on every page. Branded preview images, accurate titles, compelling descriptions. Every share is now free advertising instead of a missed impression.

Accessibility brought to WCAG AA. Contrast adjusted on all interactive elements (without changing the visual identity — the adjustments are imperceptible to sighted users), keyboard navigation restored across the gallery, alt text written for every portfolio image with both descriptive and SEO value.


Key results

LCP under 1 second on mobile

Down from over 4 seconds. The single most important Core Web Vital, the one Google weights most heavily for search ranking, the one prospects feel the most.

Lighthouse 90+ across all four axes

Performance, accessibility, best practices and SEO — verifiable in any audit run. The site went from failing every category to scoring in the high 90s on all of them.

A site Google can actually rank

Structured data, semantic HTML and clean metadata mean the site is now eligible for local pack results, image search and rich previews — none of which were accessible before.

Same site, different business

The visual identity is pixel-identical. The technical foundation is unrecognizable. The brand is intact and the booking funnel finally works.


What we deliberately didn't touch

The hardest part of a teardown engagement is restraint. The temptation to redesign, restructure or "modernize" things that aren't broken is constant — and almost always wrong. Here's what we left alone, and why.

  • The visual identity. Typography, color palette, spacing system, photo treatment — untouched. The brand was already strong. Touching it would have been ego, not engineering.
  • The hosting setup. GitHub Pages is unfashionable in 2026 but free, fast enough once the assets are optimized, and works perfectly for a portfolio site at this scale. Migrating to Vercel or Netlify would have cost time and money for zero measurable gain.
  • The vanilla JavaScript stack. No framework migration. The site is small, static, and the vanilla approach loads faster than any framework would. Replacing it with React or Astro would have been resume-driven development at the client's expense.
  • The content. We rewrote nothing the photographer had written about herself or her work. Her voice was already there. Our job was to make Google hear it, not to ghost-write a new version of her.

The discipline of an optimization engagement is in the work you refuse to do. Anyone can find ten more things to "improve." A senior engineer knows which improvements actually move the needle and which are vanity.


Tech stack (unchanged from the original build)

  • Semantic HTML5
  • CSS3 (with critical path extraction)
  • Vanilla JavaScript
  • AVIF / WebP image pipeline via build script
  • JSON-LD structured data (LocalBusiness, Person, Service)
  • Node.js + npm scripts (build tooling)
  • GitHub Pages (deployment, retained intentionally)
  • Lighthouse, WebPageTest, GTmetrix (verification)
  • Wave, axe DevTools (accessibility audit)

What this engagement reveals

Most agencies would have pitched a full rebuild for this project — because rebuilds are easier to scope, easier to price, and produce more dramatic before/after screenshots. The right answer was the boring one: leave everything that worked, fix everything that didn't, and hand back a site that looks the same and performs nothing alike. The bill was a fraction of a rebuild. The business outcome was larger.

If you have a site that looks good and underperforms — slow on mobile, invisible on Google, frustrating to navigate, or all three — the question isn't whether you need a redesign. It's whether anyone has actually audited the foundations. The first call is a 30-minute working session where we run your site through the same audit Nina's went through and tell you, honestly, what's recoverable without touching the design. If a rebuild is the right answer, we'll say so. If it isn't, we'll save you the bill.

Audit my site.