diff --git a/flake.lock b/flake.lock
index ed44d5781a020ecec47655d172ecebcd88a76ea5..74e22b2ad2cb0649852ae1a9842c8baae6901f8f 100644
--- a/flake.lock
+++ b/flake.lock
@@ -25,32 +25,32 @@
         ]
       },
       "locked": {
-        "lastModified": 1694465129,
-        "narHash": "sha256-8BQiuobMrCfCbGM7w6Snx+OBYdtTIm0+cGVaKwQ5BFg=",
+        "lastModified": 1705273357,
+        "narHash": "sha256-JAlkxgJbWh7+auiT0rJL3IUXXtkULRqygfxQA6mvLgc=",
         "owner": "nix-community",
         "repo": "home-manager",
-        "rev": "9787dffff5d315c9593d3f9fb0f9bf2097e1b57b",
+        "rev": "924d91e1e4c802fd8e60279a022dbae5acb36f2d",
         "type": "github"
       },
       "original": {
         "owner": "nix-community",
-        "ref": "release-23.05",
+        "ref": "release-23.11",
         "repo": "home-manager",
         "type": "github"
       }
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1694499547,
-        "narHash": "sha256-R7xMz1Iia6JthWRHDn36s/E248WB1/je62ovC/dUVKI=",
+        "lastModified": 1705183652,
+        "narHash": "sha256-rnfkyUH0x72oHfiSDhuCHDHg3gFgF+lF8zkkg5Zihsw=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "e5f018cf150e29aac26c61dac0790ea023c46b24",
+        "rev": "428544ae95eec077c7f823b422afae5f174dee4b",
         "type": "github"
       },
       "original": {
         "id": "nixpkgs",
-        "ref": "nixos-23.05",
+        "ref": "nixos-23.11",
         "type": "indirect"
       }
     },
diff --git a/flake.nix b/flake.nix
index d26d088036bab344970fc37d5d6821ecc8f202c9..fdeb33c4b0d4900c5f1589693e7fc53699625413 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,9 +1,9 @@
 {
   inputs = {
-    nixpkgs.url = "nixpkgs/nixos-23.05";
+    nixpkgs.url = "nixpkgs/nixos-23.11";
     flake-utils.url = "github:numtide/flake-utils";
     home-manager = {
-      url = "github:nix-community/home-manager/release-23.05";
+      url = "github:nix-community/home-manager/release-23.11";
       inputs.nixpkgs.follows = "nixpkgs";
     };
   };
@@ -35,7 +35,7 @@
           modules = [
             home-manager.nixosModules.home-manager
             ({pkgs, ...}: {
-              system.stateVersion = "22.11";
+              system.stateVersion = "23.11";
 
               services.getty.autologinUser = "neovim";
 
@@ -61,13 +61,13 @@
                 useGlobalPkgs = true;
                 useUserPackages = true;
 
-                users.neovim = ({...}: {
+                users.neovim = {...}: {
                   imports = [self.nixosModules.home-manager.neovim-config];
 
                   config = {
                     home = {
                       homeDirectory = "/home/neovim";
-                      stateVersion = "22.11";
+                      stateVersion = "23.11";
                     };
 
                     programs.bash = {
@@ -77,7 +77,7 @@
                       '';
                     };
                   };
-                });
+                };
               };
             })
           ];
@@ -97,5 +97,3 @@
       nixosModules.home-manager.neovim-config = import ./home-manager;
     };
 }
-
-
diff --git a/home-manager/default.nix b/home-manager/default.nix
index 96d42dcc70b3f326a5be3332568d12017cf97bed..9f84017e23fc1cb2d20080dec950fd3b7864efa0 100644
--- a/home-manager/default.nix
+++ b/home-manager/default.nix
@@ -4,7 +4,25 @@
   ...
 }: {
   imports = [
-    ./lazy-nvim.nix
+    ./plugins/barbar
+    ./plugins/cmp
+    ./plugins/dap
+    ./plugins/dap-ui
+    ./plugins/gitsigns
+    ./plugins/indent-blankline
+    ./plugins/lsp-status
+    ./plugins/lspconfig
+    ./plugins/lualine
+    ./plugins/null-ls
+    ./plugins/nvim-tree
+    ./plugins/nvim-treesitter
+    ./plugins/one-small-step-for-vimkind
+    ./plugins/prettier
+    ./plugins/scrollbar
+    ./plugins/telescope
+    ./plugins/toggleterm
+    ./plugins/tokyonight
+    ./plugins/trouble
   ];
 
   config = {
@@ -12,16 +30,25 @@
       enable = true;
 
       defaultEditor = true;
-    };
 
-    home.file.".config/nvim/init.lua" = {
-      source = ../src/init.lua;
-      target = ".config/nvim/init.lua";
-    };
-    home.file.".config/nvim/lazy-lock.initial.json" = {
-      source = ../src/lazy-lock.initial.json;
-      target = ".config/nvim/lazy-lock.initial.json";
+      extraLuaConfig = ''
+        vim.g.mapleader = ","
+
+        -- Options
+        require('options')
+
+        -- Mappings
+        require('mappings')
+
+        -- Misc
+        vim.api.nvim_command("syntax on")
+        vim.api.nvim_command("filetype plugin indent on")
+
+        -- Hooks
+        local lazyhooks = require('lib.lazyhooks');
+      '';
     };
+
     home.file.".config/nvim/after" = {
       source = ../src/after;
       target = ".config/nvim/after";
diff --git a/home-manager/lazy-nvim.nix b/home-manager/lazy-nvim.nix
deleted file mode 100644
index b7aa33a871043e79d1260fea86d8804401db6e76..0000000000000000000000000000000000000000
--- a/home-manager/lazy-nvim.nix
+++ /dev/null
@@ -1,14 +0,0 @@
-{pkgs, ...}: {
-  config = {
-    home.file.".local/share/nvim/lazy/lazy.nvim" = {
-      source = pkgs.fetchFromGitHub {
-        owner = "folke";
-        repo = "lazy.nvim";
-        rev = "690f9e88e2a7dc92bcb0cca85f778a3e99fe1f7e";
-        sha256 = "Sg5dVBtU+o80qzNdhmPCN7viVfEcH5jCYCCTEKzdfAg=";
-      };
-      target = ".local/share/nvim/lazy/lazy.nvim";
-    };
-  };
-}
-
diff --git a/home-manager/plugins/barbar/config.lua b/home-manager/plugins/barbar/config.lua
new file mode 100644
index 0000000000000000000000000000000000000000..bb9b9e1eed0bb5ec4b96de85c9f87161f5bb5dcb
--- /dev/null
+++ b/home-manager/plugins/barbar/config.lua
@@ -0,0 +1,3 @@
+require('barbar').setup {
+  icons = { filetype = { enabled = true } },
+}
diff --git a/home-manager/plugins/barbar/default.nix b/home-manager/plugins/barbar/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..5f14cf6b2ce440133f0ac33a26ae71acb827a649
--- /dev/null
+++ b/home-manager/plugins/barbar/default.nix
@@ -0,0 +1,12 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.barbar-nvim;
+      }
+      pkgs.vimPlugins.nvim-web-devicons
+    ];
+  };
+}
diff --git a/src/lua/config/cmp.lua b/home-manager/plugins/cmp/config.lua
similarity index 97%
rename from src/lua/config/cmp.lua
rename to home-manager/plugins/cmp/config.lua
index 50f89f5ffc76e1aa856994863aaeef2d8313a154..c5edf04719bed28bab7f7ec87a620e7c2635080f 100644
--- a/src/lua/config/cmp.lua
+++ b/home-manager/plugins/cmp/config.lua
@@ -1,4 +1,4 @@
-return function()
+local setup_cmp = function() 
   local cmp = require 'cmp'
   local luasnip = require 'luasnip'
 
@@ -62,3 +62,5 @@ return function()
     })
   })
 end
+
+setup_cmp()
diff --git a/home-manager/plugins/cmp/default.nix b/home-manager/plugins/cmp/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..a66d96ccaba782523bfc43f4f563a7423160895c
--- /dev/null
+++ b/home-manager/plugins/cmp/default.nix
@@ -0,0 +1,22 @@
+{pkgs, ...}: let
+  subplugins = with pkgs.vimPlugins; [
+    cmp-nvim-lsp
+    cmp-buffer
+    cmp-path
+    cmp-cmdline
+    cmp_luasnip
+    luasnip
+  ];
+in {
+  config = {
+    programs.neovim.plugins =
+      [
+        {
+          type = "lua";
+          config = builtins.readFile ./config.lua;
+          plugin = pkgs.vimPlugins.nvim-cmp;
+        }
+      ]
+      ++ subplugins;
+  };
+}
diff --git a/home-manager/plugins/dap-ui/config.lua b/home-manager/plugins/dap-ui/config.lua
new file mode 100644
index 0000000000000000000000000000000000000000..22a4f9333f6893827883278a6f481a928f73fe39
--- /dev/null
+++ b/home-manager/plugins/dap-ui/config.lua
@@ -0,0 +1 @@
+require('dapui').setup()
diff --git a/home-manager/plugins/dap-ui/default.nix b/home-manager/plugins/dap-ui/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..764d94202e82dcca8c598c7137c734cd8443a034
--- /dev/null
+++ b/home-manager/plugins/dap-ui/default.nix
@@ -0,0 +1,11 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.nvim-dap-ui;
+      }
+    ];
+  };
+}
diff --git a/src/lua/config/dap.lua b/home-manager/plugins/dap/config.lua
similarity index 97%
rename from src/lua/config/dap.lua
rename to home-manager/plugins/dap/config.lua
index 0db6bcdc17e1909272c031c8bde68be012c1bcac..90de8d18cee1173e624e37598640cbecf5413206 100644
--- a/src/lua/config/dap.lua
+++ b/home-manager/plugins/dap/config.lua
@@ -1,4 +1,4 @@
-return function()
+local setup_dap = function()
   local dap = require "dap"
   local map = require('lib.utils').map
 
@@ -50,3 +50,5 @@ return function()
   map('n', '<leader>dr', dap.repl.open, { noremap = true })
   map('n', '<leader>dl', dap.run_last, { noremap = true })
 end
+
+setup_dap()
diff --git a/home-manager/plugins/dap/default.nix b/home-manager/plugins/dap/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..26f000ec8bb070cecfcafdabd81c82920716fca6
--- /dev/null
+++ b/home-manager/plugins/dap/default.nix
@@ -0,0 +1,11 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.nvim-dap;
+      }
+    ];
+  };
+}
diff --git a/home-manager/plugins/gitsigns/config.lua b/home-manager/plugins/gitsigns/config.lua
new file mode 100644
index 0000000000000000000000000000000000000000..91fa65b0936a03878fc66b6504447a2a82a82249
--- /dev/null
+++ b/home-manager/plugins/gitsigns/config.lua
@@ -0,0 +1 @@
+require('gitsigns').setup()
diff --git a/home-manager/plugins/gitsigns/default.nix b/home-manager/plugins/gitsigns/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..61890ce6ca5adbf700705ab382f5c9ec83f8959f
--- /dev/null
+++ b/home-manager/plugins/gitsigns/default.nix
@@ -0,0 +1,11 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.gitsigns-nvim;
+      }
+    ];
+  };
+}
diff --git a/home-manager/plugins/indent-blankline/config.lua b/home-manager/plugins/indent-blankline/config.lua
new file mode 100644
index 0000000000000000000000000000000000000000..9448290ae6b42cdd7b911a8b5a9c2bbe42863a8d
--- /dev/null
+++ b/home-manager/plugins/indent-blankline/config.lua
@@ -0,0 +1,8 @@
+require("ibl").setup {
+  exclude = {
+    buftypes = { "terminal" },
+  },
+  indent = {
+    char = '|',
+  },
+}
diff --git a/home-manager/plugins/indent-blankline/default.nix b/home-manager/plugins/indent-blankline/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..8591f95aa47052b051c8ad7b851d9a7803444cb9
--- /dev/null
+++ b/home-manager/plugins/indent-blankline/default.nix
@@ -0,0 +1,11 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.indent-blankline-nvim;
+      }
+    ];
+  };
+}
diff --git a/src/lua/config/lspstatus.lua b/home-manager/plugins/lsp-status/config.lua
similarity index 88%
rename from src/lua/config/lspstatus.lua
rename to home-manager/plugins/lsp-status/config.lua
index 3e493859ee788780372d57e75f550b121286836b..79ae39a7d738a47e99dfb718d0ed2436a44d6c68 100644
--- a/src/lua/config/lspstatus.lua
+++ b/home-manager/plugins/lsp-status/config.lua
@@ -1,4 +1,4 @@
-return function()
+local setup_lspstatus = function()
   local lsp_status = require('lsp-status')
 
   local kind_labels_mt = {
@@ -20,3 +20,5 @@ return function()
     status_symbol = "",
   })
 end
+
+setup_lspstatus()
diff --git a/home-manager/plugins/lsp-status/default.nix b/home-manager/plugins/lsp-status/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..6eaa143f7507509cb01dac2f01851004fc6cdbcf
--- /dev/null
+++ b/home-manager/plugins/lsp-status/default.nix
@@ -0,0 +1,11 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.lsp-status-nvim;
+      }
+    ];
+  };
+}
diff --git a/src/lua/config/lspconfig.lua b/home-manager/plugins/lspconfig/config.lua
similarity index 98%
rename from src/lua/config/lspconfig.lua
rename to home-manager/plugins/lspconfig/config.lua
index 0ff38d4300ea887d603dcff293542406c9d71723..3d2d603281c0b14495224d458b5cab577f14236d 100644
--- a/src/lua/config/lspconfig.lua
+++ b/home-manager/plugins/lspconfig/config.lua
@@ -1,4 +1,4 @@
-return function()
+local setup_lspconfig = function()
   local lspconfig = require('lspconfig')
   local lsp_status = require('lsp-status')
 
@@ -99,3 +99,5 @@ return function()
     }
   end
 end
+
+setup_lspconfig()
diff --git a/home-manager/plugins/lspconfig/default.nix b/home-manager/plugins/lspconfig/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..b64e884fac2e6a4e73bbd96d453a3f9c418ab3f9
--- /dev/null
+++ b/home-manager/plugins/lspconfig/default.nix
@@ -0,0 +1,11 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.nvim-lspconfig;
+      }
+    ];
+  };
+}
diff --git a/home-manager/plugins/lualine/config.lua b/home-manager/plugins/lualine/config.lua
new file mode 100644
index 0000000000000000000000000000000000000000..28231752c58ae7a87951ef254e104594e840c033
--- /dev/null
+++ b/home-manager/plugins/lualine/config.lua
@@ -0,0 +1,13 @@
+require('lualine').setup {
+  extensions = {'nvim-tree'},
+  options = {
+    globalstatus = false,
+    theme = 'tokyonight',
+  },
+  sections = {
+    lualine_c = {
+      'file',
+      "require'lsp-status'.status()",
+    }
+  }
+}
diff --git a/home-manager/plugins/lualine/default.nix b/home-manager/plugins/lualine/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..e1e328a6053f59b0e13235581e770411c57956fc
--- /dev/null
+++ b/home-manager/plugins/lualine/default.nix
@@ -0,0 +1,12 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.lualine-nvim;
+      }
+      pkgs.vimPlugins.nvim-web-devicons
+    ];
+  };
+}
diff --git a/home-manager/plugins/null-ls/config.lua b/home-manager/plugins/null-ls/config.lua
new file mode 100644
index 0000000000000000000000000000000000000000..d87e5cd45c7dce4f7f531868a19b765cf0d51dc2
--- /dev/null
+++ b/home-manager/plugins/null-ls/config.lua
@@ -0,0 +1 @@
+require('null-ls').setup({});
diff --git a/home-manager/plugins/null-ls/default.nix b/home-manager/plugins/null-ls/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..e18b8fca2ab4a72decc0061179cf818909aaa9f9
--- /dev/null
+++ b/home-manager/plugins/null-ls/default.nix
@@ -0,0 +1,12 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.null-ls-nvim;
+      }
+      pkgs.vimPlugins.plenary-nvim
+    ];
+  };
+}
diff --git a/src/lua/config/tree.lua b/home-manager/plugins/nvim-tree/config.lua
similarity index 95%
rename from src/lua/config/tree.lua
rename to home-manager/plugins/nvim-tree/config.lua
index 62966015102d57316672a59aea6212dec97ce814..764dd34bd2d67d69a8673cb4e08ffc9a55c1bac2 100644
--- a/src/lua/config/tree.lua
+++ b/home-manager/plugins/nvim-tree/config.lua
@@ -1,4 +1,4 @@
-return function()
+local setup_tree = function()
   require('nvim-tree').setup {
     update_focused_file = {
       enable = true,
@@ -48,7 +48,7 @@ return function()
 
   -- Barbar Integration
   local nvim_tree_events = require('nvim-tree.events')
-  local bufferline_api = require('bufferline.api')
+  local bufferline_api = require('barbar.api')
 
   local function get_tree_size()
     return require 'nvim-tree.view'.View.width
@@ -85,3 +85,5 @@ return function()
     end
   })
 end
+
+setup_tree()
diff --git a/home-manager/plugins/nvim-tree/default.nix b/home-manager/plugins/nvim-tree/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..1bb7df2161007076b0bf5c7f7279462010141d14
--- /dev/null
+++ b/home-manager/plugins/nvim-tree/default.nix
@@ -0,0 +1,12 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.nvim-tree-lua;
+      }
+      pkgs.vimPlugins.nvim-web-devicons
+    ];
+  };
+}
diff --git a/home-manager/plugins/nvim-treesitter/config.lua b/home-manager/plugins/nvim-treesitter/config.lua
new file mode 100644
index 0000000000000000000000000000000000000000..ec4ddd5b7361e3ca60895619182a7c55071e8f14
--- /dev/null
+++ b/home-manager/plugins/nvim-treesitter/config.lua
@@ -0,0 +1,5 @@
+require('nvim-treesitter.configs').setup {
+  highlight = {
+    enable = true
+  }
+}
diff --git a/home-manager/plugins/nvim-treesitter/default.nix b/home-manager/plugins/nvim-treesitter/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..87456e66b6f8a2cdc5fd79ae00326ce0cf782717
--- /dev/null
+++ b/home-manager/plugins/nvim-treesitter/default.nix
@@ -0,0 +1,25 @@
+{pkgs, ...}: let
+  parsers = with pkgs.vimPlugins.nvim-treesitter-parsers; [
+    python
+    cpp
+    nix
+    haskell
+    rust
+    typescript
+    markdown
+  ];
+in {
+  config = {
+    programs.neovim = {
+      plugins =
+        [
+          {
+            type = "lua";
+            config = builtins.readFile ./config.lua;
+            plugin = pkgs.vimPlugins.nvim-treesitter;
+          }
+        ]
+        ++ parsers;
+    };
+  };
+}
diff --git a/home-manager/plugins/one-small-step-for-vimkind/default.nix b/home-manager/plugins/one-small-step-for-vimkind/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..9cc787df8e754ac6d35f51be4c2386d416c82d64
--- /dev/null
+++ b/home-manager/plugins/one-small-step-for-vimkind/default.nix
@@ -0,0 +1,21 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = ''
+        '';
+        plugin = pkgs.vimUtils.buildVimPlugin {
+          pname = "one-small-step-for-vimkind";
+          version = "03-12-2023";
+          src = pkgs.fetchFromGitHub {
+            owner = "jbyuki";
+            repo = "one-small-step-for-vimkind";
+            rev = "aaee281bdaa3141d9d0cdb3dec468532da61124f";
+            sha256 = "sha256-VACSEN50FSzQmAjpFW45yXvc68wnRhzfboYvps3sOBE=";
+          };
+        };
+      }
+    ];
+  };
+}
diff --git a/home-manager/plugins/prettier/config.lua b/home-manager/plugins/prettier/config.lua
new file mode 100644
index 0000000000000000000000000000000000000000..c703627c5f3ef700930e57199577b9f8256e588e
--- /dev/null
+++ b/home-manager/plugins/prettier/config.lua
@@ -0,0 +1,29 @@
+local prettier_filetypes = {
+  "css",
+  "graphql",
+  "html",
+  "javascript",
+  "javascriptreact",
+  "json",
+  "less",
+  "markdown",
+  "scss",
+  "typescript",
+  "typescriptreact",
+  "yaml",
+};
+
+local function setup_prettier()
+  local prettier = require("prettier")
+
+  prettier.setup({
+    bin = 'prettierd',
+    filetypes = prettier_filetypes,
+  })
+end
+
+lazyhooks.load_on_filetypes(
+  'prettier',
+  prettier_filetypes,
+  setup_prettier
+)
diff --git a/home-manager/plugins/prettier/default.nix b/home-manager/plugins/prettier/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..15d2085f5655a8b60d536f0d75bd807a4fcfb4a6
--- /dev/null
+++ b/home-manager/plugins/prettier/default.nix
@@ -0,0 +1,22 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        optional = true;
+        plugin = pkgs.vimUtils.buildVimPlugin {
+          pname = "prettier.nvim";
+          version = "16-06-2023";
+          src = pkgs.fetchFromGitHub {
+            owner = "MunifTanjim";
+            repo = "prettier.nvim";
+            rev = "d98e732cb73690b07c00c839c924be1d1d9ac5c2";
+            sha256 = "sha256-4xq+caprcQQotvBXnWWSsMwVB2hc5uyjrhT1dPBffXI=";
+          };
+        };
+      }
+      pkgs.vimPlugins.nvim-lspconfig
+    ];
+  };
+}
diff --git a/src/lua/config/scrollbar.lua b/home-manager/plugins/scrollbar/config.lua
similarity index 88%
rename from src/lua/config/scrollbar.lua
rename to home-manager/plugins/scrollbar/config.lua
index 65dbb18dc12466eae8bb84a51f49df2c4d6bd67a..5442dbff4ffb20bfe93715e8de11008dab9c7d63 100644
--- a/src/lua/config/scrollbar.lua
+++ b/home-manager/plugins/scrollbar/config.lua
@@ -1,4 +1,4 @@
-return function()
+local setup_scrollbar = function()
   local colors = require("tokyonight.colors").setup()
 
   require("scrollbar").setup({
@@ -15,3 +15,5 @@ return function()
     }
   })
 end
+
+setup_scrollbar()
diff --git a/home-manager/plugins/scrollbar/default.nix b/home-manager/plugins/scrollbar/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..41c05200ee4694356a522f4b6b674f39d2979c16
--- /dev/null
+++ b/home-manager/plugins/scrollbar/default.nix
@@ -0,0 +1,11 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.nvim-scrollbar;
+      }
+    ];
+  };
+}
diff --git a/src/lua/config/telescope.lua b/home-manager/plugins/telescope/config.lua
similarity index 87%
rename from src/lua/config/telescope.lua
rename to home-manager/plugins/telescope/config.lua
index 5717833acc31ee76566aa6799c10e2e565ca7678..da4362724e257752759660d47bcfea51f23ec98c 100644
--- a/src/lua/config/telescope.lua
+++ b/home-manager/plugins/telescope/config.lua
@@ -1,4 +1,4 @@
-return function()
+local setup_telescope = function()
   local builtin = require('telescope.builtin')
   local map = require('lib.utils').map
 
@@ -9,3 +9,5 @@ return function()
   map('n', '<leader>fh', builtin.help_tags, {})
   map('n', '<leader>fc', builtin.commands, {})
 end
+
+setup_telescope()
diff --git a/home-manager/plugins/telescope/default.nix b/home-manager/plugins/telescope/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..06319c97f219691f8a269b45cdefe9fbda959976
--- /dev/null
+++ b/home-manager/plugins/telescope/default.nix
@@ -0,0 +1,12 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.telescope-nvim;
+      }
+      pkgs.vimPlugins.plenary-nvim
+    ];
+  };
+}
diff --git a/home-manager/plugins/toggleterm/config.lua b/home-manager/plugins/toggleterm/config.lua
new file mode 100644
index 0000000000000000000000000000000000000000..a7172858798f869286c2cdc6d70a67d3468ef205
--- /dev/null
+++ b/home-manager/plugins/toggleterm/config.lua
@@ -0,0 +1,6 @@
+require("toggleterm").setup({
+  open_mapping = [[<c-\>]],
+  winbar = {
+    enable = true,
+  }
+})
diff --git a/home-manager/plugins/toggleterm/default.nix b/home-manager/plugins/toggleterm/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f441afb6ecbb378262bafd0a4084a3ddd704134c
--- /dev/null
+++ b/home-manager/plugins/toggleterm/default.nix
@@ -0,0 +1,11 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.toggleterm-nvim;
+      }
+    ];
+  };
+}
diff --git a/home-manager/plugins/tokyonight/default.nix b/home-manager/plugins/tokyonight/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..8aa8c928f6d4d57f0671224fa2ac80d24560c990
--- /dev/null
+++ b/home-manager/plugins/tokyonight/default.nix
@@ -0,0 +1,27 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = ''
+          local tokyonight = require('tokyonight')
+
+          vim.api.nvim_command("colorscheme tokyonight-moon")
+
+          tokyonight.setup({
+            style = "moon",
+            --transparent = true,
+            styles = {
+              sidebars = "dark",
+              floats = "dark",
+            },
+            --dim_inactive = true,
+            lualine_bold = true,
+            use_background = false,
+          })
+        '';
+        plugin = pkgs.vimPlugins.tokyonight-nvim;
+      }
+    ];
+  };
+}
diff --git a/src/lua/config/trouble.lua b/home-manager/plugins/trouble/config.lua
similarity index 93%
rename from src/lua/config/trouble.lua
rename to home-manager/plugins/trouble/config.lua
index 3be763a69e09c8e3175fd27e171bf1df5b750f69..4aa3eb7538e40b7be52be883392c4ca6a2dcb097 100644
--- a/src/lua/config/trouble.lua
+++ b/home-manager/plugins/trouble/config.lua
@@ -1,4 +1,4 @@
-return function()
+local setup_trouble = function()
   local map = require('lib.utils').map
   local trouble = require('trouble')
 
@@ -31,3 +31,5 @@ return function()
     map_opts
   )
 end
+
+setup_trouble();
diff --git a/home-manager/plugins/trouble/default.nix b/home-manager/plugins/trouble/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..8bfe0217cfffa8f708ec130d429437e2b5b76d43
--- /dev/null
+++ b/home-manager/plugins/trouble/default.nix
@@ -0,0 +1,12 @@
+{pkgs, ...}: {
+  config = {
+    programs.neovim.plugins = [
+      {
+        type = "lua";
+        config = builtins.readFile ./config.lua;
+        plugin = pkgs.vimPlugins.trouble-nvim;
+      }
+      pkgs.vimPlugins.nvim-web-devicons
+    ];
+  };
+}
diff --git a/src/init.lua b/src/init.lua
deleted file mode 100644
index 0f4ca051592e55a97794b635c2c198c8e22a0e22..0000000000000000000000000000000000000000
--- a/src/init.lua
+++ /dev/null
@@ -1,16 +0,0 @@
-vim.g.mapleader = ","
-
--- Options
-require('options')
-
--- Mappings
-require('mappings')
-
--- Plugins
-require('plugins')
-
--- Misc
-vim.api.nvim_command("syntax on")
-vim.api.nvim_command("filetype plugin indent on")
-
-
diff --git a/src/lazy-lock.initial.json b/src/lazy-lock.initial.json
deleted file mode 100644
index 99673938add73a21530a2db15f59dec8054e382d..0000000000000000000000000000000000000000
--- a/src/lazy-lock.initial.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "LuaSnip": { "branch": "master", "commit": "a835e3d680c5940b61780c6af07885db95382478" },
-  "barbar.nvim": { "branch": "master", "commit": "1c9d324c493650667ff621c835d552e56fd229ca" },
-  "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" },
-  "cmp-cmdline": { "branch": "main", "commit": "8fcc934a52af96120fe26358985c10c035984b53" },
-  "cmp-nvim-lsp": { "branch": "main", "commit": "0e6b2ed705ddcff9738ec4ea838141654f12eeef" },
-  "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" },
-  "cmp_luasnip": { "branch": "master", "commit": "18095520391186d634a0045dacaa346291096566" },
-  "gitsigns.nvim": { "branch": "main", "commit": "b1f9cf7c5c5639c006c937fc1819e09f358210fc" },
-  "indent-blankline.nvim": { "branch": "master", "commit": "018bd04d80c9a73d399c1061fa0c3b14a7614399" },
-  "lsp-status.nvim": { "branch": "master", "commit": "54f48eb5017632d81d0fd40112065f1d062d0629" },
-  "lualine.nvim": { "branch": "master", "commit": "e99d733e0213ceb8f548ae6551b04ae32e590c80" },
-  "null-ls.nvim": { "branch": "main", "commit": "13dd1fc13063681ca7e039436c88f6eca7e3e937" },
-  "nvim-cmp": { "branch": "main", "commit": "777450fd0ae289463a14481673e26246b5e38bf2" },
-  "nvim-dap": { "branch": "master", "commit": "7e81998e31277c7a33b6c34423640900c5c2c776" },
-  "nvim-dap-ui": { "branch": "master", "commit": "bdb94e3853d11b5ce98ec182e5a3719d5c0ef6fd" },
-  "nvim-lspconfig": { "branch": "master", "commit": "0f94c5fded29c0024254259f3d8a0284bfb507ea" },
-  "nvim-scrollbar": { "branch": "main", "commit": "f85b29805cf917f9b1d5ff0c9a52c5b1bdca5943" },
-  "nvim-tree.lua": { "branch": "master", "commit": "a50723e35f57f89fb67019127a16d90f16edfef8" },
-  "nvim-treesitter": { "branch": "master", "commit": "379305aa7f55e810950cde24a82789681478df04" },
-  "nvim-web-devicons": { "branch": "master", "commit": "074e13f21f52bb45d654069bdadbcb6d7c2b65d0" },
-  "one-small-step-for-vimkind": { "branch": "main", "commit": "aef1bdbb8347e6daaf33d5109002f3df243ebfe9" },
-  "plenary.nvim": { "branch": "master", "commit": "253d34830709d690f013daf2853a9d21ad7accab" },
-  "prettier.nvim": { "branch": "main", "commit": "08f7f08fae57fd970c7470d883c9127f172bd9e6" },
-  "telescope.nvim": { "branch": "master", "commit": "b79cd6c88b3d96b0f49cb7d240807cd59b610cd8" },
-  "toggleterm.nvim": { "branch": "main", "commit": "9a595ba699837c4333c4296634feed320f084df2" },
-  "tokyonight.nvim": { "branch": "main", "commit": "edffa82026914be54c8220973b0385f61d3392f0" },
-  "trouble.nvim": { "branch": "main", "commit": "7915277a259fdff5d46c6f1d2e100df2ec384d3b" }
-}
-
diff --git a/src/lua/config/barbar.lua b/src/lua/config/barbar.lua
deleted file mode 100644
index e6555ec4a8409fb00de4cc1135a2e2623ea695dc..0000000000000000000000000000000000000000
--- a/src/lua/config/barbar.lua
+++ /dev/null
@@ -1,7 +0,0 @@
-return function()
-  local bufferline = require('bufferline')
-
-  bufferline.setup {
-    icons = { filetype = { enabled = true } },
-  }
-end
diff --git a/src/lua/config/dapui.lua b/src/lua/config/dapui.lua
deleted file mode 100644
index 73a8f7d140fca5e2b9d85a68ba0c2f7c0acc4a5f..0000000000000000000000000000000000000000
--- a/src/lua/config/dapui.lua
+++ /dev/null
@@ -1,3 +0,0 @@
-return function()
-  require('dapui').setup()
-end
diff --git a/src/lua/config/gitsigns.lua b/src/lua/config/gitsigns.lua
deleted file mode 100644
index 4120f20223061b78bd08e6fd7eefd1fa3fbbb237..0000000000000000000000000000000000000000
--- a/src/lua/config/gitsigns.lua
+++ /dev/null
@@ -1,3 +0,0 @@
-return function()
-  require('gitsigns').setup()
-end
diff --git a/src/lua/config/indent-blankline.lua b/src/lua/config/indent-blankline.lua
deleted file mode 100644
index 063433b187669127cc9d492a86d39becc2467df1..0000000000000000000000000000000000000000
--- a/src/lua/config/indent-blankline.lua
+++ /dev/null
@@ -1,10 +0,0 @@
-return function()
-  require("ibl").setup {
-    exclude = {
-      buftypes = { "terminal" },
-    },
-    indent = {
-      char = '|',
-    },
-  }
-end
diff --git a/src/lua/config/lspfuzzy.lua b/src/lua/config/lspfuzzy.lua
deleted file mode 100644
index e75d10b6bd25745c0050036baff8bc57f3414886..0000000000000000000000000000000000000000
--- a/src/lua/config/lspfuzzy.lua
+++ /dev/null
@@ -1,3 +0,0 @@
-return function()
-  require('lspfuzzy').setup {}
-end
diff --git a/src/lua/config/lualine.lua b/src/lua/config/lualine.lua
deleted file mode 100644
index 4af74ab91aa8b71b9a226e43a0387e109b126501..0000000000000000000000000000000000000000
--- a/src/lua/config/lualine.lua
+++ /dev/null
@@ -1,17 +0,0 @@
-return function()
-  local lualine = require('lualine');
-
-  lualine.setup {
-    extensions = {'nvim-tree'},
-    options = {
-      globalstatus = false,
-      theme = 'tokyonight',
-    },
-    sections = {
-      lualine_c = {
-        'file',
-        "require'lsp-status'.status()",
-      }
-    }
-  }
-end
diff --git a/src/lua/config/null-ls.lua b/src/lua/config/null-ls.lua
deleted file mode 100644
index 77190192292d23124ae8061d8c6d661e64497429..0000000000000000000000000000000000000000
--- a/src/lua/config/null-ls.lua
+++ /dev/null
@@ -1,5 +0,0 @@
-return function()
-  local null_ls = require('null-ls');
-
-  null_ls.setup({});
-end
diff --git a/src/lua/config/prettier.lua b/src/lua/config/prettier.lua
deleted file mode 100644
index 41e8a4c299aec83f42d2eb794abec38d87484762..0000000000000000000000000000000000000000
--- a/src/lua/config/prettier.lua
+++ /dev/null
@@ -1,21 +0,0 @@
-return function()
-  local prettier = require("prettier")
-
-  prettier.setup({
-    bin = 'prettier', -- or `'prettierd'` (v0.22+)
-    filetypes = {
-      "css",
-      "graphql",
-      "html",
-      "javascript",
-      "javascriptreact",
-      "json",
-      "less",
-      "markdown",
-      "scss",
-      "typescript",
-      "typescriptreact",
-      "yaml",
-    },
-  })
-end
diff --git a/src/lua/config/toggleterm.lua b/src/lua/config/toggleterm.lua
deleted file mode 100644
index b010005dcd2c61a00221c76e7d77d275b10219c3..0000000000000000000000000000000000000000
--- a/src/lua/config/toggleterm.lua
+++ /dev/null
@@ -1,8 +0,0 @@
-return function()
-  require("toggleterm").setup({
-    open_mapping = [[<c-\>]],
-    winbar = {
-      enable = true,
-    }
-  })
-end
diff --git a/src/lua/config/tokyonight.lua b/src/lua/config/tokyonight.lua
deleted file mode 100644
index f1f37e9cb3ab051a61b1f459a48c68273445f4e8..0000000000000000000000000000000000000000
--- a/src/lua/config/tokyonight.lua
+++ /dev/null
@@ -1,17 +0,0 @@
-return function()
-  local tokyonight = require('tokyonight')
-
-  vim.api.nvim_command("colorscheme tokyonight-moon")
-
-  tokyonight.setup({
-    style = "moon",
-    --transparent = true,
-    styles = {
-      sidebars = "dark",
-      floats = "dark",
-    },
-    --dim_inactive = true,
-    lualine_bold = true,
-    use_background = false,
-  })
-end
diff --git a/src/lua/config/treesitter.lua b/src/lua/config/treesitter.lua
deleted file mode 100644
index 7f9711f51d71829b2957a21349722bf12e4d95dc..0000000000000000000000000000000000000000
--- a/src/lua/config/treesitter.lua
+++ /dev/null
@@ -1,18 +0,0 @@
-return function()
-  local ts = require 'nvim-treesitter.configs'
-
-  ts.setup {
-    ensure_installed = {
-      'python',
-      'cpp',
-      'nix',
-      'haskell',
-      'rust',
-      'typescript',
-      'markdown'
-    },
-    highlight = {
-      enable = true
-    }
-  }
-end
diff --git a/src/lua/lib/lazyhooks.lua b/src/lua/lib/lazyhooks.lua
new file mode 100644
index 0000000000000000000000000000000000000000..bdab7dc048d94d9d8a945f35788eba3d67a0cc5d
--- /dev/null
+++ b/src/lua/lib/lazyhooks.lua
@@ -0,0 +1,12 @@
+local function load_on_filetypes(module, filetypes, setup)
+  vim.api.nvim_create_autocmd("FileType", {
+      pattern = table.concat(filetypes, ","),
+      callback = function()
+          vim.cmd("packadd " .. module)
+      end
+  })
+end
+
+return {
+  load_on_filetypes = load_on_filetypes
+}
diff --git a/src/lua/plugins.lua b/src/lua/plugins.lua
deleted file mode 100644
index 1f3d25c9e8706b2dd5c21e48b9e66eaa907b93c8..0000000000000000000000000000000000000000
--- a/src/lua/plugins.lua
+++ /dev/null
@@ -1,144 +0,0 @@
--- If a lazy-lock.json file does not exist, but we have a
--- lazy-lock.initial.json file available, create a writeable copy.
---
--- This allow us to ship a lockfile with this repo, managed by home-manager,
--- ensuring the environment is reproducible while also giving the end-user the
--- option to update plugins manually.
---
--- If something breaks during na update, the user can always rever tback to
--- the state in this repo by copying the initial lockfile again.
-local lockpath = vim.fn.stdpath("config") .. "/lazy-lock.json"
-local initial_lockpath = vim.fn.stdpath("config") .. "/lazy-lock.initial.json"
-if (not vim.loop.fs_stat(lockpath)) and vim.loop.fs_stat(initial_lockpath) then
-  vim.loop.fs_copyfile(initial_lockpath, lockpath)
-  vim.loop.fs_chmod(lockpath, tonumber("664", 8))
-end
-
--- Install Lazy.nvim if it's not already available.
---
--- This should allow for this config to be usable even outside of a
--- home-manager/Nix environment.
-local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
-if not vim.loop.fs_stat(lazypath) then
-  vim.fn.system({
-    "git",
-    "clone",
-    "--filter=blob:none",
-    "https://github.com/folke/lazy.nvim.git",
-    "--branch=stable", -- latest stable release
-    lazypath,
-  })
-end
-vim.opt.rtp:prepend(lazypath)
-
-require('lazy').setup({
-  -- Prevent lazy.nvim from updating itself. The plugin will be managed
-  -- externally to lock down the version used.
-  { "folke/lazy.nvim", enabled = false },
-  {
-    'folke/tokyonight.nvim',
-    lazy = false;
-    priority = 1000;
-    config = require('config.tokyonight'),
-  },
-  {
-    'nvim-treesitter/nvim-treesitter',
-    config = require('config.treesitter'),
-    build = function()
-      local ts_update = require('nvim-treesitter.install')
-        .update({ with_sync = true })
-
-      ts_update()
-    end,
-  },
-  {
-    'nvim-lualine/lualine.nvim',
-    dependencies = { 'nvim-tree/nvim-web-devicons', 'nvim-tree/nvim-tree.lua' },
-    config = require('config.lualine'),
-  },
-  {
-    'nvim-tree/nvim-tree.lua',
-    dependencies = { 'nvim-tree/nvim-web-devicons' },
-    config = require('config.tree')
-  },
-  {
-    'lewis6991/gitsigns.nvim',
-    dependencies = {
-      'nvim-lua/plenary.nvim'
-    },
-    config = require('config.gitsigns')
-  },
-  {
-    'romgrk/barbar.nvim',
-    dependencies = { 'nvim-tree/nvim-web-devicons' },
-    config = require('config.barbar')
-  },
-  {
-    "lukas-reineke/indent-blankline.nvim",
-    main = "ibl",
-    config = require('config.indent-blankline')
-  },
-  {
-    'hrsh7th/nvim-cmp',
-    dependencies = {
-      'hrsh7th/cmp-nvim-lsp',
-      'hrsh7th/cmp-buffer',
-      'hrsh7th/cmp-path',
-      'hrsh7th/cmp-cmdline',
-      'saadparwaiz1/cmp_luasnip',
-      'L3MON4D3/LuaSnip',
-    },
-    config = require('config.cmp'),
-  },
-  {
-    'nvim-lua/lsp-status.nvim',
-    config = require('config.lspstatus')
-  },
-  {
-    'neovim/nvim-lspconfig',
-    config = require('config.lspconfig'),
-    after = 'lsp-status.nvim'
-  },
-  {
-    'nvim-telescope/telescope.nvim', tag = '0.1.0',
-    dependencies = { { 'nvim-lua/plenary.nvim' } },
-    config = require('config.telescope'),
-  },
-  {
-    'mfussenegger/nvim-dap',
-    config = require('config.dap')
-  },
-  {
-    'rcarriga/nvim-dap-ui',
-    dependencies = {'nvim-dap'},
-    config = require('config.dapui'),
-  },
-  'jbyuki/one-small-step-for-vimkind',
-  {
-    'petertriho/nvim-scrollbar',
-    config = require('config.scrollbar'),
-  },
-  {
-    'akinsho/toggleterm.nvim',
-    config = require('config.toggleterm'),
-  },
-  {
-    'folke/trouble.nvim',
-    dependencies = { 'nvim-tree/nvim-web-devicons' },
-    config = require('config.trouble'),
-  },
-  {
-    'jose-elias-alvarez/null-ls.nvim',
-    dependencies = { 'nvim-lua/plenary.nvim' },
-    after = 'nvim-lspconfig',
-    config = require('config.null-ls'),
-  },
-  {
-    'MunifTanjim/prettier.nvim',
-    dependencies = {
-      'neovim/nvim-lspconfig',
-      'jose-elias-alvarez/null-ls.nvim',
-    },
-    config = require('config.prettier'),
-  },
-})