{"id":13415290,"url":"https://github.com/qmlnet/qmlnet","last_synced_at":"2025-10-05T01:59:00.784Z","repository":{"id":39521504,"uuid":"92974365","full_name":"qmlnet/qmlnet","owner":"qmlnet","description":"Qml.Net - Qt/QML integration/support for .NET","archived":false,"fork":false,"pushed_at":"2022-12-08T05:22:33.000Z","size":18632,"stargazers_count":1400,"open_issues_count":51,"forks_count":109,"subscribers_count":57,"default_branch":"develop","last_synced_at":"2025-09-30T16:03:10.047Z","etag":null,"topics":["charp","mono","net-core","qml"],"latest_commit_sha":null,"homepage":"https://qmlnet.github.io/","language":"C#","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/qmlnet.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}},"created_at":"2017-05-31T18:04:36.000Z","updated_at":"2025-09-20T16:53:11.000Z","dependencies_parsed_at":"2023-01-24T13:00:15.022Z","dependency_job_id":null,"html_url":"https://github.com/qmlnet/qmlnet","commit_stats":null,"previous_names":["pauldotknopf/qml.net"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/qmlnet/qmlnet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmlnet%2Fqmlnet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmlnet%2Fqmlnet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmlnet%2Fqmlnet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmlnet%2Fqmlnet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qmlnet","download_url":"https://codeload.github.com/qmlnet/qmlnet/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qmlnet%2Fqmlnet/sbom","scorecard":{"id":754182,"data":{"date":"2025-08-11","repo":{"name":"github.com/qmlnet/qmlnet","commit":"0836ae783a3ed5fb404db68d0706f9a7fa3765b4"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.7,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":5,"reason":"Found 12/22 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact ci not signed: https://api.github.com/repos/qmlnet/qmlnet/releases/12231865","Warn: release artifact ci does not have provenance: https://api.github.com/repos/qmlnet/qmlnet/releases/12231865"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 23 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T21:08:10.042Z","repository_id":39521504,"created_at":"2025-08-22T21:08:10.043Z","updated_at":"2025-08-22T21:08:10.043Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278373500,"owners_count":25976149,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["charp","mono","net-core","qml"],"created_at":"2024-07-30T21:00:46.621Z","updated_at":"2025-10-05T01:59:00.741Z","avatar_url":"https://github.com/qmlnet.png","language":"C#","readme":"\u003cp\u003e\u003ca href=\"https://github.com/qmlnet/qmlnet\" rel=\"nofollow\"\u003e\u003cimg src=\"https://qmlnet.github.io/qmlnet.png\" width=\"150\"\u003e\u003c/a\u003e\u003c/p\u003e\n\n\n[![Qml.Net](https://img.shields.io/nuget/v/Qml.Net.svg?style=flat\u0026label=Qml.Net)](http://www.nuget.org/packages/Qml.Net/) [![Build status](https://travis-ci.com/qmlnet/qmlnet.svg?branch=develop)](https://travis-ci.com/qmlnet/qmlnet) [![Build status](https://ci.appveyor.com/api/projects/status/l0hh7ranqawj682y/branch/develop?svg=true)](https://ci.appveyor.com/project/pauldotknopf/qmlnet/) [![Gitter](https://img.shields.io/gitter/room/qmlnet/Lobby.svg?style=flat)](https://gitter.im/qmlnet/Lobby) [![All Contributors](https://img.shields.io/badge/all_contributors-8-orange.svg)](#contributors) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/pauldotknopf)\n\n\u003chr /\u003e\n\nA Qt/Qml integration with .NET\n\nSupported platforms/runtimes:\n* Runtimes:\n  * .NET Framework\n  * .NET Core\n  * Mono\n* Operating systems\n  * Linux\n  * OSX\n  * Windows\n\n# First look\n\n\u003cimg src=\"https://github.com/pauldotknopf/Qml.Net.Examples/blob/master/assets/features.gif\" alt=\"\" style=\"max-width:100%;\" width=\"200\"\u003e\n\n# Elevator pitch\n\n* Proven in production.\n* Established GUI/control framework, used in many industries, from desktop to embedded.\n* Excellent community with many open-sourced controls available.\n* Native rendering, done in native code. No expensive PInvoke calls for rendering/animations/etc. The only interop between .NET and Qt is the data models used to drive the GUI.\n\n# Documentation\n\nWIP: https://qmlnet.github.io/\n\n# Getting started\n\n```bash\ndotnet add package Qml.Net\ndotnet add package Qml.Net.WindowsBinaries\ndotnet add package Qml.Net.OSXBinaries\ndotnet add package Qml.Net.LinuxBinaries\n```  \n\n**Note for Linux users**: Package `libc6-dev` is required to be installed because it contains `libdl.so` that is needed.\n\n# Examples\nCheckout the [examples](https://github.com/qmlnet/qmlnet-examples) on how to do many things with Qml.Net.\n\n# Quick overview\n\n**Define a .NET type (POCO)**\n\n```c#\n//QmlType.cs\nusing Qml.Net;\nusing System.Threading.Tasks;\n\nnamespace QmlQuickOverview\n{\n    [Signal(\"customSignal\", NetVariantType.String)] // You can define signals that Qml can listen to.\n    public class QmlType\n    {\n        /// \u003csummary\u003e\n        /// Properties are exposed to Qml.\n        /// \u003c/summary\u003e\n        [NotifySignal(\"stringPropertyChanged\")] // For Qml binding/MVVM.\n        public string StringProperty { get; set; }\n\n        /// \u003csummary\u003e\n        /// Methods can return .NET types.\n        /// The returned type can be invoked from Qml (properties/methods/events/etc).\n        /// \u003c/summary\u003e\n        /// \u003creturns\u003e\u003c/returns\u003e\n        public QmlType CreateNetObject()\n        {\n            return new QmlType();\n        }\n\n        /// \u003csummary\u003e\n        /// Qml can pass .NET types to .NET methods.\n        /// \u003c/summary\u003e\n        /// \u003cparam name=\"parameter\"\u003e\u003c/param\u003e\n        public void TestMethod(QmlType parameter)\n        {\n        }\n        \n        /// \u003csummary\u003e\n        /// Async methods can be invoked with continuations happening on Qt's main thread.\n        /// \u003c/summary\u003e\n        public async Task\u003cstring\u003e TestAsync()\n        {\n            // On the UI thread\n            await Task.Run(() =\u003e\n            {\n                // On the background thread\n            });\n            // On the UI thread\n            return \"async result!\";\n        }\n        \n        /// \u003csummary\u003e\n        /// Qml can also pass Qml/C++ objects that can be invoked from .NET\n        /// \u003c/summary\u003e\n        /// \u003cparam name=\"qObject\"\u003e\u003c/param\u003e\n        public void TestMethodWithQObject(dynamic o)\n        {\n            string result = o.propertyDefinedInCpp;\n            o.methodDefinedInCpp(result);\n            \n            // You can also listen to signals on QObjects.\n            var qObject = o as INetQObject;\n            var handler = qObject.AttachSignal(\"signalName\", parameters =\u003e {\n                // parameters is a list of arguements passed to the signal.\n            });\n            handler.Dispose(); // When you are done listening to signal.\n            \n            // You can also listen to when a property changes (notify signal).\n            handler = qObject.AttachNotifySignal(\"property\", parameters =\u003e {\n                // parameters is a list of arguements passed to the signal.\n            });\n            handler.Dispose(); // When you are done listening to signal.\n        }\n        \n        /// \u003csummary\u003e\n        /// .NET can activate signals to send notifications to Qml.\n        /// \u003c/summary\u003e\n        public void ActivateCustomSignal(string message)\n        {\n            this.ActivateSignal(\"customSignal\", message);\n        }\n    }\n}\n\n```\n\n**Register your new type with Qml.**\n\n```c#\n//QmlExample.cs\nusing Qml.Net;\nusing Qml.Net.Runtimes;\n\nnamespace QmlQuickOverview\n{\n    class QmlExample\n    {\n        static int Main(string[] args)\n        {\n            RuntimeManager.DiscoverOrDownloadSuitableQtRuntime();\n\n            using (var app = new QGuiApplication(args))\n            {\n                using (var engine = new QQmlApplicationEngine())\n                {\n                    // Register our new type to be used in Qml\n                    Qml.Net.Qml.RegisterType\u003cQmlType\u003e(\"test\", 1, 1);\n                    engine.Load(\"Main.qml\");\n                    return app.Exec();\n                }\n            }\n        }\n    }\n}\n\n```\n\n**Use the .NET type in Qml**\n\n```js\n//Main.qml\nimport QtQuick 2.7\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.0\nimport test 1.1\n\nApplicationWindow {\n    visible: true\n    width: 640\n    height: 480\n    title: qsTr(\"Hello World\")\n\n    QmlType {\n      id: test\n      Component.onCompleted: function() {\n          // We can read/set properties\n          console.log(test.stringProperty)\n          test.stringPropertyChanged.connect(function() {\n              console.log(\"The property was changed!\")\n          })\n          test.stringProperty = \"New value!\"\n          \n          // We can return .NET types (even ones not registered with Qml)\n          var netObject = test.createNetObject();\n          \n          // All properties/methods/signals can be invoked on \"netObject\"\n          // We can also pass the .NET object back to .NET\n          netObject.testMethod(netObject)\n          \n          // We can invoke async tasks that have continuation on the UI thread\n          var task = netObject.testAsync()\n          // And we can await the task\n          Net.await(task, function(result) {\n              // With the result!\n              console.log(result)\n          })\n          \n          // We can trigger signals from .NET\n          test.customSignal.connect(function(message) {\n              console.log(\"message: \" + message)\n          })\n          test.activateCustomSignal(\"test message!\")\n      }\n      function testHandler(message) {\n          console.log(\"Message - \" + message)\n      }\n    }\n}\n```\n\n# Currently implemented\n\n- [x] Support for all the basic Qml types and the back-and-forth between them (```DateTime```, ```string```, etc).\n- [x] Reading/setting properties on .NET objects.\n- [x] Invoking methods on .NET obejcts.\n- [x] Declaring and activating signals on .NET objects.\n- [x] ```async``` and ```await``` with support for awaiting and getting the result from Qml.\n- [x] Passing dynamic javascript objects to .NET as ```dynamic```.\n- [x] Custom V8 type that looks like an array, but wraps a .NET ```IList\u003cT\u003e``` instance, for modification of list in Qml, and performance.\n- [x] Dynamically compiled delegates for increased performance.\n- [x] Passing ```QObject``` types to .NET with support for interacting with signals/slots/properties on them.\n\nThere aren't really any important features missing that are needed for prime-time. This product is currently used on embedded devices in the medical industry.\n\n# Running Unit Tests\n\nThe unit tests can be found in [src/native/Qml.Net.Tests](src/net/Qml.Net.Tests).\n\nThey can be run directly from Visual Studio, or by using the `dotnet test` command line tool. \n\nSince the tests rely on the native QmlNet library, you have to ensure the library is in the `PATH` (on Windows) or otherwise discoverable. If you are trying to run tests against the native library built from the same repository, you can put the `src/native/output` folder into your `PATH` or `LD_LIBRARY_PATH` after running the `build.bat` or `build.sh` script.\n\n## Contributors ✨\n\nThanks goes to these wonderful people!\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.devmil.de\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/6693130?v=4\" width=\"100px;\" alt=\"Michael Lamers\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMichael Lamers\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/qmlnet/qmlnet/commits?author=devmil\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://ymueller.de\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/2760830?v=4\" width=\"100px;\" alt=\"TripleWhy\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTripleWhy\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/qmlnet/qmlnet/commits?author=TripleWhy\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/MaxMommersteeg\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/9657173?v=4\" width=\"100px;\" alt=\"Max\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMax\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/qmlnet/qmlnet/commits?author=MaxMommersteeg\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/qmlnet/qmlnet/commits?author=MaxMommersteeg\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#financial-MaxMommersteeg\" title=\"Financial\"\u003e💵\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/geigertom\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/19152463?v=4\" width=\"100px;\" alt=\"geigertom\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003egeigertom\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/qmlnet/qmlnet/commits?author=geigertom\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/jamesdavila\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/1946041?v=4\" width=\"100px;\" alt=\"James Davila\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJames Davila\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/qmlnet/qmlnet/commits?author=jamesdavila\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/afillebrown\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/38264913?v=4\" width=\"100px;\" alt=\"Andy Fillebrown\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAndy Fillebrown\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/qmlnet/qmlnet/commits?author=afillebrown\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://linkedin.com/in/vadimperetokin\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/110988?v=4\" width=\"100px;\" alt=\"Vadim Peretokin\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eVadim Peretokin\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/qmlnet/qmlnet/commits?author=vadi2\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/Juhlinus\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/12988164?v=4\" width=\"100px;\" alt=\"Linus Juhlin\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLinus Juhlin\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/qmlnet/qmlnet/commits?author=Juhlinus\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n","funding_links":["https://paypal.me/pauldotknopf"],"categories":["GUI","others"],"sub_categories":["GUI - Framework"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqmlnet%2Fqmlnet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqmlnet%2Fqmlnet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqmlnet%2Fqmlnet/lists"}