{"id":30688949,"url":"https://github.com/untrustedmodders/plugify","last_synced_at":"2025-12-25T20:03:37.915Z","repository":{"id":226687281,"uuid":"684190318","full_name":"untrustedmodders/plugify","owner":"untrustedmodders","description":"A Modern C++ Plugin Manager with Multi-Language Support","archived":false,"fork":false,"pushed_at":"2025-09-01T00:05:04.000Z","size":31606,"stargazers_count":54,"open_issues_count":2,"forks_count":5,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-09-01T00:29:45.307Z","etag":null,"topics":["cpp","cpp20","cross-platform","game-dev","game-engine","gamedev","multi-language","package-manager","plugify","plugin-development","plugin-framework","plugin-loader","plugin-manager","plugin-system","plugins"],"latest_commit_sha":null,"homepage":"https://plugify.net","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/untrustedmodders.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"docs/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/SECURITY.md","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},"funding":{"github":["qubka"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":null}},"created_at":"2023-08-28T16:31:51.000Z","updated_at":"2025-08-27T23:04:56.000Z","dependencies_parsed_at":"2024-03-24T01:32:17.133Z","dependency_job_id":"c760acec-757e-4043-8657-59feecde2de5","html_url":"https://github.com/untrustedmodders/plugify","commit_stats":null,"previous_names":["untrustedmodders/plugify"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/untrustedmodders/plugify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/untrustedmodders%2Fplugify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/untrustedmodders%2Fplugify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/untrustedmodders%2Fplugify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/untrustedmodders%2Fplugify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/untrustedmodders","download_url":"https://codeload.github.com/untrustedmodders/plugify/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/untrustedmodders%2Fplugify/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273213992,"owners_count":25065061,"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-09-01T02:00:09.058Z","response_time":120,"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":["cpp","cpp20","cross-platform","game-dev","game-engine","gamedev","multi-language","package-manager","plugify","plugin-development","plugin-framework","plugin-loader","plugin-manager","plugin-system","plugins"],"created_at":"2025-09-02T01:04:13.790Z","updated_at":"2025-12-25T20:03:37.909Z","avatar_url":"https://github.com/untrustedmodders.png","language":"C++","readme":"\u003ca name=\"readme-top\"\u003e\u003c/a\u003e\n\n[![Documentation](https://img.shields.io/badge/docs-doxygen-blue)](https://untrustedmodders.github.io/plugify/)\n[![Discord channel](https://img.shields.io/discord/1215604597972795403?logo=discord)](https://discord.gg/rX9TMmpang)\n\n\u003ch1 align=\"center\"\u003e\n  \u003ca href=\"https://github.com/untrustedmodders/plugify\"\u003e\n    \u003c!-- Please provide path to your logo here --\u003e\n    \u003cimg src=\"https://github.com/untrustedmodders/plugify/blob/main/docs/images/logos/plg-logo-text-white-with-shadow.png?raw=true\" alt=\"Logo\" width=\"351\" height=\"100\"\u003e\n  \u003c/a\u003e\n\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n  A Modern C++ Plugin Manager with Multi-Language Support\n  \u003cbr /\u003e\n  \u003ca href=\"https://github.com/untrustedmodders/plugify/issues/new?assignees=\u0026labels=bug\u0026template=01_BUG_REPORT.md\u0026title=bug%3A+\"\u003eReport a Bug\u003c/a\u003e\n  ·\n  \u003ca href=\"https://github.com/untrustedmodders/plugify/issues/new?assignees=\u0026labels=enhancement\u0026template=02_FEATURE_REQUEST.md\u0026title=feat%3A+\"\u003eRequest a Feature\u003c/a\u003e\n  .\n  \u003ca href=\"https://github.com/untrustedmodders/plugify/issues/new?assignees=\u0026labels=question\u0026template=04_SUPPORT_QUESTION.md\u0026title=support%3A+\"\u003eAsk a Question\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n\u003c/div\u003e\n\n\u003cdetails open=\"open\"\u003e\n\u003csummary\u003eTable of Contents\u003c/summary\u003e\n\n- [About](#about)\n  - [Key Features](#key-features)\n  - [Motivation](#motivation)\n- [Integration](#integration)\n  - [Requirements](#requirements)\n  - [CMake](#cmake)\n  - [Example](#example)\n- [Documentation](#documentation)\n- [Tests](#tests)\n- [Extensions](#extensions)\n- [In Action](#in-action)\n- [Roadmap](#roadmap)\n- [Support](#support)\n- [Project assistance](#project-assistance)\n- [Contributing](#contributing)\n- [Authors \u0026 contributors](#authors--contributors)\n- [Security](#security)\n- [License](#license)\n- [Acknowledgements](#acknowledgements)\n\n\u003c/details\u003e\n\n---\n\n## About\n\nUnlock a new era in plugin development with Plugify, a revolutionary library designed to streamline and enhance\nthe way plugins are created and utilized. Plugify goes beyond traditional plugin management by introducing innovative language modules,\nredefining the boundaries of cross-language communication.\n\n### Key Features\n\n1. **Dynamic Language Diversity:**  \nPlugify’s power is in its flexibility. It allows you to use multiple programming languages. Choose the languages you need for the project, and go. This will make your development environment more diverse and flexible.\n\n2. **Language Modules:**  \nPlugify allows you to install language modules for various programming languages, so you can use the language of your choice and develop plugins with the core without any doubt about language incompatibilities.\n\n3. **Inter-Language Communication:**  \nMake plugins communicate to each other in any existing language. Export methods, and share data between plugins, without regard for the programming language used.\n\n### Motivation\n\nThe plan was to build a new plugin system for CS in C#, but some of the decisions that were made in the early version led to a decision to ‘remove the training wheels’, unshackle the system from any game or embeddable language and create a system which allows the developers of plugins to build them in whatever language they like. For as long as that language module is installed, the system is able to support it. So by no longer trying to force it to be deemed a ‘good’ solution to be embedded in a variety of games, Plugify now goes far beyond the logical limitations a C#-specific solution has. What this means is that Plugify not only has the potential to have a larger community of developers, but is now flexible from the beginning to last a long time. Longevity was always a selling point, since if it was to work, it always had to be a ‘forever’ feature. It’s not just games development that stands to benefit. The flexibility of Plugify should mean it has uses in many projects, not just in games.\n\n## Integration\n\n### Requirements\n\n- CMake version 3.14 or later.\n- Doxygen version 1.8 or later.\n- Requires C++20 or later.\n- Designed for x86 and Arm.\n- Tested on 64bit little-endian systems.\n\n#### Supported platforms:\n- Windows (7+)\n- Linux\n- macOS (13.0+)\n- PlayStation 4/5\n- Nintendo Switch\n- Android (14+)\n- iOS/iPadOS/tvOS (16.0+)\n- UWP (Universal Windows, Xbox One)\n\n#### Supported compilers:\n\n- [Clang](https://clang.llvm.org) 15 and above\n- [GCC](https://gcc.gnu.org) 11 and above\n- [MSVC](https://visualstudio.microsoft.com/vs/features/cplusplus/) 2022 and above\n- [Apple Clang](https://opensource.apple.com/projects/llvm-clang/) 15 and above\n\n[Actions](https://github.com/untrustedmodders/plugify/actions) build created for windows, linux and apple.\n\n![clang build](https://github.com/untrustedmodders/plugify/actions/workflows/clang.yml/badge.svg) ![gcc build](https://github.com/untrustedmodders/plugify/actions/workflows/gcc.yml/badge.svg) ![msvc build](https://github.com/untrustedmodders/plugify/actions/workflows/msvc.yml/badge.svg) ![msys build](https://github.com/untrustedmodders/plugify/actions/workflows/msys2.yml/badge.svg)\n\n### CMake\n\nYou can also use the `plugify::plugify` interface target in CMake.\n\n#### External\n\nTo use this library from a CMake project, you can locate it directly with `find_package()` and use the namespaced imported target from the generated package configuration:\n\n```cmake\n# CMakeLists.txt\nfind_package(plugify REQUIRED)\n...\nadd_library(foo ...)\n...\ntarget_link_libraries(foo PRIVATE plugify::plugify)\n```\n\n#### Embedded\n\nTo embed the library directly into an existing CMake project, place the entire source tree in a subdirectory and call `add_subdirectory()` in your `CMakeLists.txt` file:\n\n```cmake\n# Typically you don't care so much for a third party library's tests to be\n# run from your own project's code.\nset(PLUGIFY_BUILD_TESTS OFF CACHE INTERNAL \"\")\n\n# Don't use include(plugify/CMakeLists.txt) since that carries with it\n# unintended consequences that will break the build.  It's generally\n# discouraged (although not necessarily well documented as such) to use\n# include(...) for pulling in other CMake projects anyways.\nadd_subdirectory(plugify)\n...\nadd_library(foo ...)\n...\ntarget_link_libraries(foo PRIVATE plugify::plugify)\n```\n\n##### Embedded (FetchContent)\n\nSince CMake v3.11,\n[FetchContent](https://cmake.org/cmake/help/v3.11/module/FetchContent.html) can\nbe used to automatically download a release as a dependency at configure time.\n\nExample:\n```cmake\ninclude(FetchContent)\n\nFetchContent_Declare(plugify GIT_REPOSITORY https://github.com/untrustedmodders/plugify.git)\nFetchContent_MakeAvailable(plugify)\n\ntarget_link_libraries(foo PRIVATE plugify::plugify)\n```\n\n**Note**: It is recommended to use the URL approach described above which is supported as of version 1.0.0. See\n[wiki](https://github.com/untrustedmodders/plugify/wiki/cmake/#fetchcontent) for more information.\n\n#### Supporting Both\n\nTo allow your project to support either an externally supplied or an embedded Plugify library, you can use a pattern akin to the following:\n\n``` cmake\n# Top level CMakeLists.txt\nproject(FOO)\n...\noption(FOO_USE_EXTERNAL_PLUGIFY \"Use an external Plugify library\" OFF)\n...\nadd_subdirectory(thirdparty)\n...\nadd_library(foo ...)\n...\n# Note that the namespaced target will always be available regardless of the\n# import method\ntarget_link_libraries(foo PRIVATE plugify::plugify)\n```\n```cmake\n# thirdparty/CMakeLists.txt\n...\nif(FOO_USE_EXTERNAL_PLUGIFY)\n  find_package(plugify REQUIRED)\nelse()\n  add_subdirectory(plugify)\nendif()\n...\n```\n\n`thirdparty/plugify` is then a complete copy of this source tree.\n\n### Example\n\nThis code creates an instance of the plugify::Plugify object. It sets up services, initializes the instance, and then interacts with a plugin manager. Error handling is included for initialization failures.\n\n```c++\n// Example 1: Simple usage with defaults\nint main() {\n    auto result = plugify::MakePlugify(\"./app\");\n    if (!result) {\n        std::cerr \u003c\u003c \"Failed to create Plugify: \" \u003c\u003c result.error().message \u003c\u003c std::endl;\n        return 1;\n    }\n\n    auto plugify = result.value();\n    if (auto initResult = plugify-\u003eInitialize(); !initResult) {\n        std::cerr \u003c\u003c \"Failed to initialize: \" \u003c\u003c initResult.error().message \u003c\u003c std::endl;\n        return 1;\n    }\n\n    // Load extensions\n    const auto\u0026 manager = plugify-\u003eGetManager();\n    manager-\u003eInitialize();\n\n    // Main loop\n    bool running = true;\n    while (running) {\n        plugify-\u003eUpdate();\n        // Your application logic here\n    }\n\n    plugify-\u003eTerminate();\n    return 0;\n}\n```\n\n```c++\n// Example 2: Advanced configuration\nint main() {\n    // Create custom logger\n    auto logger = std::make_shared\u003cplugify::impl::AsyncLogger\u003e(\n        std::make_shared\u003cplugify::impl::FileLogger\u003e(\"./logs/app.log\")\n    );\n\n    // Configure plugin manager\n    plugify::Config config;\n    config.paths.baseDir = \"./app\";\n    config.paths.extensionsDir = \"extensions\";\n    config.loading.enableHotReload = true;\n    config.loading.parallelLoading = true;\n    config.runtime.updateInterval = std::chrono::milliseconds(16);\n\n    // Build Plugify instance\n    auto result = plugify::Plugify::CreateBuilder()\n        .WithConfig(config)\n        .WithLogger(logger)\n        .WithService\u003cMyCustomService\u003e(std::make_shared\u003cMyCustomServiceImpl\u003e())\n        .Build();\n\n    if (!result) {\n        std::cerr \u003c\u003c \"Failed: \" \u003c\u003c result.error().message \u003c\u003c std::endl;\n        return 1;\n    }\n\n    auto plugify = result.value();\n\n    // Initialize asynchronously\n    auto initFuture = plugify-\u003eInitializeAsync();\n\n    // Do other initialization...\n\n    // Wait for initialization\n    if (auto initResult = initFuture.get(); !initResult) {\n        std::cerr \u003c\u003c \"Failed to initialize: \" \u003c\u003c initResult.error().message \u003c\u003c std::endl;\n        return 1;\n    }\n\n    // Access service locator for convenient operations\n    auto logger = plugify-\u003eGetServices().Resolve\u003cILogger\u003e();\n    logger-\u003eLog(\"Application started\", Severity::Info);\n\n    // Main loop\n    bool running = true;\n    while (running) {\n        plugify-\u003eUpdate();\n    }\n\n    plugify-\u003eTerminate();\n    return 0;\n}\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Documentation\n\nThe documentation is based on [doxygen](http://www.doxygen.nl/). To build it:\n\n   ```sh\n   cd build\n   cmake .. -DPLUGIFY_BUILD_DOCS=ON\n   cmake --build . --target docs\n   ```\n\nThe API reference is created in HTML format in the `build/docs/html` directory.\nTo navigate it with your favorite browser:\n\n   ```sh\n   cd build\n   your_favorite_browser docs/html/index.html\n   ```\n\nThe same version is also available [online](https://untrustedmodders.github.io/plugify)\nfor the latest release, that is the last stable tag.\u003cbr/\u003e\nThere is also a [wiki](https://untrustedmodders.github.io/) page dedicated\nto the project where users can find all related documentation pages.\nAdditionally, we offer an online documentation [generator](https://untrustedmodders.github.io/plugify-generator/) that allows you to easily create documentation for your plugin's manifest file.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Tests\n\nTo build the basic testing app:\n\n1. Install dependencies:\n   \n   a. Windows\n   \u003e Setting up [CMake tools with Visual Studio Installer](https://learn.microsoft.com/en-us/cpp/build/cmake-projects-in-visual-studio#installation)\n\n   b. Linux:\n   ```sh\n   sudo apt-get install -y build-essential cmake ninja-build\n   ```\n   \n   c. Mac:\n   ```sh\n   brew install cmake ninja\n   ```\n   \n3. Clone the repo:\n   \n   ```sh\n   git clone https://github.com/untrustedmodders/plugify.git\n   ```\n\n7. Create build folder:\n   \n   ```sh\n   mkdir build\n   cd build\n   ```\n   \n9. Build the project:\n    \n   ```sh\n   cmake .. \n   cmake --build . --target plug\n   ```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Extensions\n\nHere is a list of all already implemented language modules:\n- [C++ Language Module](https://github.com/untrustedmodders/plugify-module-cpp)\n- [C# (.NET) Language Module](https://github.com/untrustedmodders/plugify-module-dotnet)\n- [Go Language Module](https://github.com/untrustedmodders/plugify-module-golang)\n- [Python Language Module](https://github.com/untrustedmodders/plugify-module-python3)\n- [JavaScript Language Module](https://github.com/untrustedmodders/plugify-module-v8)\n- [Lua Language Module](https://github.com/untrustedmodders/plugify-module-lua)\n- [Rust Language Module](https://github.com/untrustedmodders/plugify-module-rust)\n- [D Language Module](https://github.com/untrustedmodders/plugify-module-dlang)\n- [C# (Mono) Language Module](https://github.com/untrustedmodders/plugify-module-mono)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## In Action\n\nWhile Plugify is a relatively new project, it is making waves in the realm of server-side modding, \nparticularly in the Counter-Strike 2 community. As of now, Plugify is primarily utilized in the \nance of a new project known as [S2-Plugify](https://github.com/untrustedmodders/s2-plugify), which is also being developed by our team.\n\nIf you know of other resources out there that are about `Plugify`, feel free to open an issue or a PR and we will be glad to add them here.\n\n## Roadmap\n\nSee the [open issues](https://github.com/untrustedmodders/plugify/issues) for a list of proposed features (and known issues).\n\n- [Top Feature Requests](https://github.com/untrustedmodders/plugify/issues?q=label%3Aenhancement+is%3Aopen+sort%3Areactions-%2B1-desc) (Add your votes using the 👍 reaction)\n- [Top Bugs](https://github.com/untrustedmodders/plugify/issues?q=is%3Aissue+is%3Aopen+label%3Abug+sort%3Areactions-%2B1-desc) (Add your votes using the 👍 reaction)\n- [Newest Bugs](https://github.com/untrustedmodders/plugify/issues?q=is%3Aopen+is%3Aissue+label%3Abug)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Support\n\nReach out to the maintainer at one of the following places:\n\n- [Discord](https://discord.gg/rX9TMmpang)\n- [GitHub issues](https://github.com/untrustedmodders/plugify/issues/new?assignees=\u0026labels=question\u0026template=04_SUPPORT_QUESTION.md\u0026title=support%3A+)\n- Contact options listed on [this GitHub profile](https://github.com/untrustedmodders)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Project assistance\n\nIf you want to say **thank you** or/and support active development of plugify:\n\n- Add a [GitHub Star](https://github.com/untrustedmodders/plugify) to the project.\n- Tweet about the plugify.\n- Write interesting articles about the project on [Dev.to](https://dev.to/), [Medium](https://medium.com/) or your personal blog.\n\nTogether, we can make plugify **better**!\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Contributing\n\nFirst off, thanks for taking the time to contribute! Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are **greatly appreciated**.\n\n\nPlease read [our contribution guidelines](docs/CONTRIBUTING.md), and thank you for being involved!\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Authors \u0026 contributors\n\nThe original setup of this repository is by [untrustedmodders](https://github.com/untrustedmodders).\n\nFor a full list of all authors and contributors, see [the contributors page](https://github.com/untrustedmodders/plugify/contributors).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Security\n\nPlugify follows good practices of security, but 100% security cannot be assured.\nLibrary is provided **\"as is\"** without any **warranty**. Use at your own risk.\n\n_For more information and to report security issues, please refer to our [security documentation](docs/SECURITY.md)._\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## License\n\nThis project is licensed under the **MIT license**.\n\nSee [LICENSE](LICENSE) for more information.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n## Acknowledgements\n\n\u003e **[?]**\n\u003e If your work was funded by any organization or institution, acknowledge their support here.\n\u003e In addition, if your work relies on other software libraries, or was inspired by looking at other work, it is appropriate to acknowledge this intellectual debt too.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n","funding_links":["https://github.com/sponsors/qubka"],"categories":["Uncategorized"],"sub_categories":["Uncategorized"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funtrustedmodders%2Fplugify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funtrustedmodders%2Fplugify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funtrustedmodders%2Fplugify/lists"}