Skip to content

JosunLP/retro-rumble

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

15 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Retro Rumble ๐Ÿ”„

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


โœจ Features

Core Retrospective Flow

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

Collaboration & UX

  • 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

Security & Privacy

  • 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

๐Ÿ› ๏ธ Tech Stack

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)

๐Ÿš€ Quick Start

Prerequisites

  • Bun โ‰ฅ 1.0

Installation

bun install

Development

bun run dev
# โ†’ http://localhost:3000

Production

bun run build
bun run preview

Quality

bun test             # Run test suite
bun run typecheck    # Type-check (vue-tsc --noEmit)
bun run lint:fix     # ESLint with auto-fix

๐Ÿ“ Project Structure

retro-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

๐Ÿ—๏ธ Architecture

Data Flow

Vue Components โ†’ useRetroSession โ†’ useWebSocket โ†’ WebSocket Server (_ws.ts) โ†’ SessionStore โ†’ Broadcast

Key Concepts

  • Interface-first types โ€” All domain types in app/types/, prefixed with I. Constants use as const arrays with derived union types.
  • Shared OOP models โ€” RetroSession and Participant classes implement interfaces, provide toJSON()/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 in app/types/websocket.ts.

Session Lifecycle

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.


๐ŸŒ Internationalization

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

๐Ÿงช Testing

The project includes a comprehensive test suite using bun:test:

bun test
# 222 tests, 0 failures, 524 expect() calls across 4 files

Coverage includes:

  • RetroSession โ€” Phase management, card CRUD, voting, groups, action items, timer, deep copy safety
  • Participant โ€” Serialization and state transitions
  • SessionStore โ€” Full server-side logic including phase restrictions, rate limiting, stripHtml edge cases, host authorization
  • Type validation โ€” Constant correctness, validator functions

๐Ÿ“„ License

MIT License

About

A nuxt, bun, typescript and tailwind based, scrum retro app

Resources

License

Code of conduct

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

  •  

Packages

 
 
 

Contributors