> For the complete documentation index, see [llms.txt](https://docs.kouch.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.kouch.dev/docs/rumble_plan.md).

# Rumble through Steam Input, with an optional upgrade (2026-09-29)

An addendum to `VPAD_PLAN.md` and ARCHITECTURE "Rumble". It doesn't replace them.

**Owner decision, 2026-09-29.** Rumble uses Steam's virtual pads by default. A ViGEmBus install is an optional upgrade that covers every seat. The owner also asked for a warning when a reorder leaves rumble behind.

## Why

* A game's rumble can't get back to Kouch over DSU. None of the DSU clients we checked has a rumble output. So the emulator has to rumble a pad it can see.
* Buttons, sticks and motion stay on DSU through Kouch, unchanged. A rumble pad is an **output only** in the emulator's config: nothing is read from it, so there's no double input.
* Verified live: an emulated controller's motor bound to Steam's virtual pad made the owner's real controller rumble.

## The modes, chosen at each launch

| Mode              | When                                                                                  | Seats                               | After a reorder in a game                                                                 |
| ----------------- | ------------------------------------------------------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------- |
| `steam` (default) | Windows, no upgrade                                                                   | 1–4 (Steam presents 4 virtual pads) | Rumble stays with each controller's previous player until the game restarts. Kouch warns. |
| `vpad`            | Windows with ViGEmBus installed and the upgrade on; always on the Deck/Linux (uinput) | every seat the profile has          | Follows instantly: rumble goes through Kouch to the seat's current pad                    |
| `none`            | the profile has no rumble section, or no pad for a seat                               | —                                   | —                                                                                         |

**How users see it (owner, 2026-09-29):** ViGEmBus is always described as an **optional driver for a better experience on Windows**, in Settings, the user guide and PROFILE\_AUTHORING. Kouch works fully without it.

The ViGEmBus pads are the driver's target class **outside** the 4 XInput slots, so they never compete with Steam's pads, and 8 players work. Kouch never downloads the driver. Settings says where to get it.

## Work

| Item                      | Who       | What                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| R1 seat → Steam pad       | C         | `gamepad_index` on each device in the snapshot, from `SteamCtx::gamepad_index` (`GetGamepadIndexForController`). Read at launch.                                                                                                                                                                                                                                                                                                                                                            |
| R2 upgrade pads           | C         | A ViGEmBus target outside XInput in `kouch-vpad`; check on the owner's PC how many can be open at once (8 needed).                                                                                                                                                                                                                                                                                                                                                                          |
| R3 profile rumble section | B         | A `rumble` section in the profile: the config file and key per player (`{player}`), and the value template per mode (`steam`: the Steam pad's index; `vpad`: the virtual pad's index). At launch Kouch resolves each seat, and a seat without a pad gets an empty value (no rumble, no error). Validation, tests, PROFILE\_AUTHORING "Rumble".                                                                                                                                              |
| R4 contract               | B         | The session carries its rumble mode (`steam` / `vpad` / `none`) so the UI knows when a reorder leaves rumble behind.                                                                                                                                                                                                                                                                                                                                                                        |
| R5 warning + setting      | A         | When the players are reordered during a game in `steam` mode: "Rumble still follows the old order. Restart game to update it. Install ViGEmBus to have rumble follow reorders instantly.", with a **Restart game** action (the existing graceful restart, `session_restart`). Steam's Input API has no call to turn its virtual pads off, so Kouch can't stop the rumble instead. Settings › Controllers: the upgrade's state (driver found or not), a switch, and where to get the driver. |
| R6 verification           | B + owner | Windows in both modes (felt, then a reorder); the Deck (uinput); EARLY\_TESTS row 16.                                                                                                                                                                                                                                                                                                                                                                                                       |

## Status

| Item | Status                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| R1   | asked (C), then paused; resumed with this plan                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| R2   | built (C, ADR 0023): `VpadKind::RumbleOnly`, on Windows the driver's second target class under the alias `SecondTarget` (reports no input; its rumble comes from the patched `vendor/vigem-client`), elsewhere a standard pad; `kouch_vpad::appears_as`. Kouch never reads its own pads: the input thread tells each source what it just opened, and SDL (by ids) and Steam Input (by kind) claim the matching new device within 5 s and ignore it until it goes (`kouch-input` `own_pads`). Waits for the check on the owner's PC (8 at once, the device name the emulator sees, Kouch ignoring them), with Kouch closed and the owner idle; B schedules it |
| R3   | to do (B)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| R4   | to do (B)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| R5   | to do (A)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| R6   | the Steam route felt once on Windows (2026-09-29); the rest to do                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.kouch.dev/docs/rumble_plan.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
