A RedEye plugin is a directory containing aDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/ryzhpolsos/redeye/llms.txt
Use this file to discover all available pages before exploring further.
plugin.json manifest and one or more .cs source files. The C# files are compiled at startup, and any class that subclasses Plugin is instantiated automatically. This guide walks through creating a minimal working plugin.
Create the plugin directory
Inside the RedEye application directory, create a folder under Replace
plugins/ using your plugin’s ID as the name. The ID must be unique and will prefix all exported widget and function names.C:\RedEye with your actual RedEye installation directory.The directory name becomes the plugin ID. Use lowercase kebab-case to keep exported names readable:
my-plugin.widgetName, my-plugin.functionName.Create plugin.json
Add a An example with optional fields:
plugin.json manifest to the directory. At minimum, provide id and name. Add requiredAssemblies if your code uses assemblies not already loaded by RedEye, and list dependencies if this plugin must load after another.Create a .cs file and extend Plugin
Create a The
.cs file in the plugin directory. Define a class that extends RedEye.PluginAPI.Plugin. You do not need to add a namespace, but it helps avoid name collisions with other plugins.Plugin base class injects all RedEye services as protected properties before Main() is called, so Logger, Config, HotKeyManager, and the rest are ready to use immediately.Register widgets and functions in Main()
Call
ExportWidget<T>(name) to make a widget type available in RWML, and ExportFunction(name, func) to add a callable expression function. Both methods automatically prefix the name with the plugin ID.Dependency resolution
When a plugin listsdependencies in its manifest, the loader checks whether each dependency has already been loaded. If not, the plugin is moved to the end of the load queue and the loop continues. This repeats until all dependencies are satisfied or a missing dependency is detected — in which case loading halts with a fatal log entry.
Circular dependencies are not detected and will cause an infinite loop. Ensure your dependency graph is acyclic.
Complete minimal plugin example
plugins/my-plugin/, after restarting you can call my-plugin.greet("RedEye") from any RWML expression attribute.