1 / 16
Detailing.fr

Detailing.fr brings France's car detailing professionals together in one place. For customers, it is a directory: you look for a detailer nearby, by city, by service, or by asking an AI assistant. For professionals, it is the entry point to an ecosystem: a single form gets them a website, a back office (see the CMS case study) and a mobile app. I designed and built the public platform and the API that runs it all.
- city pages generated
- 1 053
- active pro websites (July 2026)
- 62
- scheduled jobs
- 11
- lines, site + API (approx.)
- 126 k
A directory built for local SEO
Every region, department and city has its own page, generated from geographic data and tightly cross-linked. Distance search runs on PostGIS (dedicated SQL functions), with a ranking that favours the most complete listings.
A page that promises detailers without showing any helps no one, Google included: a city is only indexable when it has enough content, and sitemaps are split by type (regions, departments, cities, detailers, blog, shops, training).

Find a detailer by asking a question
“Which detailers near Angers do PPF for under €50?” The AI assistant understands the question, searches the area, filters by service and price, then answers in text alongside the matching professionals' cards. The answer streams in (NDJSON): you see each step go by, then Claude's text being written.
A pro website from a single form
The central API (Node.js, Express) orchestrates the whole ecosystem. When a professional signs up, it creates their space in the shared database, their admin account, starter content (pages, services, prices), their subdomain through the host's API, then builds and uploads their site.
Paid plugin subscriptions with Stripe (tested webhooks).
Detailing.fr as an OAuth identity provider: other apps, such as FD Pilot, offer “Sign in with Detailing.fr”.
Pre-rendering of client sites for search engines, Search Console sync, sitemap submission.
11 scheduled jobs (weekly stats, engagement nudges, syncs), Slack monitoring, Redis cache.

The open directory: useful, and by the book
With clients alone, the vast majority of city pages stayed empty. To list every detailer in France, listings are imported from the public SIRENE database. The project rests on six rules that the code makes impossible to bypass:
Correcting or deleting a listing is free, needs no account, forever (signed link).
A deletion survives every re-import (exclusion list of hashed SIRET numbers).
No non-public business ever enters the database (import filter and SQL constraint).
No photos or reviews copied from third parties.
A listing without added value is not indexed (completeness score).
Contact requests are always forwarded, even to free listings.
Shipping it
The Next.js site runs in standalone mode on a shared Node.js server. A deployment script uploads the build, restarts it and clears the Redis cache. Removed listings return a real 410 and migrated ones a 301, decided by a middleware before rendering.
Tools
Next.js · TypeScript · Supabase · PostgreSQL · PostGIS · Node.js · Express · Redis · Stripe · Claude (API Anthropic) · Leaflet · Tailwind CSS · GSAP · Lenis
Links
Credits
- Role
- Design, full-stack development & deployment
- Timeline
- January → July 2026
- Client
- Formation Detailing



