All projects

02 / FULL-STACK PROJECT

CineBook.

One seat. One winning request.

A movie and event booking experience with temporary seat holds, fair waitlists, live inventory, and recovery when things go wrong.

CineBook dark movie discovery interface
CineBook dark movie discovery interface

01 / THE CONTEXT

The problem worth solving.

A seat grid is straightforward until customers compete for one seat, abandon checkout, or accept a waitlist offer at the same moment.

The approach

Model inventory per show, enforce ownership and expiry at the database boundary, and connect the interface to live invalidation and recoverable background work.

02 / UNDER THE HOOD

How the pieces connect.

01React + TypeScript customer and operations UI
02Node API and shared validation
03PostgreSQL authoritative inventory
04SSE + optional Redis invalidation
05Durable expiry and notification jobs

03 / ENGINEERING JUDGMENT

The decisions behind the build.

01

Make the database authoritative

Atomic state conditions validate the seat, hold owner and expiry before confirmation. UI state is not the booking lock.

02

Recover abandoned work

Expiry is enforced during reads and by a background worker, with durable jobs for interrupted processing.

03

Keep the queue fair

A cancellation can become a single-use offer to the next eligible queue member instead of a free-for-all.

04 / WHAT TO INSPECT

Evidence, and its boundaries.

  • Customer, organiser and administrator workflows
  • Committed screenshots across light and dark themes
  • Documented concurrency and recovery behavior

The demo uses sample events and no real payment gateway. Its documented deployment does not currently send external email. SQLite is available for local/test use.

Inspect the repository

05 / THE TAKEAWAY

What I’m taking forward.

The happy path is only one part of a booking system. Ownership, expiry, cancellation and retries deserve the same design attention.

KEEP EXPLORING

Smart Helmet