← Back to projects

CurbKey Notes

Ticketless valet flow with real-time guest updates, valet status tracking, and a manager scheduler for timed requests.

Flask Next.js Postgres Supabase SSE Vercel Render

Problem

Paper tickets, hardware, and manual coordination. Guests don't know when to head to the exit; valets get overloaded. For pop-up valet setups, existing systems are too heavy and expensive.

What I Built

Shareable guest links (QR or SMS) so guests can request a car now or schedule for a time. Valets use a simple console to update status. Managers seed data, create tickets, run the scheduler, and send notifications. Full flow runs locally or deployed.

Architecture

Stack and flow: Next.js (Vercel), Flask API (Render), Postgres (Supabase/Neon), SQLAlchemy + Alembic, JWT for valet/manager auth.

  • Frontend: Next.js, server components, API routes
  • Backend: Flask, SQLAlchemy models, SSE (EventSource) for live guest status
  • DB: Postgres, migrations via Alembic
  • Auth: JWT for valet/manager consoles
  • Deploy: Vercel (frontend), Render/Fly/Railway (API), env-driven config

Results

Stack

Flask, Next.js, Postgres

Real-time

SSE, live guest updates

Scheduling

Timed pickup

Demo runs locally; full lifecycle from ticket creation to guest request, valet status updates, and completion. Scheduler supports timed requests via manager ticks.

Request Queue (Live)

Valet request queue
Queue with timestamps, exit selection, status transitions.
Manager console view
Seed data, create tickets, scheduler ticks, notifications.
Guest request screen
Request now or schedule pickup.
Guest pickup screen
Live status and pickup.

Key Insights

Why ticketless

Link is the ticket. No printers, paper, or scanners. Less setup for pop-up valet; guests get one place to check status.

Scheduling

Request in X minutes lines up retrieval with walk time. Less curb congestion and more even valet load.