DevToys is built on an open, MEF-based extensibility model. Any developer can ship aDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/DevToys-app/DevToys/llms.txt
Use this file to discover all available pages before exploring further.
.devtoys file — a standard NuGet package renamed with that extension — and DevToys will load it automatically at startup alongside the built-in tools. Extensions can add GUI tools, CLI tools, Smart Detection detectors, custom tool groups, and more, all through the same DevToys.Api contracts used by the app itself.
What is an Extension?
An extension is a .NET class library targetingnet8.0 that references the DevToys.Api NuGet package and exports MEF (Managed Extensibility Framework) components. When DevToys starts, it scans its Plugins folder for .devtoys files, extracts them, and uses MEF to discover every exported type inside them.
Because the extension model is pure MEF, you use familiar [Export] and [Import] attributes throughout — there is no custom plugin registration API to learn.
Two Kinds of Tools
GUI Tool
Implements
IGuiTool. Renders an interactive UIToolView inside the DevToys window, built entirely with the GUI.* fluent factory API. Supports Smart Detection — the app can automatically route clipboard data to your tool.CLI Tool
Implements
ICommandLineTool. Exposes a sub-command through the DevToys CLI (devtoys.cli). Decorated with [CommandName] and [CommandLineOption] properties; returns an integer exit code from InvokeAsync.A single extension assembly can export both an
IGuiTool and an ICommandLineTool for the same feature. This is the recommended pattern: users get a graphical experience in the desktop app and a scriptable interface from the terminal.How Extensions Are Loaded
DevToys looks for.devtoys files in the per-user Plugins folder at startup. Each file is a .nupkg renamed to .devtoys; DevToys extracts it and loads all assemblies it finds inside. The process is:
- App starts and scans the Plugins folder.
- Each
.devtoyspackage is extracted to a temporary installation directory. - MEF composes the extension assemblies together with the host.
- Every
[Export]-decorated type becomes available in the app — new menu items, CLI commands, and detectors appear immediately.
IResourceAssemblyIdentifier
Every extension assembly must export exactly oneIResourceAssemblyIdentifier implementation. The app uses this to resolve localized strings from your .resx files and to load any custom fonts you bundle.
Name you give this class must match the ResourceManagerAssemblyIdentifier property of every [ToolDisplayInformation] attribute in your assembly.
Key Attributes at a Glance
Every exported component uses a consistent set of MEF metadata attributes. The table below summarizes the most important ones; follow the links in the sidebar for full per-topic documentation.| Attribute | Applies to | Purpose |
|---|---|---|
[Name("...")] | All exports | Sets the unique internal component name used by [Order] and cross-component references |
[ToolDisplayInformation(...)] | IGuiTool | Icon, group, localized strings for the sidebar entry |
[CommandName(...)] | ICommandLineTool | CLI sub-command name, alias, and description |
[TargetPlatform(Platform.X)] | Any export | Restricts the component to Windows, macOS, or Linux; omit to support all platforms |
[Order(Before/After = "...")] | IGuiTool, GuiToolGroup | Controls the sort position relative to another named component |
[MenuPlacement(MenuPlacement.Footer)] | IGuiTool | Moves the sidebar entry to the footer instead of the body |
[NotSearchable] | IGuiTool | Excludes the tool from the search index |
[NotFavorable] | IGuiTool | Prevents the tool from being added to favorites |
[NoCompactOverlaySupport] | IGuiTool | Disables Compact Overlay (picture-in-picture) mode for the tool |
Explore the Extension SDK
GUI Tool
Build a full interactive tool with
IGuiTool and the GUI.* fluent API.CLI Tool
Expose your tool on the command line with
ICommandLineTool.Smart Detection
Automatically route clipboard content to your tool with
IDataTypeDetector.Settings
Persist user preferences with
SettingDefinition and ISettingsProvider.Publish
Package your extension as a
.devtoys file and share it on NuGet.org.