LazyVim From Scratch — What an 18-Month-Old Setup Video Still Gets Right

A 19-minute walkthrough that takes Neovim from empty directory to Go LSP, debugger, fuzzy finder and Copilot in one sitting. The method holds up completely. The specifics do not: LazyVim has shipped 33 releases and two major version bumps since, the default picker and file explorer were both replaced, and the minimum Neovim version moved twice. This is the guide plus everything you would hit if you followed it today.

LazyVim From Scratch To BEAST MODE
📺 DevOps Toolbox ⏱️ 19:17 📅 7 February 2025 👁️ 221,012
LazyVim Neovim lazy.nvim LSP Extras LazyGit Copilot

📌 Read this first

This video is from February 2025. That is unusual for this series, and it changes how it should be read.

What changed in the eighteen months since. LazyVim has published 33 releases and crossed two major versions — v15.0.0 in September 2025 and v16.0.0 in June 2026. Both carried breaking changes. Two of the components demonstrated on screen are no longer the defaults, and the minimum Neovim version rose twice.

None of that makes the video worthless — the opposite. The workflow it teaches (install bare, discover through the menu, add capability through Extras, configure only what annoys you) is unchanged and is the durable part. But if you follow the keystrokes literally you will hit differences within the first minute. Section If you install it today lists them precisely.

Why cover it now at all: this is the clearest existing demonstration of a claim that keeps coming up in agent tooling too — that a curated default configuration can beat a hand-rolled one, and that the cost of the curation is not a loss of control. The video makes that case with measurements rather than assertions, which is rarer than it should be.

🎬 The premise 0:00

The opening is a parody of the genre it belongs to, and it earns the piece a lot of goodwill:

"In order to build a full-fledged development environment in Neovim, you have to spend hours — no wait, years — configuring your setup, step by step, plugin by plugin, suffer at the hand of mysterious errors, bang your head multiple times, go back to VS Code, then uninstall and cry yourself to sleep."

The pivot is the argument: that was true, and it stopped being true. Neovim core maintainers now ship kickstart projects, and beyond those sit full distributions — a ready-made setup with language servers, themes, completion, debuggers, AI integration and fuzzy pickers already wired together.

He states the standard objection without softening it — "overkill, hidden configuration, bloated" — and answers it with an appeal to opportunity cost rather than a rebuttal: "we don't all have years to wait, and honestly, if I had the luxury of Neovim users nowadays, I'd take it without blinking twice."

That framing is the whole review. The distro question is not "is this as good as what I would build" but "is the gap worth the months". Everything measured later in the video is an attempt to size that gap honestly — and the measurements mostly favour the distro.

💾 Install, and the backup 1:42

The first practical instruction is the one most tutorials skip, and it is the correct one: back up before you clone. Four locations, not one:

# move the existing setup aside — all four, not just the config
mv ~/.config/nvim{,.bak}
mv ~/.local/share/nvim{,.bak}
mv ~/.local/state/nvim{,.bak}
mv ~/.cache/nvim{,.bak}

# then the entire installation
git clone https://github.com/LazyVim/starter ~/.config/nvim
nvim
The starter repo still has exactly the structure shown: init.lua at the root, lua/config/ and lua/plugins/ beneath it, plus stylua.toml and .neoconf.json. Notably the starter repo has not been touched since December 2024 — before this video was even published — while LazyVim itself has moved 33 releases. The scaffold is deliberately frozen; the substance lives in the package.

On first launch, lazy.nvim installs the baseline set — bufferline, the Catppuccin theme, fzf-lua, gitsigns and others he describes as "almost considered a must these days", with the honest qualifier: "obviously it's all opinionated, but can be changed easily later."

A useful detail for anyone with an existing setup: his own ~/.config/nvim is a symlink into a dotfiles repo, so "deleting" it is safe by construction. That is the pattern worth copying, independent of LazyVim.

⚡ Startup time as the argument 2:42

This is where the review stops being a tour and starts being evidence.

After the first restart the status line reports 4 of 34 plugins loaded — because lazy.nvim defers the rest until an event actually needs them. Startup: 25 milliseconds.

"I can tell you I've never reached that fast startup time, regardless of how well I thought I configured things."

He returns to the number three more times as the config grows, and the trajectory is the point:

StageStartup
Fresh install, 4/34 plugins loaded25 ms
After keymap and config additions40 ms
Later in the session29 ms
After adding ~7 more Extras27 ms
The counter-intuitive result is the one that matters: adding seven Extras did not increase startup time. "Nothing major had changed when all these new additions stay unloaded." That is the entire lazy-loading thesis demonstrated rather than asserted — installed capability is not resident cost.

Note also that he reports the numbers moving around (25 → 40 → 29 → 27) rather than quoting only his best. Variance disclosed is worth more than a single flattering figure, and it is the same instinct that made the pgrust maintainers publish their lower benchmark.

⌨️ The leader-key discovery loop 3:52

The mechanism that makes a distro learnable is not documentation — it is that pressing the leader key shows you the map.

Space alone pops a command palette; from there, submenus for files, buffers, code, debugging, git and UI. Press f for files, then e for the explorer. Nothing memorised in advance.

The mappings he singles out:

KeysAction
<leader> <leader>Fuzzy file picker
<leader> b bJump to the last buffer
[ b / ] bPrevious / next buffer
[ d / ] dPrevious / next diagnostic
<leader> lThe lazy.nvim package manager
<leader> uUI options — themes, animations, dismiss notifications
<leader> .Scratch buffer
<leader> f tTerminal in the current working directory
g c o / g c OComment below / above the line
Ctrl sSave — and format on save

His repeated advice is to read the mappings table in the docs at least once — "to see what resonates with you and match your workflow" — and it is well placed, because the discoverable menu shows you where things are, not that they exist.

The scratch buffer (<leader> .) is the underrated one: a throwaway pad for testing a snippet "without abusing your project's files". He uses it to show LSP completion generating an entire web server — and takes care to distinguish that from AI: "This isn't AI, it's pure code suggestion." Precision that most tooling coverage in 2026 no longer bothers with.

🧩 Extras — the real feature 8:49

The demonstration that carries the piece. He opens a real work project — a Go-based Kubernetes controller — and finds syntax highlighting but no language server. Treesitter shipped with basic languages; Go is not among them.

The fix is :LazyExtras, a menu of bundled mini-packages. Each Extra is not a plugin but a set of plugins configured to work together:

:LazyExtras          " browse the catalogue
                     " lang.go bundles: mason, mini-icons, neotest,
                     " nvim-dap (debugger), lspconfig, and more
                     " press x to install, then restart

After the restart, gopls immediately flags a misplaced variable declaration, inline type hints appear as ghost text, and completion starts working. One keypress, one restart.

Still true, and larger. The extras/lang/ directory now holds 49 language packs, and go.lua is still among them. His joke about the breadth — "from Angular and Ansible for you old-school DevOps guys, through Docker, Elixir, heck, even Nushell scripts" — undersells the current count.
Why this is the argument for distros in one feature. Assembling a working Go environment by hand means choosing an LSP client, a Mason registry entry, a test runner, a DAP adapter and a formatter, then making them agree about root directories and on-save behaviour. The Extra is not saving you a download — it is saving you the integration decisions, which is where the months actually go.

The same distinction applies to agent skills: the value is rarely the individual capability, it is that someone already resolved how the pieces interact.

🔧 Config the sanctioned way 6:01

The customisation section answers the "hidden configuration" objection directly, and the method is more interesting than the specific tweaks.

He wants jj to exit insert mode. LazyVim already ships an empty keymaps.lua"so that we can have a place for these settings without wondering where it's best placed." That is the distro's real contribution to configuration: not fewer options, but a sanctioned location.

The discipline he applies is worth more than the mapping. His instinct was to copy his whole old keymaps.lua across. He didn't: "I like to start fresh and consider I had probably accumulated unused mappings and bad habits." He points at his own buffer keys, still prefixed t from when he used tabs — a mapping that outlived the workflow that justified it. Migrating a config wholesale carries every decision you have stopped being able to defend.

Plugin overrides, done properly

To rebind mini.surround he creates lua/plugins/surround.lua rather than editing anything LazyVim owns — returning a table per Lua convention, following the "configuration recipes" section of the docs. The remap is from gsa to <leader>sa, and the payoff is that the new binding appears in the which-key menu automatically — the override participates in the discovery system rather than bypassing it.

He also demonstrates mini.files creating that file: navigate, type the name, press = to apply. "Like oil.nvim or some of the Neo-tree capabilities, just better."

One thing he mentions and moves past too quickly: lazyvim.json tracks which Extras are enabled and which config versions have been migrated. That file is what makes a LazyVim setup reproducible on another machine — it belongs in your dotfiles repo alongside lua/, and the video never says so.

🌿 Git, and one honest doubt 12:07

<leader>g opens git: blame, browse, commits, status, and LazyGit. He is positive about the picker-style status view — staging and unstaging by moving files left and right, in the same visual language as the file explorer.

Then he does something the genre usually avoids and registers a loss:

"Is this better than having my beloved Neogit replaced with other mainly viewing options? I mean gc, which I've always been using as git commit, now suddenly pops a window with git commits, like a log. I'm not sure about that yet."
That is the most valuable twenty seconds in the video. A curated default is a set of someone else's opinions, and adopting it means some of your muscle memory now does something different. He names a specific collision — gc meaning commit to him, log to LazyVim — instead of pretending the trade is free. Any review of a curated tool that reports zero friction has not been used long enough.

His resolution is LazyGit, now integrated, which he rates as "one of, if not the best git terminal interfaces". The endorsement-by-association — that DHH appeared on the author's show praising it — is weak evidence and presented as such.

LazyGit is real and thriving: jesseduffield/lazygit, 80,909 stars, MIT licensed, last pushed the day this was written. One factual slip: he says it is "surprisingly not developed by Folke" — correct, it is Jesse Duffield's, and it predates LazyVim entirely. The shared "Lazy" prefix is coincidence, not a family.

🤖 AI, and what dated 17:19

Copilot goes in as an Extra (ai.copilot), authenticates with a one-time code, and immediately produces a working reconciler from a one-line comment. His observation about why it worked is the sharp one: the model "picks up the context in which it should work and doesn't only create a function, but also builds it correctly, according to how the controller works."

His stated reason for adopting it — "since GitHub's Copilot is free now" — was accurate in February 2025 and is the most obviously time-stamped line in the video.

This section has aged the most. extras/ai/ now carries nine integrations: avante, claudecode, codeium, copilot, copilot-chat, copilot-native, sidekick, supermaven and tabnine. Three of those are Copilot variants alone, and claudecode did not exist when this was recorded. Anyone following the video for AI setup should open :LazyExtras and look rather than copy the choice.

⚖️ The distro argument 13:20

His conclusion is more restrained than the title suggests, and better for it:

"With everything that LazyVim comes with, the ease of adjusting it to my needs — which, as you've seen, is close to zero — makes me want to keep it that way and don't go all too crazy with custom configurations."

Which turns the usual complaint inside out. The objection to distros is that they hide configuration; his experience is that a good default reduces the desire to configure at all. The measurement backs it: he never sacrificed the startup time he would have optimised for by hand.

The generalisable claim: a curated default beats a hand-rolled one not because the individual choices are better, but because the integration is already solved and the cost of overriding any single choice is low. That combination — sensible defaults plus a cheap escape hatch — is what separates a distribution from a framework, and it is exactly the property to look for when evaluating any opinionated toolchain, agent harnesses included.

🔄 If you install it today

Everything below was checked against the current LazyVim source and release history. These are the points where the video and reality now diverge.

In the video (Feb 2025)Today
fzf-lua is the default pickersnacks is first in the picker list; fzf and telescope are alternatives
Neo-tree is the default explorersnacks is first in the explorer list; neo-tree is the alternative
No stated Neovim floorNeovim ≥ 0.11.2 required since v15.0.0 — current release is v0.12.4
Treesitter as configured thenv15.0.0 migrated to the nvim-treesitter main branch
nvim-cmp completionblink is now the default completion engine
ai.copilot for AINine AI extras now, including claudecode and three Copilot variants
Extras catalogue as shownLarger — 49 language packs, lang.go still present
Starter repo structureUnchanged — untouched since Dec 2024
Backup four directories before installingStill exactly right
Lazy-loading keeps startup flatStill the core mechanism
The one that will confuse you first. The video's second-most-used keystroke is <leader><leader> for the fuzzy picker, and he explicitly says it opens fzf-lua. On a fresh install today it opens snacks.picker instead. The keybinding is identical, the interface is not. Nothing is broken — but if you are following along expecting the on-screen UI, that is the first divergence you will see, roughly five minutes in.

LazyVim handles this carefully: the config notes that existing installs keep their defaults, so this only affects new installations. Which is precisely the audience for a from-scratch video.

🔍 Claims checked

ClaimResult
LazyVim is a Neovim distribution wrapping lazy.nvimCorrect — 27,065 stars, Apache-2.0
Starter is a single git clone into ~/.config/nvimStill exact, structure unchanged
4 of 34 plugins load at startup; 25 msHis machine, his install — plausible and consistent with lazy-loading, not independently reproducible
Adding Extras does not raise startup timeDemonstrated across four measurements in the video itself
:LazyExtras bundles plugins per languageConfirmed — extras/lang/ holds 49 packs
lang.go bundles mason, neotest, DAP, lspconfigConfirmed present
fzf-lua is the default pickerNo longer — snacks is first in the picker list
Neo-tree is the default explorerNo longer — snacks is first in the explorer list
LazyGit "not developed by Folke"Correct — Jesse Duffield, 80,909 stars, MIT
Copilot is freeTrue as stated in Feb 2025; verify current terms
Extras are "updated on a weekly basis"Understated — 33 releases since the video
Neovim version requirementNot mentioned; ≥ 0.11.2 required since v15.0.0
Method note. YouTube rate-limited caption access for this video (429 on the transcript API, yt-dlp auto-subs and the signed timedtext URL alike), so the transcript was produced locally with Whisper large-v3-turbo from the downloaded audio — 196 segments across the full 19:16. Machine transcription spells phonetically, so every plugin, command and repository name above was checked against the LazyVim source and the GitHub API rather than trusted from the audio. Figures verified 31 July 2026.

💡 Key takeaways

  1. The method survives, the specifics do not. 33 releases and two major bumps in eighteen months. Follow the approach, verify every keystroke against current docs.
  2. Back up four directories, not one. ~/.config/nvim, ~/.local/share/nvim, ~/.local/state/nvim, ~/.cache/nvim.
  3. Installed capability is not resident cost. Seven Extras added, startup unchanged at 27 ms — the lazy-loading thesis, demonstrated rather than claimed.
  4. He publishes the variance. 25 → 40 → 29 → 27 ms rather than only the best figure. Disclosed noise is more credible than a clean number.
  5. Discoverability is the distro's real feature. Press leader, read the menu. You do not need to know what exists before you can find it.
  6. An Extra saves integration decisions, not downloads. Choosing an LSP client, test runner, DAP adapter and formatter — and making them agree — is where the months actually go.
  7. A sanctioned config location beats fewer options. An empty keymaps.lua answers "where does this go" once, permanently.
  8. Do not migrate your old config wholesale. His own buffer keys were still prefixed t from a tab workflow he had abandoned years earlier.
  9. Overrides that register with which-key are the good kind. A remap that appears in the menu extends the discovery system; one that bypasses it creates private knowledge.
  10. Commit lazyvim.json. It records which Extras are enabled and which migrations ran — it is what makes the setup reproducible. The video never says so.
  11. He names what he lost. gc meant commit to him and means log in LazyVim. A curated-tool review reporting zero friction has not been used long enough.
  12. The best default reduces the urge to configure. Not "hidden configuration" but configuration you stop wanting to do — with a cheap escape hatch when you do.
  13. Check :LazyExtras rather than copying a two-year-old choice. Nine AI integrations now exist where the video shows one.

🔗 Resources & links

🕐 Timestamp index

0:00The parody of configuring Neovim by hand
0:32Kickstart projects and full distributions
0:53"Overkill, hidden configuration, bloated"
1:21What LazyVim is — a distro with optional extras
1:42Back up all four directories first
2:06git clone the starter — that's the install
2:24First launch — lazy.nvim installs the baseline
2:424 of 34 plugins loaded — 25 ms startup
3:03Walking the file structure
3:21lazyvim.json — the config state file
3:52The leader key and the command palette
4:54Leader-leader — the fuzzy file picker
5:37Making tweaks — the jj mapping
6:01keymaps.lua and not migrating old habits
6:48Leader-u — UI options and notifications
7:23Buffer navigation with brackets
7:5640 ms after config additions
8:08Real project — Go controller with no LSP
8:49:LazyExtras — the catalogue
9:18lang.go — what the bundle contains
10:01gopls live — errors, inline type hints
10:42Ctrl-S and format on save
11:06Mapping gems — comments, terminal
11:43The scratch buffer — "this isn't AI"
12:07Git operations under leader-g
12:45The honest doubt — gc means something else now
13:03LazyGit integrated
13:20"Makes me want to keep it that way"
14:05Loading seven more Extras
14:4527 ms — extras added, startup unchanged
15:07mini.files as a file manager
15:30Creating surround.lua the right way
16:15The remap appears in the menu
17:07lazyvim.json filled with extras
17:19AI — adding ai.copilot
17:55Copilot builds a reconciler in context
18:16Dimming, Zen mode, util section
18:58Wrap-up — Neovim plus Tmux