The dangerous thing about building with AI is how much fun it is. Or is it?
By James Akpan
We have a love-hate relationship with restaurants. We know we will have to wait so long to get attended to, and even longer for the meal we requested to get ready, but we still wear our Sunday bests and head right there. Because restaurants give us something we haven't learned to perfect in our homes. (In this article I'll use the word "restaurant" a lot, but most times I am referring to fine dining. Forgive me.)
My wife and I were right in the middle of this polar relationship with a restaurant close to home. Of course the usual delay was going on, so I decided to take a second glance at the menu while we waited.
I had a pinned ChatGPT session where I logged my daily meals, and workouts if any. It was basic. It didn't do anything insane. I told it what I had for breakfast, and it responded with whether I was below or over my daily goal.
So I took a picture of about 4 pages of the restaurant's menu, fed it to this dedicated chat session, and it did its job: "Have the X with Y, and maybe Z to drink."
And that was when the idea of waiter.now struck me.
Here's how it evolved.
What if everyone here had the same dedicated chat session I did?
then
What if this restaurant had its menu in a chat session like this?
then
What if every restaurant had this? Then no one who wasn't inclined to had to speak to a waiter for recommendations.
If we consult AI about our careers and have it write code that we ship to real users, then it must be qualified to suggest what we could have at any given restaurant, given the fact that it has full access to a live and up-to-date menu.
Anyways, soon enough I realised menus were never the issue. Not even AI-powered ones.
Regardless, waiter.now was born.
Next.js has been a working comfort zone for me. So I got to work that night.
And I had fun.
This wasn't a typical idea. This could be argued, but UX-wise and logic-wise, there still isn't anything like waiter.now in the restaurant SaaS market.
I designed the first logo (text-based). I designed the onboarding flow for restaurant owners on Figma and implemented it.
Then the RAG system. I decided to use Firestore as the source of truth for menus; embedding was wired with OpenAI's text-embedding-3-small, and the 1536-dim vector gets upserted into Supabase pgvector. At query time, the guest's message gets embedded the same way, and retrieval runs through a match_meals RPC doing similarity search over that restaurant's vectors.
It was graceful at this point.
But I wasn't done.
The model. For generation I went with Gemini 2.5 Flash. Easy, simple, fast, cheap. The guardrailing was prompt engineering: a system prompt that boxes it in as a waiter, so it only recommends dishes that actually exist in the retrieved context. And it wouldn't be of use if you asked off-questions like "what is the time?"
It worked, and it worked graciously. Everyone I showed it to (mostly engineers and co-mates in the love-hate relationship with restaurants) loved the idea. They all said it was something they'd use.
But that was the problem. They weren't the shot-callers at the restaurants they visited.
None of us were. So even if the idea of chatting with an AI-powered menu sounded interesting, even if I had implemented state-of-the-art indexing, it simply wouldn't come to life if owners didn't load their menus to start with.
So I decided to speak to owners. And the response was identical. Menus were only 10% of their problems.
A practical inventory system.
Getting fresh meals to customers in little to no time.
Book-keeping.
Tracking sales.
Terminating theft.
Staff management.
And these were real problems.
The truth is, as software engineers we pick up some ego over time in this career.
We start to feel software can solve almost every problem in real life.
Well, it can. Almost can.
But there are problems it can't.
And those problems, if properly related, could dwarf everything it can.
So what if you had an AI-powered menu, but your inventory was at a loss, your staff couldn't manage orders in rush periods, and your sales records were terrible? What then? Ask AI? Well, the AI could only recommend meals. So there you go!
I learned slowly, but I learned: software was the easy part.
I was fortunate to have an owner give me his time, mostly at midnight (not even kidding), and we would spend hours in his VIP lounge discussing what waiter.now could do for him.
And that was the switch.
I stopped pitching my damn AI-powered menu system and decided to let him and the business speak. To see what troubles I could fix. And what limits software had.
To stop romanticizing a month-old idea.
To allow for practical evolution.
And the beauty began to form. And to form naturally.
We realised we could build an inventory system. A staff management system. A customer-facing, always-up-to-date menu. And tie all of this together. All of it.
Waiter.now has a waiter's portal where orders are taken from customers, and the menu on this portal is powered by the inventory that gets updated when a sale is made or stock is replenished. The customer-facing menu is fed by this same live inventory on the backend, so it doesn't just show the meals the restaurant offers, but the meals they actually have in store. Never a case of ordering and getting told "out of stock" some minutes later.
The AI-powered menu only comes in at the end of the story. In fact, I dare you: visit this demo menu: waiter.now/r/demo and see just how hard it is to locate the "chat". This is by design.
Waiter.now found a way to outgrow and evolve beyond my ideas when i stopped having too much fun.
I find myself coming up with ideas these days. Random ideas. Why?
Out of hunger? The low effort-cost of software development? Sheer love of the game?
I can't say exactly, but I'll tell you this:
I have learned that when it seems to be too much fun building, then maybe I am building for me, and not for general consumption.
And there is nothing wrong with this.
I am in the last legs of my 20s, so I still have many years to do this.
My head will be in the clouds and my hands in the dirt.
See you on the field.