Write C# plugins that run inside FL Studio.
The open-source plugin system and FL Studio control surface behind
FL Automate.
Website · Pricing · Discord · Getting started · Docs
🌱 1.5% of FL Automate AI usage goes to carbon credits — fl-automate.com/#pricing
FruityLink lets a plain C# class library run inside FL Studio and drive it programmatically — tempo, piano-roll notes, patterns, playlist clips, mixer, plugin parameters, native menus and toolbar buttons, even your own UI embedded in FL's window chrome.
The FL Automate AI assistant is a separate, closed-source plugin built on this SDK. Everything it can do in FL Studio, your plugin can do too.
The SDK is on NuGet — start a plugin from any C# class library with one command:
dotnet add package FruityLink.Plugins.AbstractionsThat's the whole plugin contract (FruityLink.Core comes along transitively). Embedding your own
UI inside FL Studio? Also grab FruityLink.Ui.Avalonia.Hosting or FruityLink.Ui.Wpf.Hosting.
Implement one interface:
public sealed class MyPlugin : IFlPlugin
{
public string Id => "my-plugin";
public string Name => "My Plugin";
public string Description => "Logs the current tempo.";
public string Version => "1.0.0";
private IDisposable? _cmd;
public Task EnableAsync(IPluginContext ctx, CancellationToken ct = default)
{
_cmd = ctx.Menu.AddCommand(FlNativeMenu.Tools, "Log tempo",
onInvoke: () => _ = Task.Run(async () =>
ctx.Log($"tempo = {await ctx.Fl.GetTempoAsync()} BPM")));
return Task.CompletedTask;
}
public Task DisableAsync(CancellationToken ct = default)
{
_cmd?.Dispose();
return Task.CompletedTask;
}
}Drop the build output into <host-dir>\plugins\MyPlugin\ and enable it from Tools ▸ FL Plugins.
Rebuild and it hot-reloads. Full example: samples/HelloFl.
INativeFlControl— a typed, safe control surface: channels, patterns, notes, mixer, playlist, transport, markers, projects, arrangements, plugin params, automation.- Native menu + toolbar integration — commands and toggles in FL's own UI.
- UI embedding — host Avalonia, WPF, or any
HWNDinside a real FL editor form. - Hot reload + isolation — each plugin loads in its own collectible
AssemblyLoadContextfrom a shadow copy. - Fail-safe by design — FL functions are resolved by signature scan and refused rather than guessed; plugins never see raw memory primitives.
- Getting started — first plugin, deploy, debug.
- Plugin lifecycle — discovery, isolation, pre-warm, hot reload.
- FL control API — the
INativeFlControlsurface and FL's value conventions. - Menus and toolbar — contributing to FL's native UI.
- Window embedding — your window inside FL, incl. the WPF helpers.
- Avalonia UI — Avalonia inside FL, and the gotchas that matter.
- Native bridge — architecture, protocol, build, FL version policy.
dotnet build FruityLink.Sdk.slnx # managed SDK + sample
cmake -S native/bridge -B native/bridge/build -A x64 # native bridge (MSVC, x64)
cmake --build native/bridge/build --config ReleaseMIT © Realynx