diff --git a/roles/neovim/files/lua/opdavies/lsp/init.lua b/roles/neovim/files/lua/opdavies/lsp/init.lua
index 5c5d9ffc..f00e5461 100644
--- a/roles/neovim/files/lua/opdavies/lsp/init.lua
+++ b/roles/neovim/files/lua/opdavies/lsp/init.lua
@@ -36,3 +36,5 @@ lspconfig.tailwindcss.setup {
 }
 
 require("opdavies.lsp.handlers").setup()
+
+require "opdavies.lsp.null-ls"
diff --git a/roles/neovim/files/lua/opdavies/lsp/null-ls.lua b/roles/neovim/files/lua/opdavies/lsp/null-ls.lua
index b6b5e7dc..6227cb18 100644
--- a/roles/neovim/files/lua/opdavies/lsp/null-ls.lua
+++ b/roles/neovim/files/lua/opdavies/lsp/null-ls.lua
@@ -14,4 +14,15 @@ null_ls.setup {
     diagnostics.eslint,
     completion.spell,
   },
+
+  on_attach = function(client)
+    if client.resolved_capabilities.document_formatting then
+      vim.cmd [[
+        augroup LspFormatting
+          autocmd! * <buffer>
+          autocmd BufWritePre <buffer> lua vim.lsp.buf.formatting_sync()
+        augroup END
+      ]]
+    end
+  end,
 }