Written in V — MIT Licensed

The hackable
Unix shell

vlsh is a fast, modern shell built for developers who want to read, modify, and extend their shell — not just use it.

vlsh — ~
~$ cat deploy.vsh
#!/usr/bin/env vlsh
// .vsh scripts run natively — no compile step needed
import os
 
fn main() {
  files := os.glob('build/*.js') or { [] }
  for f in files {
    os.cp(f, 'dist/' + os.base(f)) or { panic(err) }
  }
}
 
~$ ./deploy.vsh
Copied 3 files to dist/
 
~$

Everything you need, nothing you don't

vlsh ships with the fundamentals done right, then gets out of your way.

Fast & Compiled

Built with V, vlsh compiles to a lean native binary. Cold start is near-instant — no interpreter overhead on every keystroke.

|

Pipes, Redirection & Chains

First-class support for | pipes, > / >> redirection, and && command chaining. Glob expansion, tilde expansion, and $VAR substitution all work as expected.

💬

Smart History

Persistent command history across sessions (up to 5 000 entries). Press Ctrl+R for incremental search through every command you've run.

Tab Completion

File and directory completion out of the box. Plugins can register custom completions for commands, flags, and any domain-specific vocabulary.

🔌

Plugin System

Drop a .v file into ~/.vlsh/plugins/. vlsh compiles and loads it automatically — no restart required. Plugins can add commands, decorate the prompt, and provide completions.

Built-in Multiplexer

Split panes horizontally or vertically with Ctrl+V prefix bindings. Mouse support and 1 000-line scrollback per pane — no tmux dependency needed.

📜

Native .vsh Scripts

Run .vsh V scripts directly without manually compiling them first. Great for automation that needs performance without the ceremony of a full build.

🎨

Theming & Aliases

Configure prompt colors via RGB values in ~/.vlshrc. Manage aliases at runtime or persist them in your config — all without restarting the shell.

Get up and running

Pre-built packages for Linux, or build from source in seconds.

shell
# Download the latest .deb package from the releases page
wget https://github.com/vlshcc/vlsh/releases/latest/download/vlsh_linux_amd64.deb

# Install
sudo dpkg -i vlsh_linux_amd64.deb

# Add to valid login shells and set as default (optional)
echo "/usr/local/bin/vlsh" | sudo tee -a /etc/shells
chsh -s /usr/local/bin/vlsh
shell
# Download the standalone binary (64-bit Linux)
wget https://github.com/vlshcc/vlsh/releases/latest/download/vlsh_linux_amd64
chmod +x vlsh_linux_amd64
sudo mv vlsh_linux_amd64 /usr/local/bin/vlsh

# Add to valid login shells and set as default (optional)
echo "/usr/local/bin/vlsh" | sudo tee -a /etc/shells
chsh -s /usr/local/bin/vlsh
shell
# Requires V — https://vlang.io
git clone https://github.com/vlshcc/vlsh
cd vlsh
v .
sudo mv vlsh /usr/local/bin/vlsh

# Add to valid login shells and set as default (optional)
echo "/usr/local/bin/vlsh" | sudo tee -a /etc/shells
chsh -s /usr/local/bin/vlsh

Extend with pure V

The plugin system is the heart of vlsh's hackability. Any .v file you drop into ~/.vlsh/plugins/ is automatically compiled and loaded on the next shell start. Plugins can:

  • 1 Register new built-in commands available everywhere in the shell
  • 2 Decorate the prompt — e.g. show the current git branch
  • 3 Provide tab-completions for any command or flag
  • 4 Interact with the shell environment (aliases, paths, venv vars)
~/.vlsh/plugins/git_branch.v
// Show the current git branch in the prompt
module plugins

import os

pub fn prompt_suffix() string {
    branch := os.execute('git branch --show-current')
    if branch.exit_code != 0 {
        return ''
    }
    return ' (\e[35m' + branch.output.trim_space() + '\e[0m)'
}