kickstart.nvim — the official starter
nvim-lua/kickstart.nvim is a single, well-commented init.lua (around 800 lines, every section explained) that sets up LSP, completion, treesitter, telescope, gitsigns, mini.nvim, and a sensible keymap. Maintained by Neovim core contributors and updated for Neovim 0.11+. It's not a framework — it's a starting config you read and modify, not import as a black box.
When to use kickstart
- Brand new to Neovim and want a working setup in 5 minutes.
- Setting up a new machine and don't want to re-derive your config from scratch.
- Teaching someone Neovim and want them on a known-good base.
Read every line as you adopt it. Every chunk has comments telling you what it does and why. Treat it as a learning config, not a dependency.
Performance — the budget you have
Modern Neovim with lazy.nvim should start in under 100ms. Measure first, optimize second:
:Lazy profile— total startup time and per-plugin breakdown.nvim --startuptime /tmp/startup.log— full startup trace at the millisecond level.
Lazy-loading patterns that actually save time
Good lazy-loading defers heavy plugins until they're needed. Bad lazy-loading creates bugs because dependencies aren't loaded before you use them. The safe pattern is to lazy-load on a specific trigger that matches the plugin's usage:
event = "BufReadPost"— load when a file opens. Use for editing-time plugins (gitsigns, treesitter, comment plugins).event = "InsertEnter"— load on first Insert mode. Use for completion (nvim-cmp, autopairs).event = "VeryLazy"— load after the UI is ready. Use for plugins that don't need to be present immediately (which-key, lualine, nvim-surround).cmd = "FugitiveStatus"— load on a specific command. Use for occasional-use heavy plugins (fugitive, Mason).ft = { "python", "lua" }— load only for specific filetypes. Use for language-specific plugins.keys = { ... }— load on a key first being pressed.
Custom Lua you'll write within a year
The Neovim API is rich enough that most personal automations are 5–15 lines of Lua. Three patterns you'll keep reaching for:
vim.api.nvim_create_autocmd— react to events (file opened, file saved, cursor held).vim.api.nvim_create_user_command— define your own:Command.vim.keymap.set+ a custom function — bind anything you can write in Lua to a key.
Neovim's roadmap (peek ahead)
- Neovim 0.12 (in flight) — built-in plugin manager via
vim.pack, multi-cursor support, improved progress messages,vim.snippetas a first-class snippet system. - Neovim 0.13+ — structured concurrency (
vim.async), multibuffer editing, more native features that today require plugins.
Don't chase the latest unstable. Stay on the latest stable (0.11.x as of 2026); upgrade when 0.12.0 lands and the plugin ecosystem catches up.
init.lua reflects every real preference you have. Plugins were added because you felt their absence; mappings exist because you typed the long form twice. That's the editor that fits your hand. Vim+tmux earns its lifetime ROI in that config.