A modern, real-time collaborative retrospective tool built with SvelteKit 5 and SQLite.
# Install dependencies
npm install
# Set up database
npm run db:migrate
# Start development server
npm run dev
The application will be available at http://localhost:5173
Use the provided docker-compose.yml for easy deployment:
# Build and start the application
docker-compose up --build
# Run in background
docker-compose up -d --build
The application will be available at http://localhost:3000
with the database persisted in ./db/teambeat.db
.
# Build the Docker image
docker build -t teambeat .
# Create database directory
mkdir -p ./db
# Run the container
docker run -d \
--name teambeat \
-p 3000:3000 \
-v $(pwd)/db:/db \
-e DATABASE_URL=/db/teambeat.db \
teambeat
The Dockerfile uses a multi-stage build:
Key features:
/db
directoryDATABASE_URL
: Path to SQLite database file (default: /db/teambeat.db
)PORT
: Application port (default: 3000
)NODE_ENV
: Environment mode (set to production
in container)/db
: Database directory (required for data persistence)/app/logs
: Application logs (optional)# Generate migration from schema changes
npm run db:generate
# Apply migrations
npm run db:migrate
# Open database studio
npm run db:studio
src/
├── lib/
│ ├── server/
│ │ ├── db/ # Database schema and connection
│ │ ├── repositories/ # Data access layer
│ │ ├── sse/ # Server-Side Events handling
│ │ └── auth/ # Authentication & sessions
│ ├── components/ # Reusable UI components
│ │ └── ui/ # Base UI components
│ ├── stores/ # Client-side state management
│ ├── utils/ # Shared utilities
│ └── assets/ # Static assets
├── routes/
│ ├── api/ # REST API endpoints
│ ├── board/[id]/ # Board interface
│ ├── login/ # Authentication pages
│ └── register/
├── app.html # Root HTML template
└── app.less # Global styles
POST /api/auth/register
- Create accountPOST /api/auth/login
- Sign inPOST /api/auth/logout
- Sign outGET /api/auth/me
- Get current userPUT /api/auth/profile
- Update user profilePUT /api/auth/change-password
- Change passwordDELETE /api/auth/delete-account
- Delete user accountGET /api/series
- List user's seriesPOST /api/series
- Create new seriesGET /api/series/[id]
- Get series detailsPUT /api/series/[id]
- Update seriesDELETE /api/series/[id]
- Delete seriesGET /api/series/[id]/users
- Get series usersPOST /api/series/[id]/users
- Add user to seriesGET /api/boards
- List user's recent boardsPOST /api/boards
- Create new boardGET /api/boards/[id]
- Get board detailsPUT /api/boards/[id]
- Update boardDELETE /api/boards/[id]
- Delete boardPOST /api/boards/[id]/clone
- Clone boardPUT /api/boards/[id]/scene
- Change current scenePUT /api/boards/[id]/setup-template
- Setup board templateGET /api/boards/[id]/scenes
- Get board scenesPOST /api/boards/[id]/scenes
- Create scenePUT /api/boards/[id]/scenes/[sceneId]
- Update sceneDELETE /api/boards/[id]/scenes/[sceneId]
- Delete scenePUT /api/boards/[id]/scenes/reorder
- Reorder scenesGET /api/boards/[id]/columns
- Get board columnsPOST /api/boards/[id]/columns
- Create columnPUT /api/boards/[id]/columns/[columnId]
- Update columnDELETE /api/boards/[id]/columns/[columnId]
- Delete columnPUT /api/boards/[id]/columns/reorder
- Reorder columnsGET /api/boards/[id]/cards
- Get all cards for boardPOST /api/boards/[id]/cards
- Create new cardPUT /api/cards/[id]
- Update card contentDELETE /api/cards/[id]
- Delete cardPUT /api/cards/[id]/move
- Move card between columnsPUT /api/cards/[id]/group
- Group cards togetherPUT /api/cards/[id]/group-onto
- Group card onto anotherPOST /api/cards/[id]/vote
- Toggle vote on cardGET /api/boards/[id]/voting-stats
- Facilitator voting dashboardGET /api/sse
- Server-Side Events endpointPUT /api/boards/[id]/presence
- Update user presencePOST /api/boards/[id]/timer
- Start/vote on timerDELETE /api/boards/[id]/timer
- Stop timerGET /api/templates
- Get available board templatesThe application uses Server-Side Events streamed on the same port as the web application for real-time updates:
card_created
- New card addedcard_updated
- Card content changedcard_deleted
- Card removedvote_changed
- Vote count updatedscene_changed
- Meeting phase changedtimer_update
- Timer status changedpresence_update
- User activity changedboard_updated
- Board settings changedcolumns_updated
- Column configuration changedcomment_added
- New comment addeduser_joined
- User joined boarduser_left
- User left boardThis is a functional MVP implementation covering all core retrospective features:
Built according to CLAUDE.md development guidelines emphasizing explicit over implicit code, libraries over custom solutions, and human-maintainable architecture.
MIT License. See LICENSE
file for details.
The DiceBear avatar style Adventurer is a remix of: Adventurer by Lisa Wischofsky, licensed under CC BY 4.0.