Digital hand raising for in-person meetings
Handstack is a mobile-friendly web application that brings the convenience of digital hand raising (like Google Meet) to in-person meetings. Perfect for classrooms, conferences, and any meeting where you need to manage speaking order efficiently.
- Mobile-first design - Works great on phones and tablets
- Real-time synchronization - All participants see updates instantly
- Simple room system - 4-character room codes (new rooms use unambiguous characters, but can join any alphanumeric code)
- Admin controls - Meeting hosts can manage the queue
- Session persistence - Automatically restores your session after page refresh
- Zero-cost hosting - Runs on Firebase for free
- No registration required - Just enter your name and start




handstack/
βββ src/
β βββ components/ # React components
β β βββ Home.jsx # Landing page
β β βββ CreateRoom.jsx # Room creation
β β βββ JoinRoom.jsx # Room joining
β β βββ AdminRoom.jsx # Admin dashboard
β β βββ UserRoom.jsx # User interface
β βββ services/ # Firebase services
β β βββ firebase.js # Database operations
β βββ utils/ # Utility functions
β β βββ roomCode.js # Room code generation
β βββ firebase/ # Firebase config
β β βββ config.js # Firebase setup
β βββ App.jsx # Main app component
βββ database.rules.json # Database security rules
βββ firebase.json # Firebase configuration
βββ README.md # Full documentation
git clone https://github.com/petecheslock/handstack.git
cd handstack
npm install
npm install -g firebase-tools
-
Go to Firebase Console
-
Create a new project (or use an existing one)
-
Create a Web App (This step is crucial!):
- Click the βοΈ Settings icon next to "Project Overview"
- Select Project Settings
- Scroll down to "Your apps" section
- Click Add app and select the Web icon
</>
- Enter app nickname (e.g., "Handstack")
- Click Register app
-
Enable Realtime Database:
- Go to Build β Realtime Database
- Click Create Database
- Choose Start in test mode
- Select your preferred location
-
Get your Firebase config from the web app you created:
- Go to Project Settings β General tab
- Scroll to "Your apps" and click on your web app
- Copy the config object values
-
Create a
.env
file in the root directory (copy fromenv.example
):cp env.example .env
-
Fill in your Firebase configuration in
.env
:VITE_FIREBASE_API_KEY=AIzaSyC... # From firebaseConfig.apiKey VITE_FIREBASE_AUTH_DOMAIN=your-project.firebaseapp.com VITE_FIREBASE_DATABASE_URL=https://your-project-default-rtdb.firebaseio.com/ VITE_FIREBASE_PROJECT_ID=your-project-id VITE_FIREBASE_STORAGE_BUCKET=your-project.appspot.com VITE_FIREBASE_MESSAGING_SENDER_ID=123456789 VITE_FIREBASE_APP_ID=1:123456789:web:abc123def456
β οΈ Important: The.env
file is automatically ignored by Git for security. Never commit your Firebase credentials to the repository.
firebase login
firebase init
During initialization:
- Select Hosting and Realtime Database
- Choose Use an existing project and select your Firebase project
- Set
dist
as your public directory - Configure as a single-page app (Yes)
- Don't overwrite
dist/index.html
if it exists
npm run dev
Visit http://localhost:5173
to test the application. You should see the Handstack home page with "Create Room" and "Join Room" buttons.
Testing the Full Flow:
- Create a room with your name
- Note the 4-character room code
- Open a new browser tab/window and join the room with the code
- Test raising/lowering hands and queue management
The database security rules are stored in database.rules.json
and will be automatically deployed with your project. The rules are configured to allow read/write access to room data.
npm run deploy
This command will:
- Build the application
- Deploy to Firebase Hosting
- Update database rules
- Provide you with a live URL
Your app will be available at https://your-project-id.web.app
- Click "Create Room"
- Enter your name
- Share the 4-character room code with participants
- Monitor the queue and click "Done Speaking" to remove people
- See all participants and their hand status
- Click "Join Room"
- Enter the room code and your name
- Use "Raise Hand" when you want to speak
- See your position in the queue
- Use "Lower Hand" when you're done
- Frontend: React 18 + Vite
- Styling: Tailwind CSS
- Database: Firebase Realtime Database
- Hosting: Firebase Hosting
- Routing: React Router
The free Firebase Realtime Database tier includes:
- 1GB storage
- 10GB/month transfer
- 100 concurrent connections
This should handle hundreds of concurrent users across multiple rooms.
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
MIT License - feel free to use this for your meetings!
-
Firebase connection errors:
- Verify your
.env
file has all requiredVITE_FIREBASE_*
variables - Check that Realtime Database is enabled in your Firebase project
- Ensure database rules allow read/write access to
rooms
- Verify your
-
Deployment issues:
- Verify Firebase CLI is installed:
firebase --version
- Check that you're logged in:
firebase login
- Ensure your project is initialized:
firebase init
- Verify Firebase CLI is installed:
-
Room not found: Ensure the room code is correct (4 alphanumeric characters).
-
Environment variable errors:
- Local development: Check your
.env
file - Deployment: Firebase will use your project configuration
- Local development: Check your
Need Help? Create an issue on GitHub if you encounter problems or have suggestions for improvements.
Once you complete the Firebase setup, your Handstack will be ready to host on Firebase at zero cost. The application will handle multiple concurrent rooms and real-time updates seamlessly.
Perfect for: Classrooms, conferences, team meetings, workshops, and any event where you need organized hand raising!
Made with β€οΈ for better meetings