← All projects

Case · Web app

Bad Club: seat booking for a gaming coworking space

A demo app on Vue 3, Express and SQLite: an interactive hall map with seat booking, a user account and an admin panel with a layout editor. Passwordless sign-in via a one-time e-mail code.

  • Vue 3
  • Vite
  • Pinia
  • Vue Router
  • GSAP
  • Express
  • node:sqlite
  • JWT (httpOnly cookie)
  • Resend

01 · How it looks

Screenshots

Screenshot of the project "Bad Club: seat booking for a gaming coworking space" at 1280 pixels wide
Desktop, 1280 px
Screenshot of the project "Bad Club: seat booking for a gaming coworking space" on a phone screen, 390 pixels wide
Phone, 390 px

02 · About

What it is and why

A demo app on Vue 3, Express and SQLite: an interactive hall map with seat booking, a user account and an admin panel with a layout editor. Passwordless sign-in via a one-time e-mail code.

Limitations

A demo project that is not deployed anywhere; no production or real customers.

Screenshots were taken on a fresh database with seed data; busy seats on the map come from the seed, not real bookings.

Without a mail service key the sign-in code is printed to the server console.

The project has no automated tests.

What is inside

  • Hall map with zones (standard, quiet, VIP, dual-monitor), a type filter and seat status
  • Admin panel: overview, bookings, seats, computers, users and a drag-and-drop layout editor
  • OTP sign-in with attempt and rate limits; the admin role is bootstrapped via an env variable
  • Demo data is created by a seed script on first start

03 · How to run

Run it locally

npm install && npm run dev
# backend :3001, frontend :5173; production: npm run build, then NODE_ENV=production npm start (JWT_SECRET and ADMIN_EMAILS in backend/.env)

04 · Code

The repository is private

The source lives in a private repository. I will grant access on request: write to me and I will send an invitation.

Request the code