diff --git a/modules/hm/dev.nix b/modules/hm/dev.nix
index 5e58c72..5e765ff 100644
--- a/modules/hm/dev.nix
+++ b/modules/hm/dev.nix
@@ -17,17 +17,6 @@ in
       [
         (lib.mkIf cfg.rust.enable {
           home.packages = [ pkgs.rustup ] ++ cfg.rust.extraPackages;
-          # Background code checker (for Rust)
-          programs.bacon = {
-            enable = true;
-            settings = {
-              export = {
-                enabled = true;
-                path = ".bacon-locations";
-                line_format = "{kind} {path}:{line}:{column} {message}";
-              };
-            };
-          };
         })
         {
           home = {
diff --git a/modules/nixvim/dev-plugins.nix b/modules/nixvim/dev-plugins.nix
index f44c09b..fdfaff1 100644
--- a/modules/nixvim/dev-plugins.nix
+++ b/modules/nixvim/dev-plugins.nix
@@ -7,6 +7,7 @@
 }:
 let
   inherit (helpers) enableExceptInTests;
+  inherit (lib.trivial) const;
   cfg = config.jhome.nvim;
   enabledLSPs = [
     "basedpyright"
@@ -23,21 +24,18 @@ let
     "zls"
     "fish_lsp"
   ];
+
+  enableOpt.enable = true;
+  noPackage.package = null;
 in
 {
   config = lib.mkIf cfg.dev.enable (
     lib.mkMerge [
       # Enable LSPs
-      {
-        plugins.lsp.servers = lib.genAttrs enabledLSPs (_: {
-          enable = true;
-        });
-      }
+      { plugins.lsp.servers = lib.genAttrs enabledLSPs (const enableOpt); }
       # Remove bundled LSPs
       (lib.mkIf (!cfg.dev.bundleLSPs) {
-        plugins.lsp.servers = lib.genAttrs enabledLSPs (_: {
-          package = null;
-        });
+        plugins.lsp.servers = lib.genAttrs enabledLSPs (const noPackage);
       })
       # Configure LSPs
       {
@@ -52,11 +50,12 @@ in
                     return vim.fs.root(0, {'flake.nix', '.git', '.jj', 'pyproject.toml', 'setup.py'})
                   end
                 '';
-              bashls.package = lib.mkDefault pkgs.bash-language-server;
-              # Adds ~2 GiB, install in a devShell instead
-              clangd.package = lib.mkDefault null;
-              # zls & other zig tools are big, install in a devShell instead
-              zls.package = lib.mkDefault null;
+              # Big but infrequently used dependencies.
+              #
+              # Configure the LSPs, but don't install the packages.
+              # If you need to use them, add them to your project's devShell
+              clangd = noPackage;
+              zls = noPackage;
             };
           };
           lspkind = {
@@ -82,10 +81,10 @@ in
       (lib.mkIf (!cfg.dev.bundleGrammars) { plugins.treesitter.grammarPackages = [ ]; })
       # Remove tools for building gramars when bundling them
       (lib.mkIf cfg.dev.bundleGrammars {
-        plugins.treesitter = {
-          gccPackage = null;
-          nodejsPackage = null;
-          treesitterPackage = null;
+        dependencies = {
+          gcc.enable = false;
+          nodejs.enable = false;
+          tree-sitter.enable = false;
         };
       })
       # Configure Formatters
@@ -159,17 +158,9 @@ in
       }
       # Rust plugins
       {
-        plugins = {
-          bacon = {
-            enable = true;
-            settings.quickfix.enabled = true;
-          };
-          rustaceanvim = {
-            enable = true;
-            # Install through rustup
-            rustAnalyzerPackage = null;
-          };
-        };
+        plugins.rustaceanvim.enable = true;
+        # install through rustup
+        dependencies.rust-analyzer.enable = false;
       }
       # Other plugins
       {