Guild Kiosk — Self-Serve Check-in

Concept

A self-serve kiosk at the shop entrance where members check in by tapping their physical guild membership card (NFC) or entering their phone number. The kiosk runs on a Raspberry Pi 4 with a touchscreen monitor, always on, always welcoming.

The Experience

  1. Member walks into Dungeon Books
  2. Taps their guild card on the NFC reader — or types their phone number on the touchscreen
  3. Wizard animation plays on screen
  4. Screen shows: “Welcome back, [name]! Silver Adventurer — 1,500 pts ($15.00)”
  5. Check-in logged, visit tracked
  6. After a few seconds, screen returns to idle state

Idle State

When no one is checking in, the kiosk displays:

  • Guild branding / animated wizard idle loop
  • “Tap your guild card or enter your phone number”
  • Current shop info (hours, upcoming event, etc.)

Check-in State

After a successful check-in:

  • Wizard animation (celebration/welcome)
  • Member name, tier badge, points balance with dollar value
  • “See you at [next event name]!” if there’s an upcoming event
  • Returns to idle after ~5 seconds

Not Found State

If the identifier isn’t recognized:

  • Friendly message: “Not a member yet? Ask a Guildmaster!”
  • Returns to idle after ~5 seconds

Duplicate Check-in

If they already checked in within the last 4 hours:

  • Still shows the welcome screen (they should feel recognized)
  • No new check-in record created (deduplication)

Hardware

ComponentModelStatusPurpose
ComputerRaspberry Pi 4 (existing)HaveRuns the kiosk app
DisplayTouchscreen monitor (existing)HaveShows UI, phone number keypad
NFC readerACS WalletMate II (ACR1552U-MW)PurchasedReads NFC cards + Apple/Google Wallet passes
NFC cardsNTAG215 PVC cardsTo orderPhysical guild membership cards
Prototyping readerFlipper ZeroHaveTesting NFC reads before WalletMate arrives

NFC Reader — ACS WalletMate II

  • Apple VAS & Google Smart Tap certified (ECP 1.0 & 2.0)
  • ISO 14443 A&B, ISO 15693, ISO 18092, MIFARE (all variants), DESFire, FeliCa, Picopass, Topaz
  • Reader/Writer, Keyboard Emulation, Card Emulation modes
  • USB Type-A, CCID & PC/SC compliant (plug-and-play on Linux)
  • Read distance up to 70mm, read/write speed up to 848 kbps
  • Private key (LTPK) stored in secure element for wallet pass auth
  • Chosen over ACR1252U because it’s a superset — reads plain NFC UIDs for v1, adds Apple/Google Wallet pass support for v2 without hardware swap

NFC Cards

  • NTAG215, ISO 14443A, 13.56 MHz
  • Each card has a unique factory UID — we read the UID, not write data to the card
  • UID is stored on the Payload member record (nfcCardUid field)
  • 504 bytes storage (unused — identification is UID-based)
  • Card personalization approach: matte black PVC cards, hand-lettered with gold Posca paint markers, sealed with UV resin coat — each card is a hand-crafted guild artifact
  • Staff reads the card UID (via Flipper Zero or WalletMate) and associates it with the member in Payload at signup

Tech Stack (Kiosk App)

  • Frontend: React (or plain HTML/JS for simplicity) running in Chromium kiosk mode
  • Animation: Lottie or Rive for the wizard animations
  • NFC: Web NFC API (Chrome on Pi supports it) or a node-nfc daemon that pushes events to the web app via WebSocket
  • API: Calls POST /api/check-in on the Guild server (same network or via Tailscale)
  • Auth: Kiosk authenticates as a dedicated Payload staff user

API

POST /api/check-in — already built in Guild.

// Request
{ "method": "nfc" | "phone", "identifier": "...", "shopId": 1 }
 
// Response (success)
{
  "ok": true,
  "member": { "name": "...", "tier": "Silver", "loyaltyPoints": 1500, "dollarValue": 15.00 },
  "checkIn": { "id": 42, "duplicate": false }
}
 
// Response (not found)
{ "ok": false, "error": "member_not_found" }

Deduplication

4-hour window. If a member checks in twice within 4 hours, the second tap still shows the welcome screen but doesn’t create a new record. This prevents accidental double-taps and in-and-out-and-back scenarios.

Future Enhancements

  • Check-in bonus points (~5 pts per visit, scaled by tier multiplier)
  • Apple/Google Wallet pass — WalletMate II already supports this; needs pass provisioning pipeline (Apple Developer PassKit entitlement + Google Smart Tap 2.0 integration)
  • Event mode — during events, kiosk doubles as event check-in (logs to both CheckIns and event attendance)
  • Leaderboard display — show top check-in streaks, Guild Seasons team scores
  • Sound effects — satisfying tap/chime sound on successful check-in