Try it
- Live app: https://getlineless.vercel.app
- Join the line (guest): https://getlineless.vercel.app/r/demo/join
- Host dashboard: https://getlineless.vercel.app/host/demo (PIN 713206)
- Staff screen: https://getlineless.vercel.app/staff/demo (PIN 482915)
- Owner insights: https://getlineless.vercel.app/insights/demo (PIN 359148)
Inspiration
Nearly 1 in 3 U.S. diners say they've walked out of a restaurant because of the wait, and 27% say a long wait would stop them from coming back (Lightspeed survey of 1,000 U.S. consumers, Aug 2025). Busy local restaurants still run their waitlists on paper: hosts guess wait times, guests crowd the door, and owners never learn how much money walked out.
What it does
LineLess is a no-download waitlist that connects guests, hosts, staff and owners in one live system:
- Guests scan a QR code, join from their own phone, and see their live place in line with an honest wait range. They can pre-order drinks and starters, and get a full-screen "Your table is ready — Table 5" alert with a live food countdown.
- Staff (bussers) mark tables "guests left" and "clean" from their phone.
- Walk-ins without a phone: the host adds them in seconds, and they join the same line.
- Hosts see every table's status and get a best-fit suggestion for each freed table (the party that leaves the fewest empty seats), can override any suggestion, then notify and seat with one tap.
- Owners see walkaways, lost revenue in dollars, average wait by hour, busiest times, pre-order revenue and how accurate the wait estimates were.
- Role-based PINs keep each screen to the people who need it (staff, host, owner), enforced on the server.
How I built it
Next.js 16 (App Router, TypeScript) with Tailwind CSS and shadcn/ui, deployed on Vercel. Shared live state lives in Upstash Redis, so every phone and screen sees the same line; screens refresh every 2 seconds. The wait estimate multiplies a party's place in line by how fast tables have actually turned tonight and a party-size factor. Writes use compare-and-set so simultaneous actions can't overwrite each other. 200 automated tests (Vitest) cover the estimate math, table logic, food timing, insights and every route × role. I designed the architecture and product as a solo builder; the code was written with AI pair programming (Claude Code), with every phase tested and code-reviewed before shipping.
Challenges I ran into
- Keeping many phones in sync without race conditions (e.g. a pre-order arriving at the same moment as "table ready").
- Making the wait estimate honest and explainable instead of a guess.
- Designing table suggestions that don't waste big tables on small parties.
- Making the demo survive bad Wi-Fi (reconnect handling, timeouts).
Accomplishments that I'm proud of
A full working product in four days: live across devices, 200 passing tests, a real-time demo judges can join from their own phones, and an owner dashboard that turns waiting into a dollar figure.
What I learned
How to scope a product around one demo flow, how real-time shared state works, and that the business case (lost revenue) matters as much as the code.
What's next for LineLess
Pilot with three Fremont restaurants, optional "table ready" text alerts, sending pre-orders straight to the kitchen's POS, and multi-location dashboards for owners.
Built With
- claude
- next.js
- react
- redis
- tailwindcss
- typescript
- upstash
- vercel
- vitest
Log in or sign up for Devpost to join the conversation.