> ## Documentation Index
> Fetch the complete documentation index at: https://wireblast.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Keys and saved settings

> Every hotkey, and what Wireblast keeps in ~/.wireblast between runs.

## In the wizard

| Key     | Action                                     |
| ------- | ------------------------------------------ |
| `↑` `↓` | Move between items                         |
| `←` `→` | Change a choice (also `h` / `l` / `space`) |
| `enter` | Continue                                   |
| `esc`   | Go back                                    |
| `?`     | Help overlay                               |
| `q`     | Quit                                       |

Text fields validate as you type. Enum fields are arrow-key choices, so you can't misspell one.

## While running

| Key      | Action                                                          |
| -------- | --------------------------------------------------------------- |
| `space`  | Pause or resume **transmitting**. The dashboard keeps updating. |
| `+`      | Increase the rate by 10%                                        |
| `-`      | Decrease the rate by 10%                                        |
| `g`      | Cycle the graph: packets/sec, bits/sec, off                     |
| `r`      | Reset the visible counters. Lifetime totals are kept.           |
| `?`      | Help overlay                                                    |
| `q`      | Stop cleanly and quit                                           |
| `ctrl+c` | Same as `q`                                                     |

<Note>
  Pausing stops transmission but doesn't bank rate credit, so resuming never releases a burst. And an unlimited rate stays unlimited under `+`/`-`, since scaling it would silently change which limit binds. Limits also clamp at 1, so repeated `-` can never reach zero, which would mean "unlimited".
</Note>

## After a run

| Key | Action                                                             |
| --- | ------------------------------------------------------------------ |
| `r` | Run it again                                                       |
| `e` | Edit settings, back to the settings form with everything filled in |
| `p` | Change pattern                                                     |
| `g` | Cycle the graph (the shape of a finished run is worth a look)      |
| `q` | Quit                                                               |

`r` re-resolves the next-hop MAC, which is what you want if the far end has moved. It skips the review screen, but **not** a confirmation that's genuinely needed.

Because the XDP program stays attached, `r` restarts in about two seconds instead of waiting out another link bounce.

## Reading the dashboard

```text theme={null}
Wireblast  running   elapsed 0:10 / -0:10
  interface  wb0  virtual · 1 queue(s) · native XDP · copy
  pattern    udp  fixed 512-byte frames
  rx filter  udp/9000
  rate       set 200kpps  actual 199.67 kpps
```

The interface line reports what the kernel **actually granted**, not what was requested: `native` versus `generic`, `zero-copy` versus `copy`. It also tells you whether this run reused an existing attachment (`XDP already attached`) or paid for a new one (`link back in 8.4s`).

Rates sit at the top of each counter column because they're what you watch. Totals sit below.

The sparkline shows the last 30-ish seconds, newest on the right. **TX and RX share one scale**, so a receiver taking a tenth of the traffic looks obviously different from one keeping up. A zero value draws `·` rather than a block, so "nothing happened" is visually distinct from "a trickle".

On a short terminal the graph is dropped rather than the footer.

## Saved settings

Wireblast remembers what you ran, so the next `sudo wireblast` starts prefilled.

| File                         | Contents                                       |
| ---------------------------- | ---------------------------------------------- |
| `~/.wireblast/last-run.json` | The most recent configuration                  |
| `~/.wireblast/history.json`  | Up to 20 distinct configurations, newest first |

Set `$WIREBLAST_HOME` to move them. Both are written atomically, and a corrupt or unreadable file just means "no history" rather than an error.

**When they're written:** every time a run starts from the TUI. `--no-tui` neither reads nor writes them, so scripted runs depend only on their flags.

**Flags win.** Saved settings prefill; any flag you actually passed overrides. A value that merely equals its default doesn't count as a choice, only flags you typed.

Clear them with:

```bash theme={null}
sudo wireblast --forget
```

### What is deliberately not remembered

<Warning>
  **Consent is never remembered.** `--yes` and `--allow-match-all` are always dropped, and a saved `--rx-mode all` is downgraded to `none`.

  Carrying a previous "yes" forward is exactly what those confirmations exist to prevent. And a later, unrelated run silently arriving with "take every packet from the kernel" already selected is a surprise nobody wants. Narrower receive modes are useful to remember, and are kept.
</Warning>

`--no-tui` and `--start` aren't remembered either, since they're about how you launched it, not what you ran. Neither is the graph mode: it's a display preference, not part of the run.

## The help overlay

`?` from anywhere shows the keys, plus a short explanation of L1 and L2 and a few things worth knowing:

* `--packet-size` is the whole Ethernet frame, including the 4-byte FCS.
* Rates are aggregate across every queue, not per queue.
* Transmit-only is the default: nothing is taken away from the kernel.
* The two graph rows share one scale, so TX and RX can be compared directly.
* The XDP program stays attached between runs, so `r` restarts instantly. It's reattached only if you change the interface, queue count or receive mode, and detached when you quit.
