{"id":18624065,"url":"https://github.com/mitghi/protox","last_synced_at":"2026-05-14T23:05:13.459Z","repository":{"id":57614828,"uuid":"225786545","full_name":"mitghi/protox","owner":"mitghi","description":"protox message broker","archived":false,"fork":false,"pushed_at":"2023-03-10T20:14:51.000Z","size":11648,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-05-17T06:41:23.955Z","etag":null,"topics":["message-broker","message-bus","message-queue","mqtt"],"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/mitghi.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":"2019-12-04T05:28:07.000Z","updated_at":"2023-03-10T20:14:57.000Z","dependencies_parsed_at":"2024-06-20T04:40:22.780Z","dependency_job_id":"9520a05d-a265-4963-8bfe-4e3077d2dae7","html_url":"https://github.com/mitghi/protox","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mitghi/protox","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitghi%2Fprotox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitghi%2Fprotox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitghi%2Fprotox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitghi%2Fprotox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mitghi","download_url":"https://codeload.github.com/mitghi/protox/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitghi%2Fprotox/sbom","scorecard":{"id":650364,"data":{"date":"2025-08-11","repo":{"name":"github.com/mitghi/protox","commit":"7aac46a7fa1263c4528d8020930acbc4b47e20b8"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"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":"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":"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":"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":"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":"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":"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"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":"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":"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":"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":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"Vulnerabilities","score":0,"reason":"10 existing vulnerabilities detected","details":["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-2023-1988 / GHSA-2wrh-6pvc-2jm9","Warn: Project is vulnerable to: GO-2023-2102 / GHSA-4374-p667-p6c8","Warn: Project is vulnerable to: GHSA-qppj-fm5r-hxr3","Warn: Project is vulnerable to: GO-2024-2687 / GHSA-4v7x-pqxf-cx7m","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw"],"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-21T13:21:50.023Z","repository_id":57614828,"created_at":"2025-08-21T13:21:50.023Z","updated_at":"2025-08-21T13:21:50.023Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278343069,"owners_count":25971399,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"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":["message-broker","message-bus","message-queue","mqtt"],"created_at":"2024-11-07T04:27:12.402Z","updated_at":"2025-10-04T16:40:03.329Z","avatar_url":"https://github.com/mitghi.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# protox\n\nHigh performance [protox](https://protox.xyz) message broker.\n\nversion : **Alpha**.\n\n- [X] Fully Binary\n- [X] Publish/Subscribe\n- [X] Quality of Service 0 and 1 (at most once, at least once)\n- [X] Persistent states\n- [X] Client Library\n\nWhitebox test suits\n\n- [X] containers\n- [X] core\n- [X] messages\n- [X] server\n\n# Objectives\n\nobjectives for **Beta** version:\n\n- [X] Retain Storage\n- [X] Permissions\n- [X] Message Queue\n- [ ] Persistent storage\n- [ ] One-to-One  Request/Response ( support 3rd party endpoints )\n- [ ] Config parser\n\n**TODO:** whitebox test suits\n\n- [X] auth\n- [X] protocol\n- [ ] broker\n- [ ] client\n- [ ] utils\n\n\n# Features\n\nThis is the roadmap for version 1.0.\n\n- [ ] [Raft Consensus Algorithm](https://raft.github.io/raft.pdf)\n- [ ] Proposals-over-Network (ex. job delegation, polls, stable matching, ... )\n- [ ] Stream processor\n- [ ] One-to-Many Request/Response ( with support for 3rd party Endpoints )\n- [ ] Buffered   Channels\n- [ ] Unbuffered Channels\n- [ ] Event Notifications\n- [ ] Event Multiplexing\n- [ ] Endpoints ( compatibility with 3rd party services )\n- [ ] Management Console\n- [ ] Signed Messages ( RSA, PGP, SHA256, SCRYPT, ... )\n- [ ] Pluggable Authenication subsystem\n- [ ] Pluggable Protocols \n- [ ] Plugins subsystem\n- [ ] Cluster mode\n- [ ] Runtime storage subsystem\n- [ ] Promiscuous mode ( security )\n- [ ] Runtime memory forensic ( security )\n- [ ] 6LoWPAN integration\n\n# Setup ( development )\n\n[![](./media/deploy.gif)](https://asciinema.org/a/70y88r89i5pmqg4n9er8gb2oy)\n\nusing Docker\n------------\n\n**NOTICE:** create deploy key and save it as `id_rsa_depl` in `docker/`. Check `docker logs -f [CONTAINER ID]` for logs. For more options check `docker/Makefile`. Compiled binary is located at `$GOPATH/bin`.\n\nto **build**\n\n```bash\n$ git clone git@github.com:mitghi/protox.git .\n$ export PROTOXREPO=\"$GOPATH/src/github.com/mitghi\"\n$ mkdir -p $PROTOXREPO\n$ mv ./protox $PROTOXREPO/protox \u0026\u0026 cd $PROTOXREPO/protox/docker\n$ make build-remote\n$ make shell\n```\n\nto **deploy**\n\n```bash\n$ git clone git@github.com:mitghi/protox.git .\n$ export PROTOXREPO=\"$GOPATH/src/github.com/mitghi\"\n$ mkdir -p $PROTOXREPO\n$ mv ./protox $PROTOXREPO/protox \u0026\u0026 cd $PROTOXREPO/protox/docker\n$ make build\n$ export PORTS=\"-p 52909:52909\"\n$ make spawn\n```\n\nAfter starting the container, use following snippet to send a crafted `Connect` packet to assure that broker can receive connections from outside.\n\n```bash\n$ echo -e '\\x10''\\x4f''\\x0''\\x4''\\x50''\\x52''\\x58''\\x31''\\xf''\\x0''\\x3c''\\x24''\\x32''\\x61''\\x24''\\x30''\\x36''\\x24''\\x6c''\\x4e''\\x69''\\x38''\\x48''\\x35''\\x6b''\\x63''\\x35''\\x5a''\\x39''\\x54''\\x39''\\x78''\\x4a''\\x41''\\x58''\\x77''\\x51''\\x71''\\x79''\\x75''\\x6e''\\x6c''\\x32''\\x45''\\x59''\\x68''\\x47''\\x55''\\x69''\\x36''\\x63''\\x74''\\x33''\\x54''\\x67''\\x70''\\x52''\\x31''\\x42''\\x4e''\\x62''\\x31''\\x76''\\x70''\\x7a''\\x70''\\x70''\\x39''\\x70''\\x7a''\\x43''\\x0''\\x0''\\x0''\\x1''\\x0''\\x4''\\x74''\\x65''\\x73''\\x74' | nc localhost $(printf \"%d\" 0xcead) | hexdump\n```\n\n**(Client)Output:**\n\n```\n0000000 20 01 00\n0000003\n```\n\n**(Broker)Output:**\n\n```\n$ RLOG_LOG_LEVEL=DEBUG protox\n2017/03/14 13:41:46 [+]Started\n2017-03-14T13:41:52+01:00 INFO     : * [Genesis] Participation request accepted. \u003c- (*Server).ServeTCP\n2017-03-14T13:41:52+01:00 DEBUG    : * [Packet] raw packet content 0x10 0x4f 0x00 0x04 0x50 0x52 0x58 0x31 0x0f 0x00 0x3c 0x24 0x32 0x61 0x24 0x30 0x36 0x24 0x6c 0x4e 0x69 0x38 0x48 0x35 0x6b 0x63 0x35 0x5a 0x39 0x54 0x39 0x78 0x4a 0x41 0x58 0x77 0x51 0x71 0x79 0x75 0x6e 0x6c 0x32 0x45 0x59 0x68 0x47 0x55 0x69 0x36 0x63 0x74 0x33 0x54 0x67 0x70 0x52 0x31 0x42 0x4e 0x62 0x31 0x76 0x70 0x7a 0x70 0x70 0x39 0x70 0x7a 0x43 0x00 0x00 0x00 0x01 0x00 0x04 0x74 0x65 0x73 0x74 \u003c- (*ProtoConnection).HandleDefault\n\n2017-03-14T13:41:52+01:00 DEBUG    : (--OPTIONS[keepalive, clid, clusrname, clpasswd]=( true true true true )--)\n2017-03-14T13:41:52+01:00 DEBUG    : * [Packet] conn packet content.  \u003c- (*ProtoConnection).HandleDefault\n\tUsername(test), Password($2a$06$lNi8H5kc5Z9T9xJAXwQqyunl2EYhGUi6ct3TgpR1BNb1vpzpp9pzC),\n\tClientId(), KeepAlive(1), Version(PRX1)\n2017-03-14T13:41:52+01:00 DEBUG    : * [clientDelegate] client [test] has joined.\n2017-03-14T13:41:52+01:00 DEBUG    : * [Auth] status for uid [test] is [OK].\n2017-03-14T13:41:52+01:00 DEBUG    : + [Genesis] for client [test] changed to [ready].\n2017-03-14T13:41:52+01:00 DEBUG    : + [Client] Connected.\n2017-03-14T13:41:52+01:00 DEBUG    : + [Client] Passed (Genesis) state and is now (Online). \u003c- (*Server).NotifyDisconnected\n2017-03-14T13:41:52+01:00 ERROR    : - [RecvHandler] error while receiving packets. \u003c- (*ProtoConnection).recvHandler\n2017-03-14T13:41:57+01:00 DEBUG    : - [Connection] DEADLINE, No heartbeat from client [test], terminating ....\n2017-03-14T13:41:57+01:00 DEBUG    : - [1][Error] STATERR.\n2017-03-14T13:41:57+01:00 DEBUG    : * [1][Event] Shutting down stream.\n2017-03-14T13:41:57+01:00 DEBUG    : * [Connection] beginning to wait for coroutines to finish** \u003c- (*ProtoConnection).**(%!s(MISSING))\n2017-03-14T13:41:57+01:00 DEBUG    : - [2][Event][Death] Detached [Client]. userId test \u003c- (*Server).NotifyDisconnected\n2017-03-14T13:41:57+01:00 DEBUG    : - [2][Event][ConnEnded] for [Client]. userId test  \u003c- (*Server).NotifyDisconnected\n2017-03-14T13:41:57+01:00 DEBUG    : - [Client] connection to client [test] is terminated.\n2017-03-14T13:41:57+01:00 DEBUG    : * [Connection] all coroutines are finished, exiting connection handler++ \u003c- (*ProtoConnection).++(%!s(MISSING))\n```\n\n\nNative\n------\nFor compiling the repository, latest version of [Golang](https://golang.org) is required.\nCheck Golang [installation guide](https://golang.org/doc/install) for futher details.\nThis is a general and generic way to compile Protox on **nix*.\n\n```bash\n$ mkdir -p $HOME/work \u0026\u0026 mkdir -p $HOME/work/bin \u0026\u0026 mkdir -p $HOME/work/src/github.com/mitghi\n$ export $GOPATH=\"$HOME/work\"\n$ cd $HOME/work \u0026\u0026 pushd .;cd src/github.com/mitghi\n$ git clone git@github.com:mitghi/protox.git ./protox \u0026\u0026 popd\n$ go get ./... \u0026\u0026 go install -v github.com/mitghi/protox\n$ cd ./bin \u0026\u0026 ./protox\n```\n\n# Example\n\nUsing sample Protox **Broker** with explicit **Access Control List**:\n\n\n```go\npackage main\n\nimport (\n\t\"os\"\n\n\t\"github.com/mitghi/protox/auth\"\n\t\"github.com/mitghi/protox/broker\"\n\t\"github.com/mitghi/protox/client\"\n\t\"github.com/mitghi/protox/protobase\"\n)\n\n// clientDelegate is the delegate used by server to\n// create a compatible `protobase.ClientInterface`\n// struct.\nfunc clientDelegate(uid string, pid string, cid string) protobase.ClientInterface {\n\tret := User{client.Client{Username: uid, Password: pid, ClientId: cid}}\n\treturn \u0026ret\n}\n\n// defaultAuthConfig returns default configuration\n// of Auth subsystem ( Strict Mode ) with a few\n// dummy clients.\nfunc defaultAuthConfig() *auth.AuthConfig {\n\t// initialize auth configuration container\n\tvar c *auth.AuthConfig = auth.NewAuthConfig()\n\t// set authorization mode\n\tc.Mode = protobase.AUTHModeStrict\n\t// set access group partitions\n\tc.AccessGroups = auth.AuthGroups{\n\t\tMembers: map[string][][3]string{\n\t\t\t\"User\": [][3]string{\n\t\t\t\t{\"can\", \"publish\", \"self/inbox\"},\n\t\t\t\t{\"can\", \"subscribe\", \"self/notifications\"},\n\t\t\t},\n\t\t\t\"Bot\": [][3]string{\n\t\t\t\t{\"can\", \"publish\", \"self/location\"},\n\t\t\t\t{\"can\", \"request\", \"self/access/upgrade\"},\n\t\t\t},\n\t\t},\n\t\t// set access control list authorization\n\t\t// type.\n\t\tType: protobase.ACLModeInclusive,\n\t}\n\t// define sample credentials\n\tc.Credentials = []auth.AuthEntity{\n\n\t\tauth.AuthEntity{\n\t\t\tCredential: \u0026auth.Creds{\n\t\t\t\tUsername: \"test\",\n\t\t\t\tPassword: \"$2a$06$lNi8H5kc5Z9T9xJAXwQqyunl2EYhGUi6ct3TgpR1BNb1vpzpp9pzC\",\n\t\t\t\tClientId: \"\",\n\t\t\t},\n\t\t\t// define permission partition\n\t\t\tGroup: \"User\",\n\t\t},\n\n\t\tauth.AuthEntity{\n\t\t\tCredential: \u0026auth.Creds{\n\t\t\t\tUsername: \"test2\",\n\t\t\t\tPassword: \"$2a$06$2uqusEvRMcpla2KXph8sBuBXO4WVOgIVbIgfRjk5y01UXxxgR9z6O\",\n\t\t\t\tClientId: \"\",\n\t\t\t},\n\t\t\t// define permission partition\n\t\t\tGroup: \"User\",\n\t\t},\n\n\t\tauth.AuthEntity{\n\t\t\tCredential: \u0026auth.Creds{\n\t\t\t\tUsername: \"test3\",\n\t\t\t\tPassword: \"$2a$06$sgQ9yjjVvRxQhLqWKSGv4OTE2EF4ojUu1sEHnGUJdimmn.5M9M7/.\",\n\t\t\t\tClientId: \"\",\n\t\t\t},\n\t\t\t// define permission partition\n\t\t\tGroup: \"Bot\",\n\t\t},\n\n\t\tauth.AuthEntity{\n\t\t\tCredential: \u0026auth.Creds{\n\t\t\t\tUsername: \"test4\",\n\t\t\t\tPassword: \"$2a$06$9wavlAtmNZ66Whe2wturDO7yIBdE41/Zcn4c5z4ydzJ/ydVJIZwJK\",\n\t\t\t\tClientId: \"\",\n\t\t\t},\n\t\t\t// define permission partition\n\t\t\tGroup: \"Bot\",\n\t\t},\n\t}\n\n\treturn c\n}\n\nvar (\n\tc       *auth.AuthConfig        = defaultAuthConfig() // authentication configs\n\tauthsys protobase.AuthInterface                       // authentication subsystem\n)\n\nfunc main() {\n\tvar err error\n\t// setup authentication subsystem from configurations\n\tauthsys, err = auth.NewAuthenticatorFromConfig(c)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\t// initialize the broker with configured\n\t// authentication subsystem.\n\tbrk := broker.NewBroker(broker.Options{\n\t\tAuth: authsys,\n\t}).(*broker.Broker)\n\t// run the broker\n\tok := brk.Start()\n\tif !ok {\n\t\tos.Exit(1)\n\t}\n\t// wait for termination conditions such\n\t// as (KILL SIGNAL, FATAL ERRORS, .... ).\n\t\u003c-brk.E\n\n\tos.Exit(0)\n}\n```\n\nCheck more examples at [demos](./demos/).\n\n# Client\n\nList of protox client libraries.\n\n- [x] [Protox Client](https://github.com/mitghi/protox_client) ( Golang ).\n- [ ] [Protox Client](https://github.com/mitghi/protox_clswift) ( Swift ).\n- [ ] [Protox Client](https://github.com/mitghi/protox_clc) ( C ).\n- [ ] [Protox Client](https://github.com/mitghi/protox_clc) ( C++ ).\n- [ ] [Protox Client](https://github.com/mitghi/protox_clpy) ( Python ).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmitghi%2Fprotox","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmitghi%2Fprotox","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmitghi%2Fprotox/lists"}