diff --git a/files/config/nvim/.vimrc b/files/config/nvim/.vimrc
new file mode 100644
index 0000000..93a7db0
--- /dev/null
+++ b/files/config/nvim/.vimrc
@@ -0,0 +1,64 @@
+" Load plugins
+filetype plugin indent on
+
+" Search
+set ignorecase
+set smartcase
+
+" Tab completion
+set wildmode=list:longest,full
+set wildignore=*.swp,*.o,*.so,*.exe,*.dll
+
+" Tab settings
+set ts=2
+set sw=2
+set expandtab
+
+" Hud
+set termguicolors
+syntax on
+"set colorcolumn=80
+set cursorline
+set fillchars=vert:\│
+set hidden
+set list
+set listchars=tab:»·,trail:·
+set nofoldenable
+set nowrap
+set number
+set relativenumber
+set ruler
+set scrolloff=3
+
+" Tags
+set tags=./tags;/,tags;/
+
+" Backup Directories
+set backupdir=~/.config/nvim/backups,.
+set directory=~/.config/nvim/swaps,.
+if exists('&undodir')
+  set undodir=~/.config/nvim/undo,.
+endif
+
+let mapleader=','
+let maplocalleader=','
+
+" Jump key
+nnoremap ` '
+nnoremap ' `
+
+" Change pane
+nnoremap <C-h> <C-w>h
+nnoremap <C-j> <C-w>j
+nnoremap <C-k> <C-w>k
+nnoremap <C-l> <C-w>l
+
+" Turn off search highlight
+nnoremap <localleader>/ :nohlsearch<CR>
+
+" Trim trailing whitespace
+nnoremap <localleader>tw m`:%s/\s\+$//e<CR>:nohlsearch<CR>``
+
+" Fancy macros
+nnoremap Q @q
+vnoremap Q :norm @q<cr>
diff --git a/files/config/nvim/init.lua b/files/config/nvim/init.lua
new file mode 100644
index 0000000..9aa1759
--- /dev/null
+++ b/files/config/nvim/init.lua
@@ -0,0 +1,64 @@
+-- Load .vimrc
+vim.cmd([[runtime .vimrc]])
+
+vim.g.root_spec = { { ".git", ".jj", "lua" }, "lsp", "cwd" }
+
+vim.o.autochdir = true
+vim.o.fillchars = "stl: ,stlnc: ,eob:░"
+vim.o.list = false
+vim.o.scrolloff = 7
+vim.o.splitkeep = "screen"
+vim.o.updatetime = 50
+vim.o.timeout = true
+vim.o.timeoutlen = 10
+
+-- Neovim specific settings
+vim.o.icm = "split"
+-- vim.o.cia = 'kind,abbr,menu' wait for nightly to drop
+vim.o.foldtext = "v:lua.vim.treesitter.foldtext()"
+
+vim.opt.foldmethod = "expr"
+vim.opt.foldexpr = "nvim_treesitter#foldexpr()"
+
+vim.o.showmode = false
+
+-- Use rg
+vim.o.grepprg = [[rg --glob "!.git" --no-heading --vimgrep --follow $*]]
+vim.opt.grepformat = vim.opt.grepformat ^ { "%f:%l:%c:%m" }
+
+vim.fn.sign_define(
+	"DiagnosticSignError",
+	{ text = "", hl = "DiagnosticSignError", texthl = "DiagnosticSignError", culhl = "DiagnosticSignErrorLine" }
+)
+vim.fn.sign_define(
+	"DiagnosticSignWarn",
+	{ text = "", hl = "DiagnosticSignWarn", texthl = "DiagnosticSignWarn", culhl = "DiagnosticSignWarnLine" }
+)
+vim.fn.sign_define(
+	"DiagnosticSignInfo",
+	{ text = "", hl = "DiagnosticSignInfo", texthl = "DiagnosticSignInfo", culhl = "DiagnosticSignInfoLine" }
+)
+vim.fn.sign_define(
+	"DiagnosticSignHint",
+	{ text = "", hl = "DiagnosticSignHint", texthl = "DiagnosticSignHint", culhl = "DiagnosticSignHintLine" }
+)
+
+-- Make <Tab> work for snippets
+vim.keymap.set({ "i", "s" }, "<Tab>", function()
+	if vim.snippet.active({ direction = 1 }) then
+		return "<cmd>lua vim.snippet.jump(1)<cr>"
+	else
+		return "<Tab>"
+	end
+end, { expr = true })
+
+-- Covenience macros
+-- fix ellipsis: "..." -> "…"
+vim.keymap.set(
+	"n",
+	"<leader>fe",
+	"mc:%s,\\.\\.\\.,…,g<CR>:nohlsearch<CR>`c",
+	{ noremap = true, silent = true, desc = "... -> …" }
+)
+-- fix spelling: just an easier finger roll on 40% keyboard
+vim.keymap.set("n", "<leader>fs", "1z=", { noremap = true, silent = true, desc = "Fix spelling under cursor" })
diff --git a/flake.lock b/flake.lock
index 1d1dad0..865246b 100644
--- a/flake.lock
+++ b/flake.lock
@@ -29,11 +29,11 @@
         "zig": "zig"
       },
       "locked": {
-        "lastModified": 1730688195,
-        "narHash": "sha256-wXK1/gOImxv0vHpUc9qgno1AY8c64j17/UFIiT7zH1g=",
+        "lastModified": 1730568249,
+        "narHash": "sha256-+yyQ2ORHK61Q69mu9/fILlHmrPd3Es8zUTnqlwiMy3o=",
         "ref": "refs/heads/main",
-        "rev": "737dc0896dc266a98c889e122b5c900636e589c9",
-        "revCount": 7874,
+        "rev": "d47df211b03894427592851b0be3b528ff8221ff",
+        "revCount": 7864,
         "type": "git",
         "url": "ssh://git@github.com/ghostty-org/ghostty"
       },
@@ -64,11 +64,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1730633670,
-        "narHash": "sha256-ZFJqIXpvVKvzOVFKWNRDyIyAo+GYdmEPaYi1bZB6uf0=",
+        "lastModified": 1730490306,
+        "narHash": "sha256-AvCVDswOUM9D368HxYD25RsSKp+5o0L0/JHADjLoD38=",
         "owner": "nix-community",
         "repo": "home-manager",
-        "rev": "8f6ca7855d409aeebe2a582c6fd6b6a8d0bf5661",
+        "rev": "1743615b61c7285976f85b303a36cdf88a556503",
         "type": "github"
       },
       "original": {
@@ -79,11 +79,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1730531603,
-        "narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=",
+        "lastModified": 1730200266,
+        "narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=",
         "owner": "nixos",
         "repo": "nixpkgs",
-        "rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d",
+        "rev": "807e9154dcb16384b1b765ebe9cd2bba2ac287fd",
         "type": "github"
       },
       "original": {
diff --git a/home/common/nvim/default.nix b/home/common/nvim/default.nix
index ac0578f..91d22e5 100644
--- a/home/common/nvim/default.nix
+++ b/home/common/nvim/default.nix
@@ -1,5 +1,11 @@
 { lib, pkgs, ... }:
 {
+  home.file.".config/nvim/.vimrc".source = ../../../files/config/nvim/.vimrc;
+
+  home.activation.mkdirNvimFolders = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
+    mkdir -p $HOME/.config/nvim/backups $HOME/.config/nvim/swaps $HOME/.config/nvim/undo
+  '';
+
   programs.neovim = {
     enable        = true;
     defaultEditor = true;
@@ -9,7 +15,7 @@
     withPython3   = false;
     withRuby      = false;
 
-    extraLuaConfig = lib.fileContents ./init.lua;
+    extraLuaConfig = lib.fileContents ../../../files/config/nvim/init.lua;
     extraPackages = with pkgs; [
       black
       go
@@ -115,4 +121,5 @@
       }
     ];
   };
+
 }
diff --git a/home/common/nvim/init.lua b/home/common/nvim/init.lua
deleted file mode 100644
index ba179d8..0000000
--- a/home/common/nvim/init.lua
+++ /dev/null
@@ -1,93 +0,0 @@
--- vim.g.mapleader = "<space>"
-vim.g.maplocalleader = ','
-
--- UI
-
-vim.opt.cursorline = true
-vim.opt.laststatus = 0
-vim.opt.number = true
-vim.opt.relativenumber = true
-vim.opt.ruler = true
-vim.opt.rulerformat = "" -- FIXME: fancify!
-vim.opt.rulerformat = "%36(%5l,%-6(%c%V%) %t%)%*"
-vim.opt.syntax = "on"
-vim.opt.termguicolors = true
-
--- Search
-vim.opt.ignorecase = true
-vim.opt.smartcase = true
-
--- Tab completion
--- vim.opt.wildmode="list:longest,full"
-vim.opt.wildignore="*.swp,*.o,*.so,*.exe,*.dll"
-
--- Whitespaces
-vim.opt.breakindent = true
-vim.opt.copyindent = true
-vim.opt.expandtab = true
-vim.opt.softtabstop = 2
-vim.opt.shiftround = true
-vim.opt.shiftwidth = 2
-vim.opt.smartindent = true
-vim.opt.tabstop = 2
-vim.opt.wrap = false
-vim.opt.list = true
-vim.opt.listchars="tab:»·,trail:·"
-
--- Folds
-vim.opt.foldenable = false
-vim.opt.foldtext = "v:lua.vim.treesitter.foldtext()"
-vim.opt.foldmethod = "expr"
-vim.opt.foldexpr = "nvim_treesitter#foldexpr()"
-
---
-
-vim.o.autochdir = true
-vim.o.fillchars = "stl: ,stlnc: ,eob:░,vert:│"
-vim.o.list = false
-vim.o.scrolloff = 7
-vim.o.splitkeep = "screen"
-vim.o.updatetime = 50
-vim.o.timeout = true
-vim.o.timeoutlen = 10
-vim.o.icm = "split"
--- vim.o.cia = 'kind,abbr,menu' wait for nightly to drop
-
-vim.o.showmode = false
-
-
--- Use rg
-vim.o.grepprg = [[rg --glob "!.jj" --glob "!.git" --no-heading --vimgrep --follow $*]]
-vim.opt.grepformat = vim.opt.grepformat ^ { "%f:%l:%c:%m" }
-
-vim.fn.sign_define(
-	"DiagnosticSignError",
-	{ text = "", hl = "DiagnosticSignError", texthl = "DiagnosticSignError", culhl = "DiagnosticSignErrorLine" }
-)
-vim.fn.sign_define(
-	"DiagnosticSignWarn",
-	{ text = "", hl = "DiagnosticSignWarn", texthl = "DiagnosticSignWarn", culhl = "DiagnosticSignWarnLine" }
-)
-vim.fn.sign_define(
-	"DiagnosticSignInfo",
-	{ text = "", hl = "DiagnosticSignInfo", texthl = "DiagnosticSignInfo", culhl = "DiagnosticSignInfoLine" }
-)
-vim.fn.sign_define(
-	"DiagnosticSignHint",
-	{ text = "", hl = "DiagnosticSignHint", texthl = "DiagnosticSignHint", culhl = "DiagnosticSignHintLine" }
-)
-
--- Make <Tab> work for snippets
-vim.keymap.set({ "i", "s" }, "<Tab>", function()
-	if vim.snippet.active({ direction = 1 }) then
-		return "<cmd>lua vim.snippet.jump(1)<cr>"
-	else
-		return "<Tab>"
-	end
-end, { expr = true })
-
-vim.keymap.set({ "n" }, "<c-/>", "gcc", { remap = true })
-vim.keymap.set({ "v" }, "<c-/>", "gc", { remap = true })
-vim.keymap.set({ "n" }, "<c-_>", "gcc", { remap = true })
-vim.keymap.set({ "v" }, "<c-_>", "gc", { remap = true })
-vim.keymap.set("n", "zz", "zt", { remap = true })
diff --git a/home/common/nvim/mini.lua b/home/common/nvim/mini.lua
index cba6c4c..6d9fb19 100644
--- a/home/common/nvim/mini.lua
+++ b/home/common/nvim/mini.lua
@@ -9,8 +9,8 @@
           require('mini.extra').setup()
           require('mini.icons').setup()
           require('mini.jump').setup()
-          -- require('mini.pairs').setup()
-          -- require('mini.statusline').setup()
+          require('mini.pairs').setup()
+          require('mini.statusline').setup()
           require('mini.surround').setup()
           require('mini.splitjoin').setup()
 
@@ -43,35 +43,20 @@
             }
           })
 
-          require('mini.pick').setup({
-            mappings = {
-              move_down = '<tab>'
-            },
-            options = {
-              use_cache = true
-            }
-          })
+          require('mini.pick').setup()
           MiniPick.registry.files_root = function(local_opts)
-            local root_patterns = { ".jj", ".git" }
-            local root_dir = vim.fs.dirname(vim.fs.find(root_patterns, { upward = true })[1])
-            local opts = { source = { cwd = root_dir, tool = "rg" } }
-            local_opts.cwd = root_dir
-            return MiniPick.builtin.files(local_opts, opts)
-          end
-          MiniPick.registry.grep_live_root = function(local_opts)
-            local root_patterns = { ".jj", ".git" }
+            local root_patterns = { ".jj" }
             local root_dir = vim.fs.dirname(vim.fs.find(root_patterns, { upward = true })[1])
             local opts = { source = { cwd = root_dir } }
-            local_opts.cwd = root_dir
-            return MiniPick.builtin.grep_live(local_opts, opts)
+            local_opts.cwd = root_dir -- nil?
+            return MiniPick.builtin.files(local_opts, opts)
           end
-          vim.keymap.set('n', '<space>/', "<cmd>Pick grep_live_root<cr>", opts("Live Grep"))
-          vim.keymap.set('n', '<space>F', "<cmd>Pick files<cr>", opts("Find Files in CWD"))
-          vim.keymap.set('n', '<space>ff', "<cmd>Pick files_root<cr>", opts("Find Files"))
+          vim.keymap.set('n', '<space>/', "<cmd>Pick grep_live<cr>", opts("Live Grep"))
+          vim.keymap.set('n', '<space>F', "<cmd>Pick files tool='git'<cr>", opts("Find Files in CWD"))
+          vim.keymap.set('n', '<space>ff', "<cmd>Pick files<cr>", opts("Find Files"))
           vim.keymap.set('n', '<space>fr', "<cmd>Pick oldfiles<cr>", opts("Recent Files"))
           vim.keymap.set('n', '<space>b', "<cmd>Pick buffers<cr>", opts("Buffers"))
-          vim.keymap.set('n', '<space>d', "<cmd>Pick diagnostics<cr>", opts("Diagnostics"))
-          vim.keymap.set('n', '<tab>', "<cmd>Pick buffers include_current=false<cr>", opts("Buffers"))
+          vim.keymap.set('n', '<tab>', "<cmd>Pick buffers<cr>", opts("Buffers"))
           vim.keymap.set('n', "<space>'", "<cmd>Pick resume<cr>", opts("Last Picker"))
           vim.keymap.set('n', "<space>g", "<cmd>Pick git_commits<cr>", opts("Git Commits"))
 
diff --git a/home/common/utils.nix b/home/common/utils.nix
index 0a608da..7d5fd93 100644
--- a/home/common/utils.nix
+++ b/home/common/utils.nix
@@ -55,8 +55,6 @@
       arguments = [
         "--glob=!.git/*"
         "--glob=!.jj/*"
-        "--glob=!result/*"
-        "--glob=!target/*"
       ];
     };