{"id":50785610,"url":"https://github.com/olegstan/jira-estimate-column-sum","last_synced_at":"2026-06-12T07:34:30.768Z","repository":{"id":362521082,"uuid":"1259304733","full_name":"olegstan/jira-estimate-column-sum","owner":"olegstan","description":"Chrome extension that sums Jira Original Estimate hours per board column and highlights cards without an estimate. Time tracking helper for Scrum/Kanban.","archived":false,"fork":false,"pushed_at":"2026-06-04T14:56:22.000Z","size":55,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-04T16:18:50.676Z","etag":null,"topics":["agile","chrome-extension","estimate","javascript","jira","jira-board","kanban","manifest-v3","productivity","scrum","story-points","time-tracking"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/olegstan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-04T11:29:16.000Z","updated_at":"2026-06-04T14:59:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/olegstan/jira-estimate-column-sum","commit_stats":null,"previous_names":["olegstan/jira-estimate-column-sum"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/olegstan/jira-estimate-column-sum","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olegstan%2Fjira-estimate-column-sum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olegstan%2Fjira-estimate-column-sum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olegstan%2Fjira-estimate-column-sum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olegstan%2Fjira-estimate-column-sum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/olegstan","download_url":"https://codeload.github.com/olegstan/jira-estimate-column-sum/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olegstan%2Fjira-estimate-column-sum/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34234557,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agile","chrome-extension","estimate","javascript","jira","jira-board","kanban","manifest-v3","productivity","scrum","story-points","time-tracking"],"created_at":"2026-06-12T07:34:29.460Z","updated_at":"2026-06-12T07:34:30.757Z","avatar_url":"https://github.com/olegstan.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Jira Estimate Summary — sum Original estimate hours per board column\n\n\u003e Chrome extension that totals the **Original estimate** hours for every column on a Jira\n\u003e board (Scrum \u0026 Kanban) and highlights cards that have no estimate. A lightweight time\n\u003e tracking / capacity-planning helper for Agile teams.\n\n![Manifest V3](https://img.shields.io/badge/Manifest-V3-blue)\n![Platform](https://img.shields.io/badge/platform-Chrome-brightgreen)\n![License](https://img.shields.io/badge/license-MIT-green)\n\nChrome extension for Jira boards. It sums up the **Original estimate** for each column,\nconverts time (`30m`, `10h`, `1h`, `1d`, including compound values like `1d 2h 30m`) into hours and\nshows the total in the column header. Cards without an estimate are highlighted in pink,\nand their count is displayed next to the total (`5 without time`).\n\nRecalculation happens automatically when filters change and as more cards are loaded\n(via `MutationObserver`).\n\n\u003c!-- Add a screenshot/GIF here — it boosts click-through and dwell time, both indirect ranking signals:\n![Screenshot](docs/screenshot.png)\n--\u003e\n\n**Keywords:** Jira board estimate sum, Jira column total hours, Jira original estimate,\nJira time tracking extension, Chrome extension for Jira, Agile / Scrum / Kanban estimate totals.\n\n## Structure\n\nThe code is split by responsibility (SOLID/KISS): each module solves a single task,\nand the orchestrator only wires them together and decides \"when to recalculate\".\n\n```\njira-ext/\n├── manifest.json        # extension manifest (MV3)\n├── src/\n│   ├── estimate.js      # estimate-to-hours conversion + formatting (pure functions)\n│   ├── settings.js      # load/observe settings from chrome.storage\n│   ├── store.js         # board tasks + column totals\n│   ├── board.js         # board DOM: banner placement, card highlighting\n│   ├── content.js       # orchestrator: receive API data, render, watchdog\n│   ├── net/\n│   │   ├── interceptor.js  # MAIN-world: intercept board API responses → postMessage\n│   │   └── board-api.js    # parse fetchBoardData response → task list\n│   ├── styles.css       # banner and highlight styles\n│   ├── popup.html       # settings (on/off, hours per day/week)\n│   └── popup.js\n├── fixtures/            # anonymized example API responses (for debugging)\n├── tools/anonymize.mjs  # anonymize raw API dumps\n├── part.html            # reference Jira board markup (for development)\n└── README.md\n```\n\nOne-way data flow:\n\n```\ninterceptor.js (MAIN) → postMessage → content.js → board-api → estimate → store\n                                                          ↓\n                                              board (banners/highlighting)\n```\n\nSingle-responsibility modules, tested independently.\n\n## Installation\n\n1. Open `chrome://extensions`.\n2. Enable **Developer mode**.\n3. **Load unpacked extension** → select the `jira-ext` folder.\n4. Open a Jira board (`*.atlassian.net`) — the total will appear in the column headers.\n\n## Settings\n\nExtension icon → popup:\n\n- **Enabled** — turn the count on/off.\n- **Hours per day** — how many hours are in `1d` (default 8).\n- **Days per week** — how many days are in `1w` (default 5).\n\n## Hour conversion logic\n\n| Unit | Meaning             |\n|------|---------------------|\n| `m`  | minutes (`/60`)     |\n| `h`  | hours               |\n| `d`  | `hoursPerDay` hours |\n| `w`  | `daysPerWeek × hoursPerDay` |\n\n## Data source and virtualization\n\nJira keeps only visible cards in the DOM, so reading estimates from HTML is not reliable —\nthe data is incomplete while scrolling. Instead, the extension intercepts the board API\nresponse (`/rest/boards/.../fetchBoardData`), which contains **all** board tasks regardless of\nscrolling, with the `estimation` and `isVisible` fields. The total is computed from this response.\n\n- `isVisible: false` → the card is hidden by an active quick filter and is not counted.\n- `columns[].name` matches the column name on the board, which is used to place the banner.\n- When the filter/sprint changes, Jira itself issues a new request — the interceptor catches it,\n  the store is refilled, and the totals are recalculated. Scrolling does not affect the data.\n\nThe DOM is used only to place the banner in the header and to highlight visible cards\nwithout an estimate (based on data from the API).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folegstan%2Fjira-estimate-column-sum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Folegstan%2Fjira-estimate-column-sum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folegstan%2Fjira-estimate-column-sum/lists"}