Home
Softono

LazyDo

Open source Lua
137
Stars
9
Forks
1
Issues
2
Watchers
6 months
Last Commit

 About LazyDo

A little smart todo/task manager made for enthusiasts.

Platforms

Web Self-hosted

Languages

Lua

Links

Need Help Installing LazyDo?

We provide expert installation service for this software. Our team will install, configure, and secure LazyDo on your server. plans start at just $30.

LazyDo

A smart, feature-rich task/todo manager

ScreenshotsFeaturesInstallationUsageConfiguration

... made with love ...

 Screenshots

A demo video for LazyDo: LazyDo

Screenshots for LazyDo:

main panel main panel

`lualine` 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").get_lualine_stats() -- 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,
      use_git_root = 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.