FrameLift Plugin SDK
FrameLift is a lightweight video player whose features are not baked into the
executable. Each feature — the playlist, the history panel, the on-screen
overlay, the settings menu, the auto-updater — is a plugin: a standalone DLL
the host loads at runtime from its Plugins/ directory. This SDK is the public
surface external authors use to write their own.
Why a plugin SDK
The host ↔ plugin boundary is a COM-like binary ABI: pure abstract
interfaces, POD-only method signatures, and extern "C" entry points. A plugin
built with any compatible Windows compiler interoperates with the host
regardless of how the host itself was built. Concretely, that buys you:
- A dependency-free build. A plugin needs only a C++23 compiler and CMake. You do not link imgui, spdlog, stb, or a JSON library — none of those types cross the boundary.
- Toolchain independence. No standard-library types are shared across the DLL edge, so there is no requirement to match the host's compiler or its standard-library build flags.
- A versioned contract. Every plugin reports the
major.minor.patchABI it was built against (plus its name and version). The host checks it before touching a vtable — same major, host minor ≥ plugin minor — and refuses to load a mismatch, so an out-of-date plugin fails loudly instead of corrupting memory.
What a plugin can do
Through the plugin context a plugin can:
- Run one-time setup when it is installed, and tear down cleanly on shutdown.
- Read and write settings, and contribute its own page to the settings menu.
- Register keybinds that show up in the shared keybind UI.
- Render its own ImGui UI each frame (optional).
- React to media events from the player — file loaded, seek completed, property changes such as the current title.
- Talk to other plugins through typed services (
IHistory, …) and a publish/subscribe event bus.
How the pieces fit
┌─────────────────────────────────────────────┐
│ FrameLift.exe (host) │
│ │
│ loads Plugins/*.dll ◄── ABI compat gate │
│ passes IPluginContext& into each plugin │
└───────────────┬──────────────────────────────┘
│ pure abstract interfaces, POD signatures
▼
┌─────────────────────────────────────────────┐
│ YourPlugin.dll : public PluginBase │
│ │
│ OnInstall(ctx) ── wire up services │
│ RenderSettings() ── settings page │
│ OnMediaEvent() ── react to the player │
│ Render() ── draw UI (optional) │
└─────────────────────────────────────────────┘
Where to go next
- Installation — get the SDK and build the bundled example.
- Your First Plugin — write, build, and load a minimal plugin from scratch.
- Guides — settings, keybinds, UI, media events, and cross-plugin communication, one topic at a time.
- Reference — the full SDK API surface.