1
3
Fork
You've already forked periscope
1
nintendo switch input display
  • C 42.1%
  • Rust 35.9%
  • Makefile 15.6%
  • C++ 6.4%
2026年01月08日 20:50:42 -07:00
desktop [vwr] version bump 2025年11月15日 12:54:08 -07:00
nx [ovl][sys] update ver, fix build 2026年01月08日 20:50:42 -07:00
.clang-format sysmodule that connects and sends with sockets 2023年06月23日 17:35:26 -07:00
.gitignore makefile for whole repo, add lib for common stuff 2023年06月25日 13:49:18 -07:00
.gitmodules repo setup w/templates 2023年06月20日 11:56:52 -07:00
LICENSE readme/license 2023年06月23日 21:15:38 -07:00
Makefile makefile for whole repo, add lib for common stuff 2023年06月25日 13:49:18 -07:00
README.md fix factual accuracy 2024年05月05日 22:55:08 -07:00

periscope

homebrew solution for nintendo switch input display

Donate using Liberapay ko-fi

simple installation

you can just get prebuilt stuff from the releases page. if you want to build it yourself then read on.

troubleshooting

usually, you can fix the problem by restarting the sysmodule (which you can do from the overlay). if not, feel free to open an issue, contact me on matrix or ask in #periscope in my discord.

current features

  • switch sysmodule that grabs inputs
  • desktop viewer program that connects to the switch and pulls inputs from the sysmodule
  • capture up to 8 players simultaneously (pro controller, dual joy-con, or single joy-con (i think))
  • custom skin support
  • tesla overlay that shows switch's IP address and allows configuration of which controllers to capture

building

To build this, you will need devkitA64 installed (instructions here) as well as rust and cargo (either from your system package manager or follow instructions here).

if you have devkitA64 and cargo installed properly, you should be able to simply run make in the root of this repository to build the sysmodule, overlay, and desktop viewer.

the viewer binary will be in desktop/target/release/periscope or desktop/target/debug/periscope depending on whether you build a release or debug executable.

the overlay binary will be at nx/overlay/periscope-overlay.ovl. put this in /switch/.overlays/ on your switch SD card. you'll need tesla and ovlloader installed for it. to open tesla, the default keybinding is L + Dpad Down + RS. from there you can select the option labeled periscope to open periscope's overlay.

the sysmodule will be at nx/sysmodule/sys-scope.nsp. put this file onto your switch SD card at /atmosphere/contents/420000000005C09E/exefs.nsp and put toolbox.json in the same folder. you can start it with ovlSysmodules (another Tesla overlay) or from inside the periscope overlay itself, which has options to start and restart sys-scope.

running

once you have everything installed on your switch, you can open tesla with L + Dpad down + RS, and then open the periscope overlay. this can be used to start the sysmodule (if it's not already running) as well as to get the IP address of your switch. You can also start the sysmodule with other tools, and figure out your IP from the wifi settings on the switch.

you can download a skin zip file from the releases page, and place it into the configuration directory mentioned in the release page for your platform, or in a folder named skins directly adjacent to the executable.

the config file structure should look like this

< platform config directory >
|-- config.toml (automatically created if missing)
|-- default
| |-- skin.toml
| |-- < images for the skin >
|-- some_other_skin
| |-- skin.toml
| |-- < images for the skin >

when you start periscope on your computer, you will be greeted with a configuration window. type the ip into the box that asks for it, and select your skin, and then click the button to connect to your switch and start capturing inputs.

while capturing inputs, you can press C (default) to return to the config screen, or R (default) to reconnect the viewer to the switch.

configuration can be directly edited in config.toml without the config ui if you wish.

skin configuration

each skin lives in its own directory in the config folder (e.g. ~/.config/periscope/ on linux, C:\Users\YourUser\AppData\Roaming\periwinkle\periscope\config on windows, /Users/YourUser/Library/Application Support/periwinkle.periscope on mac).

skin directories can also live in a folder named skins that is in the same folder as the executable.

inside this directory is a skin.toml file and every image you need for the skin. you need at least a background image and one other, to use for buttons and joysticks. each button and joystick can be a different image, if you want. each button/stick has a pos, which is where on the screen it will be displayed. the position refers to the top left corner of the image. x increases to the right and y towards the bottom, starting at the top left of the window. joysticks also have a range, which is the radius of the circle that the joystick can travel in on the viewer.

the list of buttons is:

a, b, x, y, plus, minus, zl, zr, l, r, up, down, left, right, ls, rs, lsl, lsr, rsl, rsr

which should be fairly self-explanatory except the last few, which are left and right joycons' SL and SR buttons.

skin.toml looks like this:

background = "bg.png" # file bg.png in the same directory as this file
stick_mode = "stick_on_top" # draw the joysticks above the joystick buttons
# alternatives are "button_on_top" for button above the joystick, and "unified" to draw the button directly over the joystick in position
[player1]
buttons.a = {image = "button.png", pos = {x = 50, y = 50}}
buttons.b = {image = "button.png", pos = {x = 40, y = 60}}
# repeat for each button ...
# unspecified buttons will not be rendered
ls = {image = "stick.png", pos = {x = 100, y = 100}, range = 50}
# repeat for right stick...
# unspecified players will not be rendered
[player2]
# ...

if you leave a button, joystick, or player unconfigured, it simply will not be rendered.