A web app for collecting dish-level feedback in restaurants. Instead of one overall rating for a venue, guests rate each individual item they ordered — turning vague "it was fine" reviews into granular, product-specific data.
Guests scan a QR code at their table, rate every dish on one screen, and unlock tiered rewards. No app download, no login required.
Google and review platforms tell you the best restaurant, not the best dish and why. This app captures which specific items land well or poorly, giving venues data they can actually act on and building a foundation for public "best dish in the city" rankings.
npm install
npm run devRuns at http://localhost:5173
npm run build # outputs to /dist
npm run preview # preview the build locallyThe contents of dist/ deploy to any static host (Netlify, Vercel, etc.).
The app reads the table number from the URL:
your-domain.com/t/7→ table 7- for local testing:
localhost:5173/#t=7
Note: the
/t/7form needs SPA redirect config on your host (e.g. a_redirectsfile for Netlify with/* /index.html 200). The#t=7form works everywhere without extra setup.
- Rating screen — all ordered dishes on one screen, 5 stars each, "verified from order" badge
- Success screen — points, tiered rewards, swipe-to-redeem, city-explorer progress, account CTA
stars × 5 per dish.
src/
main.tsx Entry point
app/
App.tsx State + flow (the core)
TableRatingScreen.tsx Rating screen (all dishes on one screen)
SuccessScreen.tsx Success screen + rewards
types.ts
components/
StarRating.tsx
SwipeToRedeem.tsx
ImageWithFallback.tsx
styles/index.css
Vite · React 18 · TypeScript · Tailwind CSS 4 · motion · lucide-react
- Persist ratings to a backend (see the
// later:comment inApp.tsx) - Load dishes automatically from the order / POS instead of the hardcoded list
- Account / login flow behind the "create account" button
The sample data (dish names, rewards) is placeholder — swap it for real venue data.