{"id":13586971,"url":"https://github.com/r12f/rnp","last_synced_at":"2025-05-12T06:17:26.710Z","repository":{"id":42131847,"uuid":"383355173","full_name":"r12f/rnp","owner":"r12f","description":"A simple layer 4 ping tool for cloud.","archived":false,"fork":false,"pushed_at":"2023-12-26T00:26:13.000Z","size":390,"stargazers_count":71,"open_issues_count":5,"forks_count":7,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-04-14T12:07:26.190Z","etag":null,"topics":["network","ping","quic","rust","tcp"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/r12f.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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}},"created_at":"2021-07-06T05:53:14.000Z","updated_at":"2024-03-16T03:02:58.000Z","dependencies_parsed_at":"2023-12-26T00:29:15.596Z","dependency_job_id":null,"html_url":"https://github.com/r12f/rnp","commit_stats":{"total_commits":203,"total_committers":1,"mean_commits":203.0,"dds":0.0,"last_synced_commit":"1e6b0782516c6b4fd5ce9958dc827b8a63bdada5"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r12f%2Frnp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r12f%2Frnp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r12f%2Frnp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r12f%2Frnp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/r12f","download_url":"https://codeload.github.com/r12f/rnp/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238053527,"owners_count":19408705,"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":["network","ping","quic","rust","tcp"],"created_at":"2024-08-01T15:05:56.549Z","updated_at":"2025-02-10T04:12:47.221Z","avatar_url":"https://github.com/r12f.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# Rnp - A simple layer 4 ping tool for cloud.\n![Rnp](https://github.com/r12f/rnp/blob/main/assets/logo.png?raw=true)\n\n[![Documentation](https://docs.rs/rnp/badge.svg)](https://docs.rs/rnp/)\n[![Build Status](https://img.shields.io/azure-devops/build/riff/f012db2f-e386-47e8-acde-e33f18034044/5?style=flat)](https://riff.visualstudio.com/rnp/_build/latest?definitionId=5\u0026branchName=main)\n[![codecov](https://codecov.io/gh/r12f/rnp/branch/main/graph/badge.svg?token=E9IDEW9Z6G)](https://codecov.io/gh/r12f/rnp)\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE-APACHE)\n\n| Release | Status |\n|:---:|---|\n| Crates.io | [![Crates.io](https://img.shields.io/crates/v/rnp?color=blue\u0026style=flat-square\u0026label=cargo%20install%20rnp)](https://crates.io/crates/rnp) |\n| Install | [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/r12f/rnp?color=blue\u0026label=github%20release\u0026style=flat-square)](https://github.com/r12f/rnp/releases) [![Chocolatey Version](https://img.shields.io/chocolatey/v/rnp-cli?color=blue\u0026label=choco%20install%20rnp-cli\u0026style=flat-square)](https://community.chocolatey.org/packages/rnp-cli) [![winget](https://img.shields.io/static/v1?style=flat-square\u0026label=winget%20install%20rnp\u0026message=winget\u0026color=blue)](https://github.com/r12f/rnp/wiki/How-to-install#22-via-winget-on-windows) [![apt/deb](https://img.shields.io/static/v1?style=flat-square\u0026label=apt%20install%20rnp\u0026message=https%3A%2F%2Frepo.r12f.com%2Fapt\u0026color=blue)](https://github.com/r12f/rnp/wiki/How-to-install#23-via-apt-on-linux) |\n| Nuget\u003cbr/\u003epackages | [![Nuget](https://img.shields.io/nuget/v/rnp.main.windows.x86?style=flat-square\u0026color=green\u0026label=windows.x86)](https://www.nuget.org/packages/rnp.main.windows.x86/) [![Nuget](https://img.shields.io/nuget/v/rnp.main.windows.x64?style=flat-square\u0026color=green\u0026label=windows.x64)](https://www.nuget.org/packages/rnp.main.windows.x64/) [![Nuget](https://img.shields.io/nuget/v/rnp.main.windows.arm64?style=flat-square\u0026color=green\u0026label=windows.arm64)](https://www.nuget.org/packages/rnp.main.windows.arm64/) \u003cbr/\u003e [![Nuget](https://img.shields.io/nuget/v/rnp.main.linux.x86?style=flat-square\u0026color=green\u0026label=linux.x86)](https://www.nuget.org/packages/rnp.main.linux.x86/) [![Nuget](https://img.shields.io/nuget/v/rnp.main.linux.x64?style=flat-square\u0026color=green\u0026label=linux.x64)](https://www.nuget.org/packages/rnp.main.linux.x64/) [![Nuget](https://img.shields.io/nuget/v/rnp.main.linux.arm?style=flat-square\u0026color=green\u0026label=linux.arm)](https://www.nuget.org/packages/rnp.main.linux.arm/) [![Nuget](https://img.shields.io/nuget/v/rnp.main.linux.arm64?style=flat-square\u0026color=green\u0026label=linux.arm64)](https://www.nuget.org/packages/rnp.main.linux.arm64/) \u003cbr/\u003e [![Nuget](https://img.shields.io/nuget/v/rnp.main.linux.arm64?style=flat-square\u0026color=green\u0026label=macos.x64)](https://www.nuget.org/packages/rnp.main.macos.x64/)|\n\n```bash\n$ rnp 8.8.8.8:443 -r -l\nrnp - r12f (r12f.com, github.com/r12f) - A simple layer 4 ping tool for cloud.\n\nStart testing TCP 8.8.8.8:443:\nReaching TCP 8.8.8.8:443 from 192.168.50.153:8940 succeeded: RTT=12.95ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:8941 succeeded: RTT=11.24ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:8942 succeeded: RTT=10.96ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:8943 succeeded: RTT=12.43ms\n\n=== TCP connect statistics for 8.8.8.8:443 ===\n- Packets: Sent = 4, Received = 4, Lost = 0 (0.00% loss).\n- Round trip time: Minimum = 10.96ms, Maximum = 12.95ms, Average = 11.90ms.\n\n=== Ping result scatter map ===\n\n    Src | Results\n   Port | (\"1\" = Ok, \"0\" = Fail, \"-\" = Not Tested)\n--------+-0---4-5---9-0---4-5---9-------------------\n   8940 | 1111- ----- ----- -----\n\n=== Latency scatter map (in milliseconds) ===\n\n  Src Port | Results (\"X\" = Fail, \"-\" = Not Tested)\n-----------+----0------1------2------3------4------5------6------7------8------9---\n      8940 |  12.95  11.24  10.96  12.43    -      -      -      -      -      -\n```\n\n## Installation\nWe are currently supporting multiple ways to install Rnp. Please check the detailed doc here: [How to install](https://github.com/r12f/rnp/wiki/How-to-install).\n\n## Why Rnp?\n\nPing is one of the most frequently used tool for testing network reachability. And yet, we have another one here... So why?\n\nDespite there are numerous ping tools in the market, I wrote Rnp for some specific reasons:\n* **Wide platform support**, so we can run it everywhere.\n  * Wide platform support: Windows/Linux, x86/amd64/arm64.\n  * Wide machine environment support: Minimum dependencies, such as runtimes like JRE/CLR.\n* **Be cloud-friendly**:\n  * Support scanning all network paths.\n    * Nowadays, services and network data paths are mostly redundant. Technologies like load balancer and [ECMP] are widely used in cloud and modern data center.\n    * Because of this, if a service, or a network link is having trouble, we will see intermediate packet drop/latency, instead of seeing full connectivity drop. Hence, we need a tool to help us scan all possible network paths and find out the bad links.\n  * Minimize impact to existing data path, such as high port usage and load on networking stack.\n    * High port usage can cause your machine running out of source port to use, then cause your service failing creating new connections. And it can be easily triggered with network testing / scanning.\n    * This is even worse when you are checking network connectivity to Internet, because the outbound port will also need to be allocated on your load balancer, which is shared across all your machines. This is a very common error in all clouds, such as [AWS][AWSErrorPortAllocation] and [Azure][AzureLBSnatPortExhaustion].\n* **Avoid unstable measurements** when possible.\n* **Easy to use.**\n* ...\n\nTo help us achieve the things above, we are implementing our ping in a very specific way.\n* **TCP connect as ping.** Focus on network reachability.\n  * **Why not ICMP ping?**\n    1. Unlike TCP, ICMP is lacking of variant, which makes it bad for scanning all possible network paths.\n    2. ICMP is banned in many machines and network for security reasons, so ICMP timeout doesn't really mean it is timeout.\n  * **Why not UDP ping?**\n    1. UDP is connectionless, so there is no so-called UDP ping. \n    2. Existing UDP ping tool uses ICMP unreachable message for detecting if a UDP port is reachable or not, which causes 2 problems:\n       1. Implementation usually involves using raw socket, which is really bad for performance, especially in cloud, where the network load could be high.\n       2. Same as ICMP ping. ICMP can be banned, hence UDP ping works doesn't really mean UDP port is open. (And one of the reasons that people ban ICMP is to avoid this UDP port scan.)\n* **Parallel pings** for spray all possible network paths:\n  * We rotate the source port to make each ping having different tuples to allow them going through different network path.\n  * Parallel pings with configurable ping intervals can dramatically increase the scanning speed.\n* **Use RST instead of FIN** by default to minimize port usage.\n  * Most of the tcp connect tools follows the regular way to disconnect the TCP connection - the 4-way handshake with FIN packet. This is great for servers, but not for testing.\n  * The regular disconnect leaves the ports in TIME_WAIT state, and the cloud load balancers have to keep tracking these SNAT ports as well. It can easily cause SNAT port allocation error, which will make the network for your service even worse. You definitely don't want to see this.\n* **No [raw socket][RawSocket] usage**\n  * Many ping tools uses raw socket to implement their pings, allowing you to manipulate your packets or support mixed protocol pings, such as UDP ping. These features are helpful in certain cases, but it is not really needed for most of the people.\n  * Raw socket will cause the kernel to deliver all packets that matches the IP you bind to your sockets. It is a huge burden to network stack when the load is high, so we are avoiding using it.\n* **Use [Rust]** as the programming language:\n  * Rust is a system language with very light-weighted and GC-free runtime, which means no more random lags during our measurements, such as stop-the-world stages in GC.\n  * Rust has [wide range of platform support][RustPlatform] and produces almost self-contained native binaries, so we can simply copy and run.\n  * Rust is as fast as C, while also has great support for modern age asynchronous programming. Gems like [go-like mpsc channel][GoChannel], async/await, you can find them all in Rust.\n  * ...\n* **Friendly result output**:\n  * Besides outputting just like ping, we also provided other ways to show the results, such as very compacted scatter map.\n  * We also support outputting the result into CSV/JSON/Text files for later analysis or scripting.\n\nSome hard decisions:\n* DNS name resolution is intentionally not supported. Using IP address is enforced when using our ping.\n  * This is because DNS can return different result based on geo-location. This misleads people a lot when collaborating on network issues, because it might end up with different people debugging different issues without even knowing it for long time.\n  * To get IP from DNS, we can run `nslookup \u003cdomain-name\u003e`.\n\n## Usage\nOk, let's check some real cases to get started!\n\nThe simplest case - regular TCP connect test. Works just like ping.\n```bash\nrnp 8.8.8.8:443\nrnp - r12f (r12f.com, github.com/r12f) - A simple layer 4 ping tool for cloud.\n\nStart testing TCP 8.8.8.8:443:\nReaching TCP 8.8.8.8:443 from 192.168.50.153:10401 succeeded: RTT=11.17ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:10402 succeeded: RTT=13.36ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:10403 succeeded: RTT=14.27ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:10404 succeeded: RTT=12.39ms\n\n=== TCP connect statistics for 8.8.8.8:443 ===\n- Packets: Sent = 4, Received = 4, Lost = 0 (0.00% loss).\n- Round trip time: Minimum = 11.17ms, Maximum = 14.27ms, Average = 12.80ms.\n```\n\nNow let's make our ping faster by adding `-p 10` to spawn 10 workers and `-i 0` to remove the intervals we wait between each ping, then run 100 pings. And to avoid abusing our console, we disable the regular output (`-q`), enable the result scatter map (`-r`) and log the details to a json file for later use (`--log-json log.json`).\n```bash\n$ rnp.exe 8.8.8.8:443 -p 10 -i 0 -n 100 -q -r --log-json log.json\nrnp - r12f (r12f.com, github.com/r12f) - A simple layer 4 ping tool for cloud.\n\nStart testing TCP 8.8.8.8:443:\n97 pings finished.\n=== TCP connect statistics for 8.8.8.8:443 ===\n- Packets: Sent = 100, Received = 96, Lost = 4 (4.00% loss).\n- Round trip time: Minimum = 10.91ms, Maximum = 999.43ms, Average = 55.16ms.\n\n=== Ping result scatter map ===\n\n    Src | Results\n   Port | (\"1\" = Ok, \"0\" = Fail, \"-\" = Not Tested)\n--------+-0---4-5---9-0---4-5---9-------------------\n  18180 | ----- ----1 11111 11111\n  18200 | 11111 11111 11111 11111\n  18220 | 11111 11111 11111 11111\n  18240 | 11111 11111 11111 11111\n  18260 | 11111 11111 11111 11111\n  18280 | 10000 1111- ----- -----\n```\n\nWe will see the test will complete almost immediately, and the details will be logged into the json file:\n```json\n[\n  {\"utcTime\":\"2021-07-09T04:54:50.465178Z\",\"protocol\":\"TCP\",\"workerId\":4,\"targetIP\":\"8.8.8.8\",\"targetPort\":\"443\",\"sourceIP\":\"192.168.50.153\",\"sourcePort\":\"18285\",\"roundTripTimeInMs\":17.14,\"error\":\"\"},\n  {\"utcTime\":\"2021-07-09T04:54:50.465430300Z\",\"protocol\":\"TCP\",\"workerId\":8,\"targetIP\":\"8.8.8.8\",\"targetPort\":\"443\",\"sourceIP\":\"192.168.50.153\",\"sourcePort\":\"18288\",\"roundTripTimeInMs\":23.25,\"error\":\"\"},\n  {\"utcTime\":\"2021-07-09T04:54:50.458698800Z\",\"protocol\":\"TCP\",\"workerId\":6,\"targetIP\":\"8.8.8.8\",\"targetPort\":\"443\",\"sourceIP\":\"0.0.0.0\",\"sourcePort\":\"18282\",\"roundTripTimeInMs\":998.91,\"error\":\"timed out\"},\n]\n```\n\nAnd now, we can see our ping failed on port 19653, then we can start a continuous ping to rerun the bad ports. And we can see a fairly high failure rate on this port as below.\n```bash\n$ rnp.exe 8.8.8.8:443 --src-port 18282 -t\nrnp - r12f (r12f.com, github.com/r12f) - A simple layer 4 ping tool for cloud.\n\nStart testing TCP 8.8.8.8:443:\nReaching TCP 8.8.8.8:443 from 192.168.50.153:18282 succeeded: RTT=11.65ms\nReaching TCP 8.8.8.8:443 from 0.0.0.0:18282 failed: Timed out, RTT = 999.24ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:18282 succeeded: RTT=12.24ms\n.....\n```\n\nAlso, we can easily try all failure ports again and see how they look like. Here is an example using powershell, and on non-windows platform, we can easily do the same thing with tools like [jq]:\n```bash\n# Extract the failure ports\n$ $ports = (gc .\\log.json | ConvertFrom-Json | % { $_ } | ? { $_.error -eq \"timed out\" } | % { $_.sourcePort }) -join \",\"\n$ $ports\n18282,18281,18284,18283\n\n# Retry\n$ rnp.exe 8.8.8.8:443 --src-ports $ports -t\nrnp - r12f (r12f.com, github.com/r12f) - A simple layer 4 ping tool for cloud.\n\nStart testing TCP 8.8.8.8:443:\nReaching TCP 8.8.8.8:443 from 192.168.50.153:18284 succeeded: RTT=11.24ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:18283 succeeded: RTT=11.15ms\nReaching TCP 8.8.8.8:443 from 0.0.0.0:18282 failed: Timed out, RTT = 999.14ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:18281 succeeded: RTT=11.53ms\nReaching TCP 8.8.8.8:443 from 0.0.0.0:18284 failed: Timed out, RTT = 999.50ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:18283 succeeded: RTT=11.88ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:18282 succeeded: RTT=10.90ms\nReaching TCP 8.8.8.8:443 from 0.0.0.0:18281 failed: Timed out, RTT = 999.38ms\nReaching TCP 8.8.8.8:443 from 192.168.50.153:18284 succeeded: RTT=14.40ms\n.....\n```\n\nAnd rnp will start to rotate the ping within all the specified source ports for testing.\n\n### More in help\nTo see more on this tool, we can try `--help` option.\n```bash\n$ rnp.exe --help\nrnp 0.1.114\nr12f (r12f.com, github.com/r12f)\nA simple layer 4 ping tool for cloud.\n\nUSAGE:\n    rnp [FLAGS] [OPTIONS] \u003ctarget\u003e\n\nFLAGS:\n    -d, --check-disconnect        Check if connection can be correctly disconnected. Only available in TCP mode now.\n                                  When enabled, we will use normal disconnect (w/ FIN) and check the connection\n                                  disconnect.\n    -h, --help                    Prints help information\n        --log-tls-key             Enable key logger in TLS for helping packet capture.\n                                  Please note that it might cause RTT to be slightly larger than the real one, because\n                                  logging key will also take time.\n    -q, --no-console-log          Don't log each ping result to console. Summary and other things will still be written\n                                  to console.\n    -t                            Ping until stopped.\n    -l, --show-latency-scatter    Show latency (round trip time) scatter map after ping is done.\n    -r, --show-result-scatter     Show ping result scatter map after ping is done.\n        --use-timer-rtt           Calculate the RTT by checking the time of before and after doing QUIC connect instead\n                                  of estimated RTT from QUIC. Not recommended, as this might cause the RTT time to be\n                                  larger than the real one.\n    -V, --version                 Prints version information\n\nOPTIONS:\n        --alpn \u003calpn-protocol\u003e\n            ALPN protocol used in QUIC. Specify \"none\" to disable ALPN.\n            It is usually h3-\u003cver\u003e for http/3 or hq-\u003cver\u003e for specific version of QUIC.\n            For latest IDs, please check here: https://www.iana.org/assignments/tls-extensiontype-values/tls-\n            extensiontype-values.xhtml#alpn-protocol-ids\n            [default: h3-29]\n        --log-csv \u003ccsv-log-path\u003e                  Log ping results a csv file. [alias: --oc]\n        --log-json \u003cjson-log-path\u003e                Log ping results to a json file. [alias: --oj]\n    -b, --latency-buckets \u003clatency-buckets\u003e...\n            If set, bucket ping latency (round trip time) after ping is done. Set to 0.0 to use the default one:\n            [0.1,0.5,1.0,10.0,50.0,100.0,300.0,500.0]\n    -p, --parallel \u003cparallel-ping-count\u003e          Count of pings running in parallel. [default: 1]\n    -n, --count \u003cping-count\u003e                      Ping count. [default: 4]\n    -i, --interval \u003cping-interval-in-ms\u003e          Sleep between each ping in milliseconds. [default: 1000]\n    -m, --mode \u003cprotocol\u003e                         Specify protocol to use. [default: TCP]\n        --server-name \u003cserver-name\u003e               Specify the server name in the QUIC pings. Example: localhost.\n    -s, --src-ip \u003csource-ip\u003e                      Source IP address. [default: 0.0.0.0]\n        --src-ports \u003csource-ports\u003e\n            Source port ranges to rotate in ping. Format: port,start-end. Example: 1024,10000-11000. [alias: --sp]\n\n    -o, --log-text \u003ctext-log-path\u003e                Log ping results to a text file.\n        --ttl \u003ctime-to-live\u003e                      Time to live.\n    -w, --timeout \u003cwait-timeout-in-ms\u003e            Wait time for each ping in milliseconds. [default: 2000]\n        --warmup \u003cwarmup-count\u003e                   Warm up ping count. [default: 0]\n\nARGS:\n    \u003ctarget\u003e\n```\n\n## Contribute\nThanks a lot in being interested in this project and all contributions are welcomed!\n\nTo contribute, please follow our [how to contribute](https://github.com/r12f/rnp/wiki/How-to-contribute) doc.\n\n## Resources\n* [Equal-cost multi-path routing][ECMP]\n* [AWS NAT gateways][AWSNatGateways] and [ErrorPortAllocation error][AWSErrorPortAllocation]\n* [Azure Load Balancer][AzureLB], [SNAT port exhaustion][AzureLBSnatPortExhaustion] and [outbound connectivity troubleshooting][AzureLBOutboundTroubleshoot]\n* Raw socket on [Linux][RawSocket] and [Windows][RawSocketWin]\n\n## License\nApache-2.0: https://www.apache.org/licenses/LICENSE-2.0\n\n[ECMP]: https://en.wikipedia.org/wiki/Equal-cost_multi-path_routing\n[AWSNatGateways]: https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-limits\n[AWSErrorPortAllocation]: https://aws.amazon.com/premiumsupport/knowledge-center/vpc-resolve-port-allocation-errors/\n[AzureLB]: https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-overview\n[AzureLBSnatPortExhaustion]: https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-outbound-connections#exhausting-ports\n[AzureLBOutboundTroubleshoot]: https://docs.microsoft.com/en-us/azure/load-balancer/troubleshoot-outbound-connection\n[Rust]: https://www.rust-lang.org/\n[RustPlatform]: https://doc.rust-lang.org/nightly/rustc/platform-support.html\n[GoChannel]: https://blog.golang.org/codelab-share\n[jq]: https://stedolan.github.io/jq\n[RawSocket]: https://man7.org/linux/man-pages/man7/raw.7.html\n[RawSocketWin]: https://docs.microsoft.com/en-us/windows/win32/winsock/tcp-ip-raw-sockets-2","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr12f%2Frnp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fr12f%2Frnp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr12f%2Frnp/lists"}