kovidgoyal/kitty · error

There was an error using a custom RC auth function…

Error message

There was an error using a custom RC auth function, blocking the remote command. Error: {e}

What it means

A custom remote-control authorization function raised an exception while vetting a command; kitty blocks the command (fail-closed) and logs the error plus a traceback.

Solutions

  1. Read the printed traceback in kitty's log to find the failing line in your auth function
  2. Make the callback defensive: use pcmd.get(...), wrap risky checks in try/except and return explicit False
  3. Return None (not an exception) to let other checks run, or True/False to decide

Example fix

# before
def is_cmd_allowed(pcmd, window, from_socket, extra_data):
    return pcmd['cmd'] in ALLOWED

# after
def is_cmd_allowed(pcmd, window, from_socket, extra_data):
    return pcmd.get('cmd') in ALLOWED
Defensive patterns

Strategy: try-catch

Try / catch

def is_cmd_allowed(pcmd, window, from_socket, extra_data):
    try:
        return check(pcmd)
    except Exception:
        return False  # fail closed, kitty blocks the command

Prevention

When it happens

Trigger: The user-configured is_cmd_allowed callback raises any exception during is_cmd_allowed, so ret is forced to False.

Common situations: Auth script bugs: KeyError on unexpected pcmd fields, attribute errors on window objects across kitty versions, or network calls in the auth function failing.

Related errors


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

Appendix: source

Thrown at kitty/remote_control.py:163

                self.command_patterns.append(fnmatch_pattern(item))

    def is_cmd_allowed(self, pcmd: dict[str, Any], window: Optional['Window'], from_socket: bool, extra_data: dict[str, Any]) -> bool:
        cmd_name = pcmd.get('cmd')
        if not cmd_name:
            return False
        if not self.function_checkers and not self.command_patterns:
            return True
        for x in self.command_patterns:
            if x.match(cmd_name) is not None:
                return True
        for f in self.function_checkers:
            try:
                ret = f(pcmd, window, from_socket, extra_data)
            except Exception as e:
                import traceback

                traceback.print_exc()
                log_error(f'There was an error using a custom RC auth function, blocking the remote command. Error: {e}')
                ret = False
            if ret is not None:
                return ret
        return False


@lru_cache(maxsize=256)
def password_authorizer(auth_items: frozenset[str]) -> PasswordAuthorizer:
    return PasswordAuthorizer(auth_items)


user_password_allowed: dict[str, bool] = {}


def is_cmd_allowed(pcmd: dict[str, Any], window: Optional['Window'], from_socket: bool, extra_data: dict[str, Any]) -> bool | None:
    sid = pcmd.get('stream_id', '')
    if sid and active_streams.get(sid, '') == pcmd['cmd']:
        return True

View on GitHub (pinned to 6d5d0c4406)