Transform Jira data into interactive, decision-oriented HTML dashboards — instantly.
Delivery Intelligence · Workload Analytics · Sprint Health · Roadmap Tracking · What-If Simulation · Risk Detection
What is FlowBoard? • Screenshots • Features • Installation • Quick Start • Configuration • Dashboard • CLI • Architecture • Testing
FlowBoard is a Jira-powered delivery intelligence tool that generates self-contained HTML dashboards for engineering managers, Scrum masters, product owners, and leadership. It fetches live data from Jira Cloud, Server, or Data Center, runs analytics locally, and produces a single portable HTML file — no server, no database, no ongoing infrastructure.
Open the file in any browser and get immediate answers to the questions that drive delivery decisions:
- Who is overloaded? — capacity matrix with per-person story points, WIP counts, and overload alerts
- Is the sprint on track? — progress bars, blocked items, aging work, carry-over risk
- Are epics slipping? — roadmap timeline with progress percentages and risk badges
- Where are delivery risks? — automated risk detection across six categories
- What's blocking us? — dependency chains, critical blockers, cross-team friction
- What happens if we add a resource to API? — what-if capacity simulation with instant metric deltas
- Are there scheduling conflicts? — resource contention, priority pile-ups, timeline overlaps
- How healthy is the team? — sprint goals, velocity trends, blocker patterns
Executive Summary with metric cards, status distribution charts, risk severity breakdown, team story points, top risk signals, product progress with epic tracking, and ceremony mode — all in a single scrollable view.
Sprint Health tab with progress bars, completion tracking, sprint goals with blocked item alerts, scope change analysis with churn percentages, and capacity vs. commitment table per team.
Interactive capacity simulation with Gantt-style before/after timelines, "Best Next Hire" recommendation engine, preset scenarios, and overlap reduction tracking — shown here in Kanban mode.
- Automated Risk Detection — identifies overload, aging work, blocked chains, scope creep, sprint danger, and deadline risk across every issue
- Dependency Analysis — maps blocking chains, critical blockers, and cross-team dependencies with source/target status tracking
- Workload Distribution — per-person and per-team story point allocation with configurable overload thresholds
- Sprint Health Scoring — progress percentages, blocked item counts, aging alerts, and carry-over risk indicators
- Roadmap Tracking — epic-level timeline with progress bars, start/target dates, owner attribution, and risk badges
- Conflict Detection — surfaces resource contention, priority pile-ups, and timeline overlaps automatically
- Executive Summary — instant-scan cards for total issues, blocked items, open story points, critical risks, and overloaded team members
- Severity Classification — risk signals sorted and color-coded by severity with configurable display modes
- Chart Analytics — Chart.js-powered doughnut, bar, and stacked charts for status distribution, type breakdown, and workload visualization
- 8 Main Tabs — Overview, Workload, Sprints, Timeline, PI / Roadmap, Insights, Dependencies, and Issues
- 17 Sub-Views — each tab expands into focused views (timeline alone has 6 modes: Assignee, Team, Epic, Conflict, Executive, Simulation)
- 5 Built-In Themes — light, dark, midnight, slate, and system (auto-detect) — switchable at runtime
- Settings Drawer — 36 controls across 5 cards for branding, thresholds, layout, chart, and timeline configuration
- Global Search & Filter — search/filter across all issue tables, timeline swimlanes, and dependency graphs
- JSON & CSV Export — export workload data, risk registers, and full issue lists in structured formats
- Zoom & Navigation — timeline zoom controls, today marker, sprint boundaries, and swimlane filtering
- Responsive Layout — density modes (compact, comfortable, spacious) with field-level visibility controls
- Config Import/Export — save and restore dashboard settings as JSON with schema validation
- What-If Scenarios — model the impact of adding or removing team members before making staffing decisions
- Preset Scenarios — auto-generated "add one person to each team" presets for quick comparison
- Custom Scenarios — define arbitrary resource changes across multiple teams in a single simulation run
- Metric Deltas — instant before/after comparison of average load, max load, overloaded count, collisions, and utilization
- Team Impact Analysis — per-team scoring showing which teams benefit most from proposed changes
- Auto-Recommendations — engine-generated hiring, capacity pressure, and blocker resolution advice
- Sprint Health Dashboard — progress bars, completion percentages, and velocity indicators per sprint
- Goal Tracking — sprint goal completion status with blocked goal alerts
- Blocker Analysis — blocked item identification with aging duration and dependency chain context
- Carry-Over Risk — flags items at risk of spilling into the next sprint based on progress and remaining effort
- Aging Detection — highlights work items that have exceeded configurable age thresholds
- What is FlowBoard?
- Screenshots
- Features
- Installation
- Quick Start
- Configuration
- Jira Enterprise Integration
- Web Server Mode
- Dashboard
- Settings & Customization
- CLI Reference
- Architecture
- Internationalization
- OpsPortal Integration
- Troubleshooting
- Development
- Testing
- Documentation
- Contributing
- License
Requirements: Python ≥ 3.12
git clone https://github.com/POLPROG-TECH/FlowBoard.git && cd FlowBoard
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"Verify the installation:
flowboard version
# FlowBoard 1.0.0Corporate network (Zscaler / VPN)? If
pip installfails with SSL errors, see Corporate Network setup below.
If you're behind a corporate proxy that intercepts HTTPS (e.g. Zscaler, Netskope), you need to export the corporate CA bundle before installing dependencies or connecting to Jira.
macOS / Linux
# 1. Export corporate CA certificates (macOS)
security find-certificate -a -p \
/Library/Keychains/System.keychain \
/System/Library/Keychains/SystemRootCertificates.keychain \
> ~/combined-ca-bundle.pem
# On Linux, the CA bundle is usually already available:
# /etc/ssl/certs/ca-certificates.crt (Debian/Ubuntu)
# /etc/pki/tls/certs/ca-bundle.crt (RHEL/Fedora)
# If your proxy adds its own CA, ask your IT department for the .pem file
# and append it: cat corporate-ca.pem >> ~/combined-ca-bundle.pem
# 2. Configure SSL trust (add to ~/.zshrc or ~/.bashrc to persist)
export SSL_CERT_FILE=~/combined-ca-bundle.pem
export REQUESTS_CA_BUNDLE=~/combined-ca-bundle.pem
# 3. (Optional) Also configure git to use the same CA bundle
git config --global http.sslCAInfo ~/combined-ca-bundle.pem
# 4. Install
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
# 5. Set Jira credentials
export FLOWBOARD_JIRA_TOKEN="your-jira-api-token"
export FLOWBOARD_JIRA_EMAIL="your-email@company.com"
export FLOWBOARD_JIRA_URL="https://your-company.atlassian.net"
# 6. Start
flowboard serveWindows (PowerShell)
# 1. Export corporate CA certificate
# Ask your IT department for the corporate CA .pem file, or export it from
# certmgr.msc → Trusted Root Certification Authorities → Certificates
# Right-click → All Tasks → Export → Base-64 encoded X.509 (.CER)
# Save as: %USERPROFILE%\corporate-ca-bundle.pem
# 2. Configure SSL trust (add to your PowerShell profile to persist)
$env:SSL_CERT_FILE = "$env:USERPROFILE\corporate-ca-bundle.pem"
$env:REQUESTS_CA_BUNDLE = "$env:USERPROFILE\corporate-ca-bundle.pem"
# 3. (Optional) Also configure git to use the same CA bundle
git config --global http.sslCAInfo "$env:USERPROFILE\corporate-ca-bundle.pem"
# 4. Install
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -e ".[dev]"
# 5. Set Jira credentials
$env:FLOWBOARD_JIRA_TOKEN = "your-jira-api-token"
$env:FLOWBOARD_JIRA_EMAIL = "your-email@company.com"
$env:FLOWBOARD_JIRA_URL = "https://your-company.atlassian.net"
# 6. Start
flowboard serveTip: To make environment variables permanent on Windows, use
[System.Environment]::SetEnvironmentVariable("SSL_CERT_FILE", "$env:USERPROFILE\corporate-ca-bundle.pem", "User")or set them via System Properties → Environment Variables.
# Start the dashboard server
flowboard serve
# → http://127.0.0.1:8084The dashboard launches with a setup page if no configuration exists, and streams real-time progress via SSE during analysis.
No Jira? Run
flowboard demoto generate a fully populated dashboard from built-in mock data. Or start the server and trigger demo via API:curl -X POST http://127.0.0.1:8084/api/demo
-
Configure — copy the example and fill in your Jira details:
cp examples/config.example.json config.json
-
Validate — ensure the config is correct before fetching:
flowboard validate-config --config config.json
-
Verify — test connectivity to your Jira instance:
flowboard verify --config config.json
-
Generate — fetch data and produce the dashboard:
flowboard generate --config config.json
-
Open — view the result in any browser:
open output/dashboard.html
Minimal configuration to get started:
{
"jira": {
"base_url": "https://your-org.atlassian.net",
"projects": ["PROJ"]
},
"output": {
"path": "output/dashboard.html"
}
}| Variable | Purpose |
|---|---|
FLOWBOARD_JIRA_TOKEN |
Jira API token (Cloud) or Personal Access Token (Server/DC) |
FLOWBOARD_JIRA_EMAIL |
Jira account email (required for Cloud basic auth) |
FLOWBOARD_JIRA_URL |
Override jira.base_url from config |
FLOWBOARD_LOCALE |
Override locale (en or pl) |
export FLOWBOARD_JIRA_EMAIL="you@company.com"
export FLOWBOARD_JIRA_TOKEN="your-jira-api-token"- JSON Schema Validation — every config file validated against
config.schema.jsonbefore execution - Environment Variable Overrides — credentials and locale injected via
FLOWBOARD_JIRA_*variables, never stored in config - Config Import/Export — share dashboard configurations across teams with portable JSON files
- Sensible Defaults — minimal required config (Jira URL + project key + output path) with everything else optional
See docs/configuration.md for the full configuration reference with all keys, defaults, and examples.
FlowBoard connects to Jira Cloud, Jira Server, and Jira Data Center via REST API.
- Basic Auth — email + API token (Jira Cloud)
- Bearer / PAT — Personal Access Token (Jira Server & Data Center)
- Custom Fields — map organisation-specific fields for story points, sprints, and epics
- Environment Variable Override — inject credentials at runtime without touching config files
See docs/jira-enterprise.md for setup instructions, field mappings, and authentication details.
The web server is FlowBoard's primary operating mode. It serves an interactive dashboard via FastAPI with Jinja2 SSR, provides a REST API, and streams analysis progress in real time over SSE.
flowboard serve [OPTIONS]| Option | Default | Description |
|---|---|---|
--config, -c |
config.json |
Path to Jira configuration file |
--host |
127.0.0.1 |
Bind address |
--port, -p |
8084 |
Bind port |
--verbose, -v |
off | Enable debug logging |
For programmatic or ASGI deployment:
from flowboard.web.server import create_app
app = create_app("config.json", first_run=False, root_path="")FlowBoard exposes 16 routes covering health checks, analysis control, data export, and configuration.
Health & Status
GET /health/live— liveness probeGET /health/ready— readiness probeGET /api/status— version, uptime, and analysis state
Analysis — trigger the Jira fetch + analysis pipeline, cancel running analysis, stream progress via SSE, and retrieve results.
Export — download the dashboard as self-contained HTML, CSV (issues/workload/risks), or JSON snapshot.
Demo & Configuration — generate demo dashboards from mock data, test Jira connectivity, view current config.
See docs/usage.md for detailed endpoint documentation and examples.
To embed the dashboard in an iframe (e.g., inside OpsPortal), set:
export FLOWBOARD_ALLOW_FRAMING=true| Tab | Sub-Views | Description |
|---|---|---|
| Overview | Executive Summary, Product Progress, Ceremonies | Key metric cards, status/type distribution charts, top risk signals |
| Workload | Capacity Matrix, Backlog Quality, Sprint Readiness | Per-person story points, issue counts, WIP tracking with threshold highlighting |
| Sprints | Sprint Health, Goals, Scope Changes, Capacity vs. Commitment | Progress bars, completion %, goal status, blocked items, aging, carry-over risk |
| Timeline | Assignee, Team, Epic, Conflict, Executive, Simulation | Gantt-style interactive timeline with 6 switchable modes, zoom, and filtering |
| PI / Roadmap | Sprint Slots, Epic Progress | Program Increment timeline with sprint boundaries, epic progress, and risk badges |
| Insights | Risks, Blockers, Delivery Forecast, Dependency Heatmap | Risk register, blocker aging, epic-level risk forecast, cross-team dependency matrix |
| Dependencies | Table, Heatmap | Unresolved blocking dependency table with source/target status and chain depth |
| Issues | Full Issue List | Sortable, filterable table with all normalised Jira issues and metadata |
The dashboard ships with a built-in settings drawer containing 36 controls across 5 cards:
- Branding — title, subtitle, company name, primary/secondary/tertiary colours
- Thresholds — aging days, overload points, overload issues, WIP limit, capacity per person
- Layout — density mode, visible tabs, field density, chart toggles
- Timeline — default mode, compact view, overlap visibility, sprint boundaries, today marker, default zoom
- Actions — apply, cancel, reset, import config, export config
All settings are persisted in the browser and can be exported/imported as JSON with full schema validation.
See docs/usage.md for detailed settings documentation.
| Command | Syntax | Description |
|---|---|---|
generate |
flowboard generate --config <path> [--output <path>] [--locale <code>] |
Fetch Jira data and produce the HTML dashboard |
validate-config |
flowboard validate-config --config <path> |
Validate a config file against the JSON schema |
verify |
flowboard verify --config <path> |
Test connectivity to the configured Jira instance |
demo |
flowboard demo [--output <path>] [--locale <code>] |
Generate a dashboard from built-in mock data (no Jira required) |
version |
flowboard version |
Print the FlowBoard version and exit |
src/flowboard/
├── cli/ # Typer CLI (generate, validate, verify, demo)
├── application/ # Orchestration, services
├── domain/ # Models, risk, timeline, scrum, simulation, dependencies
├── infrastructure/ # Jira client, config loader, schema validation
├── i18n/ # Translator, en.json, pl.json (927 keys)
├── presentation/ # HTML renderer, Jinja2 templates, components
└── shared/ # Types, enums, constants
Design principles:
- Domain isolation — the domain layer has zero infrastructure imports; all analytics are pure functions on domain objects
- Boundary translation — Jira JSON is normalised at the infrastructure boundary and never leaks into domain or presentation
- Snapshot-driven rendering — the presentation layer consumes a
BoardSnapshotdataclass, never raw Jira data - Schema-first config — configuration is loaded once, validated against
config.schema.json, and threaded through as an immutable object - Self-contained output — the generated HTML embeds all CSS and JavaScript inline; only Chart.js is loaded via CDN
- Extensible i18n — every user-facing string is a translation key; adding a locale requires only a new JSON file
See docs/architecture.md for the full design document.
FlowBoard ships with full internationalisation support:
| Locale | Language | Keys |
|---|---|---|
en |
English | 927 |
pl |
Polish | 927 |
- Auto-detection — locale resolved from CLI flag → environment variable → config file → system default
- Pluralisation — context-aware plural forms for counts (e.g., "1 issue" vs. "5 issues")
- Locale-aware formatting — dates, numbers, and percentages formatted per locale conventions
- Full coverage — all UI labels, tooltips, risk descriptions, settings, and export headers are translated
Set the locale via config ("locale": "pl"), CLI flag (--locale pl), or environment variable (FLOWBOARD_LOCALE=pl).
FlowBoard integrates with OpsPortal as a managed web service:
- Auto-started on port
8084viaflowboard serve --port 8084 - Health monitoring — OpsPortal polls
GET /health/live - Embedded in the OpsPortal portal UI via iframe
- Framing enabled automatically via
FLOWBOARD_ALLOW_FRAMING=true
No additional configuration is needed — OpsPortal manages the lifecycle automatically.
For detailed solutions to common issues, see docs/troubleshooting.md.
| Problem | Quick Fix |
|---|---|
| SSL certificate errors connecting to Jira | Export corporate CA bundle: export SSL_CERT_FILE=~/combined-ca-bundle.pem — see Corporate Network setup |
| 401 Unauthorized | Regenerate Jira API token, check auth_method matches server type |
| Connection timeout | Verify FLOWBOARD_JIRA_URL, check proxy settings |
| Port already in use | lsof -i :8084 -t | xargs kill -9 or use --port 9084 |
A pre-commit hook is provided that runs lint (with auto-fix), format check, and the full test suite before each commit:
cp scripts/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commitThe hook will:
- Auto-fix lint issues on staged files (
ruff check --fix) - Check formatting — if issues are found, it auto-formats and exits so you can review and re-stage
- Run the test suite — commit is blocked if any test fails
ruff check src/ tests/ # Lint
ruff format --check src/ tests/ # Format check
python -m mypy src/ # Type check (strict)python -m pytest tests/1242 tests across 41 modules covering configuration validation, Jira normalisation, workload analytics, risk detection, overlap and conflict analysis, dependency resolution, timeline rendering, scrum analytics, capacity simulation, PI planning, HTML output, CLI commands, internationalisation, accessibility, middleware security, and data integrity.
| Document | Description |
|---|---|
| docs/architecture.md | Layered architecture, design decisions, dependency rules, extensibility |
| docs/configuration.md | Full config reference with every key, type, default, and example |
| docs/jira-enterprise.md | Jira setup, authentication methods, field mappings, custom fields, server types |
| docs/dashboard.md | Dashboard tabs, sub-views, themes, settings drawer, import/export |
| docs/schema.md | JSON Schema reference, enums, validation rules, field types |
| docs/usage.md | CLI workflows, dashboard navigation, settings, common recipes |
| docs/security.md | Credential handling, auth modes, output safety, secret masking |
| docs/testing.md | Test architecture, running tests, coverage, adding new test modules |
| docs/troubleshooting.md | Common issues, Jira connectivity, config errors, dashboard problems |
See CONTRIBUTING.md for development setup, code standards, branching strategy, and contribution guidelines.
Released under the GNU Affero General Public License v3.0 (AGPL-3.0-only).


