Skip to content

feature: minimum release age / update cooldown for security #2141

@niklas-r

Description

@niklas-r

Did you check the docs?

  • I have read all the lazy.nvim docs

Is your feature request related to a problem? Please describe.

Neovim plugins with shell-level access represent a real supply chain attack surface. Currently, lazy.nvim will apply updates as soon as a new commit or release is available, meaning a compromised plugin could reach users before the community has had time to detect and respond to it.

Describe the solution you'd like

A minimumReleaseAge option (global and/or per-plugin) that delays applying updates until a release has been published for at least N days.

This pattern has seen broad adoption across the package manager ecosystem:

Andrew Nesbitt recently surveyed the full landscape in detail: https://nesbitt.io/2026/03/04/package-managers-need-to-cool-down.html

The security rationale is concrete: of ten supply chain attacks studied, eight had windows of opportunity under one week. A modest 3–7 day delay would have blocked the majority of them.

A reasonable API might look like:

require("lazy").setup({
  checker = {
    enabled = true,
    minimum_release_age = "7d", -- 7 days
  },
})

With per-plugin override, including opting out for trusted plugins and their dependency trees:

{
  "nvim-telescope/telescope.nvim",
  minimum_release_age = nil, -- trust this plugin and pull updates immediately
  dependencies = {
    "nvim-lua/plenary.nvim",         -- inherits minimum_release_age = nil from parent
    { "nvim-tree/nvim-web-devicons", minimum_release_age = "3d" }, -- explicit override
  },
},

Describe alternatives you've considered

  • Pinning to specific commits or tags. Works but requires manual maintenance per plugin.
  • version = "*". Restricts to tagged releases only, but doesn't enforce any age gate.
  • Reviewing diffs before every :Lazy update. Reasonable practice but doesn't scale and doesn't help with transitive updates.

Note that issue #2081 covered the same request but was closed without explanation 5 months ago. Raising again given the significant ecosystem momentum around this pattern since then.

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions