Startuptime: 88ms
Based on the actual CPU time of the Neovim process till UIEnter.
This is more accurate than `nvim --startuptime`.
LazyStart 6.84ms
LazyDone 83.17ms (+76.33ms)
UIEnter 88ms (+4.84ms)
Most Neovim configurations pretend like they are being used to get actual work done. This one is.
This is the Neovim configuration I use daily in large production codebases. Every plugin, keymap, and option earns its place through real usage - if something breaks or slows me down, it gets fixed or removed. All plugins are actively used and I keep it as minimal as possible, but I never compromise on developer experience - if there's a better path, I always take it.
It contains a lot of "hacks" and little known tricks I've accumulated over the years to make overall experience better, which you won't find in any other dotfiles - all of this comes from battle-testing plugins in real projects and digging through countless GitHub issues to find solutions that actually work.
I actively keep it up to date with modern approaches, plugins, and ecosystem changes. Even though it is opinionated, it strikes a good balance between being ready to use now and providing good defaults as a starting point for your own configuration.
- 70 plugins organized across 40 separate plugin files
- 20 language servers configured with smart root detection and conditional attachment
- AI-augmented development via
99and Supermaven - Custom tree-sitter parser (
edf) for.envfile syntax highlighting - Format on save with conform.nvim (prettier, biome, stylua, ruff, rustfmt, and more)
- 10+ linters running via nvim-lint
- Modern completion via blink.cmp with
supermaven+99AI sources and LSP - Sensitive data masking with shelter.nvim
- Environment variable management with ecolog2.nvim
- REST client via kulala.nvim
- Database interface via vim-dadbod
TypeScript/JavaScript, React/Vue/Astro, Python, Rust, Lua, SQL, Bash, HTML/CSS/Tailwind, Markdown, TOML, YAML, JSON, Docker, GraphQL, Prisma, and Graphviz DOT.
Required:
- Neovim >= 0.10
- git, make, unzip
- C compiler (
gccorclang) — needed by tree-sitter to compile parsers - ripgrep — used by snacks.nvim picker for live grep
- Node.js & npm — required by many LSP servers and tools
opencodeCLI — required by the current99setup (OpenCodeProvider)- Nerd Font — provides icons used throughout the UI (
vim.g.have_nerd_fontis set totrue) - Clipboard tool —
pbcopy/pbpaste(macOS),xclip/xsel(Linux), orwin32yank(Windows)
Recommended:
- mise — runtime version manager (config prepends mise shims to
PATH) - lazygit — terminal UI for git, integrated via snacks.nvim (
<leader>lg) - fd — faster file finding for the picker
Optional (language-specific):
- Deno — for Deno project support (LSP activates when
deno.json/deno.jsoncis present) - Python 3 — for Python development (pyright + ruff)
- Rust/cargo — for Rust development (rust-analyzer + rustfmt)
-
Clone this repository:
git clone https://github.com/ph1losof/nvim ~/.config/nvim -
Open Neovim — Lazy.nvim will auto-install all plugins on first launch:
nvim
-
Install all LSP servers, formatters, and linters (this is a custom command defined in this config, not a built-in Mason command):
:MasonInstallAll
-
Verify tree-sitter parsers are installed:
:TSUpdate
Leader key is Space. Here are the most important mappings — run :map or check lua/config/mappings.lua and individual plugin files for the full list.
| Key | Description |
|---|---|
<leader>ff |
Find files |
<leader>fw |
Live grep |
<leader><space> |
Find open buffers |
<leader>fr |
Resume last search |
<leader>fh |
Help pages |
<C-n> |
Open file explorer (Oil) |
<leader>h1–h4 |
Jump to Harpoon mark 1–4 |
<leader>ha |
Add buffer to Harpoon |
| Key | Description |
|---|---|
K |
Hover documentation |
<leader>gd |
Go to definition |
<leader>gr |
Find references |
<leader>gI |
Go to implementation |
<leader>gp |
Peek definition |
<leader>rn |
Rename symbol |
<leader>ca |
Code action |
<leader>ol |
Toggle outline |
| Key | Description |
|---|---|
<leader>aa |
99 vibe |
<leader>av |
99 visual |
<leader>as |
99 search |
<leader>ax |
99 stop |
<leader>al |
99 view logs |
| Key | Description |
|---|---|
<leader>lg |
Open Lazygit |
<leader>lf |
Lazygit current file history |
<leader>hs |
Stage hunk |
<leader>hp |
Preview hunk |
<leader>hb |
Git blame line |
]c / [c |
Next / previous git change |
| Key | Description |
|---|---|
<leader>/ |
Toggle comment |
<leader>sr |
Search & replace (grug-far) |
<leader>z |
Zen mode |
<leader>u |
Undotree |
S |
Quick find/replace word under cursor |
U |
Redo |
+ / - |
Increment / decrement number |
~/.config/nvim/
├── init.lua # Entry point (leader key, loads config modules)
├── lua/
│ ├── config/
│ │ ├── lazy.lua # Lazy.nvim bootstrap and setup
│ │ ├── options.lua # Vim options and diagnostics
│ │ ├── mappings.lua # Global keymaps
│ │ └── autocmds.lua # Autocommands
│ ├── plugins/ # 38 plugin spec files (one per plugin/group)
│ └── helpers.lua # Shared utility functions
├── snippets/ # Custom snippets (drizzle, package.json, css)
├── patches/ # Plugin patches (applied via patchr.nvim)
└── lazy-lock.json # Plugin version lockfile
When I initially started using Neovim, my starting point was NvChad. That's why you may find keybindings similar to NvChad's.
The initial transition from NvChad was done using nvim-lua/kickstart.nvim as a starting point. Over time I dropped most of it and rewrote everything from scratch, keeping only a few good parts from them. Huge thanks to kickstart for getting me started in non-distro direction.
A lot of good defaults, extras, and plugin choices in this config were inspired by LazyVim. Whenever I add a new plugin, I usually look up its source code in the LazyVim repo first — a great reference for well-thought-out Neovim defaults.
on AI side the current setup incorporates 99 (via OpenCode provider) and SuperMaven. Right now my philosophy is as follows: I prefer use cli AI tools like (claude-code and opencode) in combination with tmux to have agentic experience.
Hence, I leave my workflows in neovim to be centered about more thoughtful and less agentic experience.
However, I still want AI capabilities and the ability to work quickly. And that's what 99 by ThePrimeagen got totally right. It brings that traditional feeling of copilot to the neovim, and allows you to maintain both speed and quality in a mindful way.
The opinion here is that SuperMaven.nvim is much better then Windsurf.nvim in their current state. Both are deprecated in their own ways.
While supermaven stated that they are going to be sunsetted, they still allow completions that are fast and intelligent.
windsurf.nvim (formerly Codeium.nvim) is a different story in a sense that it is not officially deprecated but server binaries have been deprecating plugin system in secret. Yes - I have verified it myself when was trying to force it to use newer ai models for completions but the plugin api itself is deprecated.
Today when comparing them both in their current state, two things standout:
First of all, supermaven.nvim is much much faster and seems to be more intelligent.
Second of all, supermaven.nvim doesn't have so much errors like windsurf.nvim, especially around non-modifiable buffers.