A customizable bingo card generator for road trips. Create, customize, and print bingo cards for your next adventure!
- Generate custom bingo cards with different grid sizes (3x3, 4x4, 5x5, 6x6, 7x7, 8x8)
- Create multiple card sets with unique content
- Upload custom icons with intelligent compression
- Center blank toggle: Leave center cell blank for odd-sized grids (5x5, 7x7, 9x9)
- Icon labels toggle: Show/hide text labels on icons for cleaner cards
- Multi-Hit Mode: Add challenge with tiles requiring multiple hits to complete
- Three difficulty levels: Light (20-30% tiles), Medium (40-50% tiles), Hard (60-70% tiles)
- Smart hit count assignment (2-5 hits per multi-hit tile)
- Visual counters in both preview and PDF output
- PDF download with adjustable compression
- Multi-language support (English, German)
- Data backup and restore
- SQLite database storage with robust data management
- RESTful API for data operations
- Automatic storage optimization and quota management
- Mobile-friendly responsive design
The project has been restructured into a modern, modular architecture:
roadtripbingo/
├── config/ # Configuration files
│ ├── .babelrc # Babel configuration
│ ├── jest.config.js # Jest unit test configuration
│ ├── jest.setup.js # Jest setup file
│ └── webpack.config.js # Webpack build configuration
├── data/ # SQLite database and related files
│ ├── README.md # Database schema documentation
│ ├── backups/ # Database backup files
│ └── migrations/ # Database migration scripts
├── src/ # Source files
│ ├── js/ # JavaScript modules
│ │ ├── app.js # Main application logic
│ │ └── modules/ # Modular components
│ │ ├── storage.js # Legacy localStorage storage
│ │ ├── indexedDBStorage.js # Legacy IndexedDB storage
│ │ ├── sqliteStorage.js # Modern SQLite storage system
│ │ ├── indexedDBMigrator.js # Migration from IndexedDB to SQLite
│ │ ├── backupManager.js # Backup and restore utilities
│ │ ├── i18n.js # Internationalization
│ │ ├── imageUtils.js # Image handling & compression
│ │ ├── cardGenerator.js # Bingo card generation
│ │ ├── db.js # Database layer
│ │ ├── languages.js # Language definitions
│ │ └── pdfGenerator.js # PDF generation
│ ├── css/ # CSS styles
│ │ └── styles.css # Main stylesheet
│ └── index.html # Main HTML file
├── public/ # Public assets
│ └── assets/ # Static assets
│ └── icons/ # Default icons
├── tests/ # Test files (mirrors src structure)
│ ├── js/modules/ # Module tests
│ │ ├── indexedDBStorage.test.js # IndexedDB storage tests
│ │ └── ... # Other module tests
│ ├── e2e/ # End-to-end tests (Playwright)
│ └── db.test.js # Database tests
├── playwright.config.js # Playwright configuration
├── server.js # Simple development server
└── package.json # Project dependencies and scripts
- Node.js (v14+)
- npm or yarn
npm install
The application uses SQLite for data storage. The database will be automatically initialized on first run. No additional setup is required.
Start the development server with hot reload:
npm run dev
Or use the simple HTTP server:
npm run start
Build for production:
npm run build
Build for development:
npm run build:dev
Run Jest unit tests:
npm test # Run tests once with coverage
npm run test:watch # Run tests in watch mode
Run Playwright end-to-end tests:
npm run playwright:test # Run all tests
npm run playwright:test:headed # Run with browser UI
npm run playwright:test:debug # Interactive debugging
npm run playwright:show-report # View test results
Run all tests:
npm run test:all
The application uses SQLite for data storage, providing:
- Robust Data Management: SQLite database with ACID compliance and data integrity
- RESTful API: Server-side API endpoints for all data operations
- Automatic Migration: Seamlessly migrates data from legacy IndexedDB storage
- Backup & Restore: Built-in tools for data backup and restore (JSON and SQL formats)
- Versioning Support: Database schema versioning with forward/backward migration
- Transaction Support: Atomic operations with rollback capability
The server provides RESTful endpoints for data operations:
- Icons:
GET/POST/PUT/DELETE /api/icons
- Settings:
GET/POST/PUT/DELETE /api/settings
- Card Generations:
GET/POST/PUT/DELETE /api/generations
- Storage Info:
GET /api/storage/info
- Export/Import:
GET /api/export
,POST /api/import
Users with existing IndexedDB data will be automatically migrated to SQLite on first load. The migration process:
- Validates existing data integrity
- Transfers all icons, settings, and card generations
- Provides rollback capability if migration fails
- Maintains data consistency throughout the process
- Toggle available: Leave center cell blank for traditional bingo experience
- Works with odd grids: Only applies to 5x5, 7x7, and 9x9 grids
- Smart calculation: Automatically adjusts required icon count when enabled
- Default enabled: Center blank is enabled by default for new users
- Show/hide labels: Toggle text labels on icons for cleaner card appearance
- Dynamic preview: Changes are reflected immediately in card preview
- Persistent setting: Your preference is saved and restored across sessions
- Images are automatically compressed when they exceed 200KB
- Maximum dimensions: 400x400 pixels
- JPEG quality: 70%, PNG quality: 80%
- Maintains visual quality while minimizing storage usage
The generator offers four levels of PDF compression:
- None: Highest quality, largest file size
- Light: Slight compression, good quality
- Medium: Balanced compression (recommended)
- High: Maximum compression, smallest file size
Currently supported languages:
- English
- German
MIT License