Event Check-In App
Build a Flutter app that event staff use at the door to check in attendees. It scans each attendee's QR code with the phone camera, checks it against the list of registered attendees stored on the device, and immediately shows a clear result: welcome, already checked in (and when), or not registered. It keeps working without internet: check-ins are saved locally in a Drift database and synced to the server when the connection returns, so several staff phones can check people in at once without letting anyone in twice. You'll learn camera-based QR scanning, local databases with Drift, Riverpod state management, offline queues and sync, and handling duplicates across devices.
- Estimate
- ~13.5h
- Steps
- 7
- Completed by
- 0
- Proposed by
- codeseed.app
Riverpod · Drift
Project roadmap
- 01
Set up the app and local database
~2hCreate a Flutter app with flutter_riverpod, drift and mobile_scanner. Define Drift tables for attendees (id, name, ticket code, ticket type) and check-ins (attendee id, time, device id, synced flag). Add an import of a sample attendee list from a JSON asset with 200 attendees, and generate QR codes for a few of them to test with. Done when: the app starts and shows the number of attendees loaded.
- 02
Scan QR codes
~2hBuild the scanner screen with mobile_scanner, including camera permission handling with a clear message when it's denied. When a code is detected, pause scanning for 2 seconds so the same code isn't read many times, and pass the code to a check-in function. Add a manual entry field for damaged codes. Done when: pointing the camera at a test QR code reads its ticket code.
- 03
Validate and record check-ins
~2hLook up the ticket code in Drift. Show a full-screen result for about 2 seconds: green with the name and ticket type for a valid first check-in, orange with the time of the earlier check-in for a duplicate, and red for an unknown code. Record valid check-ins with the time and this device's id, with synced set to false. Play a different sound or vibration for each result. Done when: scanning the same code twice shows welcome, then already checked in.
- 04
Show live statistics
~1.5hAdd a dashboard screen, driven by Riverpod providers reading Drift streams, with the number checked in out of the total, a count per ticket type, the check-ins per 15 minutes, and a search box to find an attendee and check them in manually. Done when: the numbers update instantly after each scan.
- 05
Sync with the server
~2.5hDefine a small sync API: POST /checkins sends unsynced check-ins, and GET /checkins?since= returns check-ins from other devices. Build a fake server for development (a shelf app or http's MockClient). When a device learns that an attendee was checked in elsewhere first, keep the earliest check-in on every device. Sync every 30 seconds and when the connection returns. Done when: check-ins made on two simulated devices end up identical on both.
- 06
Handle offline mode clearly
~1.5hWatch connectivity (connectivity_plus) and show an offline banner with the number of check-ins waiting to sync. Scanning keeps working offline. If the attendee list on the device is older than a configurable time, show a warning so staff know to refresh it. Done when: check-ins made in airplane mode are synced after reconnecting, and the waiting count drops to zero.
- 07
Write tests
~2hTest the check-in logic with an in-memory Drift database: a valid check-in, a duplicate, an unknown code, and merging check-ins from two devices where the earliest must win. Test the sync service against the fake server, including a failed request that leaves check-ins unsynced. Done when: flutter test passes.
Ready to build this?
Get a GitHub repo and start building. Your AI reviewer checks each step as you go.
Tech stack