{"id":26702443,"url":"https://github.com/nickacpt/nmsr-rs","last_synced_at":"2025-04-13T11:32:27.314Z","repository":{"id":63649350,"uuid":"557020104","full_name":"NickAcPT/nmsr-rs","owner":"NickAcPT","description":"NickAc's Minecraft Skin Renderer - Render Minecraft skins with true perspective","archived":false,"fork":false,"pushed_at":"2025-03-01T18:06:29.000Z","size":8191,"stargazers_count":54,"open_issues_count":7,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-12T17:06:57.558Z","etag":null,"topics":["avatar","avatar-service","ears","ears-mod","jni-library","minecraft","minecraft-avatar","minecraft-skin","minecraft-skin-renderer","minecraft-skins","nmsr","renderer","rust","skin-stealer","uv-map","web-service","wgpu","wgpu-rs"],"latest_commit_sha":null,"homepage":"https://nmsr.nickac.dev/","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/NickAcPT.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE-APACHE","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},"funding":{"ko_fi":"nickacpt"}},"created_at":"2022-10-25T00:07:23.000Z","updated_at":"2025-03-31T18:05:35.000Z","dependencies_parsed_at":"2023-01-29T01:45:47.016Z","dependency_job_id":"3c633586-ea09-4502-8ea8-cba02a868764","html_url":"https://github.com/NickAcPT/nmsr-rs","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NickAcPT%2Fnmsr-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NickAcPT%2Fnmsr-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NickAcPT%2Fnmsr-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NickAcPT%2Fnmsr-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NickAcPT","download_url":"https://codeload.github.com/NickAcPT/nmsr-rs/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248705501,"owners_count":21148548,"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":["avatar","avatar-service","ears","ears-mod","jni-library","minecraft","minecraft-avatar","minecraft-skin","minecraft-skin-renderer","minecraft-skins","nmsr","renderer","rust","skin-stealer","uv-map","web-service","wgpu","wgpu-rs"],"created_at":"2025-03-27T02:38:23.545Z","updated_at":"2025-04-13T11:32:27.290Z","avatar_url":"https://github.com/NickAcPT.png","language":"Rust","funding_links":["https://ko-fi.com/nickacpt","https://ko-fi.com/H2H6KGD8W"],"categories":[],"sub_categories":[],"readme":"\u003cimg align=\"right\" width=\"100\" src=\".assets/NickAc-face.png\"\u003e\n\n# NickAc's Minecraft Skin Renderer\n\nA speedy and fairly-accurate Minecraft avatar renderer service.\n\u003cdiv\u003e\n    \u003cimg alt=\"GitHub Actions Workflow Status\" src=\"https://img.shields.io/github/actions/workflow/status/NickAcPT/nmsr-rs/rust.yml?style=for-the-badge\" height=\"28\" /\u003e\n    \u003ca href=\"https://ko-fi.com/H2H6KGD8W\"\u003e\u003cimg alt=\"ko-fi\" src=\"https://img.shields.io/badge/support_me-on_kofi-red?style=for-the-badge\u0026logo=kofi\" height=\"28\" /\u003e\u003c/a\u003e\n\u003c/div\u003e\n\u003cdiv\u003e\n    \u003cimg alt=\"Built with Love\" src=\"https://forthebadge.com/images/featured/featured-built-with-love.svg\" height=\"28\" /\u003e\n    \u003cimg alt=\"Works on my machine\" src=\"https://forthebadge.com/images/badges/works-on-my-machine.svg\" height=\"28\"/\u003e\n\u003c/div\u003e\n\n\nA hosted version of NMSR is available [here](https://nmsr.nickac.dev/). It's\nprovided on a best-effort basis, so please don't abuse it.\n\nNMSR supports custom render parameters, player armour, armour trims, many render\nmodes, native Ears mod support and Minecraft capes.\n\n## Getting Started\n\nMoving off from a different avatar service? _We've got you covered._ Self-hosting NMSR is easy as _**1**, **2**, **3**_!\n\n### Docker\n\n1. Clone the repository and rename the `example.config.toml` file to `config.toml`.\n2. Run `docker build -t nmsr .`\n3. Run `docker run -p 8080:8080 nmsr`\n\n### No Docker\n\n1. Clone the repository.\n2. Run `cargo run --release --bin nmsr-aas`\n3. You're done! The service is now running on `http://localhost:8080`.\n\n## Supported render modes\n\n\u003ctable\u003e\n    \u003cthead\u003e\n        \u003ctr\u003e\n            \u003cth\u003eCategory\u003c/th\u003e\n            \u003cth\u003eRender Mode\u003c/th\u003e\n            \u003cth\u003eDescription\u003c/th\u003e\n            \u003cth\u003eExample\u003c/th\u003e\n            \u003cth\u003eExample (Back)\u003c/th\u003e\n        \u003c/tr\u003e\n    \u003c/thead\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd rowspan=\"5\"\u003eBody\u003c/td\u003e\n            \u003ctd\u003eFullBody\u003c/td\u003e\n            \u003ctd\u003eFull body render\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-fullbody.png\" width=\"100\"\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-fullbody-back.png\" width=\"100\"\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eFullBodyIso\u003c/td\u003e\n            \u003ctd\u003eFull body isometric render\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-fullbodyiso.png\" width=\"100\"\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-fullbodyiso-back.png\" width=\"100\"\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eBodyBust\u003c/td\u003e\n            \u003ctd\u003eBody bust render\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-bodybust.png\" width=\"100\"\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-bodybust-back.png\" width=\"100\"\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eFrontBust\u003c/td\u003e\n            \u003ctd\u003eBust isometric front render\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-frontbust.png\" width=\"100\"\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eFrontFull\u003c/td\u003e\n            \u003ctd\u003eFull isometric front render\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-frontfull.png\" width=\"100\"\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd rowspan=\"3\"\u003eHead\u003c/td\u003e\n            \u003ctd\u003eHead\u003c/td\u003e\n            \u003ctd\u003eHead render\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-head.png\" width=\"100\"\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-head-back.png\" width=\"100\"\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eHeadIso\u003c/td\u003e\n            \u003ctd\u003eHead isometric render\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-headiso.png\" width=\"100\"\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-headiso-back.png\" width=\"100\"\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eFace\u003c/td\u003e\n            \u003ctd\u003eFace render\u003c/td\u003e\n            \u003ctd\u003e\u003cimg src=\".assets/NickAc-face.png\" width=\"100\"\u003e\u003c/td\u003e\n            \u003ctd\u003e\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd rowspan=\"2\"\u003eExtra\u003c/td\u003e\n            \u003ctd\u003eSkin\u003c/td\u003e\n            \u003ctd colspan=\"4\"\u003ePlayer skin\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eCustom\u003c/td\u003e\n            \u003ctd colspan=\"4\"\u003eCustom render settings\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/tbody\u003e\n\u003c/table\u003e\n\n##### _Examples shown are of the author's skin, rendered using the `ears` feature enabled._\n\n\n\u003e [!IMPORTANT]\n\u003e If you are self-hosting an instance that you run in production, you should fill the contact information in the `config.toml` file (see example.config.toml).\n\u003e \n\u003e This is used to provide contact information in the headers of outgoing requests to the various APIs, just in case they need to contact you.\n\n\n## Crates\n\nSince this project contains a few crates, here's a short explanation for each.\n\n### `nmsr-aas` - NickAc's Minecraft Skin Renderer as a Service\n\n![Maintained Status (Yes)](https://img.shields.io/badge/Maintained-Yes-419b5a?style=for-the-badge)\n\nThe star of the show. This is the service that does the actual rendering. If you're looking to self-host NMSR, this is the crate you're looking for.\n\n### `nmsr-3d-renderer/nmsr-player-parts` - Player parts provider\n\nAbstraction of a Minecraft player model. This serves as a base for the 3d model cubes and quads.\n\nWhen compiled with the `ears` feature, it also provides Ears mod support.\n\n### `nmsr-3d-renderer/nmsr-rendering` - 3D rendering\n\nThe actual 3D rendering engine. This is where the magic happens. Implemented using `wgpu-rs` which allows for plugging many different rendering backends.\n\n### `nmsr-lib` - UV map library\n\n![Maintained Status (Yes)](https://img.shields.io/badge/Maintained-Yes-419b5a?style=for-the-badge)\n\nThis is the (now legacy) UV map library. This used to do the actual \"rendering\"\nin previous versions. It requires pre-rendered images to be provided.\n\nCurrently, it uses version 2 of the UV map layout instead of the previous\nformat.\n\nFor more information on the UV map layout, see [here](#uv-map-layouts).\n\n### `utils/**` - Utilities\n\n![Maintained Status (it depends)](https://img.shields.io/badge/Maintained-It_Depends-5593c8?style=for-the-badge)\n\nCrates in this directory are provided as-is and some may or may not be maintained.\n\nContains experiments that could be promoted to officially supported crates in the future.\n\n### nmsr-jni\n\n![Maintained Status (No)](https://img.shields.io/badge/Maintained-No-d80000?style=for-the-badge)\n\nThis is the JNI library, which contains the native code for invoking the skin\nrenderer from the JVM.\n\n\n## UV map layouts\n\n### Version 2\nThis is the current version of the UV map layout. It's an 8-bit RGBA image.\nIt improves on the previous version by not being wasteful with the bits, at the cost of being more complex.\n\n\u003cdetails\u003e\n    \u003c!--Our Red channel is composed of the 6 bits of the u coordinate + 2 bits from the v coordinate\n    U is used as-is because our coordinates are 0-63\n    0   1   2   3   4   5   6   7\n    [    ---- u ----    ]   [ v ]\n    Our Green channel is composed of the 4 remaining bits of the v coordinate + 4 bits from the shading\n    V is used as-is because our coordinates are 0-63\n    0   1   2   3   4   5   6   7\n    [  -- v --  ]   [  -- s --  ]\n    Our Blue channel is composed of the 4 remaining bits of the shading + 4 bits from the depth\n    0   1   2   3   4   5   6   7\n    [  -- s --  ]   [  -- d --  ]\n    Our Alpha channel is composed of the 8 remaining bits of the depth\n    0   1   2   3   4   5   6   7\n    [          -- d --          ]--\u003e\n    \u003csummary\u003eUV map layout v2\u003c/summary\u003e\n    \u003ctable\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003cth align=\"center\" colspan=\"8\"\u003eR\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"8\"\u003eG\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"8\"\u003eB\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"8\"\u003eA\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd align=\"center\"\u003e0\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e1\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e2\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e3\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e4\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e5\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e6\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e7\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e8\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e9\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e10\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e11\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e12\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e13\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e14\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e15\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e16\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e17\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e18\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e19\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e20\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e21\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e22\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e23\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e24\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e25\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e26\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e27\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e28\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e29\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e30\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e31\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003cth align=\"center\" colspan=\"6\"\u003eU\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"6\"\u003eV\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"8\"\u003eShading\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"12\"\u003eDepth\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/tbody\u003e\n    \u003c/table\u003e\n\u003c/details\u003e\n\n### Version 1\nThis is the previous version of the UV map layout. It's a 16-bit RGBA image.\nIt's wasteful with the bits, but it's simple.\n\nIf you're looking for the last commit that used this UV map layout, checkout\ncommit\n[`e62100095a7fcdc83c989a4fb603866cf338edca`](https://github.com/NickAcPT/nmsr-rs/tree/e62100095a7fcdc83c989a4fb603866cf338edca).\n\n\u003cdetails\u003e\n    \u003csummary\u003eUV map layout v1\u003c/summary\u003e\n    \u003ctable\u003e\n    \u003ctbody\u003e\n        \u003c!-- \n            (16 bit RGBA)\n            R - U coordinate (Horizontal, X)\n            G - 100% - V coordinate (Vertical, Y)\n            B - Depth - unused here\n            A - Normal alpha\n            --\u003e\n            \u003ctr\u003e\n            \u003cth align=\"center\" colspan=\"16\"\u003eR\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"16\"\u003eG\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"16\"\u003eB\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"16\"\u003eA\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd align=\"center\"\u003e0\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e1\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e2\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e3\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e4\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e5\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e6\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e7\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e8\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e9\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e10\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e11\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e12\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e13\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e14\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e15\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e16\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e17\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e18\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e19\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e20\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e21\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e22\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e23\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e24\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e25\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e26\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e27\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e28\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e29\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e30\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e31\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e32\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e33\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e34\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e35\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e36\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e37\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e38\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e39\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e40\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e41\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e42\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e43\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e44\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e45\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e46\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e47\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e48\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e49\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e50\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e51\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e52\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e53\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e54\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e55\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e56\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e57\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e58\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e59\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e60\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e61\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e62\u003c/td\u003e\n            \u003ctd align=\"center\"\u003e63\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003cth align=\"center\" colspan=\"16\"\u003eU\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"16\"\u003eV (100% - V coordinate)\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"16\"\u003eDepth\u003c/td\u003e\n            \u003cth align=\"center\" colspan=\"16\"\u003eAlpha\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/tbody\u003e\n    \u003c/table\u003e\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnickacpt%2Fnmsr-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnickacpt%2Fnmsr-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnickacpt%2Fnmsr-rs/lists"}