Skip to main content

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
PluginWhat it adds
vds3Browse Amazon S3 buckets like directories
vdplusAdditional aggregators and commands
vgitBrowse git history as a sheet
vdredditBrowse Reddit as a VisiData sheet
vdzulipZulip chat as a sheet
vdairtableAirtable as a VisiData sheet
vdgpxGPX GPS track files
vdfixerLive 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

ProblemCauseFix
Plugin not loadingSyntax error in plugin fileRun python3 plugin.py to check
Command not foundPlugin not importedCheck .visidatarc import statement
Plugin conflicts with keyKey already boundChange the keybinding in the plugin
S3 plugin failsMissing boto3pip install boto3

Best Practices

  • Keep plugins minimal — VisiData's core is powerful without plugins for most use cases.
  • Pin plugin versions in a requirements.txt if 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

What's Next