Case study · Occitanie, France
A bilingual campaign site the client runs herself
Next.js, Sanity and our own component library. Two editorial versions, fifteen blocks the client edits without a developer, and a live figure read from an API rather than typed in by hand. Built to a fixed public date.

1. The brief🔗
L'Atelier des Bleus Pastel d'Occitanie revives pastel dyeing, the trade that financed Toulouse in the sixteenth century. Almost no one practises it. The workshop is moving into the Château de Lamotte and raising 30 000 € on Ulule to do it.
Three things shaped the build.
A fixed public date. The campaign was timed to the Journées européennes du patrimoine, 19 and 20 September, with the workshop among the sites open to visitors. That date could not move.

Two audiences, two languages. A French heritage audience and an international one following the craft. Not the same page translated.
One person maintaining it. Whatever shipped had to be editable by the client, because there would be no developer standing by during the campaign.
2. The stack🔗
Next.js, Sanity as the content system, and our own component library on Tailwind UI.
This is the same foundation behind every site we build. It is ours, it carries from one project to the next, and it is the reason a project of this size is worth doing at all: the work goes into what makes this campaign specific, not into rebuilding a content model, an image pipeline and a component set for the fourth time.
The client owns the result outright. There is no retainer and no proprietary platform to stay subscribed to.

3. What it does🔗
- Two editorial versions. French and English, each written rather than machine-translated, with separate addresses and separate metadata.
- Fifteen content blocks. Rearranged and rewritten by the client, no developer in the loop.
- Live campaign figures. Read from the Ulule API, so the gauge is never a number someone transcribed.
- Consent-gated analytics. A cookie banner wired to analytics, so measurement runs only where consent was given.
- Newsletter opt-in. Explicit, unticked by default, stored in the client's own account.
- Structured data. So search engines and AI assistants describe the workshop and the open day correctly.
- Press section and video. The New York Times, Courrier International and Milk. The video loads only on click, so it costs nothing to visitors who never play it.
The marketing side, the landing page structure and the conversion events, was handled by a colleague who does that work daily. The practice is two people, one technical and one marketing, which is why a page like this arrives with its measurement already defined rather than added afterwards.
4. Four decisions that outlast this project🔗
None of these are specific to crowdfunding. They are what the stack makes cheap to get right.
4.1 A launch has one lever🔗
Removing a single environment variable simultaneously lifts the pre-launch password wall, switches the robots file from disallowing crawlers to allowing them, and turns on analytics, the consent banner and outbound click tracking.
There is deliberately no separate switch for any of them, because a launch that can half-happen eventually does. The gate is the single source of truth for whether the site is public.
4.2 The launch date is not the campaign date🔗
The site opened one to two weeks before the campaign, and that had nothing to do with readiness.
A password-protected site asks search engines not to visit. Once opened they need one to two weeks to explore it. Opening on the morning of the nineteenth would have meant that nobody searching for the workshop during the weekend it was open to visitors could find it.
Free to get right in advance. Expensive to discover afterwards.
4.3 Consent nobody needs is worse than no banner🔗
The consent banner offered visitors an advertising category. The site carries no advertising, so the category was removed.
Asking someone to accept or refuse tracking that does not exist trains them to dismiss the banner, and overstates what the site collects. For the same reason the question of paid advertising was settled before launch rather than after: the answer was no, so no additional trackers were installed.
4.4 A plausible test value is worse than an obvious one🔗
Before launch the campaign gauge showed 12 150 € raised from 134 backers. Invented, left from development, and entirely believable.
A figure that looks real does not get checked. Clearing the demo content was its own launch blocker, alongside example journal entries and a misattributed quote.
5. Where else this goes🔗
The segment here is a crowdfunding campaign. The stack is not.
The same foundation runs a multilingual marketing site for a company whose engineers want to edit it in Git while marketing publishes without them; a product or launch page that has to rank before a fixed date; a technical or deep tech site where the audience is sceptical and the claims have to survive scrutiny. What changes between them is the content model and the measurement, not the platform.
Where a project needs commerce rather than content, the same practice builds on Shopify. That is a different case study.
6. Status🔗
Live in both languages since 8 September. The campaign opens at the Journées du patrimoine.
There are no results to report yet, and the outcome of the raise belongs to the campaign rather than to the site. What is demonstrable today: it opened early enough to be found, it displays figures it reads rather than figures someone typed, and the client changes it without calling anyone.
Need a site your team can actually run?
Thirty minutes, no commitment, to look at what you have today and what it would take to own it outright.
