---
title: "WezTerm Plugins"
aliases: [wezterm-plugin-system, wezterm-lua-plugins]
tags: [wezterm, plugins, lua, terminal, dotfiles]
sources: [raw/Plugins - Wez's Terminal Emulator.md]
created: 2026-04-17
updated: 2026-04-17
---

## Overview

WezTerm plugins are Lua packages that extend the terminal with functionality not included in the core product. They are distributed and installed via Git URLs (HTTPS or `file://` protocol).

A curated list of plugins is maintained at [awesome-wezterm](https://github.com/michaelbrusegard/awesome-wezterm).

## Installing a Plugin

```lua
local wezterm = require 'wezterm'
local a_plugin = wezterm.plugin.require 'https://github.com/owner/repo'

local config = wezterm.config_builder()
a_plugin.apply_to_config(config)

return config
```

- URL must use `https://` or `file://` protocol
- On first `require`, WezTerm clones the repo into its runtime directory (`plugins/NAME`)
- Default branch (`main`) is checked out

### With Plugin Configuration

```lua
local myPluginConfig = { enable = true, location = 'right' }
a_plugin.apply_to_config(config, myPluginConfig)
```

Consult each plugin's README for available options.

## Updating Plugins

Plugins are **not** auto-updated when the upstream repo changes.

- Run `wezterm.plugin.update_all()` to pull all plugin updates
- Can be called from the Lua REPL in the [[wiki/dotfiles/wezterm-cli-reference|Debug Overlay]]

## Removing a Plugin

1. Find the plugin directory with `wezterm.plugin.list()` — returns an array with `plugin_dir` and `url` fields
2. Delete the directory at `plugins/NAME` inside the WezTerm runtime directory

## Developing a Plugin

### Minimal Structure

```
myPlugin/
└── plugin/
    └── init.lua   ← must export apply_to_config(config, ...)
```

`init.lua` must return a module with at least `apply_to_config(config)`.

### Local Development Workflow

```lua
local a_plugin = wezterm.plugin.require "file:///home/user/projects/myPlugin"
```

After any code change, run `wezterm.plugin.update_all()` to sync into the runtime directory.

### Multi-Module Plugins

When a plugin spans multiple Lua files, update `package.path` to point at the plugin directory:

```lua
function findPluginPackagePath(myProject)
  local sep = package.config:sub(1, 1) == '\\' and '\\' or '/'
  for _, v in ipairs(wezterm.plugin.list()) do
    if v.url == myProject then
      return v.plugin_dir .. sep .. 'plugin' .. sep .. '?.lua'
    end
  end
end

package.path = package.path .. ';' .. findPluginPackagePath 'file:///path/to/myPlugin'
```

## Forking and Modifying an Existing Plugin

1. Remove original plugin from WezTerm (delete its `plugin_dir`)
2. Fork and clone the repo locally
3. Optionally add `upstream` remote to track original changes
4. Create a feature branch, then make it the default: `git symbolic-ref HEAD refs/heads/mybranch`
5. Fix any hard-coded `plugin_dir` references in the plugin source
6. Load via `file://` URL and use the standard dev workflow

## Key Takeaways

- Plugins install via `wezterm.plugin.require 'https://...'` — clones into the runtime directory
- Pass a Lua table as second arg to `apply_to_config` for plugin-specific options
- Updates are **manual** — run `wezterm.plugin.update_all()` explicitly
- Removal = delete the folder reported by `wezterm.plugin.list()`
- Local `file://` URLs enable plugin development without publishing to GitHub
- Multi-module plugins need `package.path` patched to find sibling `.lua` files
- To fork a plugin: remove → clone → make your branch the repo default → load via `file://`

## Related Articles

- [[wiki/dotfiles/wezterm-config|WezTerm Config]] — Lua config structure and file locations
- [[wiki/dotfiles/wezterm-cli-reference|WezTerm CLI Reference]] — CLI subcommands including Debug Overlay
- [[wiki/dotfiles/wezterm-key-bindings|WezTerm Key Bindings]] — keybinding config where plugins often hook in
- [[wiki/dotfiles/wezterm-pane-to-lua|Pane to Lua]] — passing data to Lua, useful in plugin development

## Sources

- [WezTerm Plugins Docs](https://wezterm.org/config/plugins.html)
- Raw file: `raw/Plugins - Wez's Terminal Emulator.md`
