01
the challenge
Los Clasificados has no client: it is my own project. Latin Americans in Europe make a living any way they can (empanadas on Sundays, nails at home, removals, Spanish lessons, bands that play at parties) and their shop window is Facebook groups and WhatsApp statuses. There an ad lasts as long as it takes to scroll past: you cannot search it by category or by city, you cannot save it, and whoever posted it never finds out whether anyone saw it.
I set the brief myself, with three conditions that never moved. Posting is free, because charging at the door kills a directory that is still empty. The site has to be able to pay for itself (featured ads, banners, affiliate links) without turning into a billboard. And the audience is mostly in France, so data law is not a formality at the end: it decides from day one what may be measured at all.
02
the solution
A complete classifieds site, designed and built from scratch: React with Vite in front, Express 5 with Prisma and PostgreSQL behind, all in containers on a VPS. The same codebase produces three things: the website, an installable PWA and an Android/iOS app wrapped with Capacitor.
The unit is the ad, and its journey is closed end to end: a three-step wizard (type, category and details, with fields that change per category, photos cropped in the browser and an autocompleted address), plus an identification step for anyone arriving without an account and a payment step only for anyone featuring it; entry in PENDING status, moderation in the panel, an email to the advertiser on approval and, where it helps, automatic publishing to Instagram as a post or a story.
Money is decided on the server. Featuring costs €1.99, bumping €0.99 and a banner €5.99 a week; the browser sends the intent, never the amount, and a Stripe webhook applies the purchase even if the customer closes the tab halfway through paying.
03
the result
In production since June 2026, when the "coming soon" screen came down. Today there are 37 live ads (home cooking, services, products and events) from businesses in Paris, Marseille, Berlin, Amsterdam, Barcelona and Malta, growing by word of mouth.
As it stands: ~18,000 lines of TypeScript, 60 API endpoints, 9 tables, 12 migrations and 248 commits between January and September 2026.
What I take away is, as usual, in the production failures: a www redirect that left the site blank for exactly the people who had installed the PWA from the wrong subdomain, a 504 that came back after every deployment, and a `prisma generate` that fell over because of an em dash inside a schema comment. Each one left its rule written in the file where it would otherwise be lost: the nginx.conf, the docker-compose, the schema itself.