A single-page, client-side dashboard for tracking bug closure performance against Turnaround Time (TAT) SLAs. Upload your bug list (Excel or CSV export) and it renders KPIs, charts, and a breach-tracking table — no server, no data upload, everything runs in your browser.
Live version: enable GitHub Pages for this repo (Settings → Pages → Deploy
from branch → main / / (root)) and it will be served at
https://<your-username>.github.io/Bug_Tracker/.
- Bug Closure % within TAT — the headline KPI: of all closed bugs (Closed / Rejected / Bugs Treatment), what % were closed within their priority's TAT window.
- TAT rules (all in working days, Mon–Fri, minus configured holidays):
- High priority: 2 working days
- Medium priority: 7 working days
- Low priority: 30 working days
- Breach tracking — open bugs past their TAT deadline are flagged as "Breached." You can mark a breach as Accepted (e.g. an acknowledged exception) with an optional note — it's excluded from the Breached KPI/chart but stays visible in the table with an "Undo accept" option.
- Filters by created date range, priority, status, project, assignee, and free-text search.
- Every chart has a "Table view" toggle for an accessible, sortable data view.
- Light theme by default, with a dark mode toggle.
- Open
index.html(via GitHub Pages, orserve.ps1locally — see below). - Click Load sample data to preview with synthetic data, or Upload Excel / CSV to load your real export.
- Confirm the column mapping dialog — columns are auto-detected, but you can correct any that don't match.
- Adjust Settings (gear icon) if needed:
- TAT working days per priority
- Which status values count as "closed"
- Public holidays to exclude from working-day counts (none are pre-loaded — add your organization's holidays here)
All settings and accepted-breach decisions are saved in your browser's
localStorage, so they persist across reloads and re-uploads on the same machine.
The dashboard auto-detects columns by header name (case-insensitive). It was built against an OpenProject/Jira-style work-package export, so these headers are recognized out of the box:
| Purpose | Recognized headers |
|---|---|
| Bug ID | id |
| Subject | Subject, Title, Summary |
| Status | Status |
| Priority | Priority (must contain High / Medium / Low) |
| Created date | Created on, Created date, Created |
| Closed date (optional) | Closed date, Closed on, Resolution date, Resolved on/date |
| Fallback closure date | Updated on, Updated date, Updated |
| Assignee | Assignee, Assigned to |
| Project | Project |
| Category | Category, Module |
If your sheet has an explicit "Closed Date" / "Resolution Date" column, map it —
otherwise the dashboard uses Updated on as the closure timestamp for closed bugs.
Dates are read as DD-MM-YYYY (also accepts DD/MM/YYYY, with or without a
time suffix, and native Excel date cells).
No build step and no Node/Python dependency required. To preview locally on Windows:
powershell -ExecutionPolicy Bypass -File serve.ps1 -Port 5500Then open http://localhost:5500/. (This is only for local preview — GitHub
Pages serves the static files directly, no server needed.)
index.html loads style.css, sample-data.js, and app.js with a ?v=N
query string. Browsers can aggressively cache these files on GitHub Pages, so
bump the v=N number in index.html on every deploy that changes those
files — otherwise returning visitors may keep running stale JS/CSS after a
hard refresh isn't done. If a dashboard update doesn't seem to show up for a
user, ask them to hard-refresh (Ctrl+Shift+R) first.
Your bug data never leaves the browser — parsing happens entirely client-side via SheetJS. Nothing is uploaded anywhere, which is also why this works unmodified on GitHub Pages.
index.html Page shell
assets/css/style.css Styling (light/dark theme)
assets/js/app.js Parsing, TAT engine, filters, charts
assets/js/sample-data.js Synthetic sample data (not real bug data)
assets/vendor/ Vendored Chart.js + SheetJS (offline-friendly)
serve.ps1 Local static file server for development