single binary . declarative . parallel git . MIT

a neovim plugin manager that does not need neovim.

every existing plugin manager (lazy.nvim, mini.nvim, paq, vim-plug, rocks.nvim) runs inside neovim, in lua. fine if you live in your editor, but a hard dependency when you bootstrap a fresh machine, ci runner, dockerfile, ansible playbook, or dotfile. pluvgo decouples install from the editor: rust binary owns clone, lockfile, parallelism. neovim only loads a 15-line lua shim that prepends each plugin to runtimepath.

$ cargo install pluvgo
$ pluvgo init
   wrote ~/.config/nvim/pluvgo.toml
$ pluvgo install
   [================] 12/12
   installed 12 plugins in 4.20s (0 errors)
   wrote ~/.config/nvim/lua/pluvgo_runtime.lua

# in init.lua:
require('pluvgo_runtime')
the spec

one toml, every plugin.

# pluvgo.toml

[[plugin]]
repo = "nvim-treesitter/nvim-treesitter"
build = "make"

[[plugin]]
repo = "nvim-telescope/telescope.nvim"
rev = "0.1.x"

[[plugin]]
repo = "folke/tokyonight.nvim"

[[plugin]]
repo = "neovim/nvim-lspconfig"
enabled = false          # cloned, but not added to runtimepath
why bother with another one

the differences that actually matter.

install before nvim is on PATH

ci runners and dockerfile bootstraps build neovim configs from scratch. with every other manager you install neovim, then start it, then it bootstraps itself, then you run the install. with pluvgo you call pluvgo install in any shell with git available, then start nvim once and everything is on runtimepath.

deterministic lockfile

pluvgo.lock is a TOML file you commit. each plugin gets repo + rev + sha. pluvgo install in a fresh checkout reproduces the exact tree that built last time. no hidden global cache.

parallel git, single binary

rayon spreads clones across cores, shallow filtered fetch, no python or node runtime. the binary is roughly 1.2 MB.

tiny lua shim, no scheduler

generated runtime is fifteen lines. vim.opt.runtimepath:prepend(...) for each plugin, plus after-dir handling. no event hooks, no opaque lazy loader, neovim startup stays fast and predictable.

commands you would expect

install, update, list, lock, shim, doctor, init. the names mean what they say. no DSL to learn.

plays nice with the rest

does not own lazy-loading. if you want it, layer that yourself in lua, or call into lazy.nvim alongside. pluvgo only generates a prepend(runtimepath) for each plugin.

install

one line, no neovim needed.

$ cargo install pluvgo

precompiled binaries ship via github releases at the next tag. requires git on PATH at install time, neovim only at runtime.