Access Stack is a comprehensive Flutter application for real-time event check-in, guest monitoring, and access control. It combines QR code scanning, real-time monitoring, and printing integration to streamline event entry management.
- Real-time QR Code Scanning: Camera and hardware scanner support
- Guest Monitoring: Live check-in tracking with Firebase
- Multi-Access Point: Flexible point-of-access configuration
- Offline Operation: Full functionality without internet
- Printing Integration: Thermal receipt and label printing
- Responsive Design: Optimized for mobile, tablet, and desktop
- Framework: Flutter 3.x
- State Management: Provider Pattern
- Navigation: Auto Route (type-safe navigation)
- Backend: Firebase Authentication + GraphQL API
- Real-time Updates: Firebase Realtime Database
- Local Storage: SQLite + SharedPreferences
- Printing: Thermal (Epson) + Label (Brother) printers
ProfileProvider: Centralized state management
QRCodeTokenHandler: Token validation and processing
BarcodeKeyboardListener: Hardware scanner integration
ProductScanner: Camera-based QR scanning
- Printing services for receipts and labels
Splash Screen → Team Selection → Login → Event Selection → POS Selection → POA Configuration
App Launch
↓
Splash Screen (Firebase auth, locale setup)
↓
[Team saved?] → No → Team Screen (enter team name, validate)
↓ ↓
Yes [Valid?] → Yes → Save team
↓ ↓ ↓
Login Screen ←───┘ ←┘
(username/password authentication)
↓
[Auth success?] → Yes → Load user data & events
↓
[Events available?] → Yes → Location Screen
↓
Select Event
↓
Load Event Data (POS, POA, Settings, Tickets, Accreditations)
↓
Point of Sales Screen (select POS terminal)
↓
[POA available?] → Yes → Point of Access Screen (select access points)
↓ ↓
No Yes
↓ ↓
Main Scanning Interface
¶ 2. Main Scanning Interface
The primary working screen for QR code processing and guest check-in.
Features:
- Large scan button (mobile) or QR icon (with hardware scanner)
- Event name display
- Hardware keyboard listener for USB barcode scanners
- Camera-based scanning dialog
Scanning Process:
- User initiates scan (button tap or hardware scanner trigger)
- QR code captured via camera or hardware input
- Token validated and decrypted
- Navigate to Confirmation Screen
Guest details verification and check-in confirmation.
Display:
- Guest name, company, email
- Table/seat assignments
- Existing notes and comments
- Available quantity status
Actions:
- Confirm: Record check-in, auto-print (if enabled)
- Cancel: Return to scanning (if available quantity > 0)
Layout Variations:
- Mobile: Full-screen details
- Tablet/Desktop: Split screen with optional floor map
Real-time guest list and check-in tracking.
Features:
- Live Firebase stream of check-ins
- Search and filter functionality
- Table/seat mapping
- Export to CSV
- Progressive statistics display
Layout:
- Mobile: List view with map button overlay
- Tablet/Desktop: Split view (guest list + details/map)
Filters:
- Text search (name, table, email)
- Status filters (checked-in, not checked-in)
- Table selection via interactive floor map
Administrative panel accessed via 6-tap gesture on main screen.
Tabs:
- User Panel: Session info, user details, logout options
- General Panel: Language, display settings, app preferences
- Printer Panel: Receipt and label printer configuration
- Ticket Panel: QR scanning settings, auto-print configuration
- Usage Panel: Check-in statistics and analytics
Layout:
- Wide Screen (>700px): Side navigation with panel-based content
- Mobile: Drawer navigation with full-screen panels
Supported Methods:
- Camera Scanning: ProductScanner dialog with camera input
- Hardware Scanner: USB barcode scanners via BarcodeKeyboardListener
Validation Flow:
QR Code Input
↓
QRCodeTokenHandler.validate()
↓
Decrypt & Parse Token
↓
[Valid format?] → Yes → Extract guest data
↓ ↓
No [Guest exists?] → Yes → Check quantity
↓ ↓ ↓
Error Error [Available?] → Yes → Proceed
↓
No → Show "Already used" error
Receipt Printing (Thermal Printers):
- Event name and logo
- Guest details
- Date/time stamp
- Custom footer text
- QR code reprint
Label Printing (Brother/Epson):
- Name badge format
- Table/seat assignment
- Company information
- Custom event branding
Configuration:
- Auto-print on check-in (toggle)
- Printer IP configuration
- Test print functionality
- Print history tracking
Local Storage:
- Complete guest database cached
- Event configuration stored locally
- Check-in queue for offline operation
- Sync queue management
Sync Strategy:
[Network available?]
↓
Yes → Online Mode
| - Direct API calls
| - Real-time Firebase updates
| - Cache data locally
↓
No → Offline Mode
- Validate against cached data
- Record locally
- Queue for sync
[Network restored]
↓
Process Sync Queue
- Upload check-ins
- Download updates
- Resolve conflicts
Firebase Integration:
- Live guest check-in stream
- Merge with local data
- Optimized update mechanism
- Conflict resolution
Statistics:
- Total guests
- Checked-in count
- Pending check-ins
- Check-in rate over time
- Table occupancy
- Firebase Auth with team-based authorization
- Device-specific access tokens
- Session management
- Auto-logout on inactivity
Admin:
- Full access to all features
- Settings configuration
- All POS/POA assignment
Standard:
- Assigned POS only
- No settings access
- Basic scanning and monitoring
Monitor:
- Status screen access only
- Read-only operations
- Export capabilities
Mobile Portrait (<700px):
- Single column layout
- Full-screen panels
- Drawer navigation
- List-only status view
- Map overlay button
Tablet/Desktop (>700px):
- Split-view interfaces
- Side navigation
- Guest list + details panel
- Integrated floor map
- Expanded statistics
Dynamic Switching:
- Screen width detection
- Automatic layout adjustment
- Orientation change handling
Supported Languages:
- English (en)
- Japanese (ja)
Localized Elements:
- UI labels and buttons
- Error messages
- Date/time formatting
- Cultural name formatting
- Event descriptions
git clone git@git.trainspot.jp:trainspot/access-stack-app.git
cd access-stack-app
flutter pub get
Environment Variables (.env):
TEAM_NAME=trainspot
FIREBASE_PROJECT_ID=access-stack-prod
GRAPHQL_ENDPOINT=https://api.eventstacks.io/graphql
ENVIRONMENT=production
# Development mode
flutter run
# Release build (Android)
flutter build apk --release
# Release build (iOS)
flutter build ipa --release
¶ Android
- Testing: Firebase App Distribution
- Production: Google Play Store (Internal track)
- Direct: APK installation for offline devices
- Testing: TestFlight
- Production: App Store (Enterprise)
- Ad-hoc: Direct device installation
QR Scanner Not Working:
- Check camera permissions
- Ensure adequate lighting
- Clean camera lens
- Verify QR code format
Printer Connection Failed:
- Verify printer on same network
- Check printer IP address
- Test printer in settings
- Review printer logs
Sync Issues:
- Check network connectivity
- Verify Firebase configuration
- Review sync queue
- Check for conflicts
Hardware Scanner Not Detected:
- Check USB connection
- Verify keyboard input mode
- Test with keyboard input
- Check BarcodeKeyboardListener logs
✅ Use dedicated tablets at fixed positions
✅ Keep devices charged throughout event
✅ Configure wake-lock to prevent screen timeout
✅ Test offline mode before event starts
✅ Pre-load guest database for faster scanning
✅ Position scanners at well-lit locations
✅ Train staff on both camera and hardware scanning
✅ Test printers before guest arrival
✅ Monitor sync queue regularly
✅ Export CSV backups periodically
- Progressive Data Loading: 15% → 45% → 65% → 80% → 100%
- Lazy Loading: Load data as needed
- Caching: Strategic offline support
- Memory Management: Efficient resource cleanup
- Optimized Listeners: Selective Firebase subscriptions
- Batch Updates: Group multiple updates
- Throttling: Prevent excessive refreshes
Issues: access-stack-app/issues
Slack: #access-stack-support
Email: dev@trainspot.jp
Last Updated: October 2025
App Version: 2.0
Maintained By: Mobile Development Team