Skip to content
codexa

Web apps · React

Restaurant reservations

Take bookings by date and time, track covers for the night, and mark no-shows.

Restaurant reservations starter, as built from its own files
Starter screenshot captured from this template's own build at 1440×900. It shows the template as it ships, not output generated from a prompt.

What you get

A reservations book for an independent restaurant: each booking with date, time, party size and notes, moved from requested to seated on a board, with confirmed covers totalled at the top. The bookings and statuses live in src/app.ts.

Files

Exactly what is copied into a new project: 12 files, nothing generated.

Raw data: GET /api/v1/templates/app-restaurant-reservations

src/app.ts
src/app.ts
import type { AppSpec } from "./types"; /** Everything this app shows. Edit freely. */export const app: AppSpec = {  "brand": "Osteria Lume",  "icon": "cup",  "storageKey": "osteria-lume-bookings-v1",  "entity": {    "singular": "Booking",    "plural": "Bookings"  },  "title": "Reservations",  "subtitle": "Dinner service, Tuesday to Saturday, 17:30 to 22:00",  "titleKey": "guest",  "statusKey": "status",  "tones": {    "Requested": "neutral",    "Confirmed": "accent",    "Seated": "good",    "No-show": "bad",    "Cancelled": "warn"  },  "views": [    "table",    "board"  ],  "fields": [    {      "key": "guest",      "label": "Guest",      "type": "text",      "required": true    },    {      "key": "phone",      "label": "Phone",      "type": "text"    },    {      "key": "date",      "label": "Date",      "type": "date"    },    {      "key": "time",      "label": "Time",      "type": "select",      "options": [        "17:30",        "18:00",        "18:30",        "19:00",        "19:30",        "20:00",        "20:30",        "21:00"      ]    },    {      "key": "covers",      "label": "Covers",      "type": "number"    },    {      "key": "status",      "label": "Status",      "type": "select",      "options": [        "Requested",        "Confirmed",        "Seated",        "No-show",        "Cancelled"      ]    },    {      "key": "notes",      "label": "Notes",      "type": "longtext",      "hideInTable": true    }  ],  "summary": [    {      "label": "Bookings",      "kind": "count"    },    {      "label": "Confirmed covers",      "kind": "sum",      "field": "covers",      "status": "Confirmed"    },    {      "label": "Seated",      "kind": "count",      "status": "Seated"    },    {      "label": "No-shows",      "kind": "count",      "status": "No-show"    }  ],  "seed": [    {      "guest": "Giulia Romano",      "phone": "(415) 555-0142",      "date": "2026-10-30",      "time": "19:30",      "covers": 4,      "status": "Confirmed",      "notes": "Anniversary. Window table if possible."    },    {      "guest": "Mark Henderson",      "phone": "(415) 555-0187",      "date": "2026-10-30",      "time": "18:00",      "covers": 2,      "status": "Confirmed",      "notes": ""    },    {      "guest": "Leila Haddad",      "phone": "(415) 555-0119",      "date": "2026-10-31",      "time": "20:00",      "covers": 6,      "status": "Requested",      "notes": "One guest is coeliac."    },    {      "guest": "Peter Lund",      "phone": "(415) 555-0163",      "date": "2026-10-28",      "time": "19:00",      "covers": 3,      "status": "Seated",      "notes": ""    },    {      "guest": "Hiro Sato",      "phone": "(415) 555-0108",      "date": "2026-10-28",      "time": "20:30",      "covers": 2,      "status": "Seated",      "notes": "Regular, likes the Barolo."    },    {      "guest": "Dana Whitfield",      "phone": "(415) 555-0174",      "date": "2026-10-25",      "time": "18:30",      "covers": 5,      "status": "No-show",      "notes": "Called twice, no answer."    },    {      "guest": "Francesca Bell",      "phone": "(415) 555-0135",      "date": "2026-10-31",      "time": "17:30",      "covers": 2,      "status": "Confirmed",      "notes": "High chair needed."    },    {      "guest": "Omar Siddiqui",      "phone": "(415) 555-0191",      "date": "2026-11-01",      "time": "21:00",      "covers": 8,      "status": "Cancelled",      "notes": "Moved to a private event next month."    }  ]};

Remix

Remix this template

Describe what to change and the agent starts from Restaurant reservations's files. The box is already started for you: finish “Start from Restaurant reservations and …”

Agent ready

Creates a free account first; your idea is carried over.

Dependencies

Documented from the template's package.json. The runtime has a prebuilt dependency set for Vite + React + TypeScript, so installs are fast.

  • react^19.1.0
  • react-dom^19.1.0
  • vite^6.3.0
  • @vitejs/plugin-react^4.4.0
  • tailwindcss^4.1.0
  • @tailwindcss/vite^4.1.0
  • typescript^5.8.0

How it runs

Framework
Vite + React + TypeScript
Dev command
npm run dev
Build command
npm run build
Output directory
dist
Port
5173
Entry route
/

Projects run in an isolated sandbox with a live preview. Read the projects documentation for settings, snapshots and deployment.

All templates

Build on Restaurant reservations

Create a free account, start from this template, and ask the AI agent to turn it into your app.