hospitality saas / solo build · live
updated
Reservation management app for a restaurant-tech provider.
A restaurant-tech provider needed an app for the people who run service: reservations, tables, walk-ins. I built it alone in five months, from the first screen to the release in the App Store and on Google Play. Today more than 100 restaurants use it.
- Role
- Sole developer
- Duration
- 5 months to launch
- Platforms
- iOS and Android, phone and tablet
- Stack
- Flutter, Riverpod, existing Node.js backend, WebSockets
- restaurants use the app
- 100+
- months from the first screen to both stores
- 5
- automated tests
- ~1,200
- languages
- 6
- 01 Drag & drop Someone drops a reservation on a table or moves it on the timeline. The app updates at once, with Undo.
- 02 Existing Node.js backend The change goes to the backend the provider already runs.
- 03 WebSocket The backend pushes the update to every connected device.
- 04 Every device Floor plan, timeline and board update everywhere. After a dropped connection, the app reconnects and re-fetches the day.
The brief
During service, restaurant staff need to see at a glance which tables are free, who arrives next and who is still waiting. The provider already ran a Node.js backend with the reservation data. What was missing was an app for the people on the floor.
The floor plan
The app is built around the floor plan: every room of the restaurant with its tables where they really stand, round or rectangular, one chair per seat. The color of a table shows the status of its reservation, and the colored chairs show how many guests sit there. A badge counts how long they have been seated and turns red once the stay runs over. A free table shows when its next booking arrives.
Reservations without a table wait in a list next to the plan. Staff press and hold a card and drag it onto a table. While they drag, the tables that are free for the whole booking and big enough for the party light up. If a table is too small or already booked, the app asks before assigning it anyway. On an occupied table it offers to swap the two parties or to seat both there. Guests move from table to table the same way, and a long press before dragging adds a second table for a larger party.
A time slider along the bottom looks ahead: set it to 20:00 and the plan shows the room as it will be then, so staff can prepare the evening in the morning. Tapping a reservation jumps to its arrival time. On phones the plan fills the screen and the list sits in a panel below it.
Two more views of the same evening
- Timeline: the evening as a Gantt chart, tables down the side, time across, with a live “now” line. Drag a booking to another table or time, or double-tap an empty slot to add one.
- Kanban board: every reservation is a card in one of four columns: waitlist, expected, seated, closed. Dragging a card sets its status.
Everything else a service needs
Walk-ins and a waitlist. A booking wizard with availability check and recurring bookings. A guest book with notes, dietary needs and a no-show warning. Approval of online requests, a calendar with daily figures, and a shift briefing as a PDF. Every change can be undone, and staff codes record who made it. The app speaks six languages, comes in light and dark themes, and has its own layouts for phones and tablets.
Keeping every device in sync
In a restaurant, several people work with the same reservations at the same time. If one device shows an old state, two parties can end up at the same table. So a change shows up at once on the device that made it, goes to the backend, and the backend pushes it over WebSockets to every other device. If the connection drops, the app reconnects on its own and re-fetches the day, so no update gets lost.
Works when the Wi-Fi doesn’t
The app keeps a local cache per restaurant and queues changes made offline. Once the connection is back, the queue goes out with retries, and every change carries an ID, so no booking is created twice.
Result
Five months after the first screen, the app was live in both stores. More than 100 restaurants use it today. About 1,200 automated tests run on every pull request, and releases go to TestFlight and Google Play through a Fastlane pipeline. No new backend was needed: the app works with the one the provider already runs.
For the same provider I also built a white-label app generator and a WhatsApp AI assistant.
- Flutter
- Riverpod
- iOS
- Android
- WebSockets
- Offline-first
- Solo