Sprint capacity planning tool that calculates team Focus Factor and prevents overcommitment.
Calculates Focus Factor - the percentage of working time a team spends on product work vs. operational overhead (support, meetings, unplanned tasks, wind corrections). Shows how much the team can realistically take into a sprint.
| Metric | Formula | Description |
|---|---|---|
| Total Time | workingDays * 8 |
Total available hours |
| Task Time | Total Time - (Processes + Support + Meetings + FlyIn + Wind) |
Hours available for product work |
| Focus Factor | (Task Time / Total Time) * 100 |
% of time on product work |
| Effective Capacity | Total Time - Wind |
Hours excluding external factors |
| Adjusted Focus | (Task Time / Effective Capacity) * 100 |
Focus adjusted for partial availability |
| Realistic Capacity | Total Time * (Focus Factor / 100) |
Hours you can actually plan for |
| Metric | Formula | Threshold |
|---|---|---|
| Stability Factor | 1 - (FlyIn / Total Time) |
Below 0.85 = unstable planning |
| Support Ratio | Support / Total Time |
Above 0.25 = quality issues |
| Team Focus | sum(Task Time) / sum(Total Time) |
Team-wide aggregate |
| Range | Status | Meaning |
|---|---|---|
| 0-49% | Critical | Team is overwhelmed with operational work |
| 50-74% | Warning | Working, but unstable - room to optimize |
| 75%+ | Healthy | Strong concentration on product work |
Raw estimate should be divided by Focus Factor to get realistic calendar time:
Realistic hours = Estimate / (Focus Factor / 100)
Example: 16h task / 0.65 focus = 24.6 calendar hours (~3 days, not 2)
- Processes - fixed recurring load: daily standups, code review, estimation, demo/retro/planning (~6h/month)
- Support - bug fixes, monitoring, consultations, legacy work
- Meetings - all meetings beyond mandatory processes
- Fly-in - unplanned tasks arriving during the sprint
- Wind - shortened days, other projects, vacations, external commitments, force majeure
- Backend: Kotlin + Spring Boot 3.3 + Spring MVC + JPA + H2/PostgreSQL + Liquibase
- Frontend: React 18 + Vite + TypeScript + Tailwind CSS + Recharts
- Tests: JUnit 5 + MockK (backend)
- Java 21+
- Node.js 18+
Open two terminals.
Terminal 1 — backend:
Windows (PowerShell):
cd backend
.\gradlew.bat bootRunLinux / macOS / WSL:
cd backend
./gradlew bootRunBackend starts at http://localhost:8081. Open the UI on http://localhost:5173 — the :8081 host is API-only (no UI at /).
Terminal 2 — frontend:
cd frontend
npm install
npm run devFrontend starts at http://localhost:5173. API requests are proxied to backend.
HTTP Basic auth is required for every non-public API endpoint. Defaults come from application.yml:
security:
api:
user: ${API_USER:admin}
password: ${API_PASSWORD:admin}So locally the login is admin / admin. Override with env vars API_USER and API_PASSWORD for any non-dev environment.
Public (no-auth) endpoints:
GET /api/share/{token}(rate-limited, 30 req/min per IP; share links expire 90 days after sprint creation)GET /api/config/thresholdsGET /api/config/member-rolesGET /actuator/healthGET /swagger-ui.html,GET /v3/api-docs(OpenAPI)
OpenAPI 3 / Swagger UI is bundled. After bootRun:
- Swagger UI:
http://localhost:8081/swagger-ui.html - Raw spec:
http://localhost:8081/v3/api-docs
Demo teams, members and sprints are loaded from backend/src/main/resources/demo-data.json at startup — only when the database has no teams yet.
Enable/disable via env:
SEED_ENABLED=true # default in dev
SEED_ENABLED=false # default in prodcd backend && ./gradlew test- Teams and members with roles (Developer / Tech Lead / QA / DevOps)
- Sprint lifecycle: Planning → In progress → Closed. Hours are editable only in Planning; once the sprint starts or is closed, the table is read-only
- Per-member hour entry with live Focus Factor recalculation
- Sprint report with colour-coded metrics, time-breakdown chart, and recommendations
- Sprint-vs-sprint compare page (multi-select) with Δ column and side-by-side chart
- Teams compare page: per-team averages + trend chart on sprint index (comparable across different naming schemes)
- Focus Factor / Stability / Support Ratio trends over sprints
- Recommendations engine with codes, localised on the client
- Shareable public report link via UUID token
- CSV export of a sprint report
- i18n (EN default, ES). All UI strings localised; tooltips / help are always EN
- Light / dark theme
- Inline tooltips on every KPI, input column, and totals row
- Guide page with full instructions
- Two demo teams (Backend, Frontend) seeded from JSON at startup, toggle with
SEED_ENABLED - Thresholds configurable via
application.yml(sprintpulse.thresholds.*);app_configtable overrides at runtime
backend/ # Kotlin Spring Boot API
src/main/kotlin/com/sprintpulse/
controller/ # REST controllers
service/ # Business logic
model/ # JPA entities
dto/ # Request/response DTOs
config/ # Spring configuration
src/main/resources/
db/changelog/ # Liquibase SQL migrations
src/test/kotlin/ # Unit tests
frontend/ # React + Vite + TypeScript
src/
api/ # API client
components/ # Reusable UI components
ui/ # shadcn/ui primitives
pages/ # Page components
hooks/ # Custom hooks
i18n/ # i18next + locales/en.json, locales/es.json
lib/ # Utilities (csv export, cn)
types/ # TypeScript types
MIT - see LICENSE.
You are free to use, modify and distribute this code, commercially or not, as long as the copyright notice and license text stay included.






