> 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/adr/0010-mods-netplay-game-settings.md).

# ADR 0010: Per-game Workshop mods, Steam netplay with matched mods, game-style settings

## Status

Accepted 2026-09-26. Pulls work forward from FEATURE\_PLAN Phase 5 (netplay) and Phase 7 (Workshop).

## Decision

**Game-style settings**

* Profile schema v2 adds `options`: typed settings declared by the profile.
* Each option is applied either as a launch argument or as a `config_edit`.
* They appear in a game-style options menu, with tabs Graphics, Controls, Audio, Multiplayer and Advanced.
* Options can be set per emulator and per game.

**Per-game mods**

* Sources: Workshop items tagged `mod`, a local `mods` folder, and `.kod` files that contain a `mods/` folder.
* Mods must be data only. They go through the theme validator plus an executable denylist.
* Mods are applied before launch and reverted after the game exits.
* A manifest records every file placed, so the revert still happens on the next start after a crash.

**Steam netplay**

* Lobby data carries:
  * the game hash
  * the emulator and its version
  * the ordered list of mods
* A player can join only if their own copy of the game has the same hash. **The ROM is never transferred.**
* Missing Workshop mods are downloaded automatically. Local-only mods must match by hash.
* Traffic goes over Steam's relay, through a local proxy to the emulator's own netplay. Each profile describes that netplay through a `netplay` adapter.

## Consequences

* Workshop items and Steam invites need Kouch's own app id. Lobbies can be tested on app 480.
* LAN play Mode A (ADR 0007) stays as the option that works without Steam.


---

# 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/adr/0010-mods-netplay-game-settings.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.
