Case Study · Full Stack Developer · since January 2026
Celina: a live two-sided marketplace, built solo, from first commit to production
Celina (celinaeda.ru) is a consumer marketplace connecting home cooks with customers. I have been building it in Lisbon since January 2026, and it launched from Lisbon, Portugal, in July 2026. I built every layer of it — product design, frontend, backend, infrastructure, SEO, and analytics — and operate it in production. It's the most honest portfolio piece a developer can show you: a real business system running in production, not a demo.
The challenge
A two-sided marketplace is one of the hardest things to ship as a solo developer. It needs seller onboarding with identity verification, a catalog customers trust, ordering with real-time status, security that protects both sides, and — the part most builds skip — the ability to be found: a marketplace nobody discovers on Google is dead on arrival.
Both sides have to work from the same day: cooks who sign up and have their identity checked, and customers willing to order from someone they have never met. Neither group waits around while the other half of the product is built.
- Two audiences, one product. Cooks need a working tool, customers need a shop, and both run on the same codebase.
- Trust before the first order. Without identity checks on the cooks, nobody orders food from a stranger.
- Findable from day one. No organic traffic means no supply, and no supply means no traffic.
- One developer, not a team. Every technical decision had to be one that a single person can keep running.
The front end: a React app Google can read
A marketplace lives on organic traffic, but a classic single-page app hands the crawler an all but empty HTML document. So the front end is React 18 and TypeScript, generated statically with Vite: the visitor gets an app, the search engine gets finished HTML.
That produced more than 100 prerendered landing pages, bilingual, indexed by both Google and Yandex. On every deploy the site submits its new and changed pages through IndexNow, so a page never sits waiting for a crawler to come past by chance.
- React 18, TypeScript and Vite with static generation: 100+ prerendered pages served straight as HTML.
- IndexNow on every deploy, so new pages announce themselves to the search engines instead of waiting to be found.
- One codebase for three roles — customer, cook and administrator — each with its own view.
- Phone first. The ordering flow was designed for the phone and only afterwards for the large screen.
The back end: orders, identity and access
Behind it runs Node.js with Express and Prisma on MySQL. The center of the system is the order lifecycle: from placed to delivered, with a status both sides watch in real time. As long as the customer can see where the order is, nobody has to pick up the phone.
Cooks go through a KYC process: they upload an identity document, and it is reviewed before their kitchen becomes visible. Permissions are enforced on the server rather than in the interface — whatever the browser hides, the server blocks as well.
- Node.js, Express and Prisma on MySQL, with an order status that runs from placed to delivered.
- KYC for cooks: upload the document, review it, and publish the kitchen only after that.
- Roles checked on the server, so a request edited in the browser buys nothing extra.
- Sessions across several devices, with the option to end any of them remotely.
The infrastructure
The application runs in Docker containers behind nginx on a VPS of my own, with Let's Encrypt certificates that renew themselves. A deploy is a single command, so there is no manual step left for me to forget. Every night a backup of the database and the uploaded documents runs on its own.
I also measure the whole funnel: visit to catalog, catalog to order. Together with the Search Console data, that is what decides which pages get attention — not my instinct.
- Docker, nginx and Let's Encrypt on a VPS.
- Automated deploys, so a release is not a checklist of manual work.
- Daily backups of the database and the uploaded files.
- A funnel I can measure: visit → catalog → order, wired to Search Console.
Choices and trade-offs
Every choice in this project had a price. Static generation makes the site findable, but every content change needs a new build; that is acceptable only because the build is automated. Reviewing KYC by hand does not scale forever, but at this stage an external verification service costs money that is better spent on the product itself.
Just as important is what I deliberately did not do: no Kubernetes, no microservices, no extra service with a monthly subscription. At this volume, one server, one database and a monolithic back end are the cheapest option and the easiest to maintain — and I am the one who gets out of bed at night when something breaks.
- Static generation over server-side rendering: slower to publish, faster and cheaper for the visitor.
- KYC reviewed by hand instead of a paid verification service, until the volume justifies one.
- One VPS instead of a cloud platform, for predictable costs and no dependence on a single vendor.
- A monolith instead of microservices, because there is one developer here and not five teams.
Results
Celina runs in production at celinaeda.ru. More than 100 pages sit in the Google and Yandex index, cooks sign up and get verified, and customers place orders they can follow live. Design, build, deployment and day-to-day operation are all on one person.
What matters more than the numbers is what does not happen. There is no agency to call when something breaks, no platform that raises its prices halfway through, and no part of the stack I cannot repair myself. The source is public too — the whole production system on GitHub, not a sample.
What this means for your project
Everything expensive about your project — authentication, payments-ready order flows, verification, deployment, SEO — I have already solved in production under my own name. You're not paying me to learn on your budget.
I work remotely and in English from Lisbon, Portugal. Prices are in euros and fixed before anything starts, and the GDPR is part of the design from the first sketch: no third-party trackers you did not ask for, analytics that is not loaded before consent, and hosting in a region you choose.
- A fixed price up front. From €1,200 for a one-page personal site, €1,950 for a landing page, €3,900 for a business website with technical SEO and €12,000 for a web application.
- A quote within 48 hours, agreed before the work begins; messages get an answer within 24 hours.
- Working hours that overlap yours. I am on Western European Time, one hour behind Berlin and Paris; for the US East Coast your 9am is my 2pm, so we share your morning.
- Progress you can watch. A live staging link you open yourself, with WhatsApp, email or video calls in between — never a status email you have to wait for.
- You own everything. Code, design and data transfer to you on final payment — no license, no lock-in, and no monthly fee to keep using what you already paid for.