Interactive polling platform for webinars, seminars, training, and presentations. Participants join via QR code from their phones, and results appear instantly on the presenter's screen in real-time.
- Real-time results with 1-second updates (powered by TanStack Query)
- Multiple Choice, Multiple Selection, Rating 1-5
- Automatic countdown timer per question (auto-closes voting)
- Duplicate vote prevention (unique participant ID + server validation)
- QR Code join & session code with automatic locale in URL
- Fullscreen presentation mode with live charts
- Full Indonesian (
/id) and English (/en) support via next-intl - Automatic locale detection based on browser language
- ID/EN language toggle in navbar & footer
- Locale-aware join URLs:
/{locale}/join/{code}
- Path-based routing (no hash router)
- Dark Mode / Light Mode (follows system preference, no flash on switch)
- TanStack Query for efficient polling & caching
- Responsive mobile-first design
- Stats tracking (total sessions & votes)
- Open source & free
| Technology | Purpose |
|---|---|
| Next.js 16 | Fullstack React framework |
| PostgreSQL | Database via Supabase / Neon / local |
| Prisma ORM | Type-safe database client & migrations |
| TanStack Query | Data fetching & polling |
| next-intl | Internationalization (ID/EN) |
| Tailwind CSS v4 | Styling |
| Lucide React | Icons |
| qrcode.react | QR Code generation |
git clone https://github.com/jutionck/livepoll.git
cd livepoll
npm installUse a local PostgreSQL or Supabase/Neon.
# Create local database
createdb livepoll
# Apply migrations
npx prisma migrate devcp .env.example .env.development.local
# Adjust DATABASE_URL if needednpm run devOpen http://localhost:3000.
- Push the repo to GitHub
- Import the project into Vercel
- Set the
DATABASE_URLenvironment variable in the Vercel dashboard (use Supabase Transaction Pooler, port 6543) - Run migrations against Supabase using the Session Pooler (port 5432):
npx prisma migrate deploy
- Deploy
Note: Passwords with special characters (
@,?, etc.) inDATABASE_URLare automatically URL-encoded by the app, no manual encoding needed.
If this project is helpful to you, consider supporting the developer: