kovidgoyal/kitty · error · ValueError

The value {val} is not a valid choice for progress_bar

Error message

The value {val} is not a valid choice for progress_bar

What it means

kitty's config parser rejects values for the progress_bar option that are not one of the allowed strings: left, right, top, bottom, hidden. The value is lowercased before checking, so only membership in that frozenset matters. It is raised while parsing kitty.conf (or a remote-control option set).

Source

Thrown at kitty/options/parse.py:1240

        ans["placement_strategy"] = val

    choices_for_placement_strategy = frozenset(('top-left', 'top', 'top-right', 'left', 'center', 'right', 'bottom-left', 'bottom', 'bottom-right'))

    def pointer_shape_when_dragging(self, val: str, ans: dict[str, typing.Any]) -> None:
        ans['pointer_shape_when_dragging'] = pointer_shape_when_dragging(val)

    def pointer_shape_when_grabbed(self, val: str, ans: dict[str, typing.Any]) -> None:
        val = val.lower()
        if val not in self.choices_for_pointer_shape_when_grabbed:
            raise ValueError(f"The value {val} is not a valid choice for pointer_shape_when_grabbed")
        ans["pointer_shape_when_grabbed"] = val

    choices_for_pointer_shape_when_grabbed = choices_for_default_pointer_shape

    def progress_bar(self, val: str, ans: dict[str, typing.Any]) -> None:
        val = val.lower()
        if val not in self.choices_for_progress_bar:
            raise ValueError(f"The value {val} is not a valid choice for progress_bar")
        ans["progress_bar"] = val

    choices_for_progress_bar = frozenset(('left', 'right', 'top', 'bottom', 'hidden'))

    def remap_modifiers(self, val: str, ans: dict[str, typing.Any]) -> None:
        ans['remap_modifiers'] = remap_modifiers(val)

    def remember_window_position(self, val: str, ans: dict[str, typing.Any]) -> None:
        ans['remember_window_position'] = to_bool(val)

    def remember_window_size(self, val: str, ans: dict[str, typing.Any]) -> None:
        ans['remember_window_size'] = to_bool(val)

    def remote_control_password(self, val: str, ans: dict[str, typing.Any]) -> None:
        for k, v in remote_control_password(val, ans["remote_control_password"]):
            ans["remote_control_password"][k] = v

    def repaint_delay(self, val: str, ans: dict[str, typing.Any]) -> None:

View on GitHub (pinned to 6d5d0c4406)

Solutions

  1. Change the value to one of: left, right, top, bottom, or hidden
  2. Check spelling and remove extra whitespace; the value must be a single word
  3. If copied from another config, re-check the kitty docs for progress_bar

Example fix

# before
progress_bar none
# after
progress_bar hidden
Defensive patterns

Strategy: validation

Validate before calling

from kitty.options.parse import Parser
assert 'hidden' in Parser.choices_for_progress_bar  # validate before use
value = value.lower()
if value not in ('left','right','top','bottom','hidden'):
    raise SystemExit(f'bad progress_bar: {value}')

Type guard

def is_progress_bar(v: str) -> bool:
    return v.lower() in ('left','right','top','bottom','hidden')

Prevention

When it happens

Trigger: Setting `progress_bar` in kitty.conf or via the remote control `set_option` / kitten CLI to anything outside {'left','right','top','bottom','hidden'}, e.g. `progress_bar none` or `progress_bar Left-Top`.

Common situations: Typos, guessing 'none' instead of 'hidden', or copy-pasting configs from older kitty versions/other terminals with different value names.

Related errors


AI-assisted analysis of kovidgoyal/kitty@6d5d0c4406 (2026-08-27). Data as JSON: /api/errors/d3e06ede290889fa. Report an issue: GitHub.