{"id":15199808,"url":"https://github.com/qa-dev/jsonwire-grid","last_synced_at":"2026-03-03T22:31:20.549Z","repository":{"id":144213872,"uuid":"93180674","full_name":"qa-dev/jsonwire-grid","owner":"qa-dev","description":"High-performance scalable implementation of Selenium Grid","archived":false,"fork":false,"pushed_at":"2020-03-04T13:58:04.000Z","size":5154,"stargazers_count":76,"open_issues_count":4,"forks_count":10,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-10-28T13:39:12.460Z","etag":null,"topics":["jsonwire","selenium","selenium-grid","selenium-webdriver","webdriver"],"latest_commit_sha":null,"homepage":"","language":"Go","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/qa-dev.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}},"created_at":"2017-06-02T15:44:57.000Z","updated_at":"2025-10-05T16:15:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"e8ab94f6-681d-4fc3-8d9a-b07ce150e528","html_url":"https://github.com/qa-dev/jsonwire-grid","commit_stats":{"total_commits":80,"total_committers":8,"mean_commits":10.0,"dds":"0.22499999999999998","last_synced_commit":"18e6f4eae3943c27066bf23e8ee7b4a510684bb9"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/qa-dev/jsonwire-grid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qa-dev%2Fjsonwire-grid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qa-dev%2Fjsonwire-grid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qa-dev%2Fjsonwire-grid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qa-dev%2Fjsonwire-grid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qa-dev","download_url":"https://codeload.github.com/qa-dev/jsonwire-grid/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qa-dev%2Fjsonwire-grid/sbom","scorecard":{"id":752714,"data":{"date":"2025-08-11","repo":{"name":"github.com/qa-dev/jsonwire-grid","commit":"18e6f4eae3943c27066bf23e8ee7b4a510684bb9"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.2,"checks":[{"name":"Code-Review","score":10,"reason":"all changesets reviewed","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":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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":-1,"reason":"no workflows found","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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT 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":"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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.5.0 not signed: https://api.github.com/repos/qa-dev/jsonwire-grid/releases/21031546","Warn: release artifact v0.4.0 not signed: https://api.github.com/repos/qa-dev/jsonwire-grid/releases/20516152","Warn: release artifact v0.3.2 not signed: https://api.github.com/repos/qa-dev/jsonwire-grid/releases/10396050","Warn: release artifact v0.3.1 not signed: https://api.github.com/repos/qa-dev/jsonwire-grid/releases/8307128","Warn: release artifact v0.3.0 not signed: https://api.github.com/repos/qa-dev/jsonwire-grid/releases/8299257","Warn: release artifact v0.5.0 does not have provenance: https://api.github.com/repos/qa-dev/jsonwire-grid/releases/21031546","Warn: release artifact v0.4.0 does not have provenance: https://api.github.com/repos/qa-dev/jsonwire-grid/releases/20516152","Warn: release artifact v0.3.2 does not have provenance: https://api.github.com/repos/qa-dev/jsonwire-grid/releases/10396050","Warn: release artifact v0.3.1 does not have provenance: https://api.github.com/repos/qa-dev/jsonwire-grid/releases/8307128","Warn: release artifact v0.3.0 does not have provenance: https://api.github.com/repos/qa-dev/jsonwire-grid/releases/8299257"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 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":"Pinned-Dependencies","score":5,"reason":"dependency not pinned by hash detected -- score normalized to 5","details":["Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating golang:1.11.1 to golang:1.11.1@sha256:63ec0e29aeba39c0fe2fc6551c9ca7fa16ddf95394d77ccee75bc7062526a96c","Info:   0 out of   1 containerImage dependencies pinned","Info:   1 out of   1 goCommand 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":"Vulnerabilities","score":0,"reason":"12 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0209 / GHSA-r5c5-pr8j-pfp7","Warn: Project is vulnerable to: GO-2023-1992 / GHSA-x3jr-pf6g-c48f","Warn: Project is vulnerable to: GO-2022-0229 / GHSA-cjjc-xp8v-855w","Warn: Project is vulnerable to: GO-2020-0012 / GHSA-ffhg-7mh4-33c4","Warn: Project is vulnerable to: GO-2021-0227 / GHSA-3vm4-22fp-5rfm","Warn: Project is vulnerable to: GO-2022-0968 / GHSA-gwc9-m7rh-j2ww","Warn: Project is vulnerable to: GO-2021-0356 / GHSA-8c26-wmh5-6g9v","Warn: Project is vulnerable to: GO-2024-2961","Warn: Project is vulnerable to: GO-2023-2402 / GHSA-45x7-px36-x8w8","Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77","Warn: Project is vulnerable to: GO-2022-0493 / GHSA-p782-xgp4-8hr8"],"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-22T20:47:33.995Z","repository_id":144213872,"created_at":"2025-08-22T20:47:33.995Z","updated_at":"2025-08-22T20:47:33.995Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30064288,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T18:21:05.932Z","status":"ssl_error","status_checked_at":"2026-03-03T18:20:59.341Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["jsonwire","selenium","selenium-grid","selenium-webdriver","webdriver"],"created_at":"2024-09-28T02:02:18.978Z","updated_at":"2026-03-03T22:31:20.525Z","avatar_url":"https://github.com/qa-dev.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ~~jsonwire-grid~~WebDriverGrid [![Build Status](https://travis-ci.org/qa-dev/jsonwire-grid.svg?branch=master)](https://travis-ci.org/qa-dev/jsonwire-grid) [![Go Report Card](https://goreportcard.com/badge/github.com/qa-dev/jsonwire-grid)](https://goreportcard.com/report/github.com/qa-dev/jsonwire-grid) [![codecov](https://codecov.io/gh/qa-dev/jsonwire-grid/branch/master/graph/badge.svg)](https://codecov.io/gh/qa-dev/jsonwire-grid)\nThis is high-performance scalable implementation of Selenium Grid (hub),\n###### What is Selenium-Grid?\n\u003eSelenium-Grid allows you run your tests on different machines against different browsers in parallel. That is, running multiple tests at the same time against different machines running different browsers and operating systems. Essentially, Selenium-Grid support distributed test execution. It allows for running your tests in a distributed test execution environment.\n\n## Features\n* One session per one node, no more no less😺\n* Scaling grid-instances for fault-tolerance\n* Support and effective management over 9000 nodes, for parallel testing👹\n* Single entry point for all your test apps\n* Send metrics to [statsd](https://github.com/etsy/statsd)\n* Support on-demand nodes in Kubernetes cluster (Only if grid running in cluster)\n\n\n## HowTo\n### Run grid\n1. [Download last release](https://github.com/qa-dev/jsonwire-grid/releases) and unzip\n1. cd to `jsonwire-grid_vXXX`\n1. Type `export CONFIG_PATH=./config-local-sample.json`\n1. Type `./jsonwire-grid`\n1. Grid running!\n\n### Run nodes\n1. [Download selenium](http://www.seleniumhq.org/download/)\n1. `java -jar selenium-server-standalone-3.4.0.jar -role node  -hub http://127.0.0.1:4444/grid/register`\n1. Repeat!\n\n### Run test\n1. Try create session, such as `curl -X POST http://127.0.0.1:4444/wd/hub/session -d '{\"desiredCapabilities\":{\"browserName\": \"firefox\"}}'`\n1. If you see something similar with `{\"state\":null,\"sessionId\":\"515be56a...` all right! If not, submit [issue](https://github.com/qa-dev/jsonwire-grid/issues/new)\n\n\n## Configuration\nConfigurations are stored in json files. Example:\n```\n{\n  \"logger\": {\n    \"level\": \"debug\"\n  },\n  \"db\": {\n    \"implementation\": \"local\"\n  },\n  \"grid\": {\n    \"client_type\": \"selenium\",\n    \"port\": 4444,\n    \"strategy_list\": [\n      {\n        \"type\": \"persistent\"\n      }\n    ],\n    \"busy_node_duration\": \"15m\",\n    \"reserved_node_duration\": \"5m\"\n  }\n}\n```\n\n### Logger - Configuration of logger.\n| Option        | Possible values                     | Description            | \n| ------------- | ----------------------------------- | ---------------------- |\n| logger.level  | `debug`, `info`, `warning`, `error` | Logging level.         |\n\n### DB - Configuration of storage.\n| Option            | Possible values          | Description                                |\n| ----------------- | ------------------------ | ------------------------------------------ |\n| db.implementation | `mysql`, `local`, `mongo`| Select your favorite db, or local storage. |\n| db.connection     | see next table           | DSN for your db.                           |\n\n\u003eNote: Note: Local (in-memory) storage does not support common session storage between grid-instances.\n\n| DB implementation | DSN format                                                                                                                                                              |\n| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| mysql             | [spec](https://github.com/go-sql-driver/mysql#dsn-data-source-name), example `db_user:db_pass@(db_host:3306)/db_name?parseTime=true` (parseTime=true - required option) |\n| local             | omit this property, because every instance have its own in-memory storage                                                                                               |\n| mongo             | NOTE! Mongo db supports only persistent node strateg and version from 4.0, example `mongodb://localhost:27017`\n\n### Statsd - Configuration of metrics(optional).\n| Option          | Possible values | Description            |\n| --------------- | --------------- | ---------------------- |\n| statsd.host     | `string`        | Host of statsd server. |\n| statsd.port     | `int`           | Port of statsd server. |\n| statsd.protocol | `string`        | Network protocol.      |\n| statsd.prefix   | `string`        | Prefix of metrics tag. |\n| statsd.enable   | `bool`          | Enable metric.         |\n\n### Grid - Configuration of app.\n| Option                      | Possible values          | Description                                                                                                                                                    |\n| --------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| grid.client_type            | `selenium`, `wda`        | Type of used nodes.                                                                                                                                            |\n| grid.port                   | `int`                    | Grid will run on this port.                                                                                                                                    |\n| grid.busy_node_duration     | `string` as `12m`, `60s` | Max session lifetime, when timeout was elapsed grid will kill the session.                                                                                     |\n| grid.reserved_node_duration | `string` as `12m`, `60s` | Max timeout between send request `POST /session` and opening the browser window. (Deprecated will renamed)                                                     |\n| grid.strategy_list          | `array`                  | List of strategies, if grid not able create session on first strategy it go to next, until list ends. [Read more about strategies.](#element-of-strategy-list) |\n\n\u003e * `selenium` - [http://www.seleniumhq.org/]()\n\u003e * `wda` - [agent](https://github.com/qa-dev/WebDriverAgent) for [WDA](https://github.com/qa-dev/WebDriverAgent)\n\n### Element of strategy list\n| Option                         | Possible values                                                 | Description                                                                  |\n| ------------------------------ | --------------------------------------------------------------- | ---------------------------------------------------------------------------- |\n| type                           | `string`, see [type of strategy.](#types-of-strategy)           | Host of statsd server.                                                       |\n| limit                          | `int`, unlimited if equals `0`                                  | Max count of active nodes on this strategy.                                  |\n| params                         | `object`, dependent on [strategy type](#types-of-strategy)      | Object describes available nodes, ex. docker config, kubernetes config, etc. |\n| node_list                      | `array`, dependent on [strategy type](#types-of-strategy)       | Array of objects describing available nodes.                                 |\n| node_list.[].params            | `object`, dependent on [strategy type](#types-of-strategy)      | Object of describing node, ex. image_name, etc.                              |\n| node_list.[].capabilities_list | `array`, ex. [{\"foo: \"bar\"}, {\"foo: \"baz\", \"ololo\": \"trololo\"}] | array of objects describes available capabilities .                          |       \n\n### Types of strategy\n##### `persistent` - using externally started nodes, same as original selenium grid.\n| Strategy option | Possible values | Description                                          |\n|---------------- | --------------- | ---------------------------------------------------- |\n| limit           | -               | Omit this property, сount of nodes always unlimited. |\n| params          | -               | Omit this property.                                  |\n| node_list       | -               | Omit this property.                                  |\n\n##### `kubernetes` - on-demand nodes in kubernetes cluster.\n| Strategy option             | Possible values | Description                                  |\n|--------------------------   | ---------------------- | ------------------------------------- |\n| params.namespace            | string                 | Namespace in k8s for on-demand nodes. |\n| params.pod_creation_timeout | string as `12m`, `60s` | Max waiting time for creating a pod.  |\n| node_list.[].params.image   | string                 | Docker image with selenium.           |\n| node_list.[].params.port    | string                 | Port of selenium.                     |\n\n## API\n- `/grid/status` - a method returns a status of a grid\n- `/grid/session/info` - a returns a session info by session id. \n Еxample: `curl -X http://localhost:4444/grid/session/info?sessionid=9fc185d2-7a3d-4660-877f-cd4ca2a2f5c3`","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqa-dev%2Fjsonwire-grid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqa-dev%2Fjsonwire-grid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqa-dev%2Fjsonwire-grid/lists"}