{"id":13551607,"url":"https://github.com/claffin/cloudproxy","last_synced_at":"2025-05-14T16:02:47.632Z","repository":{"id":37827445,"uuid":"358552343","full_name":"claffin/cloudproxy","owner":"claffin","description":"Hide your scrapers IP behind the cloud. Provision proxy servers across different cloud providers to improve your scraping success.","archived":false,"fork":false,"pushed_at":"2025-03-05T06:10:14.000Z","size":1210,"stargazers_count":1444,"open_issues_count":11,"forks_count":83,"subscribers_count":18,"default_branch":"main","last_synced_at":"2025-04-07T04:01:33.463Z","etag":null,"topics":["cloud","proxy","proxy-server","scraping"],"latest_commit_sha":null,"homepage":"https://cloudproxy.io/","language":"Python","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/claffin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","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":"2021-04-16T09:51:55.000Z","updated_at":"2025-04-04T14:34:46.000Z","dependencies_parsed_at":"2025-03-17T01:00:23.783Z","dependency_job_id":"00fab774-9cc9-44ed-860a-124d9374ab5d","html_url":"https://github.com/claffin/cloudproxy","commit_stats":null,"previous_names":[],"tags_count":35,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claffin%2Fcloudproxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claffin%2Fcloudproxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claffin%2Fcloudproxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claffin%2Fcloudproxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/claffin","download_url":"https://codeload.github.com/claffin/cloudproxy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248836982,"owners_count":21169373,"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","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":["cloud","proxy","proxy-server","scraping"],"created_at":"2024-08-01T12:01:51.109Z","updated_at":"2025-05-14T16:02:47.625Z","avatar_url":"https://github.com/claffin.png","language":"Python","funding_links":[],"categories":["HarmonyOS","Python"],"sub_categories":["Windows Manager"],"readme":"[![Code Coverage][coverage-shield]][codecov-url]\n[![Code Quality][quality-shield]][codacy-url]\n[![Docker Build][build-shield]][docker-url]\n[![Docker Pulls][docker-pulls-shield]][docker-url]\n[![Python Version][python-shield]][python-url]\n[![License][license-shield]][license-url]\n[![Last Commit][commit-shield]][commit-url]\n[![Open Issues][issues-shield]][issues-url]\n[![Stars][stars-shield]][stars-url]\n[![Contributors][contributors-shield]][contributors-url]\n\n[coverage-shield]: https://img.shields.io/codecov/c/github/claffin/cloudproxy?style=for-the-badge\u0026logo=codecov\u0026logoColor=white\n[quality-shield]: https://img.shields.io/codacy/grade/39a9788caa854baebe01beb720e9c5a8?style=for-the-badge\u0026logo=codacy\u0026logoColor=white\n[build-shield]: https://img.shields.io/github/actions/workflow/status/claffin/cloudproxy/main.yml?style=for-the-badge\u0026logo=docker\u0026logoColor=white\n[docker-pulls-shield]: https://img.shields.io/docker/pulls/laffin/cloudproxy?style=for-the-badge\u0026logo=docker\u0026logoColor=white\n[python-shield]: https://img.shields.io/badge/Python-3.11-blue?style=for-the-badge\u0026logo=python\u0026logoColor=white\n[license-shield]: https://img.shields.io/github/license/claffin/cloudproxy?style=for-the-badge\u0026logo=opensourceinitiative\u0026logoColor=white\n[commit-shield]: https://img.shields.io/github/last-commit/claffin/cloudproxy?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[issues-shield]: https://img.shields.io/github/issues/claffin/cloudproxy?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[stars-shield]: https://img.shields.io/github/stars/claffin/cloudproxy?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[contributors-shield]: https://img.shields.io/github/contributors/claffin/cloudproxy?style=for-the-badge\u0026logo=github\u0026logoColor=white\n\n[python-url]: https://www.python.org/downloads/release/python-3110/\n[codecov-url]: https://app.codecov.io/gh/claffin/cloudproxy\n[codacy-url]: https://www.codacy.com/gh/claffin/cloudproxy/dashboard\n[docker-url]: https://hub.docker.com/r/laffin/cloudproxy\n[license-url]: https://github.com/claffin/cloudproxy/blob/master/LICENSE.txt\n[commit-url]: https://github.com/claffin/cloudproxy/commits/main\n[issues-url]: https://github.com/claffin/cloudproxy/issues\n[stars-url]: https://github.com/claffin/cloudproxy/stargazers\n[contributors-url]: https://github.com/claffin/cloudproxy/graphs/contributors\n# CloudProxy\n\n![cloudproxy](docs/images/cloudproxy.gif)\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n## About The Project\n\nThe purpose of CloudProxy is to hide your scrapers IP behind the cloud. It allows you to spin up a pool of proxies using popular cloud providers with just an API token. No configuration needed. \n\nCloudProxy exposes an API and modern UI for managing your proxy infrastructure. It includes:\n- Interactive API documentation with Swagger UI\n- Modern web interface for proxy management\n- Real-time proxy status monitoring\n- Easy scaling controls\n- Multi-provider support\n\n### Providers supported:\n* [DigitalOcean](docs/digitalocean.md)\n* [AWS](docs/aws.md)\n* [Google Cloud](docs/gcp.md)\n* [Hetzner](docs/hetzner.md)\n\n### Planned:\n* Azure\n* Scaleway\n* Vultr\n\n### Features:\n* Modern UI with real-time updates\n* Interactive API documentation\n* Multi-provider support\n* Multiple accounts per provider\n* Automatic proxy rotation\n* Health monitoring\n* Easy scaling controls\n* Docker-based deployment\n\nPlease always scrape nicely, respectfully.\n\n\u003c!-- GETTING STARTED --\u003e\n## Getting Started\n\nTo get a local copy up and running follow these simple steps.\n\n### Prerequisites\n\nYou can use CloudProxy in two ways:\n\n1. **Docker (recommended for running the service)**\n   * Docker installed on your system\n\n2. **Python Package (for development or integration)**\n   * Python 3.9 or higher\n\n### Installation\n\n#### As a Python Package\n\nCloudProxy is available as a Python package that you can install directly from PyPI:\n\n```bash\npip install cloudproxy\n```\n\nOr install from source:\n\n```bash\n# Clone the repository\ngit clone https://github.com/claffin/cloudproxy.git\ncd cloudproxy\n\n# Install in development mode\npip install -e .\n\n# Or build and install\npip install build\npython -m build\npip install dist/cloudproxy-0.1.0-py3-none-any.whl\n```\n\nOnce installed, you can import and use CloudProxy in your Python applications:\n\n```python\nfrom cloudproxy.providers import manager\nimport cloudproxy.main as cloudproxy\n\n# Setup your environment variables first\n# Start the CloudProxy service\ncloudproxy.start()\n```\n\n#### Environment variables:\n\nBasic authentication is used for proxy access. Configure via environment variables:\n* PROXY_USERNAME\n* PROXY_PASSWORD\n\n##### Required\nYou have two available methods of proxy authentication: username and password or IP restriction. You can use either one or both simultaneously.\n\n- `PROXY_USERNAME`, `PROXY_PASSWORD` - set the username and password for the forward proxy. The username and password should consist of alphanumeric characters. Using special characters may cause issues due to how URL encoding works.\n- `ONLY_HOST_IP` - set this variable to true if you want to restrict access to the proxy only to the host server (i.e., the IP address of the server running the CloudProxy Docker container).\n\n##### Optional\n- `AGE_LIMIT` - set the age limit for your forward proxies in seconds. Once the age limit is reached, the proxy is replaced. A value of 0 disables the feature. Default: disabled.\n\nSee individual provider pages for environment variables required in above providers supported section.\n\n#### Docker (recommended)\n\nFor example:\n\n   ```shell\n   docker run -e PROXY_USERNAME='CHANGE_THIS_USERNAME' \\\n       -e PROXY_PASSWORD='CHANGE_THIS_PASSWORD' \\\n       -e ONLY_HOST_IP=True \\\n       -e DIGITALOCEAN_ENABLED=True \\\n       -e DIGITALOCEAN_ACCESS_TOKEN='YOUR SECRET ACCESS KEY' \\\n       -it -p 8000:8000 laffin/cloudproxy:latest\n   ```\n\nIt is recommended to use a Docker image tagged to a version e.g. `laffin/cloudproxy:0.6.0-beta`, see [releases](https://github.com/claffin/cloudproxy/releases) for latest version.\n\n\u003c!-- USAGE EXAMPLES --\u003e\n## Usage\n\nCloudProxy provides multiple interfaces for managing your proxy infrastructure:\n\n### Web Interface\nAccess the UI at `http://localhost:8000/ui` to:\n- View proxy status across all providers\n- Scale proxy instances up/down\n- Monitor health status\n- Remove individual proxies\n- View active proxy count\n\n### API Documentation\nAccess the interactive API documentation at `http://localhost:8000/docs` to:\n- Explore available endpoints\n- Test API calls directly\n- View request/response schemas\n- Understand authentication requirements\n\n### Programmatic Usage\nCloudProxy exposes a RESTful API on localhost:8000. Your application can use the API to retrieve and manage proxy servers. All responses include metadata with request ID and timestamp for tracking.\n\nExample of retrieving and using a random proxy:\n\n```python\nimport random\nimport requests\n\ndef get_random_proxy():\n    response = requests.get(\"http://localhost:8000/random\").json()\n    return response[\"proxy\"][\"url\"]\n\nproxies = {\n    \"http\": get_random_proxy(),\n    \"https\": get_random_proxy()\n}\nmy_request = requests.get(\"https://api.ipify.org\", proxies=proxies)\n```\n\nFor more detailed examples of using CloudProxy as a Python package, see the [Python Package Usage Guide](docs/python-package-usage.md).\n\n## Multi-Account Provider Support\n\nCloudProxy now supports multiple accounts per provider, allowing you to:\n\n- Use multiple API keys or access tokens for the same provider\n- Configure different regions, sizes, and scaling parameters per account\n- Organize proxies by account/instance for better management\n- Scale each account independently\n\nEach provider can have multiple \"instances\", which represent different accounts or configurations. Each instance has its own:\n\n- Scaling parameters (min/max)\n- Region settings\n- Size configuration\n- API credentials\n- IP addresses\n\nTo configure multiple instances, use environment variables with the instance name in the format:\n```\nPROVIDERNAME_INSTANCENAME_VARIABLE\n```\n\nFor example, to configure two DigitalOcean accounts:\n```shell\n# Default DigitalOcean account\nDIGITALOCEAN_ENABLED=True\nDIGITALOCEAN_ACCESS_TOKEN=your_first_token\nDIGITALOCEAN_DEFAULT_REGION=lon1\nDIGITALOCEAN_DEFAULT_MIN_SCALING=2\n\n# Second DigitalOcean account\nDIGITALOCEAN_SECONDACCOUNT_ENABLED=True\nDIGITALOCEAN_SECONDACCOUNT_ACCESS_TOKEN=your_second_token\nDIGITALOCEAN_SECONDACCOUNT_REGION=nyc1\nDIGITALOCEAN_SECONDACCOUNT_MIN_SCALING=3\n```\n\n## CloudProxy API Examples\n\n### List available proxy servers\n#### Request\n\n`GET /?offset=0\u0026limit=10`\n\n    curl -X 'GET' 'http://localhost:8000/?offset=0\u0026limit=10' -H 'accept: application/json'\n\n#### Response\n```json\n{\n  \"metadata\": {\n    \"request_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"timestamp\": \"2024-02-24T08:00:00Z\"\n  },\n  \"total\": 2,\n  \"proxies\": [\n    {\n      \"ip\": \"192.168.1.1\",\n      \"port\": 8899,\n      \"auth_enabled\": true,\n      \"url\": \"http://username:password@192.168.1.1:8899\"\n    },\n    {\n      \"ip\": \"192.168.1.2\",\n      \"port\": 8899,\n      \"auth_enabled\": true,\n      \"url\": \"http://username:password@192.168.1.2:8899\"\n    }\n  ]\n}\n```\n\n### Get random proxy server\n#### Request\n\n`GET /random`\n\n    curl -X 'GET' 'http://localhost:8000/random' -H 'accept: application/json'\n\n#### Response\n```json\n{\n  \"metadata\": {\n    \"request_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"timestamp\": \"2024-02-24T08:00:00Z\"\n  },\n  \"message\": \"Random proxy retrieved successfully\",\n  \"proxy\": {\n    \"ip\": \"192.168.1.1\",\n    \"port\": 8899,\n    \"auth_enabled\": true,\n    \"url\": \"http://username:password@192.168.1.1:8899\"\n  }\n}\n```\n\n### Remove proxy server\n#### Request\n\n`DELETE /destroy`\n\n    curl -X 'DELETE' 'http://localhost:8000/destroy?ip_address=192.1.1.1' -H 'accept: application/json'\n\n#### Response\n```json\n{\n  \"metadata\": {\n    \"request_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"timestamp\": \"2024-02-24T08:00:00Z\"\n  },\n  \"message\": \"Proxy scheduled for deletion\",\n  \"proxy\": {\n    \"ip\": \"192.1.1.1\",\n    \"port\": 8899,\n    \"auth_enabled\": true,\n    \"url\": \"http://username:password@192.1.1.1:8899\"\n  }\n}\n```\n\n### Restart proxy server\n#### Request\n\n`DELETE /restart`\n\n    curl -X 'DELETE' 'http://localhost:8000/restart?ip_address=192.1.1.1' -H 'accept: application/json'\n\n#### Response\n```json\n{\n  \"metadata\": {\n    \"request_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"timestamp\": \"2024-02-24T08:00:00Z\"\n  },\n  \"message\": \"Proxy scheduled for restart\",\n  \"proxy\": {\n    \"ip\": \"192.1.1.1\",\n    \"port\": 8899,\n    \"auth_enabled\": true,\n    \"url\": \"http://username:password@192.1.1.1:8899\"\n  }\n}\n```\n\n### Get providers\n#### Request\n\n`GET /providers`\n\n    curl -X 'GET' 'http://localhost:8000/providers' -H 'accept: application/json'\n\n#### Response\n```json\n{\n  \"metadata\": {\n    \"request_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"timestamp\": \"2024-02-24T08:00:00Z\"\n  },\n  \"providers\": {\n    \"digitalocean\": {\n      \"enabled\": true,\n      \"ips\": [\"192.168.1.1\"],\n      \"scaling\": {\n        \"min_scaling\": 2,\n        \"max_scaling\": 2\n      },\n      \"size\": \"s-1vcpu-1gb\",\n      \"region\": \"lon1\",\n      \"instances\": {\n        \"default\": {\n          \"enabled\": true,\n          \"ips\": [\"192.168.1.1\"],\n          \"scaling\": {\n            \"min_scaling\": 2,\n            \"max_scaling\": 2\n          },\n          \"size\": \"s-1vcpu-1gb\",\n          \"region\": \"lon1\",\n          \"display_name\": \"Default Account\"\n        },\n        \"secondary\": {\n          \"enabled\": true,\n          \"ips\": [\"192.168.1.2\"],\n          \"scaling\": {\n            \"min_scaling\": 1,\n            \"max_scaling\": 3\n          },\n          \"size\": \"s-1vcpu-1gb\",\n          \"region\": \"nyc1\",\n          \"display_name\": \"US Account\"\n        }\n      }\n    },\n    \"aws\": {\n      \"enabled\": false,\n      \"ips\": [],\n      \"scaling\": {\n        \"min_scaling\": 2,\n        \"max_scaling\": 2\n      },\n      \"size\": \"t2.micro\",\n      \"region\": \"eu-west-2\",\n      \"ami\": \"ami-096cb92bb3580c759\",\n      \"spot\": false\n    }\n  }\n}\n```\n\n### Update provider scaling\n#### Request\n\n`PATCH /providers/digitalocean`\n\n    curl -X 'PATCH' 'http://localhost:8000/providers/digitalocean' \\\n      -H 'accept: application/json' \\\n      -H 'Content-Type: application/json' \\\n      -d '{\"min_scaling\": 5, \"max_scaling\": 5}'\n\n#### Response\n```json\n{\n  \"metadata\": {\n    \"request_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"timestamp\": \"2024-02-24T08:00:00Z\"\n  },\n  \"message\": \"Provider 'digitalocean' scaling configuration updated successfully\",\n  \"provider\": {\n    \"enabled\": true,\n    \"ips\": [\"192.168.1.1\", \"192.168.1.2\"],\n    \"scaling\": {\n      \"min_scaling\": 5,\n      \"max_scaling\": 5\n    },\n    \"size\": \"s-1vcpu-1gb\",\n    \"region\": \"lon1\"\n  }\n}\n```\n\n### Get provider instance\n#### Request\n\n`GET /providers/digitalocean/secondary`\n\n    curl -X 'GET' 'http://localhost:8000/providers/digitalocean/secondary' -H 'accept: application/json'\n\n#### Response\n```json\n{\n  \"metadata\": {\n    \"request_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"timestamp\": \"2024-02-24T08:00:00Z\"\n  },\n  \"message\": \"Provider 'digitalocean' instance 'secondary' configuration retrieved successfully\",\n  \"provider\": \"digitalocean\",\n  \"instance\": \"secondary\",\n  \"config\": {\n    \"enabled\": true,\n    \"ips\": [\"192.168.1.2\"],\n    \"scaling\": {\n      \"min_scaling\": 1,\n      \"max_scaling\": 3\n    },\n    \"size\": \"s-1vcpu-1gb\",\n    \"region\": \"nyc1\",\n    \"display_name\": \"US Account\"\n  }\n}\n```\n\n### Update provider instance scaling\n#### Request\n\n`PATCH /providers/digitalocean/secondary`\n\n    curl -X 'PATCH' 'http://localhost:8000/providers/digitalocean/secondary' \\\n      -H 'accept: application/json' \\\n      -H 'Content-Type: application/json' \\\n      -d '{\"min_scaling\": 2, \"max_scaling\": 5}'\n\n#### Response\n```json\n{\n  \"metadata\": {\n    \"request_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"timestamp\": \"2024-02-24T08:00:00Z\"\n  },\n  \"message\": \"Provider 'digitalocean' instance 'secondary' scaling configuration updated successfully\",\n  \"provider\": \"digitalocean\",\n  \"instance\": \"secondary\",\n  \"config\": {\n    \"enabled\": true,\n    \"ips\": [\"192.168.1.2\"],\n    \"scaling\": {\n      \"min_scaling\": 2,\n      \"max_scaling\": 5\n    },\n    \"size\": \"s-1vcpu-1gb\",\n    \"region\": \"nyc1\",\n    \"display_name\": \"US Account\"\n  }\n}\n```\n\nCloudProxy runs on a schedule of every 30 seconds, it will check if the minimum scaling has been met, if not then it will deploy the required number of proxies. The new proxy info will appear in IPs once they are deployed and ready to be used.\n\n\u003c!-- ROADMAP --\u003e\n## Roadmap\n\nThe project is at early alpha with limited features. In the future more providers will be supported, autoscaling will be implemented and a rich API to allow for blacklisting and recycling of proxies.\n\nSee the [open issues](https://github.com/claffin/cloudproxy/issues) for a list of proposed features (and known issues).\n\n## Limitations\nThis method of scraping via cloud providers has limitations, many websites have anti-bot protections and blacklists in place which can limit the effectiveness of CloudProxy. Many websites block datacenter IPs and IPs may be tarnished already due to IP recycling. Rotating the CloudProxy proxies regularly may improve results. The best solution for scraping is via proxy services providing residential IPs, which are less likely to be blocked, however are much more expensive. CloudProxy is a much cheaper alternative for scraping sites that do not block datacenter IPs nor have advanced anti-bot protection. This a point frequently made when people share this project which is why I am including this in the README. \n\n\u003c!-- CONTRIBUTING --\u003e\n## Contributing\n\nContributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the Branch (`git push origin feature/AmazingFeature`)\n5. Open a Pull Request\n\nMy target is to review all PRs within a week of being submitted, though sometimes it may be sooner or later.\n\n\u003c!-- LICENSE --\u003e\n## License\n\nDistributed under the MIT License. See `LICENSE` for more information.\n\n\n\n\u003c!-- CONTACT --\u003e\n## Contact\n\nChristian Laffin - [@christianlaffin](https://twitter.com/christianlaffin) - christian.laffin@gmail.com\n\nProject Link: [https://github.com/claffin/cloudproxy](https://github.com/claffin/cloudproxy)\n\n\n\n\u003c!-- ACKNOWLEDGEMENTS --\u003e\n## Acknowledgements\n\n* []()\n* []()\n* []()\n\n\n\n\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n[contributors-shield]: https://img.shields.io/github/contributors/claffin/cloudproxy.svg?style=flat-square\n[contributors-url]: https://github.com/claffin/cloudproxy/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/claffin/cloudproxy.svg?style=flat-square\n[forks-url]: https://github.com/claffin/cloudproxy/network/members\n[stars-shield]: https://img.shields.io/github/stars/claffin/cloudproxy.svg?style=flat-square\n[stars-url]: https://github.com/claffin/cloudproxy/stargazers\n[issues-shield]: https://img.shields.io/github/issues/claffin/cloudproxy.svg?style=flat-square\n[issues-url]: https://github.com/claffin/cloudproxy/issues\n[license-shield]: https://img.shields.io/github/license/claffin/cloudproxy.svg?style=flat-square\n[license-url]: https://github.com/claffin/cloudproxy/blob/master/LICENSE.txt\n[docker-url]: https://hub.docker.com/r/laffin/cloudproxy\n[docker-shield]: https://img.shields.io/github/workflow/status/claffin/cloudproxy/CI?style=flat-square\n[codecov-url]: https://app.codecov.io/gh/claffin/cloudproxy\n[codecov-shield]: https://img.shields.io/codecov/c/github/claffin/cloudproxy?style=flat-square\n[codacy-shield]: https://img.shields.io/codacy/grade/39a9788caa854baebe01beb720e9c5a8?style=flat-square\n[codacy-url]: https://www.codacy.com/gh/claffin/cloudproxy/dashboard?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=claffin/cloudproxy\u0026amp;utm_campaign=Badge_Grade\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclaffin%2Fcloudproxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclaffin%2Fcloudproxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclaffin%2Fcloudproxy/lists"}