The mobile companion app for Attend, Hack Club's event attendance platform. Organizers use it to check participants in at the door; participants use it to carry their tickets.
Built with Expo / React Native, with native Swift modules for Live Activities and Apple Wallet.
For organizers:
- QR check-in — scan participant QR codes (
attend:P:{uuid}) for instant check-in - NFC badges — write and scan NFC badges for tap-to-check-in
- Offline-first — scans queue locally when offline and sync automatically when connectivity returns
- Participant search & filtering — Airtable-style filtering across the participant list, with medical alerts (anaphylaxis risk, high support needs) surfaced prominently
- Emergency contacts — tap-to-call from a participant's detail view
- Airport mode — live view of participants in transit: flight legs, arrival status, and unaccompanied-minor pickup tracking
- Kiosk mode — PIN-locked self-serve check-in station for a spare iPad at the door
- Biometric lock — Face ID / Touch ID gate on sensitive participant information
For participants:
- My tickets — view event tickets with QR codes
- Apple Wallet — add tickets as Wallet passes
- Live Activities — event-day status on the Lock Screen and Dynamic Island
- Push notifications — event updates from organizers
- Node.js 18+
- Xcode (for iOS) or Android Studio (for Android)
- An Attend account
Note
The app uses native modules (NFC, Live Activities, Wallet), so it will not run in Expo Go — you need a development build.
npm installCreate a .env.local with your backend and OAuth config:
EXPO_PUBLIC_API_URL=http://localhost:3000
EXPO_PUBLIC_OAUTH_CLIENT_ID=your-oauth-client-idThen build and run a development client:
# iOS
npx expo run:ios
# Android
npx expo run:androidnpm test # jest
npm run lint # eslint
npm run typecheck # tsc --noEmitsrc/
screens/ one file per screen (scanner, kiosk, airport mode, tickets, ...)
services/ api client, auth, offline sync, NFC, notifications, storage
hooks/ useScanner, useParticipants, useNFC, useAuth, ...
components/ shared UI
modules/
activity-controller/ native Swift module for starting/updating Live Activities
wallet/ native Swift module for adding Apple Wallet passes
targets/
widget/ WidgetKit extension rendering the Live Activity
The backend is a Rails app that serves the API this app talks to, handles OAuth, and issues Wallet passes.
Builds and submissions go through EAS — see eas.json for the profiles. JS-only changes ship over the air:
bin/ota "what changed"The bin/ota script temporarily stashes local .env files so development values never leak into a production bundle.
Contributions are welcome! If you've found a bug or have an idea:
- Open an issue first for anything non-trivial so we can talk it through
- Fork the repo and create a branch for your change
- Make sure
npm test,npm run lint, andnpm run typecheckpass - Open a pull request with a clear description of what changed and why
If you're at a Hack Club event and something in the app breaks, an issue with steps to reproduce is hugely appreciated — even if you don't have time to fix it yourself.