Skip to content

tiana-code/sprint-pulse

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SprintPulse

Sprint capacity planning tool that calculates team Focus Factor and prevents overcommitment.

What it does

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.

Dashboard

Formulas

Core metrics

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

Health indicators

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

Color interpretation

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

Estimate correction

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)

Closed sprint report

Closed sprint report

Time categories

  • 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

Tech stack

  • 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)

Quick start

Prerequisites

  • Java 21+
  • Node.js 18+

Run backend and frontend

Open two terminals.

Terminal 1 — backend:

Windows (PowerShell):

cd backend
.\gradlew.bat bootRun

Linux / macOS / WSL:

cd backend
./gradlew bootRun

Backend 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 dev

Frontend starts at http://localhost:5173. API requests are proxied to backend.

Credentials

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/thresholds
  • GET /api/config/member-roles
  • GET /actuator/health
  • GET /swagger-ui.html, GET /v3/api-docs (OpenAPI)

API docs

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 data

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 prod

Run tests

cd backend && ./gradlew test

Features

  • 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_config table overrides at runtime

Screens

Sprint planning (editable)

Planning

Compare sprints (side-by-side with deltas)

Compare

Teams comparison

Teams comparison

Trends over sprints

Trends

Guide

Guide

Project structure

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

License

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.

About

Sprint capacity planning for engineering teams. Calculates Focus Factor, stability and support ratio from real working hours, visualizes trends, compares sprints. Kotlin/Spring Boot + React/TypeScript

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

No contributors