Casestudy · Full Stack Developer · sinds januari 2026
Celina: een live marktplaats die ik in mijn eentje heb gebouwd, van de eerste commit tot productie
Celina (celinaeda.ru) is een marktplaats die thuiskoks en klanten samenbrengt. Ik werk er sinds januari 2026 vanuit Lissabon aan, en in juli 2026 lanceerde ik het vanuit Lissabon, Portugal. Ik heb elke laag ervan ontworpen en gebouwd — front-end, back-end, infrastructuur en SEO — en ik houd het draaiende. Geen demo, maar een bedrijf dat draait.
De opgave
Een tweezijdige marktplaats is een van de lastigste systemen om alleen te bouwen. Beide kanten moeten tegelijk werken: koks die zich aanmelden en van wie de identiteit is gecontroleerd, en klanten die durven te bestellen bij iemand die ze niet kennen.
Daar komt een derde eis bij die in veel projecten pas achteraf aandacht krijgt: gevonden worden. Een marktplaats die niemand in Google vindt, is bij de lancering al dood.
- Twee doelgroepen, één product. Koks hebben een werkomgeving nodig, klanten een winkel; beide draaien op dezelfde codebase.
- Vertrouwen vooraf. Zonder identiteitsverificatie van de koks bestelt niemand eten bij een onbekende.
- Vindbaarheid vanaf dag één. Zonder organisch verkeer komt er geen aanbod, en zonder aanbod komt er geen verkeer.
- Eén ontwikkelaar, geen team. Elke technische keuze moest door één persoon te onderhouden zijn.
De front-end: een React-app die Google kan lezen
Een marktplaats leeft van organisch verkeer, maar een klassieke single-page-app geeft de crawler een vrijwel lege HTML-pagina. Ik heb daarom gekozen voor React 18 met TypeScript en statische generatie via Vite: de bezoeker krijgt een app, de zoekmachine kant-en-klare HTML.
Dat leverde ruim 100 vooraf gegenereerde landingspagina's op, die zowel door Google als door Yandex zijn geïndexeerd. Bij elke deploy meldt de site nieuwe en gewijzigde pagina's automatisch aan via IndexNow, zodat een nieuwe pagina niet hoeft te wachten tot een crawler toevallig langskomt.
- React 18, TypeScript en Vite met statische generatie: ruim 100 vooraf gegenereerde pagina's die direct als HTML worden uitgeleverd.
- IndexNow bij elke deploy, zodat nieuwe pagina's zichzelf aanmelden bij de zoekmachines.
- Eén codebase voor drie rollen: klant, kok en beheerder, elk met een eigen weergave.
- Mobiel als uitgangspunt. Het bestelproces is voor de telefoon ontworpen en pas daarna voor het grote scherm.
De back-end: bestellingen, identiteit en toegang
Achter de schermen draait Node.js met Express en Prisma op MySQL. De kern is de levenscyclus van een bestelling: van geplaatst tot bezorgd, met een status die beide partijen in realtime zien. Zolang de klant zelf kan zien waar de bestelling is, hoeft niemand te bellen.
Voor de koks is er een KYC-proces: zij uploaden hun identiteitsbewijs, dat wordt beoordeeld voordat hun keuken zichtbaar wordt. Toegangsrechten worden op de server afgedwongen en niet in de interface — wat de browser verbergt, blokkeert de server ook.
- Node.js, Express en Prisma op MySQL, met een bestelstatus die van geplaatst tot bezorgd loopt.
- KYC voor koks: documenten uploaden, beoordelen en pas daarna publiceren.
- Rollen worden op de server gecontroleerd, zodat een aangepast verzoek uit de browser niets extra's oplevert.
- Sessies op meerdere apparaten, waarbij een gebruiker een sessie op afstand kan beëindigen.
De infrastructuur
De applicatie draait in Docker-containers achter nginx op een eigen VPS, met certificaten van Let's Encrypt die zichzelf vernieuwen. Een deploy is één commando; er is geen handmatige stap waarin ik iets kan vergeten. Elke nacht draait er automatisch een back-up van de database en de geüploade documenten.
Daarnaast meet ik de volledige funnel: van bezoek naar catalogus naar bestelling. Samen met de gegevens uit Search Console bepaalt dat welke pagina's aandacht krijgen — niet mijn buikgevoel.
- Docker, nginx en Let's Encrypt op een eigen VPS.
- Geautomatiseerde deploys, zodat een release geen checklist met handwerk is.
- Dagelijkse back-ups van de database en de geüploade bestanden.
- Een meetbare funnel: van bezoek naar catalogus naar bestelling, gekoppeld aan Search Console.
Keuzes en afwegingen
Elke keuze in dit project had een prijs. Statische generatie maakt de site vindbaar, maar iedere inhoudswijziging vereist een nieuwe build; dat is acceptabel zolang die build geautomatiseerd is. Handmatige KYC-beoordeling schaalt niet oneindig, maar een externe verificatiedienst kost in deze fase geld dat beter naar het product kan gaan.
Minstens zo belangrijk is wat ik bewust niet heb gedaan: geen Kubernetes, geen microservices, geen extra dienst met een maandabonnement. Eén server, één database en een monolithische back-end zijn bij dit volume het goedkoopst en het best te onderhouden — en ik ben degene die 's nachts uit bed komt als er iets stukgaat.
- Statische generatie boven server-side rendering: trager bij publiceren, sneller en goedkoper voor de bezoeker.
- Handmatige KYC-beoordeling in plaats van een betaalde verificatiedienst, tot het volume dat rechtvaardigt.
- Eén VPS in plaats van een cloudplatform, voor voorspelbare kosten en zonder afhankelijkheid van één leverancier.
- Een monoliet in plaats van microservices, omdat er één ontwikkelaar is en geen vijf teams.
Het resultaat
Celina draait in productie op celinaeda.ru. Er staan ruim 100 pagina's in de index van Google en Yandex, koks melden zich aan en worden geverifieerd, en klanten plaatsen bestellingen die ze live kunnen volgen. Ontwerp, bouw, uitrol en beheer liggen bij één persoon.
Belangrijker dan de cijfers is wat er níét gebeurt. Er is geen bureau dat ik moet bellen als er iets kapot is, geen platform dat halverwege zijn tarieven verhoogt en geen onderdeel van de stack dat ik niet zelf kan repareren.
- Ruim 100 pagina's geïndexeerd door Google en Yandex.
- Live in productie op celinaeda.ru.
- Eén ontwikkelaar voor ontwerp, code, servers en SEO.
- De volledige stack in eigen beheer, zonder onderdelen die van een extern bureau afhangen.
Wat dit voor uw project betekent
Alles wat een project als het uwe duur maakt — inloggen, een bestelproces dat klaar is voor betalingen, verificatie, uitrol en technische SEO — heb ik op mijn eigen platform al in productie opgelost. U betaalt mij dus niet om het op uw kosten te leren.
Ik werk vanuit Lissabon, binnen de EU. Ik factureer in euro's, met een specificatie. De AVG zit vanaf het begin in het ontwerp: geen trackers waar u niet om hebt gevraagd, analytics die pas na toestemming wordt geladen en hosting in een regio die u zelf kiest.
- Vaste prijs vooraf. Persoonlijke website van één pagina vanaf €1.200, landingspagina vanaf €1.950, zakelijke website met technische SEO vanaf €3.900 en webapplicatie vanaf €12.000.
- Offerte binnen 48 uur, vastgelegd voordat het werk begint; op berichten reageer ik binnen 24 uur.
- Een gespecificeerde factuur in euro's, met alles wat erop komt vooraf vastgelegd in de offerte.
- Kennismaking via videogesprek wanneer dat helpt; daarna volgt u de voortgang op een testomgeving die u zelf kunt openen.
- Eén uur tijdsverschil. Uw ochtend is ook mijn ochtend, dus niets blijft een dag liggen.
- Engels als werktaal, zoals bij veel Nederlandse tech- en start-upteams; de website zelf kan gewoon Nederlands zijn.
- U wordt eigenaar van alles. Code, ontwerp en gegevens gaan bij de eindbetaling op u over, zonder licentieconstructie en zonder maandbedrag om te mogen blijven gebruiken wat u al betaald hebt.