{"id":44401258,"url":"https://github.com/kendarorg/the-protocol-master","last_synced_at":"2026-02-12T06:21:05.850Z","repository":{"id":218929170,"uuid":"747725279","full_name":"kendarorg/the-protocol-master","owner":"kendarorg","description":"TPM-Proxy Is an infrastructure simulator to test effortlessy your app in minutes for  MQTT, Redis, Amqp, MySQL, Postgres, Http, Https, DNS and MongoDB native protocols. ","archived":false,"fork":false,"pushed_at":"2026-02-10T13:46:41.000Z","size":7048,"stargazers_count":17,"open_issues_count":11,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-02-10T18:29:05.660Z","etag":null,"topics":["amqp","api-simulation","azure","chaos-engineering","dns","http","mitm","mongodb","mqtt","mysql","postgresql","proxy","rabbitmq","redis","rest","wire-protocol"],"latest_commit_sha":null,"homepage":"","language":"Java","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/kendarorg.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":"2024-01-24T14:17:32.000Z","updated_at":"2026-02-10T13:46:44.000Z","dependencies_parsed_at":"2024-01-30T10:25:07.165Z","dependency_job_id":"da086c1a-5ba8-4738-86f1-da6c7c5daebd","html_url":"https://github.com/kendarorg/the-protocol-master","commit_stats":null,"previous_names":["kendarorg/protocolmaster","kendarorg/the-protocol-master"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/kendarorg/the-protocol-master","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kendarorg%2Fthe-protocol-master","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kendarorg%2Fthe-protocol-master/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kendarorg%2Fthe-protocol-master/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kendarorg%2Fthe-protocol-master/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kendarorg","download_url":"https://codeload.github.com/kendarorg/the-protocol-master/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kendarorg%2Fthe-protocol-master/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29360642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T01:03:07.613Z","status":"online","status_checked_at":"2026-02-12T02:00:06.911Z","response_time":55,"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":["amqp","api-simulation","azure","chaos-engineering","dns","http","mitm","mongodb","mqtt","mysql","postgresql","proxy","rabbitmq","redis","rest","wire-protocol"],"created_at":"2026-02-12T06:21:05.084Z","updated_at":"2026-02-12T06:21:05.838Z","avatar_url":"https://github.com/kendarorg.png","language":"Java","readme":"## The Protocol Master Proxy\n\n![](protocolmaster_s.gif)\n\n\"The Protocol Master\" is an infrastructure simulator operable via [complete UI](docs/ui.md) or command line to test\neffortlessly your app in minutes (with no coding)\nsupporting HTTP, HTTPS, Postgres, MySQL, Redis, Mqtt, RabbitMQ, AMQP 091, DNS ... and all the compatible ones!\n\n* Simulate wrong scenarios\n* Block troubles before production\n* Simulate whole infrastructure\n* Make untestable apps testable\n* Easy Chaos engineering\n\nEffortlessly and with zero budget\n\n\n### Notes for macOs Users\n\nShould set the following on your .zprofile see [here](https://github.com/testcontainers/testcontainers-rs/pull/800): \n\n```\nexport DOCKER_DEFAULT_PLATFORM=linux/arm64v8\nexport TESTCONTAINERS_RYUK_DISABLED=true\nexport DOCKER_HOST=tcp://localhost:2375\n```\n\nCheck [here](https://podman-desktop.io/docs/migrating-from-docker/using-the-docker_host-environment-variable) for Podman\n\n### Get Started\n\nLook at \"[The Protocol Master Samples](https://github.com/kendarorg/the-protocol-master-samples)\" repository to create\na complete docker environment to have a glimpse of the features in\nvarious languages and environments\n\n* Python/MySQL/RabbitMQ\n* .Net Core/Entity Framework/MySQL\n* Go/Redis/Postgres\n* Java/Spring/MySQL/MQTT\n* Intercept a phone with pre-setup VPN container\n\n![generic.png](docs/ui/generic.png)\n\n### How it works\n\nIt's simple it's a `multiprotocol` proxy on your box (or whatever you want)\nIndependent of the stack you are using. Operated via command line and via\na [brand-new UI](docs/ui.md)\n\n### Scenarios\n\n* Simulate what-if without hitting real servers\n* Testing resiliency, errors and wrong data\n* Security analysis (what goes on the wire)\n* Test new APIs easily\n* Understand all consequences of changes\n* Load on the fly complex scenarios with all the plugin settings and data for multiple subsequent tests\n\n### Custom Plugins\n\nYou can build your own plugins, just place the Jar into the plugins dir\nand intercept all it's intercepted by TPM. Add headers, change data,\nsimulate specific needs\n\n## Examples\n\nOpen a http/s proxy on port 9999 and record everything that goes through\n\n```\njava -jar protocol-runner.jar -protocol http -proxy 9999 \\\n    -record\n```\n\nCreate a local postgres \"forward proxy\" to a real one and record everything\n\n```\njava -jar protocol-runner.jar -protocol postgres  \\\n    -connection jdbc:postgresql://REALSERVER:5432  \\\n    -login REALLOGIN -password REALPWD \\\n    -record\n```\n\nOpen a http/s proxy on port 9999 and return a 503 error, on 50% of calls\n\n```\njava -jar protocol-runner.jar -protocol http -proxy 9999 \\\n    -showError 503 -percentAction 40\n```\n\n## Features\n\n* Language independent: use the native protocols without drivers\n* Run on all OSs\n    * Windows\n    * Linux\n    * macOs\n* Native protocol for (and all compatibles):\n    * anything that goes through http/https\n    * postgres\n    * mysql\n    * mongoDB\n    * redis 3,redis 2\n    * mqtt\n    * rabbitmq/Amqp 0.9\n* Operate unattended via command lime\n* Operate via a [complete UI](docs/ui.md)\n* Mocked flow (all)\n* Support gzip,brotli,jacksonSmile,multipart and more (http/s)\n* Mocked error response (http/s)\n* Mocked (optionally parametrized) responses (http/s,mysql,postgres) (nth, and count)\n* Internal rewrite queries and urls (http/s,mysql,postgres)\n* Record/replay activity-Gold standards-Zero infrastructure (all)\n* Handle callback mocks during replay automagically (mqtt,amqp,redis)\n* Custom transparent proxy (all)\n* Translate postgres and MySQL to any Jdbc supported db like Oracle!\n* Plugin-based architecture\n* Include from maven central: [https://repo.maven.apache.org](https://repo.maven.apache.org/maven2/org/kendar/)\n* More than 70% Test coverage, more than 550 tests\n* Environment-based dynamic settings (see TPM_REPLACE)\n* Support for full \"test scenario\" with embedded encryption (for GDPR purposes)\n* Internal query language [TPMql](docs/tpmql.md) for all searches in APIs and UI\n\nThe configuration is based on command line parameters or a json properties file\nfor the usage check [here](docs/properties.md)\n\nFor the api usage here is the swagger: http//localhost:apisPort/swagger-ui/index.html\n\nSeveral data from the API can be filtered\nwith \u003ca href='https://github.com/kendarorg/the-protocol-master/blob/main/docs/tpmql.md'\u003eTPMql\u003c/a\u003e query language, a\nsmall JSON based functional query language\n\nIf you want to go on the specific functions by protocol:\n\n* [Http](protocol-http/README.md)\n    * Support Http and Https as Man In The Middle\n    * Custom proxy to intercept without DNS changes\n* [PostgresSQL](protocol-postgres/README.md)  Usable for most db (for hibernate you should set the final db dialect of\n  course)\n    * Support for simple and extended query protocol\n    * Transactions\n    * Simple authentication (could add an \"auth provider\")\n* [MySQL](protocol-mysql/README.md)\n    * Support for cached queries and stored procedures\n    * Simple authentication (could add an \"auth provider\")\n* [MongoDB](protocol-mongo/README.md)\n    * Basic authentication\n* [RabbitMq/AMQP 0.9.1](protocol-amqp-091/README.md)\n    * Support for all kind of publish/consume\n    * Channels multiplexing\n* [Redis](protocol-redis/README.md)\n    * Support for subscriptions\n    * Support for push parsing\n    * RESP2 and RESP3 supported out of the box\n* [Mqtt](protocol-mqtt/README.md)\n    * Support QOS 1,2,3\n    * Support 3.x and 5.x protocols\n* [DNS](protocol-dns-plugin/README.md)\n    * Support UDP and TCP\n    * Plugin to install in plugins directory!\n\n## Help\n\nThe DNS plugin is included in the help (should add it in the plugins dir)\n\n```\n=======================\n= The Protocol Master =\n=======================\nIf an environment variable exists TPM_REPLACE=a=b,c=d,e=f\nevery occurrence of %a% in config file is replaced with \nb value and so on\n\n  un                  unattended                 Unattended run (default false)\n  cfg                 config                     Load config file\n  pld                 pluginsDir                 Plugins directory (default plugins)\n  dd                  datadir                    Data directory (default file=data)]\n                                                 *Options:\n                                                 - encrypted=[absolute or relative path] save on disk encrypted\n                                                 the key is in ENCRYPTION_KEY environment variable or can be\n                                                 added encrypted=[path]\u0026key=[key]\n                                                 - file=[absolute or relative path] save on disk\n                                                 - null=[anything] noop\n  ll                  loglevel                   Log4j loglevel (default ERROR)\n  ap                  apis                       The port TPM controllers (default 0, as not active)\n  h                   help                       Show help\n  p                   protocol                   The protocols to start\n                                                 *Options: amqp091|mqtt|dns|http|mysql|mongodb|postgres|redis\n\nMongoDB protocol (mongodb)\n\n  po                  port                       Listening port (default 27018)\n  pc                  connection                 Connection (example mongodb://localhost:27018)\n  pt                  timeout                    Timeout (deafult 30)\n  pu                  login                      Remote login\n  pw                  password                   Remote password\n  report              report-plugin              Send 'report' events to global report plugin\n  record              record-plugin              Activate recording calls\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n  replay              replay-plugin              Activate replaying calls\n    rpc               respectCallDurations       Respect call durations, default false\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    bx                blockExternalCalls         Block external calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n  network-error       network-error-plugin       Change random bytes in the response data\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n  latency             latency-plugin             Add latency to calls\n    max                                          Max milliseconds latency, default 0\n    min                                          Min milliseconds latency, default 0\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n\nMQTT Protocol (mqtt)\n\n  po                  port                       Listening port (default 1883)\n  pc                  connection                 Connection (example tcp://localhost:1883)\n  pt                  timeout                    Timeout (deafult 30)\n  pu                  login                      Remote login\n  pw                  password                   Remote password\n  replay              replay-plugin              Activate replaying calls\n    rpc               respectCallDurations       Respect call durations, default false\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    bx                blockExternalCalls         Block external calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n  record              record-plugin              Activate recording calls\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n  latency             latency-plugin             Add latency to calls\n    max                                          Max milliseconds latency, default 0\n    min                                          Min milliseconds latency, default 0\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n  publish             publish-plugin             Publish asynchronous calls\n  report              report-plugin              Send 'report' events to global report plugin\n  network-error       network-error-plugin       Change random bytes in the response data\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n\nMySQL protocol (mysql)\n\n  po                  port                       Listening port (default 3306)\n  pc                  connection                 Connection (example jdbc:mysql://localhost:3306)\n  pt                  timeout                    Timeout (deafult 30)\n  pu                  login                      Remote login\n  pw                  password                   Remote password\n  js                  schema                     Force schema name\n  network-error       network-error-plugin       Change random bytes in the response data\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n  report              report-plugin              Send 'report' events to global report plugin\n  rewrite             rewrite-plugin             Rewrite the requests sent to the server\n  record              record-plugin              Activate recording calls\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n  latency             latency-plugin             Add latency to calls\n    max                                          Max milliseconds latency, default 0\n    min                                          Min milliseconds latency, default 0\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n  replay              replay-plugin              Activate replaying calls\n    rpc               respectCallDurations       Respect call durations, default false\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    bx                blockExternalCalls         Block external calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n  mock                mock-plugin                Mock certain service requests\n\nAmqp 0.9.1 Protocol (amqp091)\n\n  po                  port                       Listening port (default 5672)\n  pc                  connection                 Connection (example amqp://localhost:5672)\n  pt                  timeout                    Timeout (deafult 30)\n  pu                  login                      Remote login\n  pw                  password                   Remote password\n  report              report-plugin              Send 'report' events to global report plugin\n  record              record-plugin              Activate recording calls\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n  publish             publish-plugin             Publish asynchronous calls\n  replay              replay-plugin              Activate replaying calls\n    rpc               respectCallDurations       Respect call durations, default false\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    bx                blockExternalCalls         Block external calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n\nHttp Protocol (http)\n\n  ht                  http                       Http port (default 80\n  hs                  https                      Https port (default 443\n  prx                 proxy                      Proxy port (default 9999\n  cn                  cname                      Cname (default C=US,O=Local Development,CN=local.org\n  der                                            Der file (default resource://certificates/ca.der\n  key                                            Key file (default resource://certificates/ca.key\n  latency             latency-plugin             Add latency to calls\n    max                                          Max milliseconds latency, default 0\n    min                                          Min milliseconds latency, default 0\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n    t                 target                     Modify latency on following websites @\n                                                 @REGEX or  STARTWITH. Default anything\n                                                 *Repeatable\n  record              record-plugin              Activate recording calls\n    ret               removeETags                Remove e-tags, default false\n    rwh               recordWhat                 Record following websites @\n                                                 @REGEX or  STARTWITH. Default anything\n                                                 *Repeatable\n  rewrite             rewrite-plugin             Rewrite the requests sent to the server\n  mock                mock-plugin                Mock certain service requests\n  report              report-plugin              Send 'report' events to global report plugin\n    itp               ignoreTpm                  Do not send TPM calls reports, default true, so, ignore\n  error               error-plugin               Inject specific errors\n    msg               errorMessage               Error message\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n    err               errorCode                  Error code to show, default Error\n    t                 target                     Generate erros on following websites @\n                                                 @REGEX or  STARTWITH. Default anything\n                                                 *Repeatable\n  replay              replay-plugin              Activate replaying calls\n    pwh               replayWhat                 Replay following websites @\n                                                 @REGEX or  STARTWITH. Default anything\n                                                 *Repeatable\n  rate-limit          rate-limit-plugin          Force rate limit plugin\n    rateLimit                                    Rate limit, default 120\n    resetTimeSeconds                             Reset time window in seconds\n    cpr                                          Cost per request, default 2\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n    t                 target                     Generate throttle on following websites @\n                                                 @REGEX or  STARTWITH. Default anything\n                                                 *Repeatable\n\nPostgreSQL protocol (postgres)\n\n  po                  port                       Listening port (default 5432)\n  pc                  connection                 Connection (example jdbc:postgresql://localhost:5432/db?ssl=false)\n  pt                  timeout                    Timeout (deafult 30)\n  pu                  login                      Remote login\n  pw                  password                   Remote password\n  js                  schema                     Force schema name\n  mock                mock-plugin                Mock certain service requests\n  latency             latency-plugin             Add latency to calls\n    max                                          Max milliseconds latency, default 0\n    min                                          Min milliseconds latency, default 0\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n  report              report-plugin              Send 'report' events to global report plugin\n  replay              replay-plugin              Activate replaying calls\n    rpc               respectCallDurations       Respect call durations, default false\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    bx                blockExternalCalls         Block external calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n  rewrite             rewrite-plugin             Rewrite the requests sent to the server\n  network-error       network-error-plugin       Change random bytes in the response data\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n  record              record-plugin              Activate recording calls\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n\nRESP2/RESP3 Protocol (redis)\n\n  po                  port                       Listening port (default 6379)\n  pc                  connection                 Connection (example redis://localhost:6379)\n  pt                  timeout                    Timeout (deafult 30)\n  replay              replay-plugin              Activate replaying calls\n    rpc               respectCallDurations       Respect call durations, default false\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    bx                blockExternalCalls         Block external calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n  publish             publish-plugin             Publish asynchronous calls\n  report              report-plugin              Send 'report' events to global report plugin\n  latency             latency-plugin             Add latency to calls\n    max                                          Max milliseconds latency, default 0\n    min                                          Min milliseconds latency, default 0\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n  record              record-plugin              Activate recording calls\n    itc               ignoreTrivialCalls         Ignore Trivial Calls, default true\n    rcs               resetConnectionsOnStartup  Reset all connections when starting, default false\n  network-error       network-error-plugin       Change random bytes in the response data\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n\nDns Protocol (dns)\n\n  dp                  port                       Dns port (default 53)\n  cc                  cacheDns                   Cache DNS requests (default false)\n  cd                  childDns                   Child dns (default 8.8.8.8)\n                                                 *Repeatable\n  report              report-plugin              Send 'report' events to global report plugin\n  latency             latency-plugin             Add latency to calls\n    max                                          Max milliseconds latency, default 0\n    min                                          Min milliseconds latency, default 0\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n  network-error       network-error-plugin       Change random bytes in the response data\n    pca               percentAction              Percent calls touched, default 50, meaning 50%\n\n\n```\n\n## Storage choices\n\nThe global `dataDir` option is used to select the storage engine, setting the\nvalue to `[storage engine]=[storage engine connection string]`.\n\nWhen not specified the storage engine is `file`\n\n* path (relative or absolute), as `file` option\n* file= followed by the path (relative or absolute)\n* null= without connection string\n* encrypted= followed by the path (relative or absolute), must set \"ENCRYPTION_KEY\" value as environment variable\n\n## How it was Born\n\nI had an always missing QA environment and all changes should be checked by legal (it was in Electronic ID field). I\nneeded to simulate APIs, Database calls, and full scenarios, from UI to the DB.\n\nI started developing a series of docker container in PHP to intercept all incoming and outgoing HTTP/S call, with DNS\nserver and certificates, you can find it [here](https://github.com/kendarorg/HttpAnsweringMachine.php).\n\nBecoming the thing too hard to cope with I started the development of a Java integrated version with fancy UI and all\nintegrated service, the [HttpAnsweringMachine](https://github.com/kendarorg/HttpAnsweringMachine) based on Spring-Boot\nand leveraging a custom routing system, dns server and so on.\n\nBut that was too really hard to interact with. I started developing a JDBC-\u003eHTTP-\u003eJDBC\ndriver, [Janus-Jdbc](https://github.com/kendarorg/janus-jdbc) from scratch, then started creating a similar thing for\n.NET, thing went rogues in a short time with [Janus-Ado](https://github.com/kendarorg/janus-ado). But I started\nunderstanding Postgres protocol.\n\nI started then with a command line utility to parse and translate binary protocols and that's how \"The Protocol Master\"\nwas born. Always with a plugin-based architecture. Then I started adapting all the knowledge of HttpAnsweringMachine\ninside it to handle HTTP/S.\n\n## If you like it Buy me a coffee :)\n\n[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/paypalme/kendarorg/1)\n\n## The state machine-Behaviour tree\n\n### TLDR\n\nThe state machine (or better the Behaviour tree fsm) is based on\n\n* States (extending ProtoState) able to interact with events\n* Events (extending BaseEvent) to invoke action on states\n* Context (extending ProtoContext) it is the memory storage for the current\n  execution (connection) and the current state\n\n### Execution\n\nWhen bytes arrives to the TM they are transformed in a \"BytesEvent\" and then\nconsumed by the specific connection thread, then all the child states of the current\nstate are verified. They have the responsibility to check if the message is of the\ncorrect type and then if the content is matching the signature.\n\nWhen a state is hit it can send events or response messages. When an execution runs\nwithout errors then the \"executed incoming buffer\" is purged from the received bytes\n\nThe events are immediately executed. If no bytes are present or there are not enough\nbytes to read, the events queue is seeked for \"BytesEvent\" and then the execution is\nretried.\n","funding_links":["https://www.paypal.com/paypalme/kendarorg/1"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkendarorg%2Fthe-protocol-master","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkendarorg%2Fthe-protocol-master","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkendarorg%2Fthe-protocol-master/lists"}