A real-time web application for hosting blind tasting parties with friends! Rate samples anonymously and reveal the ultimate champion in a dramatic finale.
- ๐ญ Blind Tasting Mode: Samples are shown as numbered samples to prevent bias
- โญ Star Rating System: Rate each sample taste, appearance, and mouthfeel (1-5 stars)
- ๐ด Real-time Updates: All votes and changes sync instantly across devices using Socket.IO
- ๐ฑ Mobile Optimized: Works perfectly on smartphones - no app download needed
- ๐ Admin Controls: Password-protected admin panel for managing the party
- ๐ Live Leaderboard: Beautiful charts and rankings (hidden until reveal mode)
- ๐ Reveal Mode: Dramatic moment when chip names and results are unveiled
- ๐ฅ Multi-user Support: Everyone joins with their own device using a shared URL
- Node.js 18+
- Git
- Heroku CLI
# Install dependencies
npm install
# Start the development server
npm run dev
# Open http://localhost:3000 in your browserCreate a .env file in the root directory:
PORT=3000
ADMIN_SECRET=your-super-secret-admin-password-
Create a Heroku app:
heroku create your-app-name
-
Set environment variables:
heroku config:set ADMIN_SECRET=your-super-secret-password
-
Deploy:
git push heroku main
-
Your app will be available at:
https://your-app-name.herokuapp.com
- Setup: Deploy the app and share the URL with guests
- Admin Access: Click the โ๏ธ settings icon in the header
- Add Samples: Use the admin panel to add samples before the party
- Start Tasting: Guests join and rate samples in blind mode
- The Big Reveal: Toggle "Reveal Mode" to show names and results! ๐
- Join: Open the shared URL on your phone
- Enter Name: Type your name to join the tasting
- Rate Chips: Tap stars to rate each numbered sample
- Wait for Reveal: The leaderboard unlocks when admin enables reveal mode
- Vanilla JavaScript: No framework dependencies for maximum compatibility
- Real-time UI: Instant updates when anyone votes or admin makes changes
- Progressive Enhancement: Works on any modern browser
- Responsive Design: Mobile-first approach with touch-optimized interactions
- Node.js + Express: Lightweight web server
- Socket.IO: Real-time bidirectional communication
- In-Memory Storage: Game state stored in server memory (resets on restart)
- Admin Authentication: Simple password-based access control
User Device โโ Socket.IO โโ Node.js Server โโ In-Memory Game State
โ โ
Other Devices โโโโโโโ Real-time Broadcasts โโโโโโโโโโ
- Input Validation: All votes and sample names are validated
- Admin Authentication: Protected admin functions require password
- Rate Limiting: Built-in protection via Socket.IO
- Sanitization: User inputs are escaped to prevent XSS
- No Database: Game state is stored in memory only
- Server Restart: All data is lost when the server restarts
- Single Instance: Doesn't scale across multiple server instances
- Concurrent Users: Tested with ~20 users, should handle small-medium parties
- Memory Usage: Grows with number of users and votes
- Single Server: No horizontal scaling support
- Modern Browsers Only: Requires ES6+ support (Chrome 51+, Firefox 54+, Safari 10+)
- JavaScript Required: No fallback for disabled JavaScript
- Socket.IO Dependency: Requires WebSocket support
- Single Admin: Only one admin password, no role-based access
- No User Management: Can't kick users or moderate content
- Limited Backup: No export/import functionality for game data
โโโ server.js # Main server file with Socket.IO setup
โโโ public/
โ โโโ index.html # Main app interface
โ โโโ styles.css # All styling and animations
โ โโโ app.js # Client-side JavaScript
โโโ package.json # Dependencies and scripts
โโโ Procfile # Heroku deployment config
npm start # Production server
npm run dev # Development with nodemonThe codebase is designed to be easily extensible:
- New Rating Criteria: Add to the criteria array in
app.js - Different Rating Scales: Modify the star generation logic
- Data Export: Add endpoints in
server.jsfor JSON export - Database Integration: Replace in-memory storage with your preferred DB
We welcome contributions! This project was built for fun and learning.
- Fork the repository
- Create a feature branch:
git checkout -b feature-name - Make your changes and test locally
- Submit a pull request with a clear description
- Use modern JavaScript (ES6+)
- Keep functions small and focused
- Comment complex logic
- Test on mobile devices
MIT License - feel free to use this for your own parties!
100% Vibe coded with Claude Sonnet 4 โจ
Perfect for office parties, birthday celebrations, or any gathering where you want to settle the age-old question: which chip reigns supreme? ๐