Go + Lazy = Glaze — A centralized manager for Go binaries in Neovim.
Every Go-based Neovim plugin reinvents the wheel:
freeze → ships its own installerglow → ships its own installermods → ships its own installerEach plugin implements go install, update checking, and version management from scratch.
Users run different update commands for each plugin. Plugin authors duplicate code.
Glaze provides a single source of truth for Go binaries:
-- Plugin authors: two lines
local ok, glaze = pcall(require, "glaze")
if ok then glaze.register("freeze", "github.com/charmbracelet/freeze") end
-- Users: one command
:Glaze
u updates binary under cursor, U updates all{
"taigrr/glaze.nvim",
config = function()
require("glaze").setup()
end,
}
use {
"taigrr/glaze.nvim",
config = function()
require("glaze").setup()
end,
}
go install support)local glaze = require("glaze")
-- Setup
glaze.setup()
-- Register binaries
glaze.register("freeze", "github.com/charmbracelet/freeze")
glaze.register("glow", "github.com/charmbracelet/glow")
glaze.register("gum", "github.com/charmbracelet/gum")
-- Open the UI
vim.cmd("Glaze")
| Command | Description |
|---|---|
:Glaze |
Open the Glaze UI |
:GlazeUpdate [name] |
Update all or specific binary |
:GlazeInstall [name] |
Install missing or specific binary |
:GlazeCheck |
Manually check for available updates |
| Key | Action |
|---|---|
U |
Update all binaries |
u |
Update binary under cursor |
I |
Install all missing binaries |
i |
Install binary under cursor |
x |
Abort running tasks |
<CR> |
Toggle details |
q / <Esc> |
Close window |
Make your plugin a Glaze consumer with two lines:
-- In your plugin's setup:
local ok, glaze = pcall(require, "glaze")
if ok then
glaze.register("mytool", "github.com/me/mytool", {
plugin = "myplugin.nvim", -- Shows in UI
callback = function(success)
if success then vim.notify("mytool updated!") end
end,
})
end
These plugins use Glaze to manage their Go binaries:
require("glaze").setup({
-- UI settings
ui = {
border = "rounded", -- "none", "single", "double", "rounded", "solid", "shadow"
size = { width = 0.7, height = 0.8 },
icons = {
pending = "○",
running = "◐",
done = "●",
error = "✗",
binary = "",
},
use_system_theming = false, -- Use nvim theme instead of doughnut colors
},
-- Parallel installations
concurrency = 4,
-- Go command (auto-detects goenv)
go_cmd = { "go" },
-- Auto-install missing binaries on register
auto_install = {
enabled = true,
silent = false,
},
-- Auto-check for updates
auto_check = {
enabled = true,
frequency = "daily", -- "daily", "weekly", or hours as number
},
-- Auto-update when newer versions found
auto_update = {
enabled = false, -- Requires auto_check
},
})
local glaze = require("glaze")
-- Registration
glaze.register(name, url, opts?) -- Register a binary
glaze.unregister(name) -- Remove a binary
glaze.binaries() -- Get all registered binaries
-- Status
glaze.is_installed(name) -- Check if binary exists
glaze.bin_path(name) -- Get full path to binary
glaze.status(name) -- "installed", "missing", or "unknown"
-- Runner
local runner = require("glaze.runner")
runner.update({ "freeze" }) -- Update specific binaries
runner.update_all() -- Update all
runner.install_missing() -- Install all missing
runner.abort() -- Stop all tasks
-- Checker
local checker = require("glaze.checker")
checker.check() -- Check for updates
checker.get_update_info() -- Get cached update info
| Group | Description |
|---|---|
GlazeH1 |
Main title |
GlazeH2 |
Section headers |
GlazeBinary |
Binary names |
GlazeUrl |
Module URLs |
GlazePlugin |
Plugin names |
GlazeDone |
Success status |
GlazeError |
Error status |
GlazeRunning |
In-progress status |
GlazeProgressDone |
Progress bar (filled) |
GlazeProgressTodo |
Progress bar (empty) |
:checkhealth glaze
Verifies Go installation, GOBIN configuration, and registered binary status.
Glaze is inspired by: