Restaurant platform
Tam Cuisine
A full-stack restaurant platform for an Ibadan restaurant: reservations with real availability, catering requests, online ordering and an admin dashboard.
Code-complete and building cleanly; awaiting payment keys, business details and a production deployment.
- Period
- Aug 2026
- Status
- In Development
- Role
- Full-stack engineering, Product design
- Built with
- Next.js 16, TypeScript
The problem
Why this needed to exist
A busy local restaurant takes bookings, catering enquiries and orders by phone and chat. Nothing is in one place, and nobody can see availability without asking.
Who it’s for
- Diners booking tables or ordering
- Clients requesting catering
- Restaurant staff and administrators
The solution
How it works
One platform with three roles — customer, staff and admin. Customers book against real availability, order from the menu and receive invoices; staff and admins manage reservations, catering and orders from a dashboard.
Implemented
What’s actually built
Reservations with an availability engine
Bookings are checked against seating and duration rules and land in the database in real time.
Menu to checkout
Cart, Paystack checkout (initialise → redirect → verify), invoice PDF and email confirmation, with idempotent order finalisation shared between the webhook and the confirmation page.
Catering requests
A dedicated request flow for events.
Role-gated admin
Customer, staff and admin roles enforced with row-level security in Postgres.
My role
What I did
Full implementation: schema, RLS policies, storage, payment flow, reservation logic, customer account and admin dashboard.
Responsibilities
- Full-stack engineering
- Product design
- Database & auth
Stack (verified from source)
- Next.js 16
- TypeScript
- Supabase (Postgres, Auth, Storage, RLS)
- Paystack
- Resend
Decisions
Technical and design choices
- 01
Paystack over Stripe
Stripe does not settle naira for Nigerian merchants, so the payment layer was switched to Paystack.
- 02
Finalise orders idempotently
The same fulfilment function runs from the webhook and from the confirmation page, so local development completes orders without a public webhook URL and production never double-fulfils.
Lessons
What I took away
- Local payment rails shape architecture as much as any framework choice.
What’s next
Planned — not built
Planned work
- Production deployment with live payment keys
- Real business hours, seating and contact details
- Replacing placeholder review text with real reviews
Current limits, stated plainly
- Some business details and testimonials are placeholders until supplied by the restaurant.