A fair and balanced way to choose your next meeting facilitator. The longer someone waits, the higher their chances of being selected!
This contains everything you need to run your app locally or deploy it to GitHub Pages.
- Fair Selection Algorithm: Uses weighted random selection where recently chosen members have lower weights
- Persistent Storage: Supports both Supabase database and localStorage fallback
- Real-time Updates: Team management with instant UI updates
- Responsive Design: Works on desktop and mobile devices
- Weighted Probability Display: Shows each member's current selection probability
This application supports Supabase database for persistent storage across devices and sessions.
- Create a new project at Supabase
- Run the SQL schema from
supabase-schema.md
in your Supabase SQL Editor - Copy your project URL and anon key from Settings > API
- Create a
.env
file in the project root:
VITE_SUPABASE_URL=your_supabase_project_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
If Supabase is not configured, the application automatically falls back to localStorage for data persistence.
Prerequisites: Node.js
- Clone the repository
- Install dependencies:
npm install
- (Optional) Set up Supabase using the instructions above
- Start the development server:
npm run dev
- Open http://localhost:5173 in your browser
npm run build
The built files will be in the dist
directory.
The app is automatically deployed to GitHub Pages when changes are pushed to the main
branch.
- Live URL: https://psykzz.github.io/fair-roulette/
- Deployment: Automatic via GitHub Actions
- Build Command:
npm run build
To manually deploy:
- Build the project:
npm run build
- The built files will be in the
dist/
directory - Deploy the
dist/
folder to any static hosting service
- Add team members to the roster
- Click "Spin the Wheel!" to select a facilitator
- The algorithm considers each member's "weight" (chance of being selected)
- Recently selected members get lower weights, making it fair over time
- Weights gradually increase for non-selected members
The fair selection ensures everyone gets a turn while maintaining randomness!