Plugins
VisiData's plugin system extends the tool with additional file format support, new commands, and third-party integrations. Plugins are Python files loaded at startup via .visidatarc.
Learning Focus
Learn how to install plugins from the built-in plugin index and how to write a minimal custom plugin for your own use case.
Plugin Index
# Open the plugin index inside VisiData
Space
# Enter: open-plugins
# OR use the menu: Alt+H → Plugins
# Or from the CLI
vd -P open-plugins
The plugin index lists available community plugins with descriptions.
Installing a Plugin
# From the Plugin Index sheet:
Enter # install the plugin under cursor
# VisiData downloads and enables it
# Or manually, add to ~/.visidatarc:
import importlib
# (plugins are Python modules dropped in the visidata plugins dir)
Default plugin directory:
~/.config/visidata/plugins/
To list installed plugins:
ls ~/.config/visidata/plugins/
Enabling/Disabling Plugin Autoload
# ~/.visidatarc
# Disable autoloading of all plugins
options.plugins_autoload = False
# Selectively import specific plugins
import visidata.plugins.vds3 # S3 support
Popular Community Plugins
| Plugin | What it adds |
|---|---|
vds3 | Browse Amazon S3 buckets like directories |
vdplus | Additional aggregators and commands |
vgit | Browse git history as a sheet |
vdreddit | Browse Reddit as a VisiData sheet |
vdzulip | Zulip chat as a sheet |
vdairtable | Airtable as a VisiData sheet |
vdgpx | GPX GPS track files |
vdfixer | Live currency conversion |
Writing a Custom Plugin
A minimal plugin is a Python file placed in the plugin directory:
# ~/.config/visidata/plugins/my_plugin.py
from visidata import vd, Sheet, Column
# Add a custom command to all sheets
Sheet.addCommand(
'F5', # keybinding
'my-custom-command', # longname
'vd.status("Hello VisiData!")', # Python expression to execute
'Show a status message' # help text
)
To load it:
# ~/.visidatarc
import sys, os
sys.path.insert(0, os.path.expanduser('~/.config/visidata/plugins'))
import my_plugin
Adding Custom Column Transformations
# ~/.visidatarc
from visidata import Sheet, Column, vd
# Add a command to add a 'size' column showing length of each cell
@Sheet.api
def add_len_column(sheet):
col = sheet.cursorCol
sheet.addColumn(
Column(
f'len_{col.name}',
getter=lambda col, row: len(str(col.sheet.cursorCol.getDisplayValue(row)))
)
)
Sheet.addCommand('zL', 'add-len-col', 'sheet.add_len_column()', 'Add length column')
Plugin Security
warning
VisiData plugins are executed as Python code with full system access. Only install plugins from trusted sources. Review plugin source code before enabling in production environments.
Troubleshooting Matrix
| Problem | Cause | Fix |
|---|---|---|
| Plugin not loading | Syntax error in plugin file | Run python3 plugin.py to check |
| Command not found | Plugin not imported | Check .visidatarc import statement |
| Plugin conflicts with key | Key already bound | Change the keybinding in the plugin |
| S3 plugin fails | Missing boto3 | pip install boto3 |
Best Practices
- Keep plugins minimal — VisiData's core is powerful without plugins for most use cases.
- Pin plugin versions in a
requirements.txtif using plugins in automated pipelines. - Test plugins on non-production data first — a poorly written plugin can corrupt data.
Hands-On Practice
# Open VisiData and launch plugin index
vd -P open-plugins
# Browse available plugins
# Move cursor to a plugin you want to try
# Press Enter to install
# Or create a minimal custom status command:
mkdir -p ~/.config/visidata/plugins
cat > ~/.config/visidata/plugins/hello.py << 'EOF'
from visidata import Sheet
Sheet.addCommand('F12', 'hello-world', 'vd.status("Hello from plugin!")', 'Say hello')
EOF
# Add to ~/.visidatarc:
echo "import sys; sys.path.insert(0, '/root/.config/visidata/plugins'); import hello" >> ~/.visidatarc
# Test:
vd /tmp/servers.csv
# Press F12 → see "Hello from plugin!" in status bar