{
  "name": "timer",
  "kind": "bundled",
  "title": "Timer",
  "description": "Named countdown timers and pomodoros: the soonest one counts down on the bar and turns into an alarm when it ends. Built on the `timer` command line tool, so timers started in a terminal show up here too.",
  "version": "0.1.0",
  "icon": {
    "tile": {
      "glyph": "󰔛",
      "bg": "amber"
    }
  },
  "author": "pal",
  "spec": "github:zcag/pal/extensions/timer@v0.17.4",
  "source": "https://github.com/zcag/pal-extensions/tree/HEAD/timer",
  "commit": "4d2559cf9c04d0133c97d7c897f19a14acb9eace",
  "manifest": {
    "name": "timer",
    "title": "Timer",
    "description": "Named countdown timers and pomodoros: the soonest one counts down on the bar and turns into an alarm when it ends. Built on the `timer` command line tool, so timers started in a terminal show up here too.",
    "version": "0.1.0",
    "icon": {
      "tile": {
        "glyph": "󰔛",
        "bg": "amber"
      }
    },
    "author": "pal",
    "repo": "bundled",
    "settings": [
      {
        "kind": "path",
        "id": "command",
        "label": "timer command",
        "description": "The timer CLI (a name on PATH or a path). It keeps the timers; pal only reads and asks.",
        "pick": "file",
        "default": "timer"
      },
      {
        "kind": "path",
        "id": "dir",
        "label": "State directory",
        "description": "Where the CLI keeps one file per timer (its TIMER_DIR). ~ is expanded.",
        "pick": "folder",
        "default": "~/.local/share/timer"
      },
      {
        "kind": "number",
        "id": "pomodoro_work",
        "label": "Pomodoro work",
        "description": "Minutes of work per round.",
        "min": 1,
        "max": 180,
        "unit": "min",
        "default": 25
      },
      {
        "kind": "number",
        "id": "pomodoro_break",
        "label": "Pomodoro break",
        "description": "Minutes of break after a round.",
        "min": 1,
        "max": 60,
        "unit": "min",
        "default": 5
      },
      {
        "kind": "number",
        "id": "pomodoro_long_break",
        "label": "Pomodoro long break",
        "description": "Minutes of break after the last round of a cycle.",
        "min": 1,
        "max": 120,
        "unit": "min",
        "default": 15
      },
      {
        "kind": "number",
        "id": "pomodoro_rounds",
        "label": "Pomodoro rounds",
        "description": "Work rounds per cycle before the long break.",
        "min": 1,
        "max": 12,
        "unit": "rounds",
        "default": 4
      }
    ],
    "links": {
      "start": {
        "description": "Start a timer",
        "params": {
          "duration": {
            "description": "25m, 90s, 1h30m, 2:30, or minutes as a bare number",
            "required": true
          },
          "name": {
            "description": "Optional; the duration otherwise. A name already taken restarts that timer"
          },
          "ring": {
            "description": "Ring the phone out loud when it lands",
            "type": "boolean"
          }
        }
      }
    },
    "palettes": {
      "timers": {
        "title": "Timers",
        "description": "Every timer with what is left; New timer takes a duration, a name and whether to ring the phone in the bar; Start Pomodoro runs work and break timers in turn.",
        "kind": "live",
        "remember": false,
        "keys": [
          {
            "keys": "enter",
            "title": "Pause, resume or dismiss"
          },
          {
            "keys": "cmd++",
            "title": "Add the minutes typed in the bar (five when blank)"
          },
          {
            "keys": "cmd+s",
            "title": "Skip to the pomodoro's next phase"
          },
          {
            "keys": "cmd+shift+d",
            "title": "Stop the pomodoro"
          },
          {
            "keys": "cmd+d",
            "title": "Stop"
          }
        ]
      }
    },
    "bar": {
      "timer": {
        "title": "Timer",
        "description": "The soonest timer's remaining time with a fill; an alarm once it lands; hidden with none running. The popover: the soonest timer's time left as its headline, a card with a bar for each other one, pause, add five minutes, stop, a field to start one, a pomodoro's phase and round on its card.",
        "mocks": {
          "plain": {
            "title": "A timer running",
            "item": {
              "icon": "󰥔",
              "title": "8:12",
              "progress": 0.18,
              "color": "blue",
              "tooltip": "Tea"
            }
          },
          "running": {
            "title": "A pomodoro round running",
            "item": {
              "icon": "󰥔",
              "title": "12:34 · 2/4",
              "progress": 0.58,
              "color": "blue",
              "tooltip": "Pomodoro: round 2 of 4, work"
            }
          },
          "ending": {
            "title": "Nearly landed, another timer behind it",
            "item": {
              "icon": "󰥔",
              "title": "0:41",
              "progress": 0.95,
              "color": "red",
              "tooltip": "Tea (+1 more)"
            }
          },
          "paused": {
            "title": "Paused timer",
            "item": {
              "icon": "󰥔",
              "title": "41:05",
              "progress": 0.32,
              "color": "muted",
              "tooltip": "Tea, paused"
            }
          },
          "landed": {
            "title": "Timer landed",
            "item": {
              "icon": "󰥔",
              "title": "Tea",
              "urgent": true,
              "progress": 1,
              "tooltip": "Tea landed 0:03 ago"
            }
          },
          "idle": {
            "title": "No timers",
            "item": {
              "hidden": true,
              "empty": {
                "icon": "󰥔",
                "tooltip": "No timers"
              }
            }
          }
        },
        "refresh": {
          "every": 10,
          "on": [
            "wake"
          ]
        },
        "keys": [
          {
            "keys": "space",
            "title": "Pause, resume or dismiss the timer with the ring"
          },
          {
            "keys": "+",
            "title": "Add five minutes"
          },
          {
            "keys": "backspace",
            "title": "Stop"
          },
          {
            "keys": "up",
            "title": "Move the ring to another timer (or click a card)"
          },
          {
            "keys": "n",
            "title": "Start one: type 25m tea in the field, Enter"
          },
          {
            "keys": "p",
            "title": "Start a pomodoro"
          },
          {
            "keys": "s",
            "title": "Skip to the pomodoro's next phase"
          },
          {
            "keys": "cmd+shift+d",
            "title": "Stop the pomodoro"
          },
          {
            "keys": "o",
            "title": "Open the Timers palette"
          }
        ]
      }
    },
    "license": "MIT",
    "store": {
      "tagline": "Named countdowns and pomodoros, with an alarm on the bar",
      "category": "productivity",
      "features": [
        "One row per timer, most urgent first, with the time left or when it ended",
        "Start one by typing `25m`, `90s` or `1h30m` and a name; optionally ring the phone when it ends",
        "`enter` pauses, resumes or dismisses; `cmd++` adds minutes (five when none are typed); `cmd+d` stops",
        "Pomodoro: 25 minutes of work, 5 of break, 15 after the fourth round; `cmd+s` skips a phase",
        "A bar item with the countdown filling blue to amber to red; its popover pauses, adds time or starts a timer",
        "The same timers as the `timer` CLI, so one started in a terminal is in this list"
      ],
      "permissions": [
        "timer"
      ],
      "platforms": [
        "macos",
        "linux"
      ],
      "screenshots": [
        {
          "file": "1-timers.png",
          "caption": "Every timer, the most urgent first: one that just landed, three running with when each lands, one paused, and the pomodoros done today"
        },
        {
          "file": "2-actions.png",
          "caption": "A running timer's actions: pause it, stop it, or add the minutes in the field beside the search (five unless you type more)"
        },
        {
          "file": "3-pomodoro.png",
          "caption": "A pomodoro round is a timer too: its row says the round and the phase, and skips to the break or stops the cycle"
        },
        {
          "file": "4-new.png",
          "caption": "New timer, typed after the search: a duration as you would say it, an optional name, and whether the phone rings when it lands"
        },
        {
          "file": "bar-menubar.png",
          "caption": "On the menu bar: what is left of the soonest timer, with a fill under the glyph that turns amber past two thirds",
          "kind": "bar"
        },
        {
          "file": "bar-menubar-landed.png",
          "caption": "A timer that landed: the item turns into a red alarm with its name",
          "kind": "bar"
        },
        {
          "file": "bar-popover.png",
          "caption": "A click opens the popover: a card per timer with the time left and a bar; space pauses, + adds five minutes, backspace stops",
          "kind": "bar",
          "box": [
            420,
            64,
            840,
            868
          ]
        },
        {
          "file": "bar-popover-landed.png",
          "caption": "A landed timer sits on top, red and full, until space dismisses it",
          "kind": "bar",
          "box": [
            416,
            64,
            840,
            960
          ]
        },
        {
          "file": "bar-popover-new.png",
          "caption": "n opens the field: 25m tea starts one, and the last durations are a click away",
          "kind": "bar",
          "box": [
            420,
            64,
            840,
            786
          ]
        },
        {
          "file": "bar-popover-pomodoro.png",
          "caption": "A pomodoro on the popover: the round and the phase on its card, s skips to the break, the rounds finished today below",
          "kind": "bar",
          "box": [
            382,
            64,
            840,
            712
          ]
        },
        {
          "file": "bar-sketchybar.png",
          "caption": "On sketchybar: the fill as a rule of box-drawing cells before the glyph, the countdown as the label",
          "kind": "bar"
        }
      ],
      "actions": [
        {
          "title": "Pause / Resume / Dismiss",
          "description": "Pause a running timer, resume a paused one, dismiss a landed one.",
          "keys": "enter"
        },
        {
          "title": "Add minutes",
          "description": "The minutes typed in the bar, five when blank.",
          "keys": "cmd++"
        },
        {
          "title": "Stop",
          "description": "The timer is gone.",
          "keys": "cmd+d"
        },
        {
          "title": "Start",
          "description": "On New timer: the bar takes the duration (required), a name and Silent or Ring the phone, then the CLI starts it.",
          "keys": "enter"
        },
        {
          "title": "Start pomodoro",
          "description": "The Start Pomodoro row: the first work round's timer, the breaks and the next rounds follow on their own.",
          "keys": "enter"
        },
        {
          "title": "Skip to the next phase",
          "description": "On the pomodoro's timer: this phase's timer stopped, the next started.",
          "keys": "cmd+s"
        },
        {
          "title": "Stop pomodoro",
          "description": "The cycle is over; the timer stopped.",
          "keys": "cmd+shift+d"
        }
      ]
    }
  },
  "playable": false,
  "updated_at": "2026-11-02T04:38:11Z",
  "url": "https://pal.cagdas.io/extensions/timer",
  "tagline": "Named countdowns and pomodoros, with an alarm on the bar",
  "category": "productivity",
  "screenshots": [
    "https://pal.cagdas.io/extensions/timer/screenshots/1-timers-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/1-timers.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/2-actions-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/2-actions.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/3-pomodoro-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/3-pomodoro.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/4-new-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/4-new.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-menubar-landed-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-menubar-landed.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-landed-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-landed.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-new-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-new.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-pomodoro-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-pomodoro.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-sketchybar-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots": [
    "https://pal.cagdas.io/extensions/timer/screenshots/1-timers.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/2-actions.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/3-pomodoro.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/4-new.png"
  ],
  "bar_screenshots": [
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-menubar-landed.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-landed.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-new.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-pomodoro.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots_dark": [
    "https://pal.cagdas.io/extensions/timer/screenshots/1-timers-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/2-actions-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/3-pomodoro-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/4-new-dark.png"
  ],
  "bar_screenshots_dark": [
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-menubar-landed-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-landed-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-new-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-pomodoro-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/timer/screenshots/bar-sketchybar-dark.png"
  ],
  "has_bar": true,
  "bar_items": [
    {
      "id": "timer",
      "title": "Timer",
      "description": "The soonest timer's remaining time with a fill; an alarm once it lands; hidden with none running. The popover: the soonest timer's time left as its headline, a card with a bar for each other one, pause, add five minutes, stop, a field to start one, a pomodoro's phase and round on its card.",
      "refresh": {
        "every": 10,
        "on": [
          "wake"
        ]
      },
      "refresh_words": "every 10s, on wake"
    }
  ],
  "has_links": true,
  "links": [
    {
      "route": "start",
      "url": "pal://timer/start?duration=\u003cduration\u003e",
      "cli": "pal call timer/start duration=\u003cduration\u003e",
      "description": "Start a timer",
      "params": [
        {
          "name": "duration",
          "description": "25m, 90s, 1h30m, 2:30, or minutes as a bare number",
          "required": true
        },
        {
          "name": "name",
          "description": "Optional; the duration otherwise. A name already taken restarts that timer"
        },
        {
          "name": "ring",
          "description": "Ring the phone out loud when it lands",
          "type": "boolean"
        }
      ]
    }
  ],
  "multi": false,
  "has_readme": true
}
