Dan7h3x
LazyDo
Lua

A little smart todo/task manager made for enthusiasts.

Last updated Jul 7, 2026
141
Stars
8
Forks
1
Issues
+3
Stars/day
Attention Score
58
Language breakdown
Lua 100.0%
โ–ธ Files click to expand
README

LazyDo

A smart, feature-rich task/todo manager

Screenshots โ€ข Features โ€ข Installation โ€ข Usage โ€ข Configuration

... made with love ...

๎˜ Screenshots

A demo video for LazyDo: LazyDo

Screenshots for LazyDo:

main panel main panel

<code>lualine</code> integration lualine integration

pin window pin window for having pending task everywhere

multiline note editor multi-line note editor

โœจ Features

  • ๏‚ฎ Intuitive task management with subtasks support
  • ๎ˆซ Customizable themes and icons
  • ๎ชฐ Due dates and reminders
  • ๐Ÿท๏ธ Task tagging and categorization
  • ๐Ÿ” Advanced sorting
  • ๓ฑ’– Task relationships and dependencies
  • ๏ƒ‡ Smart Storage
  • ๐Ÿ“Š Progress tracking and filtering
  • ๓ฐฆ File attachments (WIP)

๐Ÿ“ฆ Installation

Using lazy.nvim:

return {
  {
    "Dan7h3x/LazyDo",
    branch = "main",
    cmd = {"LazyDoToggle","LazyDoPin","LazyDoToggleStorage"},
    keys = { -- recommended keymap for easy toggle LazyDo in normal and insert modes (arbitrary)
	    {
        "<F2>","<ESC><CMD>LazyDoToggle<CR>",
        mode = {"n","i"},
	    },
    },
    event = "VeryLazy",
    opts = {
      -- your config here
    },
  },
}

and integration with lualine.nvim:

{
    "nvim-lualine/lualine.nvim",
    event = "VeryLazy",
    opts = function(_, opts)
      table.insert(opts.sections.lualine_x, {
        function()
          return require("lazydo").getlualinestats() -- status
        end,
        cond = function()
          return require("lazydo")._initialized  -- condition for lualine
        end,
      })
    end,
  }

Usage

[!WARNING]
For having pin window or storage toggling first spawn LazyDoToggle to load plugin up just
once, when ever you enter neovim.
  • :LazyDoToggle - Toggle the task manager window
- a - Add new task - A - Add subtask - <leader>a - Quick Task - <leader>A - Quick Subtask - d - Delete task - e - Edit task - D - Set due date - K - Move task up - J - Move task down - i - Toggle info - m - Add metadata - M - Edit metadata - L/l - Set/Show relationships - n - Add/edit note - p - Toggle priority - t - Add tags - T - Edit tags - q - Close window - x/X - Convert Task to Subtask and vice verse - z - Toggle fold and more in help window using ?.
  • :LazyDoPin position
- available positions are {default:topright,topleft,bottomright,bottomleft}.
  • :LazyDoToggleStorage mode
- available modes are project and global and custom. (the auto mode is under development)

Valid dates

Example Dates:

  • YYYY-MM-DD (like 2025-01-15)
  • MM/DD (03/15)
  • Nd (3d = 3 days)
  • Nw (2w = 2 weeks)
  • Nm (1m = 1 month)
  • Ny (1y = 1 year)
  • today
  • tomorrow
  • next week
  • next month
  • leave empty to clear

๐Ÿ”ง Configuration

All available options:

{
  title = " LazyDo Tasks ",
  layout = {
    width = 0.7,      -- Percentage of screen width
    height = 0.8,     -- Percentage of screen height
    spacing = 1,      -- Lines between tasks
    task_padding = 1, -- Padding around task content
  },
  pin_window = {
    enabled = true,
    width = 50,
    max_height = 10,
    position = "topright", -- "topright", "topleft", "bottomright", "bottomleft"
    title = " LazyDo Tasks ",
    auto_sync = true,      -- Enable automatic synchronization with main window
    colors = {
      border = { fg = "#3b4261" },
      title = { fg = "#7dcfff", bold = true },
    },
  },
  storage = {
    startup_detect = false, -- Enable auto-detection of projects on startup
    silent = false,         -- Disable notifications when switching storage mode
    global_path = nil,      -- Custom storage path (nil means use default)
    project = {
      enabled = false,
      usegitroot = true,
      auto_detect = false,                                                     -- Auto-detect project and switch storage mode
      markers = { ".git", ".lazydo", "package.json", "Cargo.toml", "go.mod" }, -- Project markers
    },
    auto_backup = true,
    backup_count = 1,
    compression = true,
    encryption = false,
    readable = false,  -- Formatted JSON for readability and easy diffing
                       -- Note: incompatible with compression and encryption
  },
    theme = {
    border = "rounded",
    colors = {
      header = { fg = "#7aa2f7", bold = true },
      title = { fg = "#7dcfff", bold = true },
      task = {
        pending = { fg = "#a9b1d6" },
        done = { fg = "#56ff89", italic = true },
        overdue = { fg = "#f7768e", bold = true },
        blocked = { fg = "#f7768e", italic = true },
        in_progress = { fg = "#7aa2f7", bold = true },
        info = { fg = "#78ac99", italic = true },
      },
      priority = {
        high = { fg = "#f7768e", bold = true },
        medium = { fg = "#e0af68" },
        low = { fg = "#9ece6a" },
        urgent = { fg = "#db4b4b", bold = true, undercurl = true },
      },
      storage = { fg = "#a24db3", bold = true },
      notes = {
        header = {
          fg = "#7dcfff",
          bold = true,
        },
        body = {
          fg = "#d9a637",
          italic = true,
        },
        border = {
          fg = "#3b4261",
        },
        icon = {
          fg = "#fdcfff",
          bold = true,
        },
      },
      due_date = {
        fg = "#bb9af7",
        near = { fg = "#e0af68", bold = true },
        overdue = { fg = "#f7768e", undercurl = true },
      },
      progress = {
        complete = { fg = "#9ece6a" },
        partial = { fg = "#e0af68" },
        none = { fg = "#f7768e" },
      },
      separator = {
        fg = "#3b4261",
        vertical = { fg = "#3b4261" },
        horizontal = { fg = "#3b4261" },
      },
      help = {
        fg = "#c0caf5",
        key = { fg = "#7dcfff", bold = true },
        text = { fg = "#c0caf5", italic = true },
      },
      fold = {
        expanded = { fg = "#7aa2f7", bold = true },
        collapsed = { fg = "#7aa2f7" },
      },
      indent = {
        line = { fg = "#3b4261" },
        connector = { fg = "#3bf2f1" },
        indicator = { fg = "#fb42f1", bold = true },
      },
      search = {
        match = { fg = "#c0caf5", bold = true },
      },
      selection = { fg = "#c0caf5", bold = true },
      cursor = { fg = "#c0caf5", bold = true },
    },
    progress_bar = {
      width = 15,
      filled = "โ–ˆ",
      empty = "โ–‘",
      enabled = true,
      style = "modern", -- "classic", "modern", "minimal"
    },
    indent = {
      connector = "โ”œโ”€",
      last_connector = "โ””โ”€",
    },
    task_separator = {
      left = "๎‚ถ",
      right = "๎‚ด",
      center = "โ–‘"
	},
  },
  icons = {
    task_pending = "๏ƒˆ",
    task_done = "๏…Š",
    priority = {
      low = "๓ฐ˜„",
      medium = "๓ฐญ",
      high = "๓ฐ˜ƒ",
      urgent = "๓ฐ€ฆ",
    },
    created = "๓ฐƒฐ",
    updated = "๏‰ฑ",
    note = "๏ฟ",
    relations = "๓ฑ’– ",
    due_date = "๎ชฐ",
    recurring = {
      daily = "๏€ž",
      weekly = "๏€ก",
      monthly = "๏‚ฒ",
    },
    metadata = "๓ฐ‚ต",
    important = "๎™”",
  },
  features = {
    task_info = {
      enabled = true,
    },

folding = { enabled = true, default_folded = false, icons = { folded = "โ–ถ", unfolded = "โ–ผ", }, }, tags = { enabled = true, colors = { fg = "#7aa2f7", }, prefix = "๓ฐ“น ", }, relations = { enabled = true, }, metadata = { enabled = true, colors = { key = { fg = "#f0caf5", bg = "#bb9af7", bold = true }, value = { fg = "#c0faf5", bg = "#7dcfff" }, section = { fg = "#00caf5", bg = "#bb9af7", bold = true, italic = true }, }, }, }, }

๐Ÿค Contributing

Contributors are welcome here and thank you btw.

๐Ÿ”— More in this category

ยฉ 2026 GitRepoTrend ยท Dan7h3x/LazyDo ยท Updated daily from GitHub