{"id":36541217,"url":"https://github.com/overlookerjs/overlooker","last_synced_at":"2026-01-12T05:46:58.863Z","repository":{"id":40796631,"uuid":"198234714","full_name":"overlookerjs/overlooker","owner":"overlookerjs","description":"Frontend performance profiling tool","archived":false,"fork":false,"pushed_at":"2023-01-04T22:13:28.000Z","size":78288,"stargazers_count":20,"open_issues_count":17,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-22T21:11:50.452Z","etag":null,"topics":["comparing","frontend","metrics","performance","profiling","spa","tool"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/overlookerjs.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}},"created_at":"2019-07-22T14:01:49.000Z","updated_at":"2024-02-08T07:47:07.000Z","dependencies_parsed_at":"2023-02-02T21:45:16.551Z","dependency_job_id":null,"html_url":"https://github.com/overlookerjs/overlooker","commit_stats":null,"previous_names":["pyatyispyatil/overlooker"],"tags_count":91,"template":false,"template_full_name":null,"purl":"pkg:github/overlookerjs/overlooker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/overlookerjs%2Foverlooker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/overlookerjs%2Foverlooker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/overlookerjs%2Foverlooker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/overlookerjs%2Foverlooker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/overlookerjs","download_url":"https://codeload.github.com/overlookerjs/overlooker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/overlookerjs%2Foverlooker/sbom","scorecard":{"id":715173,"data":{"date":"2025-08-11","repo":{"name":"github.com/overlookerjs/overlooker","commit":"5c9451dd12e99605e9cbc9729f618ddec1fcbfe0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/tagged-release.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Binary-Artifacts","score":6,"reason":"binaries present in source code","details":["Warn: binary detected: src/cache-proxy/mitmdump/darwin/mitmdump:1","Warn: binary detected: src/cache-proxy/mitmdump/linux/mitmdump:1","Warn: binary detected: src/cache-proxy/wpr/darwin/wpr:1","Warn: binary detected: src/cache-proxy/wpr/linux/wpr:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":4,"reason":"dependency not pinned by hash detected -- score normalized to 4","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/tagged-release.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/overlookerjs/overlooker/tagged-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tagged-release.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/overlookerjs/overlooker/tagged-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tagged-release.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/overlookerjs/overlooker/tagged-release.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   1 out of   1 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":0,"reason":"80 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-cph5-m8f7-6c5x","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-w8qv-6jwh-64r5","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-8r6j-v8pm-fqw3","Warn: Project is vulnerable to: MAL-2023-462","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-pfq8-rq6v-vf5m","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-7r28-3m3f-r2pr","Warn: Project is vulnerable to: GHSA-r8j5-h5cx-65gg","Warn: Project is vulnerable to: GHSA-w7q9-p3jq-fmhm","Warn: Project is vulnerable to: GHSA-xvf7-4v9q-58w6","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-r6rj-9ch6-g264","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-hwj9-h5mp-3pm3","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-44c6-4v22-4mhx","Warn: Project is vulnerable to: GHSA-4x5v-gmq8-25ch","Warn: Project is vulnerable to: GHSA-h9rv-jmmf-4pgx","Warn: Project is vulnerable to: GHSA-hxcc-f52p-wc94","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-r628-mhmh-qjhw","Warn: Project is vulnerable to: GHSA-9r2w-394v-53qc","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-qq89-hq3f-393p","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-pq67-2wwv-3xjx","Warn: Project is vulnerable to: GHSA-8cj5-5rvv-wf4v","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T09:24:45.344Z","repository_id":40796631,"created_at":"2025-08-22T09:24:45.344Z","updated_at":"2025-08-22T09:24:45.344Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28335245,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T00:36:25.062Z","status":"online","status_checked_at":"2026-01-12T02:00:08.677Z","response_time":98,"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":["comparing","frontend","metrics","performance","profiling","spa","tool"],"created_at":"2026-01-12T05:46:57.604Z","updated_at":"2026-01-12T05:46:58.857Z","avatar_url":"https://github.com/overlookerjs.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# overlooker\n\n[![Build Status](https://travis-ci.com/overlookerjs/overlooker.svg?branch=master)](https://travis-ci.com/overlookerjs/overlooker) [![npm overlooker package](https://img.shields.io/npm/v/overlooker)](https://www.npmjs.com/package/overlooker)\n\n\nThis package is a set of utilities that allow you to configure your frontend profiling in CI/CD.\nAt the same time, you will receive comprehensive information about what your pages contain.\n\nOverlooker allows you to run batch profiling of a set of pages for all relevant metrics for the frontend. \nYou can set the number of measurements for each page, \nwrite scripts that need to be measured for execution speed, \nanalyze the content of resources on your pages, and much more..\n\nIn addition, you can use the received data to compare them with previous profiles, \nwhile receiving a report on what has changed on your pages.\n\nAs a tool for performance tests, there is an opportunity to set thresholds \nthat will limit the degradation of performance on your project and help you track what exactly led to them.\n\n* [Installation](#installation)\n* [Usage](#usage)\n  * [Configuration](#configuration-types)\n  * [Profiling](#profiling-types)\n  * [Impact Analysis](#impact-analysis-types)\n  * [Comparison](#comparison-types)\n  * [Analyzing the comparison results](#analyzing-the-comparison-results-types)\n* [Tool for getting build data](#tool-for-getting-build-data)\n  \n## Installation\n```\nnpm i overlooker\n```\n## Usage\n\n### Configuration [(types)](https://github.com/overlookerjs/overlooker/blob/master/src/types.d.ts#L321)\nFirst, let's figure out how to start profiling.\n```js\nconst config = {\n  host: 'https://example.com', // profiling host - it will be concatenated for urls of all pages\n  throttling: { // like a throttling in Chrome DevTools Performance\n    cpu: 1,\n    network: 'WiFi'\n  },\n  cookies: [{ // an array of cookies to be added for all pages when profiling\n      name: 'cookie_name',\n      value: 'cookie_value',\n      domain: 'example.com'\n    }],\n  cache: { // used cache - you can use the built-in wpr binary or use your own proxy\n    type: 'wpr'\n    // to use your own proxy:\n    // {\n    //   type: 'proxy',\n    //   host: string,\n    //   restart?: () =\u003e Promise\u003cany\u003e\n    // }\n  },\n  count: 10, // number of profiles for each page\n  platform: 'desktop', // platform which will be used for profiling (desktop|mobile)\n  pages: [{ // array of profiling pages\n    name: 'main',\n    url: '/',\n    layers: {\n      meaningfulLayer: '.selector'\n    },\n    actions: [{ // each page can include several scripts that will be executed after the page is loaded\n      name: 'test-action',\n      action: async (page) =\u003e {\n        await page.click('button');\n        await page.waitForSelector('#loaded-image');\n      }\n    }]\n  }, {\n    name: 'category',\n    url: '/'\n  }],\n  logger: (msg) =\u003e console.log(msg), // logger for profiling - it will receive messages during the profiling process\n  buildData: { // URL or getter to get build data (generated by Bundle Internals Plugin) to assemble complete profiling data\n    url: '/build.json',\n  },\n  requests: { // some functions for filtering requests\n    ignore: (url) =\u003e url.includes('ad'), // ignoring some urls by pattern\n    merge: (url) =\u003e url.includes('stats'), // merge duplicate requests\n    internalTest: (url) =\u003e url.startsWith('https://example.com') || url.startsWith('https://example.io'), // pattern for detecting internal resources\n  }\n};\n```\n\nMost of the parameters are optional and the brief config can be as follows:\n```js\nconst config = {\n  host: 'https://example.com',\n  pages: [{\n    name: 'main',\n    url: '/',\n  }],\n  count: 10\n};\n```\n\nTo collect some product-centric metrics, you can use standard API on your pages:\n\n[Element Timing API](https://wicg.github.io/element-timing/)\n```html\n\u003cspan elementtiming=\"some-element-paint\"\u003e\u003c/span\u003e\n```\n[User Timing API](https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API) \n```js\n// to detect User Timing API calls, first set up marks pattern in the profiling configuration\nconst config = {\n  // ...\n  customMetrics: {\n    timing: /^product-timing\\.(.*?)$/i // use string 'all' to collect all timings\n  }\n}\n```\nand on your page you have to execute this:\n```js\nperformance.mark('some-metric');\n```\n\n\nThese metrics will be collected during profiling and presented in the resulting json.\n\n### Profiling [(types)](https://github.com/overlookerjs/overlooker/blob/master/src/types.d.ts#L2)\nProfiling can be organized in a simple way.\n```js\n  const { profile } = require('overlooker');\n\n  const profileResult = await profile({\n    ...config,\n    host: 'https://master.example.com'\n  });\n\n  await db.saveProfile(revision, profileResult);\n```\nAs a result, you will receive data about the performance of your pages in json format.\nI recommend saving the data to your favorite database or directly to the file system (do not forget about rotation) with the identifier of the measured revision.\n\n### Impact Analysis [(types)](https://github.com/overlookerjs/overlooker/blob/master/src/types.d.ts#L415)\nTo reduce the cost of profiling and speed it up, I recommend using the impact analyzer on the page.\nTo use it, you need the [previous impact analysis data](https://github.com/overlookerjs/overlooker/blob/master/src/types.d.ts#L406).\n```js\nconst { impactAnalysis, affectConfigByImpact } = require('overlooker');\n\nconst impactData = await impactAnalysis(\n  masterDescription, // impact data about pages on previous impact analysis\n  config, // same configuration as for profiling \n  (element) =\u003e element.request.url.includes('ad') // element filtration for collecting stable impact data (for example, you can filter dynamic ad urls) \n);\n\nawait db.saveImpactData(revision, impactData);\n\nconst impactedConfig = affectConfigByImpact(config, impactData);\n\n```\nAs a result of executing this code, you will get a configuration with pages that have changes compared to another revision.\nImpact analysis data is best saved in a database too.\n\n\n### Comparison [(types)](https://github.com/overlookerjs/overlooker/blob/master/src/types.d.ts#L224)\nAfter profiling is over, you can use it to compare against a profile with an earlier revision.\nor the revision profile from where your branch you are testing was forked from.\n```js\nconst { comparePages } = require('overlooker');\n\nconst profileDataFeature = await db.getProfileByRevision(featureRevision);\nconst profileDataMaster = await db.getProfileByRevision(masterRevision);\n\nconst comparison = comparePages(profileDataMaster, profileDataFeature);\n```\nAs a result of the comparison, you will get the full difference for all metrics,\nrequests, modules in chunks (if you used bundle-internals-plugin) and this data \ncan be used to analyse performance impact of your code changes.\n\n### Analyzing the comparison results  [(types)](https://github.com/overlookerjs/overlooker/blob/master/src/types.d.ts#L283)\nThere is also a separate method to check the comparison results by custom thresholds. \nBut first let's see how to define thresholds for your performance metrics.\nThat will allow you to set up the deviation limits that you need.\n\nExample of thresholds:\n```js\nconst thresholds = {\n  default: { // default thresholds (will be used for all pages)\n    'percent.stats.userCentric.timeToInteractive.median': 0.05, // path for value in comparison object and limit for deviation\n    'percent.stats.elementsTimings.**.median': 0.05 // path with ** covers all nested paths up to keys after this point\n  },\n  main: { // threshold for one page, which name is 'main' in profile configuration\n    'percent.stats.custom.timings.*.median': 0.1, // path with * symbol covers all keys on this level\n    'percent.stats.custom.userCentric.{timeToInteractive, speedIndex}.median': 0.1 // path with {} symbol covers all included keys on this level\n  }\n}\n```\n\nAnd you can use these thresholds to check your comparison\n```js\nconst { check } = require('overlooker');\n\nconst result = check(comparison, thresholds);\n\nif (!result.success) {\n    return 1; // for example, you can handle the check result and fail the build\n}\n```\n\nYou can also use this approach to budget performance by using the check method\non some profile.\n```js\nconst { check } = require('overlooker');\n\nconst result = check(profileDataFeature, budget);\n```\n\n## Tool for getting build data\n[Bundle Internals Plugin](https://github.com/smelukov/bundle-internals)\n\n## Tool for view trace events\n[flame-chart-js](https://github.com/pyatyispyatil/flame-chart-js)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foverlookerjs%2Foverlooker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foverlookerjs%2Foverlooker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foverlookerjs%2Foverlooker/lists"}