{
  "name": "odak",
  "kind": "registry",
  "title": "odak",
  "description": "Your odak todos in the panel: open ones by section with today's and the overdue on top, a new todo in one typed line, search across open and done, and today's count on the bar.",
  "version": "0.1.0",
  "icon": {
    "tile": {
      "glyph": "󰄴",
      "bg": "indigo"
    }
  },
  "author": "pal",
  "spec": "github:zcag/pal/extensions/odak@v0.9.1",
  "source": "https://github.com/zcag/pal/tree/HEAD/extensions/odak",
  "commit": "63287e180ce349dac3aa87c68ce4c80bc42ad409",
  "manifest": {
    "name": "odak",
    "title": "odak",
    "description": "Your odak todos in the panel: open ones by section with today's and the overdue on top, a new todo in one typed line, search across open and done, and today's count on the bar.",
    "keywords": [
      "todo",
      "todos",
      "task",
      "tasks"
    ],
    "version": "0.1.0",
    "icon": {
      "tile": {
        "glyph": "󰄴",
        "bg": "indigo"
      }
    },
    "author": "pal",
    "repo": "bundled",
    "settings": [
      {
        "kind": "text",
        "id": "url",
        "required": true,
        "label": "Address",
        "description": "The odak server: http://host:8761 on your network, or its public address.",
        "placeholder": "http://host:8761",
        "default": ""
      },
      {
        "kind": "secret",
        "id": "api_key",
        "required": true,
        "label": "API key",
        "description": "The server's ODAK_API_KEY.",
        "placeholder": "the key",
        "default": ""
      },
      {
        "kind": "text",
        "id": "default_section",
        "label": "Section for new todos",
        "description": "Where a todo lands unless the line names one with /section.",
        "placeholder": "Inbox",
        "default": "Inbox"
      }
    ],
    "palettes": {
      "odak": {
        "title": "Todos",
        "description": "Every open todo: the overdue and today's first, then the file's sections in order, subtasks under their parent, what waits for a day at the end. Add a todo from the first row, typed in the bar.",
        "kind": "live",
        "lazy": true,
        "ttl": 60,
        "keys": [
          {
            "keys": "enter",
            "title": "Complete (Tab marks several)"
          },
          {
            "keys": "cmd+e",
            "title": "Edit: text, section, tags, due day, urgent"
          },
          {
            "keys": "cmd+t",
            "title": "Snooze to tomorrow"
          },
          {
            "keys": "cmd+s",
            "title": "Snooze: tomorrow, in 3 days, next Monday, next week, a day typed"
          },
          {
            "keys": "cmd+m",
            "title": "Move to a section"
          },
          {
            "keys": "cmd+u",
            "title": "Mark urgent, or not"
          },
          {
            "keys": "cmd+n",
            "title": "Add a subtask"
          },
          {
            "keys": "cmd+l",
            "title": "Open the link in the todo"
          },
          {
            "keys": "cmd+o",
            "title": "Open odak"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the text"
          },
          {
            "keys": "cmd+shift+c",
            "title": "Copy the link (the todo's, else odak's)"
          },
          {
            "keys": "cmd+d",
            "title": "Delete (asks; subtasks go with it)"
          }
        ]
      },
      "add": {
        "title": "Add Todo",
        "description": "A todo typed in one line: #tag, ! for urgent, /section, d:day or a day in words at the end (tomorrow, fri, next mon, in 3 days, 20 sep); the row reads it back as you type, Enter adds it. Before you type: the selected text and the clipboard as todos.",
        "kind": "input",
        "fallback": "Add “{query}” to odak",
        "keys": [
          {
            "keys": "enter",
            "title": "Add"
          },
          {
            "keys": "cmd+enter",
            "title": "Add and type another"
          },
          {
            "keys": "cmd+shift+c",
            "title": "Copy the line"
          }
        ]
      },
      "search": {
        "title": "Search Todos",
        "description": "Every word typed against the text, tags and section of every todo, open and completed; a completed one reopens on Enter.",
        "kind": "input",
        "keys": [
          {
            "keys": "enter",
            "title": "Complete an open todo; reopen a completed one"
          },
          {
            "keys": "cmd+e",
            "title": "Edit"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the text"
          },
          {
            "keys": "cmd+d",
            "title": "Delete (asks)"
          }
        ]
      },
      "done": {
        "title": "Completed",
        "description": "What is checked off, by section, the ones completed from pal with when; Enter reopens.",
        "kind": "live",
        "lazy": true,
        "ttl": 60,
        "keys": [
          {
            "keys": "enter",
            "title": "Reopen (Tab marks several)"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the text"
          },
          {
            "keys": "cmd+o",
            "title": "Open odak"
          },
          {
            "keys": "cmd+d",
            "title": "Delete (asks; Tab marks several)"
          }
        ]
      }
    },
    "bar": {
      "today": {
        "title": "Today",
        "description": "How many todos are due today or sit in today's sections, red while any is overdue, hidden at zero; the popover lists them with a cursor, completes on Enter and adds from a field.",
        "refresh": {
          "every": 300,
          "on": [
            "show",
            "wake",
            "network"
          ]
        },
        "settings": [
          {
            "kind": "list",
            "id": "today_sections",
            "label": "Today's sections",
            "description": "Sections the item counts as today's work, on top of what is due today.",
            "placeholder": "Focus",
            "default": [
              "Focus",
              "Today"
            ]
          }
        ],
        "mocks": {
          "busy": {
            "title": "Three today, none overdue",
            "item": {
              "icon": "󰄴",
              "title": "3",
              "tooltip": "3 today"
            }
          },
          "overdue": {
            "title": "One overdue (red by its rule)",
            "item": {
              "icon": "󰄴",
              "title": "4",
              "color": "red",
              "tooltip": "1 overdue, 3 today"
            }
          },
          "clear": {
            "title": "Nothing due today",
            "item": {
              "hidden": true,
              "empty": {
                "icon": "󰄴",
                "tooltip": "Nothing due today"
              }
            }
          },
          "out": {
            "title": "Signed out",
            "item": {
              "hidden": true
            }
          }
        },
        "keys": [
          {
            "keys": "enter",
            "title": "Complete the focused todo (x too)"
          },
          {
            "keys": "u",
            "title": "Mark the focused todo urgent, or not"
          },
          {
            "keys": "t",
            "title": "Snooze the focused todo to tomorrow"
          },
          {
            "keys": "n",
            "title": "A field: type a todo, Enter adds it"
          },
          {
            "keys": "o",
            "title": "Open odak"
          },
          {
            "keys": "p",
            "title": "Open the Todos palette"
          },
          {
            "keys": "r",
            "title": "Fetch again"
          },
          {
            "keys": "up, down",
            "title": "Move between the rows (j, k too; a click sets the cursor)"
          }
        ],
        "rules": [
          {
            "id": "quiet",
            "when": "odak.today == 0 and odak.overdue == 0",
            "description": "Nothing due today and nothing in today's sections: off the strip, muted for anyone who keeps it.",
            "hidden": true,
            "color": "muted"
          },
          {
            "id": "overdue",
            "when": "odak.overdue \u003e 0",
            "description": "Something is past its day.",
            "color": "red"
          }
        ]
      }
    },
    "states": {
      "overdue": {
        "description": "Open todos past their day",
        "kind": "number"
      },
      "today": {
        "description": "Open todos due today or in today's sections (overdue ones aside)",
        "kind": "number"
      },
      "open": {
        "description": "Open todos in all",
        "kind": "number"
      }
    },
    "links": {
      "add": {
        "description": "Add a todo; the text takes the add line's grammar (#tag, !, /section, a day at the end)",
        "params": {
          "text": {
            "description": "The todo",
            "required": true
          },
          "section": {
            "description": "The section; the setting's default otherwise"
          },
          "due": {
            "description": "A day: tomorrow, fri, next mon, in 3 days, 2026-10-01"
          },
          "tags": {
            "description": "Tags, repeated",
            "type": "string[]"
          },
          "urgent": {
            "description": "Flag it",
            "type": "boolean"
          }
        }
      }
    },
    "license": "MIT",
    "store": {
      "tagline": "Your odak todos: add in one line, see today's on the bar",
      "category": "productivity",
      "features": [
        "Todos by section, overdue and today's on top; `enter` completes, with Undo right after",
        "Add in one line: `#tag`, `!` for urgent, `/section` and a day in words (`tomorrow`, `fri`, `in 3 days`)",
        "Snooze, move between sections, or edit everything in a form",
        "Search across open and completed todos, and reopen what you checked off",
        "Today's count on the bar, red when anything is overdue; add and complete from its popover",
        "`pal://odak/add?text=...` adds a todo from a script or a keybind"
      ],
      "permissions": [
        "network",
        "token"
      ],
      "platforms": [
        "macos",
        "linux"
      ],
      "screenshots": [
        {
          "file": "1-todos.png",
          "caption": "Every todo by section, the overdue and today's on top, a subtask under its parent; Enter completes"
        },
        {
          "file": "2-add.png",
          "caption": "One line adds a todo: #tag, ! for urgent and a day in words, read back as you type"
        },
        {
          "file": "3-snooze.png",
          "caption": "Snooze to tomorrow, next Monday or a day typed in words"
        },
        {
          "file": "4-search.png",
          "caption": "Search reaches open and completed todos alike, by text or by tag"
        },
        {
          "file": "5-edit.png",
          "caption": "Edit everything in one form: the text, the section, the tags and the day"
        },
        {
          "file": "6-completed.png",
          "caption": "Completed lists what is checked off; Enter reopens one"
        },
        {
          "file": "bar-menubar.png",
          "caption": "On the menu bar: today's count, red while anything is overdue",
          "kind": "bar"
        },
        {
          "file": "bar-popover.png",
          "caption": "A click opens the popover: the overdue first, then today's, Enter completes, n adds",
          "kind": "bar",
          "box": [
            438,
            64,
            840,
            668
          ]
        },
        {
          "file": "bar-sketchybar.png",
          "caption": "On sketchybar: the glyph and the count, red for the overdue one",
          "kind": "bar"
        }
      ]
    }
  },
  "playable": false,
  "updated_at": "2026-09-30T01:45:08Z",
  "url": "https://pal.cagdas.io/extensions/odak",
  "tagline": "Your odak todos: add in one line, see today's on the bar",
  "category": "productivity",
  "screenshots": [
    "https://pal.cagdas.io/extensions/odak/screenshots/1-todos-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/1-todos.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/2-add-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/2-add.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/3-snooze-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/3-snooze.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/4-search-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/4-search.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/5-edit-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/5-edit.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/6-completed-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/6-completed.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-sketchybar-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots": [
    "https://pal.cagdas.io/extensions/odak/screenshots/1-todos.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/2-add.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/3-snooze.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/4-search.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/5-edit.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/6-completed.png"
  ],
  "bar_screenshots": [
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots_dark": [
    "https://pal.cagdas.io/extensions/odak/screenshots/1-todos-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/2-add-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/3-snooze-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/4-search-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/5-edit-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/6-completed-dark.png"
  ],
  "bar_screenshots_dark": [
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/odak/screenshots/bar-sketchybar-dark.png"
  ],
  "has_bar": true,
  "bar_items": [
    {
      "id": "today",
      "title": "Today",
      "description": "How many todos are due today or sit in today's sections, red while any is overdue, hidden at zero; the popover lists them with a cursor, completes on Enter and adds from a field.",
      "refresh": {
        "every": 300,
        "on": [
          "show",
          "wake",
          "network"
        ]
      },
      "refresh_words": "every 5 min, when the panel shows, on wake, when the network is back"
    }
  ],
  "has_links": true,
  "links": [
    {
      "route": "add",
      "url": "pal://odak/add?text=\u003ctext\u003e",
      "cli": "pal call odak/add text=\u003ctext\u003e",
      "description": "Add a todo; the text takes the add line's grammar (#tag, !, /section, a day at the end)",
      "params": [
        {
          "name": "text",
          "description": "The todo",
          "required": true
        },
        {
          "name": "section",
          "description": "The section; the setting's default otherwise"
        },
        {
          "name": "due",
          "description": "A day: tomorrow, fri, next mon, in 3 days, 2026-10-01"
        },
        {
          "name": "tags",
          "description": "Tags, repeated",
          "type": "string[]"
        },
        {
          "name": "urgent",
          "description": "Flag it",
          "type": "boolean"
        }
      ]
    }
  ],
  "multi": false,
  "has_readme": true
}
