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
requestJirafrom@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 toReact.createElement, so React must be in scope while components come from@forge/react. Painful, unforgettable lesson. - Scope discovery: broad scopes like
read:jira-workweren'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,
deployvsinstallvsupgrade, 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
Log in or sign up for Devpost to join the conversation.