The Waiter Who Wanted to Give Feedback
I worked as a waiter. I also love food. That combination gave me a weird perspective on restaurants. I saw how much effort went into the food and service, but I also saw the gap between what customers thought and what restaurant owners knew.
Sometimes I wanted to tell a restaurant about an issue I noticed. Not to complain publicly, not to hurt their reputation. Just to help them improve. But there was no easy way to do that. Either I told a manager directly which felt confrontational, or I left a public review which felt destructive.
I wanted a middle ground. A way to give feedback that reached the right people without the public shaming.
Three Languages for Three Jobs
The architecture was intentional. Each piece of the system has different needs and I picked the best tool for each one.
Django handles the backend and the admin interface. It has the most mature ORM I have used and the admin panel is ready to go out of the box. For a system that needs to manage restaurants, feedback, and users, Django was the obvious choice.
Next.js powers the customer facing form and the business dashboard. Restaurants in Bangkok serve a multilingual customer base. The frontend needed to handle multiple languages elegantly and Next.js with SSR delivers a fast experience on any device.
Elixir with Oban handles background jobs. Email notifications, weekly digest generation, analytics aggregation. Oban makes job processing simple and reliable. If a job fails it retries. If traffic spikes it queues. The concurrency model handles everything without breaking a sweat.
The Moment It Worked
The first restaurant that used KraowKao saw real feedback come in. Not the usual public reviews that are either five stars or one star with no middle ground. Structured, honest feedback about specific things.
They got excited because they could improve their service before it turned into a public complaint. A customer mentioned the music was too loud and they adjusted it the same day. Another mentioned a dish was undersalted and the chef fixed it for the next order.
That is the whole point. Not to replace public reviews, but to give restaurants a chance to fix things before those reviews happen.
What It Does
Customers scan a QR code on the table and answer a quick structured form. No account needed, no app download. The feedback goes directly to the restaurant dashboard where they can respond and track trends over time. Everything is private between the customer and the business.
The Tech
Django REST Framework for the API. Next.js for the multilingual frontend. Elixir with Oban for background job processing. PostgreSQL for everything.
Top comments (0)