return require('packer').startup(function()
	-- Packer can manage itself
	use { 'wbthomason/packer.nvim' }

    use {
        'github/copilot.vim',
        config = function()
            require('config.copilot')
        end
    }

    use {
        'VonHeikemen/lsp-zero.nvim',
        requires = {
            -- LSP Support
            {'neovim/nvim-lspconfig'},
            {'williamboman/mason.nvim'},
            {'williamboman/mason-lspconfig.nvim'},

            -- Autocompletion
            {'hrsh7th/nvim-cmp'},
            {'hrsh7th/cmp-buffer'},
            {'hrsh7th/cmp-path'},
            {'saadparwaiz1/cmp_luasnip'},
            {'hrsh7th/cmp-nvim-lsp'},
            {'hrsh7th/cmp-nvim-lua'},

            -- Snippets
            {'L3MON4D3/LuaSnip'},
            {'rafamadriz/friendly-snippets'},
        },

        config = function()
            require('config.lsp')
        end
    }

    use {
        'tpope/vim-fugitive',
        config = function()
            require('config.fugitive')
        end
    }

    use { 'shumphrey/fugitive-gitlab.vim' }

	use { 'nvim-lua/plenary.nvim' }

	use {
        'nvim-telescope/telescope.nvim',
        config = function()
            require('config.telescope')
        end
    }

	use { 'nvim-telescope/telescope-fzy-native.nvim'}

    use { 'nvim-treesitter/nvim-treesitter' }

    use {
        'theprimeagen/harpoon',
        config = function ()
            require('config.harpoon')
        end
    }

    use {
        'mbbill/undotree',
        config = function ()
            require('config.undotree')
        end
    }

    use {
        'lewis6991/gitsigns.nvim',
        config = function()
            require('config.gitsigns')
        end
    }

    use {
        'nvim-lualine/lualine.nvim',
        requires = {
            'kyazdani42/nvim-web-devicons',
            'nvim-lua/lsp-status.nvim',
            opt = true
        },
        config = function()
            require('config.lualine')
        end
    }

    use {
        'aserowy/tmux.nvim',
        config = function ()
            require('config.tmux')
        end
    }

    use {
        'nvim-neo-tree/neo-tree.nvim',
        branch = 'v2.x',
        requires = {
            'nvim-lua/plenary.nvim',
            'kyazdani42/nvim-web-devicons',
            'MunifTanjim/nui.nvim',
        },
        config = function ()
            require('config.nvim-neo-tree')
        end
    }

    use {
        'glepnir/dashboard-nvim',
        event = 'VimEnter',
        config = function()
            require('config.dashboard')
        end,
        requires = {'nvim-tree/nvim-web-devicons'}
    }

    use {
        'nvim-neotest/neotest',
        requires = {
            'nvim-lua/plenary.nvim',
            'nvim-treesitter/nvim-treesitter',
            'antoinemadec/FixCursorHold.nvim',
            -- Adapters
            'olimorris/neotest-phpunit',
            'nvim-neotest/neotest-go',
        },
        config = function()
            require('config.neotest')
        end,
    }

    use {
        'MunifTanjim/prettier.nvim',
        requires = {
            -- 'jose-elias-alvarez/null-ls.nvim',
            'neovim/nvim-lspconfig',
        },

        config = function()
            -- require('config.null-ls')
            require('config.prettier')
        end
    }

    -- CMD and search at the top
    use {
        'folke/noice.nvim',
        requires = {
            'MunifTanjim/nui.nvim',
            'rcarriga/nvim-notify',
        },
        config = function ()
            require('config.noice')
        end
    }

    use {
        'rcarriga/nvim-notify',
        config = function ()
            require('notify').setup({
                background_color = '#000000'
            })
        end
    }

    -- DB manager
    use {
        'kristijanhusak/vim-dadbod-ui',
        requires = {
            'tpope/vim-dadbod',
        },
        config = function()
            require('config.dadbod')
        end
    }

    -- Copy to clipboard over ssh
    use {
        'ojroques/nvim-osc52',
        config = function()
            require('config.osc52')
        end
    }

    use {
        'numToStr/Comment.nvim',
        config = function()
            require('Comment').setup()
        end
    }

    -- Programming language specifics
	use { 'dart-lang/dart-vim-plugin' }
    use { 'ray-x/guihua.lua' }
    use {
        'ray-x/go.nvim',
        config = function()
            require('config.go')
        end
    }

    -- Colorschemes
    use {
        'gruvbox-community/gruvbox',
        -- config = function ()
        --     vim.cmd('colorscheme gruvbox')
        -- end
    }

    use {
        'folke/tokyonight.nvim',
        -- config = function ()
        --     vim.cmd('colorscheme tokyonight-night')
        -- end
    }

    use {
        'catppuccin/nvim',
        as = 'catppuccin',
        config = function ()
            vim.cmd('colorscheme catppuccin-mocha')
        end
    }
end)
