How Guest Check-In works

A simple way to check guests in at an event. Search a name, or scan a QR code. Tap to check in.

For staff

Check someone in

  1. Sign in with your username and PIN.
  2. Pick a filter: All, Name, Mobile or Table.
  3. Type in the search box. Results appear as you type.
  4. Tap a guest. Their card opens.
  5. Tap Check in, then confirm.

Parties and plus-ones

A guest can bring plus-ones. Each person is checked in on their own. Plus-ones show as “Guest 1”, “Guest 2” and so on. Use Check in all to do the whole party at once.

Scan a QR code

Tap Scan QR code and point the camera at the ticket. Only that person shows up. A code that was already used shows “Already checked in”. Your admin can make scans check people in straight away.

Made a mistake?

If your admin allows it, tap Undo on the person. Otherwise ask an admin.

For admins

  • Dashboard. See how many people are in, by table.
  • Guests. Add, edit or import guests. Use the Import button for spreadsheets (CSV or Excel).
  • Staff. Create accounts, reset PINs, disable people.
  • Activity. A log of every check-in and change.
  • Event. Create an event, archive it, export a CSV, or delete it for good.
  • Settings. Turn features on or off. Each switch applies straight away.

Settings you can change

  • QR codes and scanning: on or off.
  • Check-in method: search or scan, or scan only.
  • After a scan: show the guest, or check in automatically.
  • “Are you sure?” step before a manual check-in.
  • Who can undo a check-in: admins only, or anyone.
  • Email tickets: send each guest their QR code.

Importing guests

Upload a spreadsheet. The app previews the changes first. Guests are matched on name and mobile number. Choose to update, replace or cancel.

For developers

Stack

  • SvelteKit 2 and Svelte 5, with the Node adapter.
  • SQLite through better-sqlite3, in WAL mode.
  • No external services. One container, one file for data.

Run it

npm install
npm run build
ORIGIN=https://your.domain DATA_DIR=/data node ./build/index.js

ORIGIN must match the address people use. DATA_DIR holds the database. Mount it as a volume.

How it works

  • The browser polls /api/state every 3 seconds. The server only sends data when something changed.
  • Every change bumps a revision number. That is what clients compare.
  • A check-in is one atomic update. Two staff cannot check in the same person twice.
  • Sessions are random tokens. Only a hash is stored. PINs are hashed with bcrypt.
  • Admin pages are guarded in hooks.server.ts.
  • Each person has a private QR token. The ticket page at /t/<token> shows only that person.

Project layout

  • src/lib/server/: database, auth, guests, settings, import, email.
  • src/routes/: pages and the JSON API.
  • src/lib/: shared components and the live-state store.

Source: github.com/farhanmunim/guest