diff --git a/home/editors/neovim/alpha.lua b/home/editors/neovim/alpha.lua
new file mode 100644
index 0000000..b2e9018
--- /dev/null
+++ b/home/editors/neovim/alpha.lua
@@ -0,0 +1,33 @@
+local status_ok, alpha = pcall(require, "alpha")
+if not status_ok then
+  return
+end
+
+local keybind_opts = { noremap = true, silent = true, nowait = true }
+local dashboard = require("alpha.themes.dashboard")
+dashboard.section.header.val = {
+  [[                               __                ]],
+  [[  ___     ___    ___   __  __ /\_\    ___ ___    ]],
+  [[ / _ `\  / __`\ / __`\/\ \/\ \\/\ \  / __` __`\  ]],
+  [[/\ \/\ \/\  __//\ \_\ \ \ \_/ |\ \ \/\ \/\ \/\ \ ]],
+  [[\ \_\ \_\ \____\ \____/\ \___/  \ \_\ \_\ \_\ \_\]],
+  [[ \/_/\/_/\/____/\/___/  \/__/    \/_/\/_/\/_/\/_/]],
+}
+dashboard.section.buttons.val = {
+  dashboard.button("p", " " .. " Find project", ":Telescope project display_type=full <CR>", keybind_opts),
+  dashboard.button("s", " " .. " Restore session", ":RestoreSession <CR>", keybind_opts),
+  dashboard.button("f", " " .. " Find file", ":Telescope find_files <CR>", keybind_opts),
+  dashboard.button("e", " " .. " New file", ":ene <BAR> startinsert <CR>", keybind_opts),
+  dashboard.button("r", " " .. " Recent files", ":Telescope oldfiles <CR>", keybind_opts),
+  dashboard.button("t", " " .. " Find text", ":Telescope live_grep <CR>", keybind_opts),
+  dashboard.button("h", " " .. " Neovim Help", ":help<CR>", keybind_opts),
+  dashboard.button("R", " " .. " Neovim Reference", ":help reference<CR>", keybind_opts),
+  dashboard.button("q", " " .. " Quit", ":qa<CR>", keybind_opts),
+}
+
+dashboard.section.footer.opts.hl = "Type"
+dashboard.section.header.opts.hl = "Include"
+dashboard.section.buttons.opts.hl = "Keyword"
+
+dashboard.opts.opts.noautocmd = true
+alpha.setup(dashboard.opts)
diff --git a/home/editors/neovim/auto-session.lua b/home/editors/neovim/auto-session.lua
new file mode 100644
index 0000000..de8b5af
--- /dev/null
+++ b/home/editors/neovim/auto-session.lua
@@ -0,0 +1,17 @@
+vim.o.sessionoptions = "buffers,curdir,tabpages,winsize"
+
+require("auto-session").setup {
+  auto_session_suppress_dirs = { "~/", "~/dev", "~/dev/work" },
+  auto_session_enabled = false,
+  pre_save_cmds = { "tabdo NvimTreeClose" },
+}
+
+local wk = require("which-key")
+wk.register({
+  S = {
+    name = "Session",
+    d = { require("auto-session").DeleteSession, "Delete session" },
+    s = { require("auto-session").SaveSession, "Save session" },
+    r = { require("auto-session").RestoreSession, "Restore session" },
+  },
+}, { mode = "n", prefix = "<leader>" })
diff --git a/home/editors/neovim/default.nix b/home/editors/neovim/default.nix
index de0ca77..ee6ad8b 100644
--- a/home/editors/neovim/default.nix
+++ b/home/editors/neovim/default.nix
@@ -18,12 +18,14 @@ in {
       editorconfig-nvim
       direnv-vim
       telescope-nvim
+      telescope-project-nvim
       telescope-fzy-native-nvim
       lualine-nvim
       nvim-web-devicons
       nvim-tree-lua
       toggleterm-nvim
-      vim-startify
+      alpha-nvim
+      auto-session
       vim-visual-multi
       vim-surround
       kommentary
@@ -66,7 +68,8 @@ in {
     # readFile ./vim-surround-fix.vim +
       vimLua (lib.foldl (r: f: r + "\n" + readFile f) "" [
         ./init.lua
-        ./startify.lua
+        ./alpha.lua
+        ./auto-session.lua
         ./lualine.lua
         ./which-key.lua
         ./gitsigns.lua
diff --git a/home/editors/neovim/startify.lua b/home/editors/neovim/startify.lua
deleted file mode 100644
index 6957aa6..0000000
--- a/home/editors/neovim/startify.lua
+++ /dev/null
@@ -1,49 +0,0 @@
-local function formatDirs(files)
-  local results = {}
-  for _, file in ipairs(files) do
-    table.insert(results, { line = file, path = file })
-  end
-  return results
-end
-
-local function gitModified()
-  local files = vim.fn.systemlist("git ls-files -m 2>/dev/null")
-  return formatDirs(files)
-end
-
-local function gitUntracked()
-  local files = vim.fn.systemlist("git ls-files -o --exclude-standard 2>/dev/null")
-  return formatDirs(files)
-end
-
-local function escapePattern(text)
-  return text:gsub("([^%w])", "%%%1")
-end
-
-local function listProjects()
-  local gitDirs = vim.fn.finddir(".git", vim.env.HOME .. "/dev/**4", -1)
-  table.insert(gitDirs, 1, "/etc/nixos")
-  return vim.fn.map(gitDirs, function(_, gitDir)
-    local dir = gitDir:gsub(escapePattern(".git"), "")
-    dir = dir == "" and "." or dir
-    local line = dir:gsub(escapePattern(vim.env.HOME), "~")
-    return {
-      line = line,
-      path = dir,
-    } end
-  )
-end
-
-vim.g.startify_commands = {
-  {h = {"Vim Help", "help"}},
-  {r = {"Vim Reference", "help reference"}},
-}
-
-vim.g.startify_lists = {
-  { header = {"   Sessions"},      type = "sessions" },
-  { header = {"   git modified"},  type = gitModified },
-  { header = {"   git untracked"}, type = gitUntracked },
-  { header = {"   Projects"},      type = listProjects },
-  { header = {"   Recent files"},  type = "files" },
-  { header = {"   Commands"},      type = "commands" },
-}
diff --git a/home/editors/neovim/telescope.lua b/home/editors/neovim/telescope.lua
index c30cea5..1435855 100644
--- a/home/editors/neovim/telescope.lua
+++ b/home/editors/neovim/telescope.lua
@@ -1,5 +1,17 @@
-require("telescope").setup()
+require("telescope").setup {
+  extensions = {
+    project = {
+      base_dirs = {
+        { "/etc/nixos" },
+        { "~/dev", max_depth = 3 },
+        { "~/dev/work", max_depth = 3 },
+      },
+    },
+  },
+}
+
 require("telescope").load_extension("fzy_native")
+require("telescope").load_extension("project")
 
 local wk = require("which-key")
 
@@ -43,7 +55,8 @@ wk.register({
     m = { require("telescope.builtin").marks, "Marks" },
     M = { require("telescope.builtin").man_pages, "Man pages" },
     o = { require("telescope.builtin").oldfiles, "Previously open files" },
-    p = { require("telescope.builtin").pickers, "Pickers" },
+    p = { require("telescope").extensions.project.project, "Pickers" },
+    P = { require("telescope.builtin").pickers, "Pickers" },
     q = { require("telescope.builtin").quickfix, "Quickfix" },
     Q = { require("telescope.builtin").quickfixhistory, "Quickfix history" },
     r = { require("telescope.builtin").resume, "Resume" },