A modern, lightweight plugin manager for Neovim with a beautiful UI and intelligent dependency management.

git clone https://github.com/OriginCoderPulse/synapse.nvim ~/.local/site/package/pack/synapse.nvim
Add to your Neovim configuration:
require('synapse').setup({})
require('synapse').setup({
-- Git clone method: "ssh" or "https"
method = "https",
opts = {
-- Plugin installation directory
package_path = "your pkg path",
-- Configuration directory (scanned recursively for .lua files)
config_path = "your config path",
-- UI customization
ui = {
style = "float",
header = {
text = {
"โโโโโโโโโโโ โโโโโโโ โโโ โโโโโโ โโโโโโโ โโโโโโโโโโโโโโโโ",
"โโโโโโโโโโโโ โโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ",
"โโโโโโโโ โโโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ",
"โโโโโโโโ โโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโ ",
"โโโโโโโโ โโโ โโโ โโโโโโโโโ โโโโโโ โโโโโโโโโโโโโโโโ",
"โโโโโโโโ โโโ โโโ โโโโโโโโ โโโโโโ โโโโโโโโโโโโโโโโ",
},
hl = "SynapseHeader", -- or use hex color: "#e6d5fb"
},
plug = {
hl = "SynapsePlugin", -- or use hex color: "#d5fbd9"
},
icons = {
download = { glyph = "๏", hl = "SynapseDownload" }, -- or "#fbe4d5"
upgrade = { glyph = "๓ฐฐ", hl = "SynapseUpgrade" },
remove = { glyph = "๓ฐบ", hl = "SynapseRemove" },
check = { glyph = "๓ฑฅพ", hl = "SynapseCheck" },
success = { glyph = "๏
", hl = "SynapseSuccess" }, -- or "#bbc0ed"
faild = { glyph = "๓ฐฌ", hl = "SynapseFaild" }, -- or "#edbbbb"
progress = {
glyph = "๏",
hl = {
default = "SynapseProgressDefault", -- or "#5c6370"
progress = "SynapseProgress", -- or "#fbe4d5"
},
},
},
},
},
keys = {
download = "<leader>si",
remove = "<leader>sr",
upgrade = "<leader>su",
},
})
Create .lua files in your config_path directory (supports subdirectories):
-- ~/.config/nvim/plugins/telescope.lua
return {
-- Repository URL (required)
repo = "nvim-telescope/telescope.nvim",
-- Clone configuration (optional)
clone_conf = {
branch = "main", -- Default: "main"
},
-- Tag version (optional, takes precedence over branch)
tag = "v0.1.0", -- Lock to specific tag version
-- Post-install/update commands (optional)
execute = {
"make",
"cargo build --release",
}, -- Or use a single string: execute = "make"
-- Dependencies (optional)
depend = {
"nvim-lua/plenary.nvim",
},
-- Plugin configuration function (optional)
config = function()
require("telescope").setup({
-- Your configuration
})
end,
}
:SynapseDownload - Install missing plugins:SynapseUpgrade - Update all plugins:SynapseRemove - Remove unused plugins<leader>si - Install plugins<leader>sr - Remove unused plugins<leader>su - Update plugins
q or Esc - Close windowR - Retry failed operations (when viewing failures)
## Configuration Options
### `method`
- **Type**: `string`
- **Default**: `"https"`
- **Values**: `"ssh"` or `"https"`
- **Description**: Git clone protocol
### `opts.default`
- **Type**: `string`
- **Default**: `"OriginCoderPulse/synapse.nvim"`
- **Description**: Default plugin repository
### `opts.package_path`
- **Type**: `string`
- **Default**: `~/.synapse/package`
- **Description**: Directory where plugins are installed
### `opts.config_path`
- **Type**: `string`
- **Default**: `~/.config/nvim`
- **Description**: Directory to scan for plugin configuration files (recursive)
### `opts.ui`
- **Type**: `table`
- **Description**: UI customization options
#### `opts.ui.header`
- **Type**: `table`
- **Fields**:
- `text`: Array of strings for multi-line ASCII art header
- `hl`: Highlight group name or hex color (e.g., `"SynapseHeader"` or `"#e6d5fb"`)
#### `opts.ui.plug`
- **Type**: `table`
- **Fields**:
- `hl`: Highlight group name or hex color for plugin names (e.g., `"SynapsePlugin"` or `"#d5fbd9"`)
#### `opts.ui.icons`
- **Type**: `table`
- **Description**: Icon definitions for different operations
- **Fields for each icon**:
- `glyph`: Icon character (string)
- `hl`: Highlight group name or hex color (e.g., `"SynapseDownload"` or `"#fbe4d5"`)
**Note**: All `hl` parameters support both highlight group names (strings) and hex color values (e.g., `"#bbc0ed"`). When a hex color is provided, a highlight group is automatically created.
## Dependency Management
Synapse automatically handles plugin dependencies:
1. **Auto-install**: Dependencies are installed automatically
2. **Deduplication**: Shared dependencies are installed only once
3. **Priority**: If a dependency is also a main plugin, its configuration takes precedence
4. **Protection**: Dependencies are protected during removal unless unused
## Version Management
Synapse supports both branch and tag-based version control:
- **Tag Support**: Use `tag` field in plugin configuration to lock to a specific version
- When `tag` is specified, it takes precedence over `branch`
- Tag information is saved to `synapse.yaml` for persistence
- Updates will respect tag changes in configuration
- **Branch Support**: Use `clone_conf.branch` to specify a branch
- Default branch is "main" if not specified
- Branch information is saved to `synapse.yaml` (only if not "main" or "master")
- **synapse.yaml**: Automatically created in `package_path` directory
- Records installed plugins with their repository, branch, tag, and dependencies
- Only main plugins are recorded (dependencies are stored in `depend` field)
- Used to maintain consistency across installations and updates
- **Post-Install Commands**: Use `execute` field to run build commands
- Commands are executed after successful Git clone/update
- Supports both installation and update operations
- Commands run in the plugin's installation directory
- Useful for compiled plugins that require build steps
## Examples
### Basic Plugin
```lua
-- ~/.config/nvim/plugins/mason.lua
return {
repo = "williamboman/mason.nvim",
config = function()
require("mason").setup()
end,
}
-- ~/.config/nvim/plugins/telescope.lua
return {
repo = "nvim-telescope/telescope.nvim",
depend = {
"nvim-lua/plenary.nvim",
"nvim-telescope/telescope-live-grep-args.nvim",
},
config = function()
require("telescope").setup({})
end,
}
-- ~/.config/nvim/plugins/custom.lua
return {
repo = "username/repo-name",
clone_conf = {
branch = "develop",
},
config = function()
-- Your config
end,
}
-- ~/.config/nvim/plugins/versioned.lua
return {
repo = "username/repo-name",
tag = "v1.2.3", -- Lock to specific tag version
config = function()
-- Your config
end,
}
Note: When tag is specified, it takes precedence over branch. The plugin will be checked out to the specified tag version, and this tag will be recorded in synapse.yaml for future reference.
-- ~/.config/nvim/plugins/compiled.lua
return {
repo = "username/compiled-plugin",
execute = {
"make",
"cargo build --release",
}, -- Commands executed sequentially after installation/update
config = function()
-- Your config
end,
}
Or use a single command:
return {
repo = "username/compiled-plugin",
execute = "make", -- Single command
config = function()
-- Your config
end,
}
Note: The execute field supports both a single string or an array of strings. Commands are executed sequentially in the plugin's installation directory. If any command fails, the installation/update process will stop and report an error.
Common Use Cases:
make, cargo build, npm install, etc.Examples:
-- C/C++ plugin with make
execute = "make"
-- Rust plugin with cargo
execute = "cargo build --release"
-- Node.js plugin
execute = "npm install"
-- Multiple build steps
execute = {
"cmake .",
"make",
"make install",
}
-- Python plugin with pip
execute = "pip install -e ."
You can use hex colors directly in hl parameters:
require('synapse').setup({
opts = {
ui = {
header = {
text = { "Your Header" },
hl = "#e6d5fb", -- Use hex color directly
},
plug = {
hl = "#d5fbd9", -- Plugin name color
},
icons = {
success = {
glyph = "โ",
hl = "#bbc0ed", -- Success icon color
},
faild = {
glyph = "โ",
hl = "#edbbbb", -- Failure icon color
},
progress = {
glyph = "โธ",
hl = {
default = "#5c6370", -- Default progress color
progress = "#fbe4d5", -- Active progress color
},
},
},
},
},
})
Or use highlight group names:
require('synapse').setup({
opts = {
ui = {
header = {
text = { "Your Header" },
hl = "SynapseHeader", -- Use highlight group name
},
-- ... other config
},
},
})
config_path (supports subdirectories)repo fieldrepo field is not emptydepend field format (array of strings)package_pathContributions are welcome! Please feel free to submit issues or pull requests.
MIT License