return {
	{
		"mfussenegger/nvim-lint",
		event = { "BufReadPre", "BufNewFile" },
		config = function()
			local lint = require("lint")
			lint.linters_by_ft = {
				-- brew install luacheck
				lua = { "luacheck" },
				bash = { "shellcheck" },
				sh = { "shellcheck" },
				-- brew install tflint
				terraform = { "tflint" },
				-- brew install markdownlint-cli2
				markdown = { "markdownlint-cli2" },
				-- go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.64.0
				go = { "golangcilint" },
			}
			local lint_augroup = vim.api.nvim_create_augroup("lint", { clear = true })

			vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave" }, {
				group = lint_augroup,
				callback = function()
					lint.try_lint()
				end,
			})
			vim.keymap.set("n", "<leader>l", function()
				lint.try_lint()
			end, { desc = "Trigger linting for current file" })
			vim.keymap.set("n", "<leader>d", function()
				if vim.diagnostic.config().virtual_lines then
					vim.diagnostic.config({ virtual_lines = false })
				else
					vim.diagnostic.config({ virtual_lines = { current_line = true } })
				end
			end, { desc = "Toggle inline diagnostics" })
		end,
	},
}
