Elio Darras
FreelanceIn production

Atelier Nicoletti · Architecte, Annecy

An architecture studio's website, rebuilt in three weeks

www.archinicoletti.fr
The real site, loaded inside the frame.

Role

Freelance

Webflow had unpublished the old site and the domain returned 404. Rather than going back to Webflow, everything was rebuilt in Astro: 57 projects, 509 photos recovered and captioned by script, 140 static pages, a content contract that breaks the build before an error reaches visitors.

What's inside

  • Astro 5 as a static site, four dependencies, a 48 KB home page answering in 0.2 s.
  • Content as versioned JSON under contract: an unknown category, a missing photo or an extra caption breaks the build.
  • 884 images saved from Webflow's CDN, 493 photos re-matched by perceptual hash, 509 captions.
  • Page transitions, native lightbox, a consent banner that genuinely controls trackers.
  • Art direction drawn from the site sign and the letterhead.
  • DNS switch without a second of e-mail downtime, 29 redirects from the old addresses.

In detail

01Why it exists

The showcase site of the Atelier d'Architecture Michel Nicoletti, in Annecy: 57 projects, 509 photos. On 24 August 2026, Webflow unpublished the old site, expired plan or refused payment, and the domain returned 404 for eleven days. Rather than going back to Webflow, everything was rebuilt: 50 commits in three weeks.

Nothing was lost: the old CMS content, 63 projects, and its 884 images were saved into the repository before anything else.

02Technology and content

Astro 5 as a static site: the build computes 140 HTML pages once and for all, no database, no application server. Four dependencies only: Astro, Sharp and two fonts. Output: 3 CSS files, 1 JavaScript file, and a 48 KB home page that answers in 0.2 seconds.

Each project is a JSON file versioned in git, under a content contract that breaks the build when violated: an invalid JSON, an unknown category, a missing photo, or a caption count different from the photo count, and the deployment fails. A content error cannot reach visitors.

One ordering function, used everywhere: the architect's rank, else the date, else alphabetical order. No two pages can sort differently.

03The scripts that built the content

Five Python programs built the content and remain replayable. A harvest fetched the 884 images from Webflow's CDN before it vanished. An ingestion turned the old CMS export into JSON files, deciding which photo series to keep.

The cleverest: the matching. The architect had named his photos for search engines, and the Webflow upload had renamed them, erasing everything. The script finds each photo's original by image content, a perceptual hash compared only within the project's folder. Result: 493 photos out of 493, no approximation. A hand-written dictionary then turns those names into 509 readable captions.

A post-build sweep walks the 140 pages, follows 1,220 internal links, and refuses to pass if it finds a dead link or a page missing from the sitemap.

04Mechanics, art direction, SEO

Page transitions without reload, a card's photo morphs into the project page's photo. A lightbox built on the native dialog element. A consent banner that genuinely controls the only two things that could set a tracker, analytics and YouTube videos: zero requests to Google before consent.

Everything comes from the site sign and the letterhead: the red extracted from the Illustrator swatch under the ICC profile, the frosted brown always as a texture, the "truncated M" vectorised in 658 bytes, self-hosted Josefin Sans and Inter.

The 509 photos produce 3,485 derived images at build time, several widths in WebP, served with a one-year cache, and Astro keeps the file name in the URL. Canonical URLs, descriptive alt texts, structured data, a 73-address sitemap, and 29 permanent redirects: all 63 old addresses were checked one by one.

Hosted on Vercel from a private GitHub repository. DNS stayed at OVH, only two records changed, and the architect's e-mail never went down for a second.