# Stream Deck integration — handoff

## Summary

The Elgato Stream Deck plugin (`streamdeck-plugin/`) controls Paarrot via the local HTTP API: toggle mute/deafen, switch channels, send messages, and show status. It is a separate package from the main app but ships in the same monorepo.

## User-facing behavior

- User installs `.streamDeckPlugin` or copies `com.paarrot.streamdeck.sdPlugin` into Stream Deck plugins folder
- Requires Paarrot desktop running with API on `http://127.0.0.1:33384`
- Actions: Toggle Mute, Toggle Deafen, Change Channel, Send Message, Get Status

## Architecture

```
Stream Deck button press
  → com.paarrot.streamdeck.sdPlugin/plugin/index.js
    → fetch http://127.0.0.1:33384/...
      → Paarrot Electron API (see local-api handoff)
```

## Key files

| Path | Role |
|------|------|
| `streamdeck-plugin/com.paarrot.streamdeck.sdPlugin/manifest.json` | Plugin manifest |
| `streamdeck-plugin/com.paarrot.streamdeck.sdPlugin/plugin/index.js` | Action implementations |
| `streamdeck-plugin/com.paarrot.streamdeck.sdPlugin/plugin/index.html` | Property inspector UI |
| `streamdeck-plugin/build.js` | Build `.streamDeckPlugin` bundle |
| `streamdeck-plugin/validate.js` | Manifest validation |
| `streamdeck-plugin/README.md` | User install guide |
| `streamdeck-plugin/QUICKSTART.md` | Dev quickstart |

## Data model

None — stateless HTTP client. Channel list and status come from Paarrot API responses.

## Dependencies

- Elgato Stream Deck software 6.0+
- Paarrot local API (port 33384)
- Node build tooling in `streamdeck-plugin/package.json`

## Integration points

- **local-api**: sole backend; breaking API changes require Stream Deck plugin update
- Icons: `streamdeck-plugin/.../images/paarrot.svg`, `status.svg`

## Testing

### Manual

1. Run Paarrot; confirm `/health` responds.
2. Load plugin in Stream Deck developer mode.
3. Map Toggle Mute to a key; join a call; press key.
4. Map Change Channel; verify room switch in Paarrot.

### Automated

- `node streamdeck-plugin/validate.js`

## Known issues & gotchas

- Plugin repo README still references placeholder GitHub URLs in places — update on publish
- No auth on API; same machine trust model
- Deafen/mute only meaningful during active calls

## Future work

- Auto-discover rooms without manual room id entry in property inspector
- Connection status indicator on Stream Deck key

## Related docs

- [local-api HANDOFF](../local-api/HANDOFF.md)
- [API.md](../../API.md)
- [streamdeck-plugin/README.md](../../../../streamdeck-plugin/README.md)

## Add your extra things here

- Bundle id: `com.paarrot.streamdeck`
- Build output: `.streamDeckPlugin` via `npm run build` in `streamdeck-plugin/`
