Reads gamepad input and serves a local OBS overlay.
Project description
Gamepad Overlay
Shows your gamepad inputs as a visual overlay in OBS (or any tool that supports browser sources).
The app runs in your system tray, reads your controller, and serves an overlay page your streaming software can display. The overlay has a transparent background, so it sits cleanly on top of your gameplay.
What you need:
- A game controller (Xbox, SNES-style, or any standard gamepad).
- OBS Studio, or any streaming/recording tool that supports a Browser Source.
Installation
Download the latest release for your platform from the Releases page and extract the archive. No installer needed — just run the executable inside.
Windows: gamepad-overlay.exe
Linux: gamepad-overlay
Getting Started
- Run the app. A window opens showing your connected gamepads, and a tray icon appears.
- Pick your controller. In the list, click the controller you want, then click Select Gamepad. If you only have one controller, or you don't care which one is used, click Any Gamepad instead.
- Open OBS and add a Browser Source.
- Get the URL. In the gamepad overlay window, click Overlay URL..., then click Copy to copy the address. Paste it into your OBS browser source.
- Done. The overlay will display your controller inputs in your stream or recording.
Gamepad Selection
The main window lists all connected gamepads. Click one, decide how it should be matched using the Criteria checkboxes, then click Select Gamepad. To go back to using whatever controller is connected, click Any Gamepad.
The Criteria checkboxes control how your controller is recognized the next time it's connected:
- Identity — match by hardware ID (vendor/product, or GUID). The controller is recognized no matter which USB port it's plugged into.
- Physical port — match by the specific USB port. Useful when you always want whichever controller is plugged into a particular port.
- Tick both to require the same controller and the same port.
The controller currently in use is marked with a ★ in the list, and the Target: line at the top of the window always shows what the overlay is set to use.
Overlay URL Window
Open this from the main window with the Overlay URL... button. It shows the full URL to paste into OBS and lets you configure the overlay appearance. Use Copy to copy the URL, or Launch in Browser to preview the overlay.
Overlay Settings
| Setting | Description |
|---|---|
| Source | websocket (normal use) or demo (animated preview that plays without a controller, handy for testing) |
| Layout | Controller shape — xbox, xbox-digital-triggers, or snes |
| Theme | Color scheme — Auto (follows the layout's default), xbox, or snes |
| Background | The overlay background. Leave blank to keep it transparent (recommended for streaming). Accepts any CSS color, e.g. green, #00ff00, or transparent. |
| Blur | Softens the overlay's edges (anti-aliasing). Set to 0 for crisp, hard edges. |
| Digital Threshold % | How far an analog trigger must be pressed before it counts as "pressed." Default is 20%. |
Changes to overlay settings take effect immediately and are saved automatically.
Server Settings
| Setting | Description |
|---|---|
| Server Port | The port the local server listens on. Default is 8765. Change this if something else on your machine is using that port. |
After changing the port, click Apply Server Settings. The server restarts on the new port and the URL updates to match. Update your OBS browser source with the new URL.
Reset to Defaults restores all overlay settings and the server port to their original values.
Layouts and Themes
Layouts control the shape and behavior of the controller display. Themes control colors and visual style. They are independent — any theme can be combined with any layout.
Built-in layouts:
xbox— standard Xbox controller with analog triggersxbox-digital-triggers— Xbox controller with triggers shown as digital buttonssnes— SNES-style controller (no analog sticks or triggers)
Built-in themes:
xbox— dark Xbox color schemesnes— SNES color scheme
Troubleshooting
The overlay isn't showing any input.
Make sure the app is running and the correct gamepad is selected. Check that the URL in your OBS browser source matches what the Overlay URL window shows.
The overlay won't connect to the server.
Try the URL with 127.0.0.1 instead of localhost. Some systems resolve these differently.
I want to test the overlay without a controller.
Set Source to demo in the Overlay URL window. The overlay will cycle through animations so you can preview it.
Something else is using port 8765.
Open the Overlay URL window, go to Server Settings, change the port, and click Apply Server Settings. Update your OBS browser source with the new URL.
OBS Browser Source Tips
- Set the browser source resolution to match the area you want the overlay to occupy (e.g. 1920×1080 for full screen, or a smaller size for a corner overlay).
- The overlay scales to fill its browser source. Use OBS transform controls to position and resize it on your canvas.
- Enable Shutdown source when not visible if you want the overlay to disconnect when the scene isn't active.
Advanced / CLI
Everything below is for advanced users. If you're just using the app normally, you can stop here.
The app can also be controlled from the command line.
List connected gamepads:
gamepad-overlay --list-gamepads
Select gamepad by name:
gamepad-overlay --gamepad-name "Xbox"
Select gamepad by GUID:
gamepad-overlay --gamepad-guid <guid>
Use any gamepad:
gamepad-overlay --any-gamepad
Set the server port:
gamepad-overlay --port 9000
Start with the window hidden:
gamepad-overlay --hide
Run without a system tray (headless):
gamepad-overlay --headless
Running from Source
Requires Python 3.12+ and uv.
uv sync
uv run gamepad-overlay
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gamepad_overlay-1.1.0.tar.gz.
File metadata
- Download URL: gamepad_overlay-1.1.0.tar.gz
- Upload date:
- Size: 62.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac783cf1a8d08e505a531c1acc17241c2c61babc00b99e44285bf88f33fcd69d
|
|
| MD5 |
35d163b8e126ef1583744b0d2044bacd
|
|
| BLAKE2b-256 |
be2af251b8802330b4ac9a681e576c86b85aa7d2d4a5517d39c261800cc33fad
|
Provenance
The following attestation bundles were made for gamepad_overlay-1.1.0.tar.gz:
Publisher:
release.yml on sevaht/gamepad-overlay
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gamepad_overlay-1.1.0.tar.gz -
Subject digest:
ac783cf1a8d08e505a531c1acc17241c2c61babc00b99e44285bf88f33fcd69d - Sigstore transparency entry: 1857453875
- Sigstore integration time:
-
Permalink:
sevaht/gamepad-overlay@c6ebac6958cd3b01308a83632ef3085f6efb1d95 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/sevaht
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c6ebac6958cd3b01308a83632ef3085f6efb1d95 -
Trigger Event:
push
-
Statement type:
File details
Details for the file gamepad_overlay-1.1.0-py3-none-any.whl.
File metadata
- Download URL: gamepad_overlay-1.1.0-py3-none-any.whl
- Upload date:
- Size: 71.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9347e6756b7f7003ff88544573270b40d720a7bdb57d412cb45f6453b46f6300
|
|
| MD5 |
c3ab5e1014986325bbe4e1d4e026ddac
|
|
| BLAKE2b-256 |
57492c7e4677b96e768dc9743f37f6637fef49423422e9f4b15a5035101c312d
|
Provenance
The following attestation bundles were made for gamepad_overlay-1.1.0-py3-none-any.whl:
Publisher:
release.yml on sevaht/gamepad-overlay
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gamepad_overlay-1.1.0-py3-none-any.whl -
Subject digest:
9347e6756b7f7003ff88544573270b40d720a7bdb57d412cb45f6453b46f6300 - Sigstore transparency entry: 1857454102
- Sigstore integration time:
-
Permalink:
sevaht/gamepad-overlay@c6ebac6958cd3b01308a83632ef3085f6efb1d95 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/sevaht
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c6ebac6958cd3b01308a83632ef3085f6efb1d95 -
Trigger Event:
push
-
Statement type: