Free planning poker for agile teams. No account, no tracking, no bullshit.
Most planning poker tools show ads, track users, and weigh megabytes. CleanPoker does the opposite.
| What others do | CleanPoker |
|---|---|
| Ads / freemium upsells | Zero ads, zero monetization |
| Google Analytics, cookies | Zero trackers, zero cookies |
| Require account creation | No account, just a link |
| Heavy JS bundles | < 50 KB JS total (brotli) |
| Accessibility as an afterthought | Lighthouse accessibility 100 |
CleanPoker is built for any agile team, with no compromises on ethics, performance or inclusion:
- Eco-conscious teams: < 50 KB JS (brotli), zero third-party scripts, hosted on renewable energy, CO2 < 0.1g/visit
- Privacy-first teams: zero trackers, zero cookies, zero analytics, nothing leaves your browser except the WebSocket to the game server
- Teams with members with disabilities: fully keyboard navigable, screen reader compatible (NVDA, VoiceOver, JAWS), no motion hazard
- Blind and visually impaired users: semantic HTML5,
aria-liveregions announce vote results in real time, all interactive elements have explicit labels - Keyboard-only users: complete Tab / Shift+Tab / Enter / Space navigation, no mouse required at any step
- Users sensitive to motion: respects
prefers-reduced-motion, zero auto-playing animations - Low-vision users: minimum 4.5:1 contrast ratio,
remunits so browser zoom works correctly up to 200% - Remote-first distributed teams: WebSocket real-time, no install, works on any device and OS
- Open-source enthusiasts: MIT license, full source on GitHub, no vendor lock-in
- Instant room: create a session, share the URL, done
- Custom card decks: Fibonacci, T-shirt, 2n, or any values you want
- Real-time votes: WebSocket, no polling
- Reveal & new round: smooth flow for sprint planning
- Observers: product owners and stakeholders can watch without voting
- Kick / role switch: host controls for unruly participants
- Full keyboard nav: tab through everything
- Screen reader support: NVDA, VoiceOver,
aria-livefor real-time updates - 5 languages: FR, EN, ES, DE, PT
- Auto-reconnect: WebSocket reconnects automatically with exponential backoff
- Ephemeral rooms: in-memory, auto-deleted after 24h of inactivity
| Metric | Target |
|---|---|
| CO2 / visit | < 0.1g |
| Lighthouse Performance | 100 |
| Lighthouse Accessibility | 100 |
| Page weight | < 50 KB JS (brotli) |
| Third-party cookies | 0 |
| Trackers | 0 |
| Layer | Tech | Why |
|---|---|---|
| Backend | Go + native WebSocket | ~15 MB RAM, native binary, no runtime |
| Frontend | SvelteKit 5 (runes) | SSR, zero virtual DOM, minimal bundle |
| Storage | In-memory (Go map) | Zero dependencies, rooms auto-expire after 24h |
| Frontend hosting | Cloudflare Pages | Global CDN, renewable energy |
| Backend hosting | Fly.io cdg Paris |
Renewable energy, EU data residency |
Every push to main runs a quality and security pipeline before deploying.
| Tool | What it checks | Dashboard |
|---|---|---|
| golangci-lint | Go static analysis (errcheck, staticcheck, govet...) | GitHub Actions |
| ESLint | TypeScript + Svelte code quality | GitHub Actions |
| svelte-check | TypeScript types in Svelte components | GitHub Actions |
| Go tests | Backend unit tests | GitHub Actions |
| Bundle Size | JS bundle stays under size budget | GitHub Actions |
| SonarCloud | Bugs, code smells, security hotspots | sonarcloud.io |
| CodeQL | SAST vulnerability scan (Go + TypeScript) | Security tab |
| Lighthouse CI | Performance, accessibility, SEO after each deploy | GitHub Actions |
| Dependabot | Automated dependency updates (npm, Go, Actions) | Pull requests |
| Eco-CI | CI pipeline energy consumption estimate | GitHub Actions summary |
- Zero trackers: no Google Analytics, no third-party scripts, no cookies
- System fonts: no Google Fonts download
- Vanilla CSS: no CSS framework (Tailwind, Bootstrap, etc.)
- Zero virtual DOM: SvelteKit compiles to vanilla JS
- Minimal runtime: Go binary ~15 MB RAM, no database
- Green hosting: Cloudflare Pages + Fly.io CDG both run on renewable energy
- CI energy tracked: each pipeline run is measured by Eco-CI
- Native HTML semantics (
<button>,<main>,<section>,<table>) - Skip link at the top of the page
aria-live="polite"for real-time vote updatesaria-labelon all interactive elements- Contrast ratio >= 4.5:1 throughout
prefers-reduced-motionrespectedremunits (browser zoom works correctly)- No
user-scalable=no
# Backend
cd backend
go run ./cmd/server
# Frontend (separate terminal)
cd frontend
npm install
cp .env.example .env
npm run devOpen http://localhost:5173.
feature/* --> main (PR required, CI must pass) --> deploy
main: production only, never commit directly, always via PRfeature/*: daily work, branch frommain, merge back via PR
Branch protection on main: PRs required, direct push blocked, CI gates enforced.
CI/CD via GitHub Actions, auto-deploys on push to main, quality gate must pass first.
Code Quality (golangci-lint + ESLint + svelte-check + Go tests + SonarCloud)
Bundle Size check
--> deploy-frontend (Cloudflare Pages)
--> deploy-backend (Fly.io)
--> lighthouse audit
Preview deploys (Cloudflare Pages) are created automatically for every push to a non-main branch.
Required GitHub secrets:
| Secret | Used for |
|---|---|
CLOUDFLARE_API_TOKEN |
Cloudflare Pages deploy |
CLOUDFLARE_ACCOUNT_ID |
Cloudflare Pages deploy |
FLY_API_TOKEN |
Fly.io backend deploy |
SONAR_TOKEN |
SonarCloud analysis |
MIT, see LICENSE.
Made by Florian Mousseau - cleanpoker.dev
