Inspiration

Every sprint review starts the same way: the Scrum Master opens the board, counts cards in each column, eyeballs velocity, and tries to remember whether the sprint even had a goal. Sprint health is scattered across burndown charts, boards, and meeting notes — but there's no single, instant, at-a-glance answer to the simplest question in agile: "Is this sprint healthy?" We wanted that answer to be one click away, inside Jira, with zero setup.

What it does

SprintPulse adds a Sprint Health page to any Jira Software project that shows, for any active or future sprint on the board:

  • Overall health — traffic-light status driven by completion rate
  • Scope-change risk — heuristic based on sprint size (low / medium / high)
  • Sprint goal commitment — instantly flags sprints running without a goal
  • A live metrics table — total issues, Done / In Progress / To Do counts, completion rate, and the goal itself

Everything is computed from live Jira data at page-load time — select a different sprint from the dropdown and the whole dashboard updates in under a second. No configuration, no syncing, no external service.

How we built it

  • Atlassian Forge, using a Jira Project Page module with native UI Kit rendering (render: native)
  • Frontend-only architecture: instead of a backend resolver, the UI calls the Jira Agile REST API directly via requestJira from @forge/bridge. Every call runs as the viewing user — no app credentials, no stored tokens, no data leaves Atlassian
  • UI Kit components (@forge/react): Select, Lozenge, DynamicTable, SectionMessage, Spinner, Heading
  • Health computation: issues are bucketed by Jira status category (new → To Do, indeterminate → In Progress, done → Done); completion rate ≥80% = healthy, ≥50% = at-risk, below = critical
  • Least-privilege scopes — the app requests only what the linter proved it needs: read:sprint:jira-software, read:issue-details:jira, read:jql:jira
  • MIT-licensed Tabler "activity-heartbeat" icon (attribution in README)

Challenges we ran into

  • UI Kit's mental model: our first refactor removed the React import, and the app died with React is not defined — UI Kit JSX compiles to React.createElement, so React must be in scope while components come from @forge/react. Painful, unforgettable lesson.
  • Scope discovery: broad scopes like read:jira-work weren't accepted by Forge's linter for Agile endpoints; it demanded the granular software scopes and even triggered a major-version upgrade approval when we changed them.
  • Jira's status vocabulary: "In Progress" issues live in a category called indeterminate — our first health counts were all wrong until we mapped categories correctly.
  • Static assets: an icon bundled in the app directory is not shipped for native-rendered UI Kit apps, which taught us to use a verifiably licensed hosted icon instead.

Accomplishments that we're proud of

  • A zero-backend Forge app: no functions, no storage, no egress — the entire app is one frontend file that talks to Jira as the current user. That's a security posture most Marketplace apps can't claim.
  • First-time Forge developers shipping a deployed, installed, scope-upgraded app — including surviving a major-version bump mid-hackathon.
  • Real data, real fast: live sprint metrics rendering in under a second.

What we learned

  • The Forge lifecycle end-to-end: manifest, modules, environments, deploy vs install vs upgrade, and how the linter acts as a guardrail for scopes, runtimes, and API usage.
  • When to prefer bridge API calls over resolvers — simpler, fewer moving parts, better least-privilege.
  • The Jira Agile REST API's shape: boards, sprints, and the surprisingly named status categories.

What's next for SprintPulse

  • Rovo AI agent that narrates sprint health in plain language and suggests corrective actions (and a shot at the Best Rovo/AI bonus prize)
  • Historical trends using Forge Storage: snapshot health daily via a scheduled trigger and chart scope creep over time
  • Confluence export of the health report for sprint reviews, and Slack/Teams alerts when a sprint flips to critical
  • Atlassian Marketplace listing with per-board configuration

Built With

Share this project:

Updates

Submission history