A modern, real-time Scrum Retrospective tool for agile teams โ anonymous, secure, and simple. Built with Nuxt 4, TypeScript, and WebSockets. Part of the growing scrum app stack alongside Planning Poker.
Write โ Group โ Vote โ Discuss โ Act
| Phase | Description |
|---|---|
| Set the Stage | Check-in with emoji moods to warm up the team |
| Gather Data | Submit anonymous cards to three columns |
| Generate Insights | Drag & drop cards into thematic groups |
| Dot Voting | Distribute votes freely across cards and groups |
| Decide Actions | Define action items with assignees and due dates |
| Close Retro | Review summary, export results, and give feedback |
- Real-time sync โ All changes broadcast instantly via WebSocket
- Anonymous cards โ No author information revealed to participants
- Join codes โ Easy 6-character codes (non-confusable charset, no
O/0/I/1/l) - Session timer โ Built-in countdown with audio chime notification
- Export โ Download results as JSON, Markdown, or high-quality PNG image
- Responsive design โ Optimized for desktop and mobile
- 12 languages โ EN, DE, ES, FR, IT, JA, NL, PL, PT-BR, RU, SV, ZH-CN
- Zero persistence โ Sessions live in memory only, no database
- No authentication โ Friction-free access, nothing stored
- Input sanitization โ Server-side HTML stripping with iterative bypass protection
- Rate limiting โ Action item and card creation limits prevent abuse
- Phase enforcement โ Server validates all operations against the current session phase
| Layer | Technology |
|---|---|
| Framework | Nuxt 4 (Vue 3 + Nitro) |
| Language | TypeScript (strict mode, vue-tsc) |
| Styling | Tailwind CSS + custom semantic tokens |
| Real-time | WebSocket via crossws |
| Runtime | Bun |
| Icons | Heroicons via @nuxt/icon |
| i18n | @nuxtjs/i18n with 12 locales |
| Sanitization | DOMPurify (client) + custom stripHtml (server) |
- Bun โฅ 1.0
bun installbun run dev
# โ http://localhost:3000bun run build
bun run previewbun test # Run test suite
bun run typecheck # Type-check (vue-tsc --noEmit)
bun run lint:fix # ESLint with auto-fixretro-rumble/
โโโ app/
โ โโโ components/ # Vue components (RetroBoard, VotingBoard, ClusterCanvas, โฆ)
โ โโโ composables/ # Reusable logic (useWebSocket, useRetroSession, useExport, โฆ)
โ โโโ pages/ # Single-page route (index.vue)
โ โโโ types/ # TypeScript interfaces & constants
โ โ โโโ retro.ts # Domain types (IRetroSession, IRetroCard, ICardGroup, โฆ)
โ โ โโโ websocket.ts # Client/server message protocol types
โ โโโ utils/ # Shared OOP classes & config
โ โ โโโ RetroSession.ts # Core session logic (used by client & server)
โ โ โโโ Participant.ts # Participant model
โ โ โโโ columnConfig.ts # Centralized column metadata (DRY)
โ โโโ assets/css/ # Global Tailwind styles
โโโ i18n/locales/ # 12 translation files (en, de, es, fr, it, ja, nl, pl, pt-BR, ru, sv, zh-CN)
โโโ server/
โ โโโ routes/_ws.ts # WebSocket message dispatcher (30+ handlers)
โ โโโ utils/sessionStore.ts # In-memory session store singleton
โโโ tests/ # Bun test suite (222 tests)
โโโ nuxt.config.ts
โโโ tailwind.config.ts
โโโ package.json
Vue Components โ useRetroSession โ useWebSocket โ WebSocket Server (_ws.ts) โ SessionStore โ Broadcast
- Interface-first types โ All domain types in
app/types/, prefixed withI. Constants useas constarrays with derived union types. - Shared OOP models โ
RetroSessionandParticipantclasses implement interfaces, providetoJSON()/fromJSON()serialization, and are shared between client and server. - Composables โ
useWebSocket(connection singleton with auto-reconnect),useRetroSession(session state + all actions),useExport(JSON/Markdown/PNG export),useClusterCanvas(drag & drop). - WebSocket protocol โ Typed messages
{ type, payload, timestamp }with separate client/server message type unions inapp/types/websocket.ts.
create โ set-the-stage โ gather-data โ generate-insights โ voting โ decide-action โ close-retro
Sessions auto-delete when the last participant disconnects and the idle TTL (30 min) expires. Participants can rejoin within this window.
All user-facing strings are localized via @nuxtjs/i18n. Currently supported:
| Language | Code | File |
|---|---|---|
| English | en |
en.json |
| Deutsch | de |
de.json |
| Espaรฑol | es |
es.json |
| Franรงais | fr |
fr.json |
| Italiano | it |
it.json |
| ๆฅๆฌ่ช | ja |
ja.json |
| Nederlands | nl |
nl.json |
| Polski | pl |
pl.json |
| Portuguรชs (BR) | pt-BR |
pt-BR.json |
| ะ ัััะบะธะน | ru |
ru.json |
| Svenska | sv |
sv.json |
| ไธญๆ (็ฎไฝ) | zh-CN |
zh-CN.json |
The project includes a comprehensive test suite using bun:test:
bun test
# 222 tests, 0 failures, 524 expect() calls across 4 filesCoverage includes:
RetroSessionโ Phase management, card CRUD, voting, groups, action items, timer, deep copy safetyParticipantโ Serialization and state transitionsSessionStoreโ Full server-side logic including phase restrictions, rate limiting,stripHtmledge cases, host authorization- Type validation โ Constant correctness, validator functions
MIT License