01
le défi
Los Clasificados n'a pas de client : c'est un projet personnel. La communauté latino-américaine d'Europe se débrouille (empanadas le dimanche, ongles à domicile, déménagements, cours d'espagnol, groupes qui jouent en soirée) et sa vitrine, ce sont les groupes Facebook et les statuts WhatsApp. Là, une annonce dure le temps de descendre dans le fil : pas de recherche par catégorie ni par ville, rien à enregistrer, et celui qui publie ne saura jamais si quelqu'un l'a vue.
La commande, je me la suis passée à moi-même, avec trois conditions qui n'ont pas bougé. Publier est gratuit, parce que faire payer l'entrée tue un annuaire encore vide. Le site doit pouvoir tenir tout seul (mises en avant, bannières, affiliation) sans devenir un panneau publicitaire. Et le public est majoritairement en France : le droit des données n'est donc pas une formalité de fin de parcours, il décide dès le premier jour de ce qu'on a le droit de mesurer.
02
la solution
Un site de petites annonces complet, conçu et développé de zéro : React avec Vite devant, Express 5 avec Prisma et PostgreSQL derrière, le tout en conteneurs sur un VPS. Le même code produit trois sorties : le site, une PWA installable et une application Android et iOS emballée avec Capacitor.
L'unité, c'est l'annonce, et son parcours est fermé de bout en bout : un assistant en trois étapes (type, catégorie et détails, avec les champs qui changent selon la catégorie, le recadrage des photos et l'adresse autocomplétée), plus l'identification pour qui arrive sans compte et le paiement seulement pour qui veut mettre en avant ; une entrée en statut PENDING, la modération dans le panneau, un e-mail à l'annonceur à l'approbation et, si c'est utile, une publication automatique sur Instagram en post ou en story.
L'argent se décide côté serveur. Mettre en avant coûte 1,99 €, relancer 0,99 € et une bannière 5,99 € la semaine ; le navigateur envoie l'intention, jamais le montant, et un webhook Stripe applique l'achat même si le client ferme l'onglet au milieu du paiement.
03
le résultat
En production depuis juin 2026, quand l'écran « bientôt disponible » est tombé. Aujourd'hui, 37 annonces actives (cuisine maison, services, produits et événements) de commerces à Paris, Marseille, Berlin, Amsterdam, Barcelone et Malte, et ça grandit par le bouche-à-oreille.
À ce jour : ~18 000 lignes de TypeScript, 60 points d'entrée d'API, 9 tables, 12 migrations et 248 commits entre janvier et septembre 2026.
Ce que j'en retiens est, comme toujours, dans les pannes de production : un 301 de www qui laissait le site blanc précisément chez ceux qui avaient installé la PWA depuis le mauvais sous-domaine, un 504 qui revenait après chaque déploiement, et un « prisma generate » qui tombait à cause d'un tiret cadratin dans un commentaire du schéma. Chacune a laissé sa règle écrite dans le fichier où elle pouvait se perdre : le nginx.conf, le docker-compose, le schéma lui-même.