Judge a Scrum tool by the rules it keeps, not by the boards it draws.
Scrumooth is a self-hosted, open-source web application for teams that run Scrum. It is built for Scrum Masters, Product Owners, and the engineering-led teams that want the process to hold itself to the Guide. It turns the rules of the 2020 Scrum Guide into gates the backend enforces wherever a tool can — and declares the places where it deliberately does not.
It is not a replacement for your issue tracker. As the Scrum Guide enforcement layer your tracker does not have, it owns the Sprint lifecycle, the roles, and the gates, and it refuses to let a process violation pass silently. Your tracker keeps your record; this keeps your rules. Every rule it enforces is listed in What Scrumooth Enforces — and no rule outside that list is claimed.
Running a second tool is a real cost — something else to deploy, secure, back up, and keep fed. Scrumooth is deliberately the smallest system that can carry it: a single Compose stack — reverse proxy, backend, frontend, PostgreSQL, and scheduled backups — and one database to look after.
Languages: English | Deutsch | Español | Français | Italiano
Try Scrumooth instantly in your browser — no installation required. The demo runs with mock data (no backend needed) so you can explore the full Scrum lifecycle right away.
👉 Launch the Live Demo on GitHub Pages
Note: The demo uses in‑memory mock data — any changes you make are local to your browser session and reset on refresh. For persistent data and multi‑user collaboration, follow the Installation guide to self‑host your own instance.
Understand Scrumooth
Self-host & develop
- Tech Stack
- Project Structure
- Quick Start
- Prerequisites
- Installation
- Common Development Commands
- Testing
- Load Testing (k6)
- Code Quality
- Database Management
- Docker Support
- Deployment
- Troubleshooting
Project
Most project management tools are built to record what happened. They give you boards, they log your clicks, they draw accurate charts — after the Sprint is over. Recording is genuinely useful, and those tools do it well.
But a record is a description, not a decision. The 2020 Scrum Guide is full of rules a tool could hold you to: a Sprint closes only after its Review and its Retrospective, only the Developers size the work, one Product Owner owns the Product Backlog, and "Done" means the Definition of Done has been met. When one of them slips — a Sprint closed before its Retrospective ran, a Product Owner sizing work on the Developers' behalf, an item marked Done with its criteria unverified — the slip is usually invisible until the Sprint is over. In most tools those rules are advisory: a shared understanding the team is trusted to remember.
Scrumooth treats them as rules.
Discipline is not the missing ingredient — if it were enough on its own, no team would ever have closed a Sprint without a Retrospective. The Guide tells a team what to do; it cannot notice when the team stops doing it. So we embed the 2020 Scrum Guide as executable code and enforce it server-side, where neither the interface nor a direct API call can bypass it. We are a gatekeeper, not a note-taker.
Fewer process debates. More time shipping working software.
These are gates, not warnings or hints. In every case below, the answer is no — and every answer holds in the backend service layer, so a frontend shortcut cannot get around it.
| A 2020 Scrum Guide rule, asked as a question | Scrumooth's answer |
|---|---|
| Can a Sprint be closed before its Review and Retrospective? | Sprint completion is refused until both events are recorded (sprints API). |
| Can an item be called Done without its Definition of Done? | Completing a Sprint never marks items Done — each item must pass its Definition of Done checklist (Definition of Done API). |
| Can a team hold more than one Product Owner or Scrum Master? | Adding a second holder of either role is refused (teams API). |
| Can a team grow past Scrum Team size? | Team size is capped — TEAM_MAX_SIZE, default 10 (teams API). |
| Can someone other than a Developer size the work? | Only Developers can size Product Backlog items — every other role receives 403 Forbidden (Product Backlog API). |
| Can the Product Owner or Scrum Master author the Daily Scrum? | Only Developers can author or join the daily record; the Product Owner and Scrum Master observe (Daily Scrum API). |
| Can a Sprint be cancelled by anyone but the Product Owner? | Cancellation is Product-Owner-only, and only while the Sprint is ACTIVE (sprints API). |
| Can a delivered Increment be rewritten? | Delivered Increments are locked against further edits (increments API). |
Where Scrumooth deliberately does not enforce anything: the Retrospective Prime Directive is left to the facilitator, and event timeboxes are surfaced through a shared team timer rather than forcibly terminating an event. The Guide asks for self-management in exactly those places, so Scrumooth does not decide for the team.
What a gate looks like in practice. It is Friday, the Sprint is due to end, the increment is deployed — and the Retrospective was never scheduled. A recording tool closes the Sprint and the Retrospective slips to next week, which is the failure the Guide's final event exists to prevent; Scrumooth refuses the close until both events are recorded. The team then runs the Retrospective, or stops and discusses why not — the version of that decision the Guide expects a team to make consciously.
Why will the tools you already use not simply add this? In our view, because a gate you can switch off is a setting, not a rule, and configurability is their selling point rather than their oversight. Nor can a hosted service easily promise that your process data never leaves your infrastructure. Scrumooth is not a feature they are missing; it is a trade-off they have already made the other way.
The gates above are the entire claim: if a rule is not in the table, Scrumooth does not enforce it — and because a configuration that breaks the 2020 Scrum Guide is never offered, the refusal is the product.
Scrumooth is built for one situation in particular: engineering-led organisations that have to be able to show how a Sprint was actually run, and for whom process data cannot leave their own infrastructure — regulated industries, their suppliers, and public-sector teams.
Scrumooth is for you if…
- You are a Scrum Master or Product Owner whose team finds it hard to hold to the 2020 Scrum Guide, and you want the tool to refuse the drift instead of quietly allowing it.
- You lead an engineering team that wants to self-host its process data for privacy, compliance, or data-sovereignty reasons.
- You need a defensible, auditable record of how each Sprint was actually run — who changed what, when, and under which role.
- You want the Scrum Guide's boundaries encoded once, so new team members learn the process by using it.
Scrumooth is not for you if…
- You want a general-purpose issue tracker, roadmap planner, or Kanban board for non-Scrum work. Scrumooth refuses to be one.
- You want every rule to be configurable. Scrumooth refuses configurations that break the Scrum Guide.
- You want a fully managed SaaS. Scrumooth is self-hosted by design.
- You need deep portfolio management, resource planning, or financial tracking across many unrelated projects.
- You follow a scaled framework that adapts the Guide for a wider organisation, or Scrum is not yet how your team works. Scrumooth enforces the 2020 Scrum Guide as written, for a single Scrum Team.
Why not a hosted service
- Self-hosted by design. Your process data never leaves your infrastructure.
- Data sovereignty built in. GDPR data export, a 14-day deletion grace period, and consent tracking ship with the product.
- Auditable. Every role change and state transition is written to a dedicated, compliance-separated audit log.
- Bounded access. Concurrent sessions are capped, and the oldest sessions are revoked automatically.
Why not another self-hosted tool
- Open and inspectable. Apache-2.0, public CI, published coverage — an 80% line/branch/function/statement gate is enforced in the pipeline.
- Tested under load, not just under unit tests. 10 pre-built k6 scenarios, including a Sprint-planning peak. See Load Testing.
- Strict by construction. TypeScript strict mode across backend, frontend, and shared packages.
- Localised where it matters. The interface ships in English, German, Spanish, French, and Italian, with Scrum terminology sourced from the official Scrum Guide.
For those who have to approve it internally. Deployment guidance, the security architecture, and the vulnerability-reporting process are all documented in the repository: Deployment, docs/architecture/security-architecture.md, and SECURITY.md.
Everything needed to run the Sprint — the Guide's five events, three artifacts, and three commitments — with the rule it holds attached to each. Bold clauses repeat the gates in What Scrumooth Enforces; that table stays the only list of rules Scrumooth claims.
- Product Goal - Strategic alignment and goal tracking; the commitment the backlog serves
- Product Backlog - MoSCoW prioritisation (Must, Should, Could, Won't); only Developers size the work
- Sprint Planning - Configurable sprint durations and capacity planning; only Developers save the Sprint Backlog
- Sprint Execution - Interactive Kanban board with drag-and-drop; only the Product Owner can cancel, and only while the Sprint is
ACTIVE - Daily Scrum - Shared daily record, with impediment surfacing; only Developers author it — the Product Owner and Scrum Master observe
- Impediment - Blocker identification and resolution tracking; a Sprint cannot close before its Impediments are resolved
- Increment - Product increment management; The moment a Product Backlog item meets the Definition of Done, an Increment is born
- Sprint Review - Review management, stakeholder feedback, and backlog adjustment; a Sprint cannot close before its Review is recorded
- Sprint Retrospective - Team reflection and tracked improvement; a Sprint cannot close before its Retrospective is recorded
- Workflow Engine - Role-based permissions and gated state transitions, enforced server-side
- Definition of Done/Ready - Customisable checklists; nothing is Done until its checklist passes
- Increment integrity - Delivered work cannot be silently rewritten
- Team composition - One Product Owner and one Scrum Master; team size capped (
TEAM_MAX_SIZE, default10) - Audit Logging - Dedicated, compliance-separated log; every role change and state transition recorded
- Dashboard & Reporting - Real-time metrics and visualisations
- Team Communication - Built-in notifications and messaging
- Team Health Check - Periodic check-in against the five Scrum values
- Shared event timeboxes - One clock for every participant; timeboxes are surfaced, never force-closed
- Privacy controls - Data export and erasure rights, plus consent tracking
- Runtime: Node.js 24+
- Framework: Express.js 5
- Language: TypeScript (strict mode)
- Database: PostgreSQL 18+ with Prisma ORM 7
- Authentication: JWT with bcrypt
- Validation: Zod
- Scheduled Jobs: node-cron
- Email: Nodemailer (SMTP, SendGrid, AWS SES providers)
- Logging: Winston with rotating file transports
- Framework: React 19 with Vite
- Language: TypeScript (strict mode)
- Routing: React Router 8
- State Management: TanStack Query (React Query) + Zustand
- Visualisation: Chart.js
- Styling: CSS Modules with Design Tokens
- Error Tracking: Sentry (optional, via
VITE_SENTRY_DSN)
- TypeScript types and interfaces
- Constants and enumerations
- Utility functions
- Unit / Integration: Vitest
- End-to-End: Playwright (frontend) + Vitest (backend)
- Load Testing: k6 (10 pre-built scenarios)
- Linting: ESLint + Stylelint
- Formatting: Prettier
- Git Hooks: Husky + lint-staged
scrumooth/
├── packages/
│ ├── backend/ # Express.js REST API
│ │ ├── src/
│ │ │ ├── controllers/ # API route handlers
│ │ │ ├── services/ # Business logic layer
│ │ │ ├── middleware/ # Express middleware
│ │ │ ├── routes/ # API route definitions
│ │ │ ├── utils/ # Utility functions
│ │ │ └── __tests__/ # Unit, integration, and e2e tests
│ │ ├── prisma/ # Database schema and migrations
│ │ ├── Dockerfile # Production image
│ │ └── Dockerfile.dev # Development image
│ ├── frontend/ # React + Vite frontend
│ │ ├── src/
│ │ │ ├── components/ # React components
│ │ │ ├── pages/ # Route-level pages
│ │ │ ├── hooks/ # Custom React hooks
│ │ │ ├── services/ # API client services
│ │ │ ├── stores/ # Zustand stores
│ │ │ └── styles/ # CSS and design tokens
│ │ ├── e2e/ # Playwright end-to-end tests
│ │ ├── Dockerfile # Production image
│ │ └── Dockerfile.dev # Development image
│ └── shared/ # Shared types, constants, utilities
├── docs/
│ ├── api/ # REST API reference
│ ├── architecture/ # System design, data model, security
│ ├── deployment/ # Deployment guides
│ └── user-guide/ # User documentation and guides
├── k6/ # Load testing scenarios (k6)
│ └── scripts/scenarios/ # pre-built load test scenarios
├── scripts/ # Build and utility scripts
├── .github/workflows/ # CI, Release, and GitHub Pages deployment
├── docker-compose.yml # Production Docker Compose
├── docker-compose.dev.yml # Development Docker Compose
├── CHANGELOG.md # Version history
├── SECURITY.md # Security policy and reporting
├── CONTRIBUTING.md # Contributing guidelines
├── CODE_OF_CONDUCT.md # Community code of conduct
└── THIRD-PARTY-NOTICES.md # Third-party License attributions
The fastest way to run a local instance is with Docker Compose:
git clone https://github.com/orbivort/scrumooth.git
cd scrumooth
cp packages/backend/.env.production.example packages/backend/.env.production
docker compose up -dThis starts the Caddy reverse proxy, backend, frontend, and PostgreSQL. Once running, open http://localhost (HTTPS is enabled by default on port 443). For a full manual setup (without Docker), see Installation.
Note: The production compose stack requires
packages/backend/.env.production. If you prefer a fully pre-configured, hot-reloading development environment, usedocker compose -f docker-compose.dev.yml upinstead.
- Node.js v24.19.0 or higher
- pnpm v11.21.0 or higher
- PostgreSQL v18 or higher
- Docker & Docker Compose (optional, for the Quick Start)
git clone https://github.com/orbivort/scrumooth.git
cd scrumoothThis project uses pnpm as its package manager. The project enforces pnpm through preinstall scripts.
pnpm installCopy the example environment files and configure your settings:
# Backend configuration
cp packages/backend/.env.example packages/backend/.env
# Frontend configuration
cp packages/frontend/.env.example packages/frontend/.envEdit the environment files with your configuration:
Backend (packages/backend/.env):
# Database Configuration
DATABASE_URL=postgresql://postgres:password@localhost:5432/scrumooth
# JWT Configuration (generate with: openssl rand -hex 64)
JWT_SECRET=your-64-character-secret-key-here
# CORS Configuration
CORS_ORIGIN=http://localhost:5173
# Optional: restrict new-account registration to specific email domains.
# Leave empty/unset for open registration. Enforced server-side (HTTP 403 on
# disallowed domains). Tenant-control gate only, not email verification.
REGISTRATION_ALLOWED_EMAIL_DOMAINS=example.com,example.euFrontend (packages/frontend/.env):
# Backend API URL
VITE_API_URL=http://localhost:5001/api/v1
# Use mock API (set to false for real backend)
VITE_USE_MOCK_API=falseGenerate the Prisma client, then create your database schema. For local development you can use either approach:
# Generate Prisma client (always required)
pnpm run db:generate
# Option A: Push schema directly (fast iteration, no migration files)
pnpm run db:push
# Option B: Create and apply a migration (recommended for tracked changes)
pnpm run db:migrateFor production deployments use pnpm run db:migrate:prod to apply existing migrations without prompting.
pnpm run devThis will start both the backend and frontend servers concurrently. To run them independently:
pnpm run dev:backend # Backend only (http://localhost:5001)
pnpm run dev:frontend # Frontend only (http://localhost:5173)For developers, the closest analogy is a linter for your Scrum process — with the difference that matters built in: a linter reports a violation, a gate refuses it.
The most common commands for everyday development:
| Task | Command |
|---|---|
| Start backend + frontend | pnpm run dev |
| Start backend only | pnpm run dev:backend |
| Start frontend only | pnpm run dev:frontend |
| Build all packages | pnpm run build |
pnpm run test # All tests
pnpm run test:coverage # With coverage report
pnpm run test:unit # Unit tests only
pnpm run test:integration # Backend integration tests
pnpm run test:e2e # End-to-end (backend Vitest + frontend Playwright)
pnpm run test:watch # Watch modeCoverage thresholds enforced: 80% lines, functions, statements, branches.
Pre-built load test scenarios live under k6/scripts/scenarios/. Copy k6/.env.k6.example to k6/.env.k6, configure your target, then run a scenario such as:
pnpm run loadtest:normal # Realistic everyday load
pnpm run loadtest:peak # Sprint planning rush (worst-case concurrency)
pnpm run loadtest:stress # Push the system until it breaksPrerequisite: Install k6 and ensure your target backend is running. Ten scenarios live in
k6/scripts/scenarios/; theloadtest:*scripts inpackage.jsonexpose eight of them, including endurance, multi-team, daily-scrum, auth, and database stress.
| Task | Command |
|---|---|
| Lint (ESLint) | pnpm run lint |
| Lint & auto-fix | pnpm run lint:fix |
| Lint CSS (Stylelint) | pnpm run lint:css |
| Format (Prettier) | pnpm run format |
| Type check | pnpm run typecheck |
| Security audit | pnpm run audit |
See CONTRIBUTING.md for the full development workflow and quality gates.
pnpm run db:generate # Generate Prisma client (after schema changes)
pnpm run db:migrate # Create and apply a migration (development)
pnpm run db:migrate:prod # Apply migrations in production (non-interactive)
pnpm run db:studio # Open Prisma Studio (database GUI)Additional database commands (db:push, db:reset, db:validate, db:migrate:test) are documented in CONTRIBUTING.md.
The project includes Docker configuration for both development and production deployment.
# Development environment (with hot reload)
docker compose -f docker-compose.dev.yml up
# Production environment (detached)
docker compose up -d
# Tear down
docker compose downNote: All Dockerfiles reference repository-root-relative paths (monorepo workspace files such as
package.json,pnpm-lock.yaml, andpackages/shared/). You must build them from the repository root and use-fto point at the Dockerfile — passing the package directory as the build context will fail.
# Development images (with dev dependencies and watch mode)
docker build -t scrumooth-backend:dev -f packages/backend/Dockerfile.dev .
docker build -t scrumooth-frontend:dev -f packages/frontend/Dockerfile.dev .
# Production images (build from the repo root)
docker build -t scrumooth-backend -f packages/backend/Dockerfile .
docker build -t scrumooth-frontend -f packages/frontend/Dockerfile .Using a registry/apt mirror
If you are behind a network that requires an npm registry or apt mirror, you can set them as build arguments or environment variables:
# Docker Compose
$env:NPM_REGISTRY="https://your_mirror_url"
$env:APT_MIRROR="your_mirror_url"
# Manual build
docker build --build-arg NPM_REGISTRY=https://your_mirror_url --build-arg APT_MIRROR=your_mirror_url .See docs/deployment/DEPLOYMENT.md for full production deployment guidance covering environment configuration, database migration, reverse-proxy setup, and operational best practices.
The main branch is automatically deployed to GitHub Pages via the Deploy to GitHub Pages workflow, using an in-memory mock API (no backend or database required). See the Live Demo above to try it.
| Area | Location |
|---|---|
| User guide | docs/user-guide/ — getting started, core features, Scrum workflows |
| REST API reference | docs/api/ — endpoint groups covering authentication, sprints, backlog, reports, and more |
| System architecture | docs/architecture/ — system design, data model, component design, security architecture |
| Deployment guide | docs/deployment/DEPLOYMENT.md |
| Security policy | SECURITY.md — vulnerability reporting procedure |
| Contributing | CONTRIBUTING.md — guidelines and development workflow |
| Code of conduct | CODE_OF_CONDUCT.md — community standards |
| Release history | CHANGELOG.md |
| Third-party notices | THIRD-PARTY-NOTICES.md |
The shared package must be built before backend/frontend can resolve imports.
pnpm --filter=@scrumooth/shared run buildThis is normally handled automatically by pnpm install and the dev scripts, but is required after a manual pnpm run clean.
The repository enforces pnpm via a preinstall script. Install pnpm globally:
npm install -g pnpm@11.21.0Verify your DATABASE_URL in packages/backend/.env points to a running PostgreSQL 18+ instance, and that the database exists. Run pnpm run db:validate to validate the Prisma schema against the connection.
Default ports can be overridden via environment variables:
- Backend:
PORTinpackages/backend/.env - Frontend:
VITE_DEV_PORTinpackages/frontend/.env
Check that VITE_API_URL in packages/frontend/.env matches the actual backend address and that CORS_ORIGIN in packages/backend/.env allows the frontend origin.
Set VITE_USE_MOCK_API=true in packages/frontend/.env to use the same mock API that powers the live demo.
Scrumooth is under active development. The priorities below deepen what Scrumooth enforces rather than widening it into a general-purpose tracker:
- Scrum Guide conformance report — a per-Sprint statement of which rules applied, and how each was met
- Exportable Sprint evidence pack — a shareable record for audits and compliance reviews
- More enforceable rules — expanding the covered surface of the 2020 Scrum Guide
- Deeper Definition of Done / Definition of Ready automation
- Reporting that surfaces process drift, not just delivery metrics
- Integrations and webhooks, so Scrumooth can sit alongside the tools you already use
- Performance and scalability hardening
The project status and latest changes are tracked in the CHANGELOG. Feedback and feature requests are welcome via GitHub Issues.
Contributions are welcome! Please read CONTRIBUTING.md for development workflow, code standards, and the pull request process, and review the CODE_OF_CONDUCT.md before participating.
This project is licensed under the Apache License 2.0.
Judge a Scrum tool by the rules it keeps, not by the boards it draws.
