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
- Sign in with your username and PIN.
- Pick a filter: All, Name, Mobile or Table.
- Type in the search box. Results appear as you type.
- Tap a guest. Their card opens.
- 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/stateevery 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