My Favorite Diner
A diner website whose staff run the whole thing themselves — menu, prices, photographs, bookings and mailshots — without anyone touching code.
Website + Online Booking + Admin Panel
Overview
My Favorite Diner is an American bar and grill on Thappraya Road in Jomtien, Pattaya. The site is the restaurant's shopfront and its back office at once: a menu-led marketing website with a gallery, guest reviews and online table booking on the front, and a private admin panel behind it where the team edits all of it. A menu of 108 dishes across 12 sections, every price in baht, every photograph — all of it is editable from a phone by someone who has never seen a line of code.
- Sector
- Restaurant
- Client
- My Favorite Diner Bar and Grill
- Location
- Jomtien Complex, Pattaya, Thailand
- Year
- 2025
- Scope
- Website + Online Booking + Admin Panel
Visit the live site
The problem
A restaurant menu is never finished. Prices move, dishes come off, a new burger goes on for the season, and the photograph the kitchen took last night is better than the one on the site. If every one of those edits has to go through a developer, the menu online drifts away from the menu on the table within a month — and the bookings that arrive by phone and Facebook message while the floor is busy quietly get lost.
The challenge
The panel had to be genuinely usable by busy floor staff on a phone, mid-service, or it would be abandoned and the site would go stale. Bookings had to reach the team through the channel they actually read — in Thailand that is LINE, not email. Guest data is personal data under Thailand's PDPA, so retention could not be an afterthought. And the site had to stay standing when a dependency did not: no restaurant should have a blank menu because a database is having a bad morning.
What we built
A Next.js site on Vercel with Supabase behind it, built so that the database is the menu — and so that nothing breaks when it isn't. Bookings write straight to Postgres, alert the staff LINE group within seconds, email the guest a confirmation with a private cancel link, and appear in a panel where they move from New to Confirmed to Done. Every piece of content on the public site has an editor behind it, and the whole thing degrades gracefully: with Supabase disconnected the site still serves a complete written-in menu rather than an error.
The system
Key features
What it actually does.
The menu is the database
12 sections, 108 dishes, prices in baht, badges, per-section small print and around 110 dish photographs — all editable from the panel. Sections and dishes reorder with arrows rather than a number box, and a dish can be hidden with one press of the eye without losing it.
Bookings that actually reach someone
A request lands in the staff LINE group within seconds of being submitted, with the guest's name, party size, phone and notes, and a button straight to the panel. Email is the backup, not the primary. An alert never blocks the booking — the guest is told their table is requested the moment it saves.
Capacity and closed days, enforced server-side
The diner sets how many tables it accepts per day and which days it is closed. Those dates are struck through on the calendar, and the server refuses them anyway — so a guest with yesterday's page still open cannot slip past a setting that changed this morning.
Guests cancel themselves
Every confirmation carries a private cancel link. No account, no login, no phone call. The table is freed automatically and the restaurant is told, which is the difference between a no-show and a table that can be sold again.
Nothing a stranger writes goes live unapproved
Guest reviews land in a pending queue, notify the LINE group, and reach the homepage only when a human approves them. Submissions are rate-limited per address, and anything containing a web link is rejected outright — a link in a restaurant review is almost always advertising.
Mailshots that survive a double-click
Upload a poster, preview it exactly as subscribers will see it, send a test, then send to the list. A second click or a second tab is turned away rather than starting a second send, and every delivered address is recorded as it goes — so a batch that fails halfway can be finished without mailing anyone twice.
It tells you when it is broken
A monitor checks the database, the booking table, email configuration, whether a new booking would actually reach anybody, and how much of the LINE monthly allowance is left. Problems appear in plain English on the panel's home page, and /api/health returns 503 so an uptime monitor can watch it too.
Personal data does not pile up
Guest names, phone numbers and notes are personal data under Thailand's PDPA. A nightly job deletes bookings older than twelve months, forgets people who unsubscribed over a year ago, and trims the activity log — so retention is a property of the system rather than a policy nobody performs.
Built to be found
Restaurant and menu structured data covering every dish and price with THB offers, breadcrumbs, a sitemap, robots.txt and a branded share image. The phone number and address Google sees come from the panel's settings, so they stay in step automatically.
Fails soft, everywhere
With Supabase disconnected the site serves a complete written-in menu instead of an error. Without email configured, sending is skipped and logged rather than crashing a booking. The guest-facing path is designed to survive every dependency it has.
Screenshots
Desktop and mobile.
Captured from the running site at 1440px and 390px — the mobile set is the layout a phone genuinely gets, not a scaled-down desktop.






The result
What changes.
What the system changed about the way the business runs. These are described outcomes, not measured statistics.
Technology used
Want something like this for your business?
Tell us what is taking up your time. We will tell you honestly whether a system would help.
Start a Project
