Lezzet İmparatorluğu
Three.js · Vite · Capacitor · NestJS · WebSocket · node:sqlite · Docker

Lezzet İmparatorluğu is a restaurant tycoon. Pedestrians walk past your place and decide whether to come in based on your sign, reputation and prices; you seat them, read the order bubble, pick the right kitchen station and serve. Serving tea doubles the tip, serving the wrong dish costs money and reputation. Supply orders land about twenty-five seconds later, and raising menu prices widens the margin while thinning the queue.
It is one web codebase. The client is Vite and Three.js - a procedurally built 3D scene, a delta-tick simulation and a touch-first UI - and the same build ships to Google Play through Capacitor, with AdMob, Google sign-in and Play Games Services on the native side. The backend is NestJS with WebSocket push for balance and notification updates, scrypt and HMAC token auth, and cloud saves autosaved every five seconds.
The datastore is deliberately small: node:sqlite, the SQLite module built into Node 24, with no external database to run. The whole thing builds into a Docker image and deploys to a VPS from GitHub Actions with a health check on the way in.
The hardest problem was not technical. Once every upgrade is bought, a tycoon loop starts repeating itself, and I wrote up how comparable games break that - resetting the loop with prestige, injecting new variables through events, or attaching a puzzle to it - before building the league, leaderboard and gifting layers on top of the core loop.
Highlights
- One web build ships as both a browser game and a Google Play app via Capacitor
- node:sqlite - the SQLite built into Node 24 - as the only datastore, no external database
- Cloud saves autosaved every five seconds, with WebSocket push for balance and notifications
- Leagues, leaderboards and gifting layered on the core loop after a written study of late-game repetition