---
title: Plugins
---

import VersionLabel from '@site/src/components/Docs/VersionLabel';

proto supports a pluggable architecture as a means for consumers to integrate and manage custom
tools (languages, CLIs, etc) within proto's toolchain. It's not possible for proto to support
_everything_ in core directly, so plugins are a way for the community to extend the toolchain to
their needs.

## Enabling plugins

Plugins can be enabled by configuring them in [`.prototools`](./config#plugins) files, within the
`[plugins]` section. The map key is the plugin name _in kebab-case_, which is used as the
binary/tool name in proto, and also the name for configuration and cache purposes. The map value is
a [plugin locator string](../guides/wasm-plugins#configuring-plugin-locations) that defines a
protocol and source location.

```toml title=".prototools"
[plugins.tools]
<id> = "<protocol>://<location>"
```

Alternatively, the locator can be defined directly within the [`[tools.*]`](./config#tools) or
[`[backends.*]`](./config#backends) sections using the `plugin` field, allowing the plugin and its
settings to be defined side-by-side. <VersionLabel version="0.60.0" />

```toml title=".prototools"
[tools.<id>]
plugin = "<protocol>://<location>"
```

## Creating plugins

To ease the plugin development process, proto supports 2 types of plugins, a
[non-WASM configuration based plugin](./non-wasm-plugin) for basic use cases, and a
[WASM based plugin](./wasm-plugin) for advanced use cases.

## Publish a plugin

proto's registry is currently powered by static JSON files located in our official
[proto repository](https://github.com/moonrepo/proto/tree/master/registry). View that link for
information on how to publish a plugin.
