# bMUD Help Guide

**Beranek MUD Client — A Modern Cross-Platform MUD Client**

Version 0.1.0 | [beranek.us/bmud](https://beranek.us/bmud)

---

## Table of Contents

1. [Getting Started](#getting-started)
2. [Connecting to a MUD](#connecting-to-a-mud)
3. [The Interface](#the-interface)
4. [Triggers](#triggers)
5. [Aliases](#aliases)
6. [Timers](#timers)
7. [Macros](#macros)
8. [Variables](#variables)
9. [The Automapper](#the-automapper)
10. [Pattern Wildcards](#pattern-wildcards)
11. [Command Line Features](#command-line-features)
12. [Hash Commands](#hash-commands)
13. [Python Scripting](#python-scripting)
14. [Settings Editor](#settings-editor)
15. [Preferences](#preferences)
16. [Keyboard Shortcuts](#keyboard-shortcuts)
17. [Licensing](#licensing)

---

## Getting Started

### What is bMUD?

bMUD is a modern MUD (Multi-User Dungeon) client for macOS and Windows. It connects you to text-based multiplayer games and provides automation tools like triggers, aliases, an automapper, and a Python scripting engine.

bMUD is inspired by the legendary cMUD/zMUD clients but rebuilt from scratch with modern technology: Python scripting instead of zScript, a premium dark UI, and cross-platform support.

### First Launch

When you start bMUD, you'll see the **Welcome Screen** with your saved connections. If this is your first time:

1. Click the **"+ Add New Connection"** card
2. Fill in the **Connection** tab: Host (e.g., `aardmud.org`), Port (e.g., `4000`), and a name
3. Optionally fill in the **Character** tab with your character name and password
4. Click **Connect** to connect immediately, or **Save** to add it to your favorites

### The Welcome Screen

The Welcome Screen shows all your saved MUD connections as visual cards. Each card shows:
- MUD name and character name
- Host and port
- Last connected date

**Double-click** a card to connect. **Right-click** for options (Connect, Edit, Delete).

---

## Connecting to a MUD

### From the Welcome Screen

- Double-click a saved connection card
- Or select a card and click the **Connect** button

### From the Toolbar

- Click the **Connect** button in the toolbar (shows saved connections)
- Or use **Ctrl+N** / **File > New Connection** for a new connection

### Multiple Sessions

bMUD supports multiple simultaneous MUD connections. Each session has its own tab with independent triggers, aliases, button bars, gauges, and map.

Switch between sessions with **Ctrl+Tab** or click on session tabs.

### Disconnecting

- Click **Disconnect** in the toolbar or **File > Disconnect**
- Or use **Ctrl+D**
- A dialog will ask if you want to reconnect

### Auto-Reconnect

Check "Auto-reconnect on disconnect" in the reconnect dialog, or set it in the Character Editor (Character tab). When enabled, bMUD reconnects automatically if the connection drops.

---

## The Interface

### Main Window Layout

```
┌──────────────────────────────────────────────────┐
│ Menu Bar: File Edit View Options Actions Tools... │
│ Toolbar: [Connect][Triggers][Aliases][Map]...     │
├────────────────────────┬─────────────────────────┤
│                        │                         │
│  [Button Bar]          │   Dock Panels           │
│  MUD Output            │   (Map, Editor,         │
│  (scrolling text)      │    Settings, REPL)      │
│                        │                         │
│  [Gauge Bar]           │                         │
│  [Status Bar]          │                         │
│  > Command Input    🟢 │                         │
└────────────────────────┴─────────────────────────┘
```

### Toolbar Buttons

| Button | Function |
|--------|----------|
| **Connect** | Open saved connections / new connection |
| **Disconnect** | Disconnect from current MUD |
| **Settings** | Open the Settings Editor (triggers/aliases/timers) |
| **Prefs** | Open Preferences dialog |
| **Triggers** | Create a new trigger |
| **Aliases** | Create a new alias |
| **Timers** | Create a new timer |
| **Editor** | Open the Python script editor |
| **REPL** | Open the Python interactive console |
| **Pattern** | Open the pattern tester |
| **Map** | Toggle the automapper panel |
| **Quit** | Exit bMUD |

### Dock Panels

Panels can be docked to any side of the window or floated as separate windows:

- **Settings Editor** — manage all triggers, aliases, timers, macros
- **Script Editor** — write Python scripts with syntax highlighting
- **REPL Console** — interactive Python with bMUD API access
- **Pattern Tester** — test regex/wildcard patterns against MUD text
- **Map** — the automapper
- **Captures** — tabbed windows for routed text (tells, chat, etc.)

Toggle panels from the **View** menu or toolbar buttons.

### Command Input

The command input at the bottom is where you type commands to send to the MUD.

- **Enter** — send command (or repeat last command if empty)
- **Up/Down arrows** — browse command history
- **Escape** — clear the input
- **Green dot** (right side) — connection status indicator
- **Gold arrow** (left side) — prompt indicator

### Gauges and Status Bar

Scripts and triggers can create visual gauge bars (HP/MP/XP) and status lines that update in real-time. These are per-session — each MUD connection has its own.

---

## Triggers

Triggers automatically respond when specific text appears from the MUD.

### Creating Triggers

**Method 1: Toolbar**
Click **Triggers** in the toolbar to open the visual trigger creator.

**Method 2: Command line**
```
#trigger {pattern} {command}
#trigger {* tells you *} {reply Hello!}
```

**Method 3: Right-click output**
Select text in the MUD output, right-click, and choose "Create Trigger from Selection."

**Method 4: Python scripting**
```python
@trigger(r"(\w+) tells you '(.*)'")
def on_tell(match):
    sender = match.group(1)
    echo(f"Got a tell from {sender}!")
```

### Trigger Actions

| Action | Description |
|--------|-------------|
| **Send Command** | Send a command to the MUD when pattern matches |
| **Highlight Line** | Change the line's color |
| **Gag (Hide Line)** | Remove the line from display |
| **Substitute Text** | Replace matched text with new text |
| **Capture to Window** | Route the line to a named capture panel |
| **Play Sound** | Play a WAV/MP3 file |

### Trigger Options

| Option | Description |
|--------|-------------|
| **Pattern Type** | Wildcard (default) or Regex |
| **Case Insensitive** | Ignore uppercase/lowercase differences |
| **Stop Processing** | Don't fire any more triggers on this line |
| **Prompt Only** | Only match on prompt lines (GA/EOR), not regular text |
| **Priority** | 1-100, lower fires first |
| **Group** | Organize triggers into groups for bulk enable/disable |
| **Enabled** | Toggle trigger on/off without deleting it |

### Quick Trigger Commands

```
#trigger {pattern} {command}     Create a trigger
#gag {pattern}                   Gag lines matching pattern
#highlight {#FF0000} {pattern}   Highlight matching lines in red
#untrigger name                  Remove a trigger
```

---

## Aliases

Aliases are command shortcuts that expand when you type them.

### Creating Aliases

**Method 1: Toolbar**
Click **Aliases** in the toolbar.

**Method 2: Command line**
```
#alias {name} {expansion}
#alias {gg} {gossip %1}
#alias {prep} {sharpen sword;drink potion;cast armor}
```

### Parameter Substitution

| Syntax | Meaning |
|--------|---------|
| `%1` | First word (or ALL args if only %1 is used) |
| `%2`, `%3`... | Second word, third word, etc. (when multiple used) |
| `%*` | All arguments |

**Examples:**
- `#alias {gg} {gossip %1}` — `gg hello everyone` → `gossip hello everyone`
- `#alias {heal} {cast %1 %2}` — `heal cure bob` → `cast cure bob`
- `#alias {prep} {sharpen;drink;cast armor}` — semicolons send multiple commands

### Removing Aliases

```
#unalias name
```

---

## Timers

Timers execute commands at regular intervals.

### Creating Timers

**Method 1: Toolbar**
Click **Timers** in the toolbar.

**Method 2: Command line**
```
#timer {name} {seconds} {command}
#timer {autoheal} {30} {cast heal self}
```

### Timer Options

- **Repeat** — fire repeatedly (default) or once (alarm)
- **Enabled** — toggle on/off
- **Group** — organize with other timers

### Removing Timers

```
#untimer name
```

---

## Macros

Macros bind keyboard shortcuts to commands. Create them via the Settings Editor or Python scripting:

```python
@macro("Ctrl+F1")
def quick_heal():
    send("cast heal self")

@macro("F5")
def auto_attack():
    send("kill target")
```

---

## Variables

Variables store data that persists across sessions.

### Setting Variables

```
#var target goblin
#var hp 100
```

### In Python Scripts

```python
vars["target"] = "goblin"
vars["hp"] = 100
echo(f"Targeting: {vars['target']}")
```

Variables are saved automatically to `~/.bmud/sessions/{id}/variables.json`.

---

## The Automapper

The automapper builds a visual map as you explore the MUD.

### Getting Started

1. Open the Map panel (click **Map** in toolbar or **View > Map Panel**)
2. Click **Record** to start recording
3. Walk around the MUD — rooms appear on the map automatically

### Map Controls

| Control | Function |
|---------|----------|
| **Record** | Toggle auto-mapping on/off |
| **Edit** | Toggle edit mode (drag rooms, multi-select) |
| **+/-/1:1** | Zoom in/out/reset |
| **Level** | Switch between map levels (z-axis) |
| **Center** | Center map on current room |
| **Config** | Configure room/exit detection patterns |
| **Export** | Save map to JSON file (share with others) |
| **Import** | Load a shared map file |

### Room Interaction

- **Click** a room — see its properties (name, exits, notes)
- **Double-click** — speedwalk to that room
- **Right-click** — context menu:
  - Set as Current Position
  - Walk Here
  - Color This Room (edit mode)
  - Delete Room (edit mode)
  - Properties

### Speedwalk

When you double-click a room, bMUD computes the shortest path and walks there automatically.

**Speed modes:**
- **Fast** — no delay (spam movement)
- **Safe** — waits for room confirmation before each step
- **Slow** — 1.5 second delay between steps

Controls: **Pause** / **Step** (one room) / **Stop**

### Speedwalk Syntax

Type speedwalk notation directly in the command line:
```
3n2es     → north, north, north, east, east, south
5w        → west, west, west, west, west
1n1e1s1w  → north, east, south, west
```

### Zones

Organize your map into zones (areas):
- **"+" button** or right-click zone tree → "New Zone"
- Right-click zone → Rename, Set Color, Delete
- In edit mode: select rooms on map, right-click zone → "Move Rooms to This Zone"

### Map Commands

```
#map         Toggle mapper on/off
#teleport N  Set current position to room #N
#walk N      Speedwalk to room #N
#mapinfo     Show map statistics
```

### How Room Detection Works

bMUD detects rooms from MUD text using configurable patterns:

1. You send a direction command (e.g., `north`)
2. The MUD sends back: room name, description, exits, prompt
3. bMUD parses this and creates/matches a room on the map
4. If the MUD supports GMCP Room.Info, that takes priority (more reliable)

Configure detection patterns via **Map panel > Config** for your specific MUD.

### Map Sharing

Export your map: **Map toolbar > Export** → saves as `.json` file.
Share it with other players. They import it: **Map toolbar > Import**.

---

## Pattern Wildcards

bMUD supports zMUD/cMUD-compatible wildcard patterns:

### Wildcards

| Symbol | Matches | Example |
|--------|---------|---------|
| `*` | Any characters | `* tells you *` |
| `?` | Exactly one character | `?ello` matches "Hello" |
| `%w` | Letters only (a-z) | `%w attacks you` |
| `%d` | Digits (0-9) | `You get %d coins` |
| `%n` | Signed number (+/- with commas) | `%n gold` |
| `%s` | Whitespace | `HP:%sMV:` |
| `%x` | Non-whitespace | `%x` |
| `%a` | Alphanumeric | `%a` |
| `%p` | Punctuation | `%p` |
| `%t` | Direction word | `You go %t` |

### Anchors and Special

| Symbol | Meaning |
|--------|---------|
| `^` | Start of line |
| `$` | End of line |
| `[abc]` | Match any character in set |
| `{a\|b\|c}` | Match any of the alternatives |
| `{^text}` | Negative match (NOT this text) |
| `~` | Escape next character (literal) |

### Capture Groups

Wildcards and parenthesized expressions create capture groups accessible as `%1`, `%2`, etc. in commands:

```
Pattern:  * hits you for %d damage
Line:     Goblin hits you for 50 damage
%1 = Goblin
%2 = 50
Command:  say %1 hit me for %2 damage!
```

### Regex Mode

For advanced patterns, switch to Regex mode (Python `re` syntax):
```
(?i)(\w+) tells you '(.*)'
```

---

## Command Line Features

### Semicolon Stacking

Send multiple commands at once:
```
kill goblin; loot corpse; eat bread
```

### Repeat Last Command

Press **Enter** with an empty input to repeat your last command. Perfect for:
```
e [Enter] [Enter] [Enter]    → moves east 4 times
```

Configurable in **Preferences > General**.

### Speedwalk Syntax

```
3n2es   → north, north, north, east, east, south
```

### Find in Output

**Ctrl+F** opens a find bar above the output. Search for text with:
- **F3** — Find next
- **Shift+F3** — Find previous
- **Escape** — Close find bar

---

## Hash Commands

Create and manage scripts from the command line. Most commands have short aliases shown in parentheses.

### Triggers & Aliases

| Command | Description |
|---------|-------------|
| `#trigger {pattern} {command}` (`#tr`) | Create a trigger |
| `#action {pattern} {command}` (`#ac`) | Same as #trigger (zMUD/TinTin compat) |
| `#temp {pattern} {command}` | Create a one-shot trigger (fires once, then auto-deletes) |
| `#alias {name} {expansion}` (`#al`) | Create an alias |
| `#timer {name} {secs} {command}` (`#ti`) | Create a repeating timer |
| `#untrigger name` (`#untr`) | Remove a trigger |
| `#unalias name` (`#unal`) | Remove an alias |
| `#untimer name` (`#unti`) | Remove a timer |
| `#gag {pattern}` | Gag (hide) lines matching pattern |
| `#highlight {color} {pattern}` (`#hi`) | Highlight matching lines |
| `#substitute {pattern} {replacement}` (`#sub`) | Replace matched text in output |

**Examples:**
```
#trigger {* tells you *} {echo Message from %1: %2}
#action {You are hungry} {eat bread}
#temp {You have arrived} {look}
#alias {gg} {get all corpse}
#timer {autolook} {30} {look}
#gag {has left the game}
#highlight {#FF0000} {DANGER}
#substitute {Bob} {Robert}
```

### Classes & Enable/Disable

| Command | Description |
|---------|-------------|
| `#t+` | Enable ALL triggers and timers (aliases unaffected) |
| `#t+ groupname` | Enable triggers and timers in a group |
| `#t-` | Disable ALL triggers and timers (aliases unaffected) |
| `#t- groupname` | Disable triggers and timers in a group |
| `#tm+` | Enable ALL timers only |
| `#tm+ groupname` | Enable timers in a group |
| `#tm-` | Disable ALL timers only |
| `#tm- groupname` | Disable timers in a group |
| `#class` (`#cla`) | List all classes/groups |
| `#class name 1` | Enable a class |
| `#class name 0` | Disable a class |
| `#ignore` (`#ig`) | Toggle trigger processing on/off |
| `#killall` (`#ki`) | Delete ALL triggers, aliases, and timers |

**Examples:**
```
#t- Combat                → disable the "Combat" class
#t+                       → enable everything
#tm-                      → disable all timers
#class                    → list all groups
#class Healing 0          → disable "Healing" class
#ignore                   → pause trigger processing
```

### Loops & Repeat

| Command | Description |
|---------|-------------|
| `#5 north` | Repeat command 5 times (replace 5 with any number) |
| `#repeat N command` (`#rep`) | Repeat command N times |
| `#loop {start,end} {command}` (`#loo`) | Loop with counter variable `%i` |
| `#forall {a\|b\|c} {command}` (`#fo`) | Iterate through a list using `%i` |

**Examples:**
```
#5 north                  → walk north 5 times
#repeat 3 say hello       → say "hello" 3 times
#loop {1,5} {get %i.sword}   → get 1.sword, 2.sword, ... 5.sword
#forall {sword|shield|helm} {drop %i}  → drop each item
```

### Variables & Math

| Command | Description |
|---------|-------------|
| `#var name value` | Set a session variable |
| `#gvar name value` | Set a global variable (persists across sessions) |
| `#math varname expression` (`#mat`) | Evaluate math and store result |
| `#add varname value` (`#ad`) | Add a number to an existing variable |

**Examples:**
```
#var target goblin        → set @target to "goblin"
#var hp 100
#math damage 50+25        → damage = 75
#add hp -30               → hp = 70
#gvar gold 5000           → persists even after disconnect
```

### Output & Communication

| Command | Description |
|---------|-------------|
| `#echo text` | Display text locally (not sent to MUD) |
| `#say text` (`#sa`, `#show`, `#sh`) | Same as #echo |
| `#send text` | Send raw text to MUD (bypasses alias expansion) |
| `#cr` | Send a blank line to the MUD |

### Session & Connection

| Command | Description |
|---------|-------------|
| `#reconnect` (`#rc`) | Reconnect to the MUD |
| `#disconnect` (`#dc`) | Disconnect from the MUD |
| `#wait seconds` | Pause script execution |
| `#waitfor {pattern} [timeout]` | Wait for MUD output matching pattern |
| `#if {expression} {command}` | Conditional execution |
| `#abort` (`#ab`) | Stop processing current command line |
| `#pause` | Pause/resume all running scripts |

**Examples:**
```
#wait 2                   → pause 2 seconds
#waitfor {You can see again}  → wait for blindness to wear off
#if {@hp < 50} {cast heal}    → heal if HP is low
```

### Tools & Utilities

| Command | Description |
|---------|-------------|
| `#tts on/off/speak/rate/volume` | Text-to-speech control |
| `#discord on/off/status` | Discord Rich Presence |
| `#overlay on/off/status` | Stream overlay for OBS |
| `#note {text}` | Add a session note |
| `#stash` | Stash/restore typed text |
| `#record start/stop/status` | Session recording for replay |
| `#debug` | Toggle trigger debugger/profiler |
| `#suggest` | AI-suggest triggers from recent MUD output |
| `#exportlog [file.html]` | Export session as styled HTML |
| `#version` (`#ver`) | Show bMUD version |
| `#help` | Show all commands |

### Scripting & Settings

| Command | Description |
|---------|-------------|
| `#clearscripts` (`#cs`) | Clear all loaded scripts |
| `#reload` | Reload init.py script |
| `#direction {name} {reverse}` (`#dir`) | Add a custom direction |
| `#menu {label} {command}` | Add a right-click menu item |
| `#stwin {text}` | Add text to the status window |
| `#db subcommand` | Database operations (create, insert, search, list) |
| `#quest add/list/complete/abandon` | Quest tracker |

### Automapper

| Command | Description |
|---------|-------------|
| `#map` | Toggle mapper display |
| `#teleport N` | Set current position on map |
| `#walk N` | Speedwalk to room N |
| `#nomap` | Prevent current line from being parsed by mapper |
| `#mapinfo` | Show map statistics |

---

## Python Scripting

bMUD uses Python 3.12 as its scripting language. Scripts are loaded from `~/.bmud/scripts/init.py`.

### Available API

```python
# Sending and displaying
send("command")           # Send to MUD
echo("text")              # Display locally (gold text)
capture("window", "text") # Route to capture window

# Decorators
@trigger("pattern")       # Create trigger
@alias("name")            # Create alias
@timer(seconds)           # Create repeating timer
@alarm(seconds)           # One-shot timer
@macro("Ctrl+F1")         # Keyboard macro
@event("on_connect")      # Event handler
@gmcp_trigger("Char.Vitals")  # GMCP trigger
@oninput()                # Input trigger (intercept commands)

# UI
set_gauge("HP", value, max)   # Update gauge bar
set_status("info", "template") # Update status bar
add_button("name", "label", "command") # Add button

# Variables
vars["key"] = "value"     # Set variable
vars["key"]               # Get variable

# Classes/groups
enable_class("Combat")    # Enable a group
disable_class("Combat")   # Disable a group

# Engine access
engine                    # Full engine reference
gmcp                      # GMCP data store
```

### Script Editor

Open the script editor: **View > Script Editor** or **Ctrl+E**

Features: Python syntax highlighting, line numbers, code folding, autocomplete.

### REPL Console

Open the REPL: **View > REPL Console** or **Ctrl+R**

Type Python interactively with full access to `send()`, `echo()`, `vars`, and all bMUD API.

---

## Settings Editor

Open with **Ctrl+P** or toolbar **Settings** button.

### Three-Pane Layout

- **Left**: Class/group tree (folders)
- **Center**: Item list for selected class
- **Right**: Inline property editor

### Features

- Filter by type: All, Triggers, Aliases, Macros, Timers
- Create new items from the toolbar
- Right-click items: Enable/Disable, Delete
- Edit inline: change properties and click **Apply Changes**
- Import/Export: share trigger packages as `.json` files

---

## Preferences

Open with **Ctrl+,** or **Options > Preferences**.

### Tabs

| Tab | Settings |
|-----|----------|
| **General** | Startup action, confirm quit, repeat last command, scrollback |
| **Colors** | Color scheme, background/foreground, ANSI color grid |
| **Fonts** | Output font, input font, UI font (with preview) |
| **Sounds** | Enable sounds, connect/disconnect/beep file paths |
| **Network** | Encoding, terminal type, keep-alive, proxy |
| **Scripting** | Auto-reload scripts, confirm delete, default script path |
| **Logging** | Enable session logging, log directory, timestamps, ANSI |
| **AI** | Claude API key, Copilot key, Apple Intelligence, model selection |
| **Advanced** | Debug mode, strict telnet |

---

## Keyboard Shortcuts

### General

| Shortcut | Action |
|----------|--------|
| **Ctrl+N** | New Connection |
| **Ctrl+D** | Disconnect |
| **Ctrl+S** | Save Session |
| **Ctrl+Q** | Quit |
| **Ctrl+Tab** | Next Session |
| **Ctrl+Shift+Tab** | Previous Session |

### Editing

| Shortcut | Action |
|----------|--------|
| **Ctrl+C** / **Cmd+C** | Copy selected text |
| **Ctrl+V** / **Cmd+V** | Paste |
| **Ctrl+A** / **Cmd+A** | Select all text in output |
| **Ctrl+F** | Find in Output |
| **F3** | Find Next |
| **Shift+F3** | Find Previous |
| **Ctrl+=** / **Cmd+=** | Zoom In (increase font) |
| **Ctrl+-** / **Cmd+-** | Zoom Out (decrease font) |

### Panels

| Shortcut | Action |
|----------|--------|
| **Ctrl+P** | Settings Editor |
| **Ctrl+E** | Script Editor |
| **Ctrl+R** | REPL Console |
| **Ctrl+T** | Pattern Tester |
| **Ctrl+,** | Preferences |

### Command Input

| Key | Action |
|-----|--------|
| **Enter** | Send command (or repeat last) |
| **Up/Down** | Command history |
| **Ctrl+Up** | Search history by prefix |
| **Tab** | Tab-complete from MUD output words |
| **Backspace** (empty input) | Clear queued last-command (so Enter sends blank) |
| **Escape** | Clear input and queued last-command |
| **PgUp** | Split scrollback (freeze) |
| **PgDn** | Rejoin scrollback |
| **Numpad 1-9** | Directional movement (8=N, 2=S, 4=W, 6=E, etc.) |

### HUD Controls (Command Bar)

| Icon | Meaning |
|------|---------|
| **Lightning bolt** (gold/gray) | Triggers enabled/disabled — click to toggle (aliases unaffected) |
| **Stopwatch** (green/red) | Timers enabled/disabled — click to toggle |
| **Dot** (green/red) | Connection status |
| **Clock** | Session duration |

---

## Licensing

### Free Trial

bMUD includes a **45-day free trial** of all Pro features. After the trial:

### Free Version

- Single MUD session
- Up to 25 triggers and aliases
- Basic connection and ANSI colors
- Command history

### Pro Version — $19.99

- Unlimited triggers, aliases, timers, macros
- Multiple simultaneous sessions
- Full automapper with pathfinding and speedwalk
- Script editor and Python REPL
- Session logging
- Sound system
- Package import/export
- All protocol support (GMCP, MCCP, MXP, etc.)

Purchase at [beranek.us/bmud](https://beranek.us/bmud) — $19.99
App Store — $29.99

### AI Add-on — $9.99

- Claude API integration (bring your own key)
- Apple Intelligence on macOS 15+
- Microsoft Copilot support
- AI trigger suggestions and game help

Purchase at [beranek.us/bmud](https://beranek.us/bmud) — $9.99
App Store — $14.99

### Activating a License

**Help > Activate Pro License** — enter your BMUD-XXXX-XXXX-XXXX-XXXX key
**Help > Activate AI Add-on** — enter your BMAI-XXXX-XXXX-XXXX-XXXX key

---

## Support

- Website: [beranek.us/bmud](https://beranek.us/bmud)
- Report bugs: Help > Report Bug
- Documentation: This help file

---

*bMUD — Beranek MUD Client*
*Built with Python 3.12, PySide6, and QScintilla*
*Inspired by cMUD/zMUD, reimagined for 2026*
