01
el reto
Los Clasificados no tiene cliente: es un proyecto propio. La comunidad latina en Europa se la rebusca (empanadas los domingos, uñas a domicilio, mudanzas, clases de español, grupos que tocan en fiestas) y su escaparate son los grupos de Facebook y los estados de WhatsApp. Ahí un anuncio dura lo que tarda en bajar por el muro: no se busca por categoría ni por ciudad, no se guarda, y quien lo publica nunca llega a saber si alguien lo vio.
El encargo me lo puse yo, con tres condiciones que no se movieron. Publicar es gratis, porque cobrar la entrada mata un directorio que todavía está vacío. El sitio tiene que poder sostenerse solo (destacados, banners, afiliación) sin convertirse en una valla publicitaria. Y el público mayoritario está en Francia, así que la ley de datos no es un trámite del final: decide desde el primer día cómo se puede medir.
02
la solución
Un sitio de clasificados completo, diseñado y desarrollado desde cero: React con Vite delante, Express 5 con Prisma y PostgreSQL detrás, todo en contenedores sobre un VPS. De la misma base de código salen tres cosas: la web, una PWA instalable y una app de Android y iOS envuelta con Capacitor.
La unidad es el anuncio, y su recorrido está cerrado de punta a punta: un asistente de tres pasos (tipo, categoría y detalles, con los campos que cambian según la categoría, el recorte de fotos y la dirección autocompletada), más la identificación para quien llega sin cuenta y el pago solo si quiere destacar; entrada en estado PENDING, moderación en el panel, correo al anunciante cuando se aprueba y, si conviene, publicación automática en Instagram como post o como story.
El dinero se decide en el servidor. Destacar cuesta 1,99 €, relanzar 0,99 € y un banner 5,99 € la semana; el navegador manda la intención, nunca el importe, y un webhook de Stripe aplica la compra aunque el cliente cierre la pestaña a mitad del pago.
03
el resultado
En producción desde junio de 2026, cuando cayó la pantalla de «próximamente». Hoy hay 37 anuncios activos (comida casera, servicios, productos y eventos) de negocios en París, Marsella, Berlín, Ámsterdam, Barcelona y Malta, y crece por boca a boca.
A día de hoy: ~18.000 líneas de TypeScript, 60 endpoints de API, 9 tablas, 12 migraciones y 248 commits entre enero y septiembre de 2026.
Lo que me llevo está, como siempre, en las averías de producción: un 301 de www que dejaba el sitio en blanco justo a quien se había instalado la PWA desde el subdominio equivocado, un 504 que volvía después de cada despliegue, y un «prisma generate» que se caía por una raya larga dentro de un comentario del esquema. Cada una dejó su regla escrita en el fichero donde podía perderse: en el nginx.conf, en el docker-compose, en el propio esquema.