# Kitty

> Instructions for using kitty remote control to spawn windows/tabs, send text, inspect output, and manage processes. Useful for running servers or long-running tasks in the background.

- Skill: `xyenon/kitty` (Agent Skill)
- Install (CLI): `npx skillmds@latest add xyenon/kitty`
- Raw SKILL.md: https://api.skillmd.com/api/skills/xyenon/kitty/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: xyenon (https://skillmd.com/u/xyenon)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/xyenon/kitty

---


# Kitty Remote Control Skill

This skill empowers you to manage multiple concurrent processes (like servers, watchers, or long builds) using kitty's remote control feature directly from the `Bash` tool.

Since you are running inside a kitty terminal, you can spawn new windows or tabs to handle these tasks without blocking your main communication channel.

## 1. Verify Environment & Check Status

First, verify you are running inside kitty with remote control enabled. You can try listing windows:

```bash
kitten @ ls
```

If this fails, check if `$KITTY_LISTEN_ON` is set. Note that in some configurations it might be empty even if remote control is enabled (using default sockets).

```bash
echo $KITTY_LISTEN_ON
```

If remote control is not enabled, the user should add `allow_remote_control yes` to their `kitty.conf` or start kitty with `--allow-remote-control`.

## 2. Spawn a Background Process

To run a command (e.g., a dev server) in a way that persists and can be inspected:

1. **Create a new window in the SAME tab as the agent** (recommended):
   Use `$KITTY_WINDOW_ID` to ensure the new window stays with you.

   ```bash
   WID=$(kitten @ launch --match "id:$KITTY_WINDOW_ID" --title "server-log" --keep-focus)
   echo "Created window with ID: $WID"
   ```

2. **Or create a new tab:**

   ```bash
   kitten @ launch --type=tab --title "server-log" --keep-focus
   ```

3. **Launch with a command directly:**
   (Use `--hold` if you want the window to stay open after the command finishes)

   ```bash
   kitten @ launch --title "server-log" --keep-focus --hold npm start
   ```

## 3. Send Text/Commands to a Window

Send keystrokes to a specific window. Use the window ID for precision, or matching for convenience.

**Using ID (Reliable):**

```bash
kitten @ send-text --match "id:$WID" "npm start\n"
```

**Using Matching (Title):**

Note: Use `\n` for Enter. In some shells, you may need to use `$'...'` or pipe to ensure the newline is interpreted correctly.

```bash
kitten @ send-text --match "title:server-log" "npm start
"
# OR
echo "npm start" | kitten @ send-text --match "title:server-log" --stdin
```

Or send to all windows:

```bash
kitten @ send-text --all "echo hello\n"
```

## 4. Inspect Output (Get Text from Window)

Get the current visible text from a window:

```bash
kitten @ get-text --match "id:$WID"
```

Get text including scrollback buffer:

```bash
kitten @ get-text --match "title:server-log" --extent=all
```

Get only the last command output (requires shell integration):

```bash
kitten @ get-text --match "title:server-log" --extent=last_cmd_output
```

## 5. Focus or Bring Window to Front

Focus a specific window:

```bash
kitten @ focus-window --match "id:$WID"
```

Focus a specific tab:

```bash
kitten @ focus-tab --match "title:server-log"
```

## 6. Interact with Processes

**Send Ctrl+C (Interrupt):**

```bash
kitten @ send-text --match "id:$WID" "\x03"
```

**Close a window:**

```bash
kitten @ close-window --match "id:$WID"
```

**Close a tab:**
(Note: You can close a tab by matching its title or any window ID inside it)

```bash
# By ID of a window inside the tab
kitten @ close-tab --match "id:$WID"

# By tab title
kitten @ close-tab --match "title:server-log"
```

## 7. Advanced: Window Matching

Kitty supports powerful matching expressions:

- `title:pattern` - Match by window title
- `id:number` - Match by window ID
- `pid:number` - Match by process ID
- `cwd:path` - Match by current working directory
- `cmdline:pattern` - Match by command line
- `state:focused` - Match the focused window
- `state:active` - Match the active window

Combine with `and`, `or`, `not`:

```bash
kitten @ focus-window --match "title:server and state:active"
```

## 8. Get Window/Tab Information

List all OS windows, tabs, and windows as JSON:

```bash
kitten @ ls
```

**Get current focused window ID:**

```bash
kitten @ ls | jq -r '.[].tabs[] | select(.is_focused) | .windows[] | select(.is_focused) | .id'
```

**Parse for specific info:**

```bash
kitten @ ls | jq '.[].tabs[].windows[] | {id, title, cmdline}'
```

## Summary of Pattern

1. `WID=$(kitten @ launch --title "NAME" --keep-focus [CMD])` - Create window and save ID
2. `kitten @ send-text --match "id:$WID" "CMD\n"` - Send command reliably
3. `kitten @ get-text --match "id:$WID"` - Read output
4. `kitten @ close-window --match "id:$WID"` - Cleanup

## Common Remote Control Commands

| Command | Description |
| ------- | ----------- |
| `kitten @ ls` | List all windows/tabs |
| `kitten @ launch` | Create new window/tab |
| `kitten @ send-text` | Send text to window |
| `kitten @ get-text` | Get text from window |
| `kitten @ focus-window` | Focus a window |
| `kitten @ focus-tab` | Focus a tab |
| `kitten @ close-window` | Close a window |
| `kitten @ close-tab` | Close a tab |
| `kitten @ signal-child` | Send signal to process |
| `kitten @ set-tab-title` | Change tab title |
| `kitten @ set-colors` | Change terminal colors |

