{"id":13438496,"url":"https://github.com/macbre/phantomas","last_synced_at":"2026-03-06T11:11:20.107Z","repository":{"id":3854572,"uuid":"4939243","full_name":"macbre/phantomas","owner":"macbre","description":"Headless Chromium-based web performance metrics collector and monitoring tool","archived":false,"fork":false,"pushed_at":"2026-01-30T10:33:00.000Z","size":6993,"stargazers_count":2265,"open_issues_count":62,"forks_count":137,"subscribers_count":62,"default_branch":"devel","last_synced_at":"2026-01-31T03:14:52.473Z","etag":null,"topics":["automation","chromium","css","developer-tools","dom","domquery","headless-chrome","http2","http3","javascript","jquery","metrics","phantomas","puppeteer","webperf","webperformance"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/phantomas","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/macbre.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":"FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":["https://xscode.com/macbre/phantomas"]}},"created_at":"2012-07-07T16:28:54.000Z","updated_at":"2026-01-30T10:29:51.000Z","dependencies_parsed_at":"2023-07-05T20:16:41.337Z","dependency_job_id":"8c9654eb-b439-4ea9-9326-0cdf50bd0cf5","html_url":"https://github.com/macbre/phantomas","commit_stats":{"total_commits":2381,"total_committers":45,"mean_commits":52.91111111111111,"dds":"0.29273414531709363","last_synced_commit":"2c8a6c5a579074fef97ef7d76a21e4b57e52826a"},"previous_names":[],"tags_count":69,"template":false,"template_full_name":null,"purl":"pkg:github/macbre/phantomas","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macbre%2Fphantomas","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macbre%2Fphantomas/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macbre%2Fphantomas/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macbre%2Fphantomas/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/macbre","download_url":"https://codeload.github.com/macbre/phantomas/tar.gz/refs/heads/devel","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/macbre%2Fphantomas/sbom","scorecard":{"id":609217,"data":{"date":"2025-08-11","repo":{"name":"github.com/macbre/phantomas","commit":"d82b0fef1ec552557754820790aac69e49259a1e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5,"checks":[{"name":"Maintained","score":10,"reason":"12 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/8 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":"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":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: topLevel 'contents' permission set to 'write': .github/workflows/auto-merge-dependabot.yml:7","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/dockerimage.yml:1","Warn: no topLevel permission defined: .github/workflows/linter.yml:1","Warn: no topLevel permission defined: .github/workflows/npmpublish.yml:1","Warn: no topLevel permission defined: .github/workflows/push-to-ghcr.yml:1","Warn: no topLevel permission defined: .github/workflows/tests.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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 2-Clause \"Simplified\" License: 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":"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":"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":"Pinned-Dependencies","score":3,"reason":"dependency not pinned by hash detected -- score normalized to 3","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/auto-merge-dependabot.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/auto-merge-dependabot.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/codeql-analysis.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/codeql-analysis.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/codeql-analysis.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/codeql-analysis.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/dockerimage.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/dockerimage.yml/devel?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/dockerimage.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/dockerimage.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/linter.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/linter.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/linter.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/linter.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npmpublish.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/npmpublish.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npmpublish.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/npmpublish.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npmpublish.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/npmpublish.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/push-to-ghcr.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/push-to-ghcr.yml/devel?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/push-to-ghcr.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/push-to-ghcr.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/tests.yml/devel?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/tests.yml/devel?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tests.yml:89: update your workflow using https://app.stepsecurity.io/secureworkflow/macbre/phantomas/tests.yml/devel?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:2: pin your Docker image by updating node:lts-bullseye-slim to node:lts-bullseye-slim@sha256:8b1d14e4e6d2c100437554eb44e06d90f8315a6d717a853ec8e840223c93077e","Info:   0 out of  13 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   3 out of   3 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":"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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/dockerimage.yml:10"],"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":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (24) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"13 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-mhxj-85r3-2x55","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","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-44c6-4v22-4mhx","Warn: Project is vulnerable to: GHSA-4x5v-gmq8-25ch","Warn: Project is vulnerable to: GHSA-54xq-cgqr-rpm3","Warn: Project is vulnerable to: GHSA-pq67-2wwv-3xjx","Warn: Project is vulnerable to: GHSA-8cj5-5rvv-wf4v"],"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-21T02:15:00.022Z","repository_id":3854572,"created_at":"2025-08-21T02:15:00.022Z","updated_at":"2025-08-21T02:15:00.022Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30173593,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T07:56:45.623Z","status":"ssl_error","status_checked_at":"2026-03-06T07:55:55.621Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["automation","chromium","css","developer-tools","dom","domquery","headless-chrome","http2","http3","javascript","jquery","metrics","phantomas","puppeteer","webperf","webperformance"],"created_at":"2024-07-31T03:01:06.029Z","updated_at":"2026-03-06T11:11:20.065Z","avatar_url":"https://github.com/macbre.png","language":"JavaScript","readme":"phantomas\n[![npm](https://img.shields.io/npm/dt/phantomas.svg)]()\n[![Inline docs](http://inch-ci.org/github/macbre/phantomas.svg?branch=phantomas-v2)](http://inch-ci.org/github/macbre/phantomas)\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)\n[![Coverage Status](https://coveralls.io/repos/github/macbre/phantomas/badge.svg?branch=devel\u00261)](https://coveralls.io/github/macbre/phantomas?branch=devel)\n[![CodeFactor](https://www.codefactor.io/repository/github/macbre/phantomas/badge)](https://www.codefactor.io/repository/github/macbre/phantomas)\n=========\n\n[Headless Chromium](https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md)-based modular web performance metrics collector. And why phantomas? Well, [because](http://en.wikipedia.org/wiki/Fantômas) :)\n\n## Requirements\n\n* [NodeJS](http://nodejs.org) 16+\n\n## Installation\n\n#### Via npm\n\n\u003ca href=\"https://www.npmjs.com/package/phantomas\" title=\"latest\"\u003e\u003cimg alt=\"latest\" src=\"https://img.shields.io/npm/v/phantomas/latest.svg\" /\u003e\u003c/a\u003e\n\n```\nnpm install phantomas\n```\n\n\u003e This will install [a recent version of Chromium](https://github.com/GoogleChrome/puppeteer#installation) supported by `puppeteer` module.\n\n#### Via Docker\n\nYou can use [phantomas Docker image](https://hub.docker.com/r/macbre/phantomas):\n\n```\ndocker pull macbre/phantomas:latest\n```\n\nOr you can fetch from [GitHub's Containers registry](https://github.com/macbre/phantomas/pkgs/container/phantomas)\n\n```\ndocker pull ghcr.io/macbre/phantomas:latest\n```\n\n## Support\n\n[![Foo](https://raw.githubusercontent.com/macbre/phantomas/devel/docs/phantomas-banner.png)](https://xscode.com/macbre/phantomas)\n\n**You can get [support for phantomas](https://xscode.com/macbre/phantomas) via xs:code.**\n\n## Usage example\n\n```js\nconst phantomas = require('phantomas'),\n    promise = phantomas('http://example.com/');\n\npromise.\n    then(results =\u003e {\n        console.log('Metrics', results.getMetrics());\n        console.log('Offenders', results.getAllOffenders());\n    }).\n    catch(res =\u003e {\n        console.error(res);\n    });\n\n// events handling\npromise.on('recv', response =\u003e {\n    console.log('Response: %s %s [%s]', response.method, response.url, response.contentType);\n});\n\n// including the custom one emitted by phantomas modules\npromise.on('domQuery', (type, query) =\u003e {\n        console.log('DOM query by %s - \"%s\"', type, query);\n});\n```\n\nOr run `./examples/index.js`.\n\n### Development version\n\nTo get the latest development version of phantomas (and install all required dependencies):\n\n```\ngit clone git@github.com:macbre/phantomas.git\nnpm install\n```\n\n#### Running tests\n\nFirst you need to start a local nginx container that will serve static assets used by integration tests suite. Then simply run `npm t`:\n\n```\n./test/server-start.sh\nnpm t\n```\n\nAll pull requests that are filed for this repository will have tests run via GitHub Actions.\n\n## Having problems?\n\nPlease refer to **[/Troubleshooting.md](https://github.com/macbre/phantomas/blob/devel/Troubleshooting.md)**\n\n## Features\n\n* modular approach - each metric is generated by a separate \"module\"\n* phantomas \"core\" acts as an events emitter that each module can hook into\n* in-depth metrics such as: number of events bound via jQuery, calls to ``window.write``or [complex and duplicated CSS selectors (via analyze-css)](https://github.com/macbre/analyze-css)\n* JSON as an output format\n* easy integration with other nodejs projects via CommonJS module ([see API docs](https://github.com/macbre/phantomas/wiki/npm-module))\n* metrics can be emitted from JavaScript code of the page phantomas is run against (thanks to [helper functions available in window.__phantomas](https://github.com/macbre/phantomas/wiki/Phantomas-scope))\n* device profiles allow phantomas to emulate mobile or tablet (by setting a proper user agent and viewport)\n\n## Contributors\n\n\u003e All the [contributors](https://github.com/macbre/phantomas/graphs/contributors)\n\n* [macbre](https://github.com/macbre)\n* [sjhcockrell](https://github.com/sjhcockrell)\n* [jgonera](https://github.com/jgonera)\n* [william-p](https://github.com/william-p)\n* [gmetais](https://github.com/gmetais)\n* [vgangan](https://github.com/vgangan)\n* [cphoover](https://github.com/cphoover)\n* [wladekb](https://github.com/wladekb)\n* [iNem0o](https://github.com/iNem0o)\n* [gomezd](https://github.com/gomezd)\n* [stefanjudis](https://github.com/stefanjudis)\n\n## Usage\n\nphantomas comes as a **CommonJS module** ([see API docs](https://github.com/macbre/phantomas/wiki/npm-module)) that you can use in your nodejs projects.\n\nYou can also use it as a **command line tool**. Run `phantomas -h` for more details.\n\n## Metrics\n\n\u003e Please refer to [`/docs/metrics.md` file](https://github.com/macbre/phantomas/blob/devel/docs/metrics.md) for **a full, up-to-date list of all available modules and metrics** that phantomas emits.\n\n## For developers\n\n* [`docs/` directory](https://github.com/macbre/phantomas/blob/devel/docs)\n* Description of [events fired by phantomas core](https://github.com/macbre/phantomas/blob/devel/docs/events.md)\n* [List of **all metrics** and modules](https://github.com/macbre/phantomas/blob/devel/docs/metrics.md)\n\n## Let's make Web a bit faster!\n\n* [Best Practices for Speeding Up Your Web Site](http://developer.yahoo.com/performance/rules.html) (by Yahoo!)\n* [Web Performance Best Practices](https://developers.google.com/speed/docs/best-practices/rules_intro) (by Google)\n* [Planet Performance](http://www.perfplanet.com/) - news and views from the web performance blogosphere\n* [Performance of 3rd Party Content](http://stevesouders.com/p3pc/) (by Steve Souders)\n* [Profiling CSS for fun and profit. Optimization notes.](http://perfectionkills.com/profiling-css-for-fun-and-profit-optimization-notes/)\n\n### Slides\n\n* [Know Your Engines: How to Make Your JavaScript Fast](http://cdn.oreillystatic.com/en/assets/1/event/60/Know%20Your%20Engines_%20How%20to%20Make%20Your%20JavaScript%20Fast%20Presentation%201.pdf) (by David Mandelin from Mozilla)\n* [Velocity Conf 2013 Workshop: Avoiding Web Performance Regression](http://www.slideshare.net/marcelduran/velocity-conf-2013) (by Marcel Duran from Twitter)\n\n## Blogosphere\n\nIntroductions to phantomas and use cases:\n\n* [phantomas – PhantomJS based, modular web performance metrics generator](http://calendar.perfplanet.com/2013/phantomas/) (an article for Performance Calendar)\n* [How to Measure Frontend Performance With Grunt](http://4waisenkinder.de/blog/2013/12/22/how-to-measure-frontend-performance-with-phantomas-and-grunt/)\n* [MaxCDN Blog - Behind The Scenes: tools.maxcdn.com](http://blog.maxcdn.com/behind-scenes-tools-maxcdn-com/)\n* [Measuring frontend performance](http://www.nephila.it/en/blog/2014/10/24/measuring-frontend-performance/)\n* [Performance Budgets with Phantomas and Jenkins](http://fairl.es/2014/02/02/phantomas-performance-testing-and-jenkins/)\n* [phantomas introduced at npmawesome.com](http://npmawesome.com/posts/2014-12-01-phantomas/)\n* [Grunt.js for the Enterprise - Vol.1: Frontend Performance with Phantomas](http://www.slideshare.net/DavidAm/grunt-js-for-the-enterprise) (by David Amend)\n* [Automated Frontend Testing at DrupalCon Austin 2014](https://austin2014.drupal.org/session/automated-frontend-testing) (+video)\n* [Phantomas: Fais-moi un strip !](https://wooster.checkmy.ws/2014/01/phantomas-performance-website/) (in French)\n* [Untangle the JavaScript spaghetti code with YellowLabTools](https://gmetais.github.io/yellowlabtools/2014/11/18/untangle_the_js_spaghetti_code.html)\n\n### Videos\n\n* [Sebastian Golasch: The Glitch in the Game (Front End Ops Conference 2014)](http://youtu.be/B_kwo5V6m_w?t=12m25s)\n\n## Utilities\n\nUse [grunt](http://gruntjs.com/) to automate daily dev tasks, including your's application web performance, via these great tools:\n\n* [grunt-phantomas](https://github.com/stefanjudis/grunt-phantomas)\n* [juve](https://github.com/jared-stilwell/juve)\n* [grunt-devperf](https://github.com/gmetais/grunt-devperf)\n\n## Stargazers over time\n\n[![Stargazers over time](https://starchart.cc/macbre/phantomas.svg)](https://starchart.cc/macbre/phantomas)\n","funding_links":["https://xscode.com/macbre/phantomas"],"categories":["Metrics Monitor","JavaScript","Benchmarking","chromium"],"sub_categories":["Meetups"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmacbre%2Fphantomas","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmacbre%2Fphantomas","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmacbre%2Fphantomas/lists"}