# Remote Switch — Finish the Build from Step 12

**Starting point:** Windows 11 Pro host, Elgato Game Capture Neo, OBS, Parsec, Raspberry Pi Debug Probe on `COM3`, Raspberry Pi Pico H connected to the Switch dock, and the tested HORI/Pokkén compatibility UF2 already flashed  
**Controller path:** official current-model Xbox Wireless Controller on the remote computer → Parsec Xbox 360 virtual controller → pinned SDL2 switch-pico bridge → UART → Pico → Switch  
**Verified configuration date:** July 26, 2026

This is the authoritative continuation of the larger implementation guide. It replaces the old Step 12 and everything after it.

The important controller correction is entirely on the Windows bridge side. **Do not reflash the Pico.** The HORI/Pokkén firmware already forwards the Switch button bits correctly and remains installed through a PC reboot or power loss.

The pinned SDL2 bridge at commit `e13ba506cfc31fa8f02f50a9ac2a445d1ecf246b` already uses the desired label-for-label Xbox mapping. Therefore:

- Use `C:\RemoteSwitch\switch-pico-sdl2`.
- Do **not** add `--swap-abxy`.
- Disable the bridge's runtime ABXY-swap hotkey so the mapping cannot be changed accidentally.
- Keep Parsec's host controller type set to **Xbox 360**.

## 12. Resume the controller setup after the PC reboot

### 12.1 Know what the reboot did—and did not—reset

A Windows restart stopped OBS, the temporary PowerShell bridge, and the active Parsec session. It did not erase:

- The HORI/Pokkén firmware on the Pico.
- The Python environment under `C:\RemoteSwitch\switch-pico-sdl2`.
- The Parsec Virtual USB driver.
- The OBS profile and scene.
- The UART wiring.

For normal operation, leave the hardware connected like this:

```text
Windows host USB
    -> Raspberry Pi Debug Probe
    -> UART U port
    -> GPIO4 / GPIO5 / GND on Pico

Switch dock USB
    -> Pico Micro-USB data port
```

The Pico belongs on the Switch dock. The Debug Probe belongs on the Windows PC.

### 12.2 Confirm the working bridge folder survived

Open a normal PowerShell window on the host and run:

```powershell
Test-Path C:\RemoteSwitch\switch-pico-sdl2\.venv\Scripts\python.exe
git -C C:\RemoteSwitch\switch-pico-sdl2 rev-parse --short HEAD
```

Expected results:

```text
True
e13ba50
```

If `Test-Path` says `False`, do not continue to the bridge command. Recreate the pinned SDL2 environment:

```powershell
Set-Location C:\RemoteSwitch
git clone https://github.com/jyapayne/switch-pico.git switch-pico-sdl2
Set-Location C:\RemoteSwitch\switch-pico-sdl2
git checkout e13ba506cfc31fa8f02f50a9ac2a445d1ecf246b
py -3.13 -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade pip
.\.venv\Scripts\python.exe -m pip install -e .
.\.venv\Scripts\python.exe -m pip install "PySDL2-dll==2.32.10"
```

If the folder already exists, do not clone over it.

### 12.3 Reconfirm the Debug Probe COM port

Run:

```powershell
C:\RemoteSwitch\switch-pico-sdl2\.venv\Scripts\python.exe -m serial.tools.list_ports -v
```

Find the `USB Serial Device` associated with the Raspberry Pi Debug Probe. The tested machine used `COM3`.

You can verify it visually:

1. Open **Device Manager**.
2. Expand **Ports (COM & LPT)**.
3. Unplug only the Debug Probe's USB cable.
4. Note which COM entry disappears.
5. Reconnect the probe and confirm the same entry returns.

Keep the Debug Probe in the same physical PC USB port. Windows normally preserves its COM number there.

Every command below uses `COM3`. If Windows now assigns another number, substitute that number everywhere, including the startup script.

### 12.4 Confirm the Switch-side prerequisites

Using a local Joy-Con if necessary:

1. Confirm the Switch is awake and docked.
2. Open **System Settings > Controllers and Sensors**.
3. Confirm **Pro Controller Wired Communication** is **On**.
4. Open **System Settings > Sleep Mode**.
5. Confirm **Auto-Sleep (Connected to TV)** is **Never**.

The HORI compatibility firmware does not implement controller wake-from-sleep. Keeping the docked Switch awake is part of this design.

### 12.5 Confirm Parsec's host controller mode after reboot

On the Windows host:

1. Open **Parsec > Settings > Host**.
2. Confirm **Parsec Virtual USB Gamepads** is **Enabled**.
3. Confirm the latest offered Virtual USB driver is installed.
4. Set **Virtual Gamepad Type** to **Xbox 360**.
5. Click **Restart** at the top of Parsec if you changed either setting.

Do not use DualShock 4 or DualSense emulation for this build. The SDL2 bridge and the tested remote path expect Parsec's standardized Xbox 360 device.

### 12.6 Prepare the sister's Xbox controller on her Mac

The recommended controller is the current official Xbox Wireless Controller—the Series X|S model with USB-C and a Share button.

On the Mac:

1. Update macOS before first setup.
2. Turn on the Xbox controller.
3. Hold its pairing button until the Xbox light flashes.
4. Open **System Settings > Bluetooth** and connect **Xbox Wireless Controller**.
5. Open **System Settings > Game Controllers**.
6. Select the Xbox controller and return its controls to their defaults if they were customized previously.
7. Close Steam while commissioning this path so Steam Input cannot consume or duplicate controller events.
8. Open **Parsec > Settings > Gamepad**.
9. Select the Xbox controller.
10. Press every control and watch Parsec's **State** display.

The intended Parsec meanings are:

| Physical Xbox control | Parsec control |
|---|---|
| A | A |
| B | B |
| X | X |
| Y | Y |
| Menu, three horizontal lines | Start |
| View, overlapping rectangles | Back |
| Xbox logo | Guide |
| Share | Misc/Share, when exposed |
| LB / RB | Left / Right Shoulder |
| LT / RT | Left / Right Trigger |
| Left / right stick click | Left / Right Stick |
| D-pad | D-pad |

If a control is wrong, use **Map** in Parsec's Gamepad tab to assign it. Use **Show Raw Data** when you need to determine whether macOS and Parsec can see a button at all.

### 12.7 Create the Parsec virtual controller on the host

The virtual controller does not exist merely because the host PC booted. Parsec creates it after the remote player connects and presses a face button.

1. On the Mac, connect to the Windows host in Parsec.
2. Press Xbox **A** once.
3. The host should play the Windows USB-connected sound.
4. On the host, press **Windows+R**, enter `joy.cpl`, and press Enter.
5. Confirm an **Xbox 360 Controller** appears.
6. Open its **Properties > Test** page.
7. Confirm A/B/X/Y, both sticks, D-pad, bumpers, triggers, Menu, and View respond correctly.

If `joy.cpl` is empty, do not start debugging the Pico. Fix Parsec first:

- Confirm the remote user has gamepad permission.
- Confirm the client pressed a face button after connecting.
- Restart Parsec on the host, reconnect, and press A again.
- Reinstall the Parsec Virtual USB driver if the host still creates no device.

### 12.8 Confirm the SDL2 bridge sees only the intended controller

Disconnect local controllers from the Windows host. Then run:

```powershell
Set-Location C:\RemoteSwitch\switch-pico-sdl2
.\.venv\Scripts\python.exe -m switch_pico_bridge.controller_uart_bridge --list-controllers
```

Expected output includes:

```text
Detected controller 0: Xbox 360 Controller
```

`No controllers detected` is normal if the sister is not currently connected or has not pressed a face button. It is not evidence that the Python installation broke.

Avoid using the older physical Xbox One controller directly on the Windows host. Its SDL GUID reproduced a known SDL input-read problem during testing. Parsec's virtual Xbox 360 controller is the validated path.

### 12.9 Run the corrected bridge manually

Stop any old bridge console with **Ctrl+C**. Then run:

```powershell
Set-Location C:\RemoteSwitch\switch-pico-sdl2
.\.venv\Scripts\python.exe -u -m switch_pico_bridge.controller_uart_bridge --ports COM3 --no-imu --zero-sticks --deadzone 0.12 --zero-hotkey= --swap-hotkey=
```

Expected startup messages include:

```text
Prepared 1 specified UART port(s) for auto-pairing.
Detected controller 0: Xbox 360 Controller
Auto-paired controller 0 to COM3
Controller 0 (...) paired to COM3
```

The terminal does not print a line for every button. Silence while playing is normal.

Why these options are final:

| Option | Reason |
|---|---|
| `--ports COM3` | Auto-pairs the first arriving Parsec controller with the known Debug Probe port and supports hot-plugging. |
| `--no-imu` | The HORI firmware intentionally has no gyro path, and Animal Crossing does not require it. |
| `--zero-sticks` | Captures the initial neutral positions when the virtual controller arrives. Keep both sticks released during connection. |
| `--deadzone 0.12` | Suppresses the approximately 8% return-to-center drift observed during testing without harming Animal Crossing. |
| `--zero-hotkey=` | Disables the terminal re-zero hotkey for unattended operation. |
| `--swap-hotkey=` | Prevents an accidental terminal keypress from changing ABXY later. |

There is deliberately **no `--swap-abxy` flag**. In this pinned SDL2 revision, no flag means Xbox labels map directly to the same Switch labels.

### 12.10 Final controller mapping

The resulting mapping is:

| Xbox controller | Nintendo Switch |
|---|---|
| A | A |
| B | B |
| X | X |
| Y | Y |
| LB | L |
| RB | R |
| LT | ZL |
| RT | ZR |
| Menu, three lines | Plus `+` |
| View, overlapping rectangles | Minus `−` |
| Xbox logo | Home |
| Share | Capture, when Parsec exposes the Share/Misc button |
| Left stick click | L-stick click |
| Right stick click | R-stick click |
| D-pad | D-pad |
| Left and right sticks | Left and right sticks |

This is label-for-label ABXY, not physical-position mapping. When Animal Crossing says “Press A,” press the Xbox button labeled A.

### 12.11 Test every control before automating it

On the Switch, open **Controllers > Change Grip/Order**, then test:

1. Release the controller and wait five seconds. Nothing should move.
2. Press A, B, X, and Y individually.
3. Test all four D-pad directions.
4. Move each stick in a full circle and release it.
5. Press LB, RB, LT, and RT.
6. Press Menu and verify Switch Plus.
7. Press View and verify Switch Minus.
8. Press the Xbox logo and confirm it opens the Switch HOME Menu.
9. Press Share and look for the Switch capture confirmation.
10. Click both sticks.

Then launch Animal Crossing and confirm:

- Xbox A selects.
- Xbox B cancels.
- Xbox X and Y perform their expected in-game functions.
- Menu opens the NookPhone or the appropriate Plus action.
- View performs the Minus action.
- Xbox logo returns to HOME.

Do not automate the bridge until the controls pass this manual test.

### 12.12 If Xbox Home or Share is intercepted

First open **Parsec > Settings > Gamepad > Show Raw Data** on the Mac.

- If the Xbox-logo press appears, map it to **Guide**.
- If Share appears, map it to **Misc/Share**.
- If the Xbox logo never appears, check **macOS System Settings > Game Controllers** for a system action assigned to that button and return the controller to default controls.
- If Guide remains unavailable but Share works, temporarily map **Share to Guide**. Home matters more than Capture for unattended Switch use.

The Windows bridge cannot forward a button that never reaches Parsec. Diagnose this on the Mac's Parsec Gamepad screen before changing Python or reflashing the Pico.

## 13. Finish the Parsec video, audio, and access settings

### 13.1 Host settings

On the Windows host, open **Parsec > Settings > Host** and use:

- Hosting Enabled: **On**
- Resolution: **1920×1080**
- FPS: **60**
- Bandwidth Limit: **30 Mbps**
- Display: the 1080p60 display carrying the OBS projector
- Audio: **CABLE Input (VB-Audio Virtual Cable)**
- Echo Cancelling: **Off**
- Parsec Virtual USB Gamepads: **Enabled**
- Virtual Gamepad Type: **Xbox 360**
- Quality: **Lowest Latency**

Restart Parsec after changing the gamepad type or Virtual USB driver.

### 13.2 Sister's client settings

On the Mac:

- Window Mode: **Fullscreen**
- VSync: **Off** initially
- Decoder: **Hardware**
- H.265/HEVC: **Off** for the baseline test
- 10-bit color: **Off**
- Controller: verified in **Settings > Gamepad**

If she sees tearing, enable VSync and accept its small latency cost. If the network cannot sustain 30 Mbps, lower the host limit to 25 Mbps, then 20 Mbps.

### 13.3 Give access only to her account

Use separate Parsec accounts.

1. Add the sister as a friend or invited guest.
2. Enable **Gamepad** permission.
3. Enable keyboard and mouse only if you want her to perform recovery actions.
4. Enable unattended connection only for her trusted account.
5. Do not share the host account password.
6. Do not create a permanent public Parsec share link.

## 14. Make the controller bridge start automatically

### 14.1 Create the permanent bridge launcher

Open Notepad and save the following as:

```text
C:\RemoteSwitch\start-switch-bridge.cmd
```

Use this exact content, replacing `COM3` only if the Debug Probe uses another port:

```bat
@echo off
setlocal
set "ROOT=C:\RemoteSwitch\switch-pico-sdl2"
set "PYTHON=%ROOT%\.venv\Scripts\python.exe"
set "LOGDIR=C:\RemoteSwitch\logs"

if not exist "%LOGDIR%" mkdir "%LOGDIR%"
cd /d "%ROOT%"

echo [%date% %time%] Starting Remote Switch controller bridge>>"%LOGDIR%\switch-pico-bridge.log"
"%PYTHON%" -u -m switch_pico_bridge.controller_uart_bridge --ports COM3 --no-imu --zero-sticks --deadzone 0.12 --zero-hotkey= --swap-hotkey= >>"%LOGDIR%\switch-pico-bridge.log" 2>&1
exit /b %errorlevel%
```

Important:

- The path is `switch-pico-sdl2`, not `switch-pico`.
- There is no `--swap-abxy`.
- Do not launch `debug-bridge.py` for daily use.

### 14.2 Test the launcher manually

1. Stop every bridge with **Ctrl+C**.
2. Double-click `C:\RemoteSwitch\start-switch-bridge.cmd`.
3. Have the sister connect through Parsec and press A.
4. Test the Switch.
5. Close the launcher with **Ctrl+C**.
6. Open the log:

```powershell
Get-Content C:\RemoteSwitch\logs\switch-pico-bridge.log -Tail 40
```

Do not schedule it until this exact launcher works.

### 14.3 Create the Task Scheduler entry

1. Open **Task Scheduler**.
2. Select **Create Task**, not Create Basic Task.
3. On **General**:
   - Name: `Remote Switch - Controller Bridge`
   - User: the Windows account used for remote play
   - Select **Run only when user is logged on**
   - Leave **Run with highest privileges** cleared
4. On **Triggers**:
   - New
   - Begin the task: **At log on**
   - Specific user: the remote-play Windows account
   - Delay task for: **15 seconds**
5. On **Actions**:
   - Program: `C:\Windows\System32\cmd.exe`
   - Arguments: `/c "C:\RemoteSwitch\start-switch-bridge.cmd"`
   - Start in: `C:\RemoteSwitch`
6. On **Conditions**:
   - Clear **Start the task only if the computer is on AC power** if shown.
7. On **Settings**:
   - Enable **Allow task to be run on demand**.
   - Enable **If the task fails, restart every 1 minute**.
   - Set restart attempts to `999`.
   - Clear **Stop the task if it runs longer than**.
   - If already running: **Do not start a new instance**.
8. Save.

The task may start before a Parsec controller exists. That is fine; the bridge waits for hot-plug events.

### 14.4 Test the scheduled task without rebooting

Run:

```powershell
Start-ScheduledTask -TaskName "Remote Switch - Controller Bridge"
Start-Sleep -Seconds 3
Get-ScheduledTaskInfo -TaskName "Remote Switch - Controller Bridge"
Get-Content C:\RemoteSwitch\logs\switch-pico-bridge.log -Tail 40
```

Then connect through Parsec, press A, and confirm the Switch responds.

Only one process may own `COM3`. Do not leave a manual bridge running when starting the scheduled task.

## 15. Make OBS return to the clean Switch view

### 15.1 Save the full-screen projector

In OBS:

1. Open **File > Settings > General**.
2. In **Projectors**:
   - Enable **Save projectors on exit**.
   - Enable **Hide cursor over projectors**.
   - Enable **Always on top** if available.
3. Right-click the `Switch` scene.
4. Choose **Fullscreen Projector (Scene)**.
5. Select the display Parsec captures.
6. Confirm the Switch fills the display.
7. Exit OBS normally with **File > Exit** once, then reopen it.
8. Confirm the projector returns.

Press **Esc** on the host to leave projector mode temporarily.

### 15.2 Create the OBS scheduled task

Create another Task Scheduler task:

- Name: `Remote Switch - OBS`
- Run only when the remote-play Windows user is logged on
- Trigger: At log on, delayed **25 seconds**
- Program:

```text
C:\Program Files\obs-studio\bin\64bit\obs64.exe
```

- Arguments:

```text
--profile "Remote Switch" --collection "Remote Switch" --scene "Switch" --disable-missing-files-check
```

- Start in:

```text
C:\Program Files\obs-studio\bin\64bit
```

Use the same retry and no-time-limit settings as the bridge task.

### 15.3 Reconfirm audio after the reboot

In OBS:

1. Confirm the `Game Capture Neo` audio meter moves.
2. Open **Advanced Audio Properties**.
3. Set the Neo to **Monitor Only (mute output)**.
4. Open **Settings > Audio > Advanced**.
5. Set Monitoring Device to **CABLE Input (VB-Audio Virtual Cable)**.

In Parsec Host settings, Audio must also be **CABLE Input**.

The TV still receives audio independently through the Neo's HDMI OUT.

## 16. Finish unattended Windows recovery

### 16.1 Confirm Parsec is installed per-computer

The per-computer installation lets the Parsec service start before a user signs in.

In PowerShell:

```powershell
Get-CimInstance Win32_Service |
    Where-Object {
        $_.Name -match "parsec" -or
        $_.DisplayName -match "parsec"
    } |
    Format-Table Name, DisplayName, State, StartMode
```

At least one Parsec service should be **Running** with an automatic start mode.

If no service appears, reinstall Parsec using its **Per Computer** option, restart Windows, and recheck.

### 16.2 Automatic sign-in decision

OBS and the controller bridge need an interactive Windows session.

For a dedicated, physically secure host:

1. Download Microsoft Sysinternals Autologon.
2. Run `Autologon64.exe` as administrator.
3. Enter the dedicated remote-play Windows account and password.
4. Select **Enable**.
5. Restart and verify the account signs in.

Use BitLocker and keep the machine physically secure. A local administrator can recover the stored autologon credential.

If you do not enable autologon, Parsec can reach the Windows sign-in screen, but someone must sign in before OBS and the user-level scheduled bridge become available.

### 16.3 Power-loss settings

- In BIOS/UEFI, set **Restore on AC Power Loss** to **Power On**.
- Keep Windows sleep disabled.
- Disable USB selective suspend for this host.
- Keep Windows Update active, but configure Active Hours around likely play times.
- Prefer a small UPS for the PC, network equipment, dock, and capture card.
- A smart plug is useful for the dock or capture hardware; it is not a safe routine way to restart Windows.

## 17. Staged acceptance test after the reboot

Pass each stage before moving to the next.

### Stage A — Local HDMI and OBS

- TV shows Switch video and audio through Neo passthrough.
- OBS shows 1080p60 Switch video.
- OBS audio meter moves.
- Fullscreen Scene Projector fills the host display.

### Stage B — Parsec video and audio

- Sister connects.
- She sees only the clean Switch scene.
- She hears one clean stereo feed.
- Parsec reports hardware decode and stable network timing.

### Stage C — Parsec virtual controller

- Client Gamepad State responds correctly.
- After connecting and pressing A, host `joy.cpl` shows Xbox 360 Controller.
- Its Test page shows correct controls.

### Stage D — Bridge

- Scheduled task is running.
- Log shows controller 0 paired to `COM3`.
- Idle input is neutral.
- Every control follows the mapping table in Step 12.10.

### Stage E — Animal Crossing

1. Return to the Switch HOME Menu.
2. Select the sister's existing Switch user.
3. Launch Animal Crossing.
4. Confirm her existing resident and house load on the family island.
5. Walk, open inventory, use the NookPhone, enter and leave a building, and save normally.

### Stage F — True unattended restart

1. Disconnect Parsec.
2. Restart Windows normally.
3. Wait three to five minutes.
4. Confirm the host comes back online.
5. Reconnect.
6. Press A once to create the virtual controller.
7. Verify video, audio, Plus, Minus, Home, ABXY, and both sticks.
8. Repeat the full restart test a second time.

Do not call the build unattended until it passes Stage F twice.

## 18. Normal daily use

### Sister

1. Connect or wake the Xbox controller on the Mac.
2. Open Parsec.
3. Verify the controller under **Settings > Gamepad** if anything changed.
4. Connect to the home PC.
5. Press A once to create the host virtual controller.
6. Wait a few seconds for the bridge to pair it to `COM3`.
7. Play normally.
8. Choose her existing Switch user when launching Animal Crossing.
9. Save and return to the HOME Menu when finished.
10. Disconnect from Parsec.
11. Do not put the Switch to sleep.

### Family at home

- Use the TV normally through the Neo's HDMI passthrough.
- Avoid using another controller during a remote session.
- If controller order becomes confused, open **Controllers > Change Grip/Order** and reconnect only the intended controller.
- Leave the Pico on the dock and Debug Probe on the PC.

## 19. Troubleshooting

### The bridge says `No controllers detected` after boot

This is normal before a remote player connects.

1. Connect the sister through Parsec.
2. Press a face button.
3. Confirm the host USB-connected sound.
4. Check `joy.cpl`.
5. The already-running bridge should hot-detect and pair it.

### `joy.cpl` sees no controller

The problem is before switch-pico:

1. Verify the controller in the Mac's Parsec Gamepad tab.
2. Confirm the guest has gamepad permission.
3. Press A after connecting.
4. Restart host Parsec and reconnect.
5. Reinstall the Parsec Virtual USB driver if needed.

### The bridge reports `Access is denied` for COM3

Another process owns the UART.

Stop:

- Any manual bridge window.
- `debug-bridge.py`.
- `test-pico.py`.
- A serial terminal.
- The scheduled bridge task before doing a manual test.

Then start exactly one bridge.

### The bridge uses the wrong controller

Disconnect all local host controllers. In Parsec, reset virtual gamepads, reconnect only the sister, and press her A button first.

### ABXY letters are reversed

The final SDL2 command must not contain:

```text
--swap-abxy
```

Confirm the scheduled script points to `switch-pico-sdl2`, not the newer `switch-pico` folder. Stop and restart the task after correcting it.

### Menu or View does not produce Plus or Minus

On the client:

1. Open Parsec **Settings > Gamepad**.
2. Confirm Menu reports **Start**.
3. Confirm View reports **Back**.
4. Remap them if necessary.
5. Reconnect so Parsec recreates the host controller.

The pinned bridge already maps Start to Plus and Back to Minus.

### Xbox logo does not produce Home

1. Check **Show Raw Data** in the client Gamepad tab.
2. Map the Xbox logo to **Guide**.
3. Reset any macOS Game Controller action assigned to the button.
4. Close Steam.
5. Reconnect Parsec.
6. If Guide remains unavailable, map Share to Guide as the fallback.

### Share does not produce Capture

Capture is optional. Some client/virtual-controller combinations do not expose a distinct Misc/Share button. Keep Home working even if that means sacrificing Capture.

### Buttons again become directions or Up is stuck

That was the old Switch-facing Pro Controller report failure.

1. Stop the bridge.
2. Confirm the Pico was not reflashed with the original rollback UF2.
3. Reflash `switch-pico-hori-compat-rp2040.uf2`.
4. Restart with the SDL2 command from Step 12.9.

Do not troubleshoot this symptom by swapping physical controllers.

### Stick movement continues at idle

1. Release both sticks before connecting.
2. Keep `--zero-sticks`.
3. Keep `--deadzone 0.12`.
4. Disconnect and reconnect the Parsec controller so neutral is captured again.
5. If needed, increase to `--deadzone 0.15`.

### Scheduled task runs but the Switch does nothing

Check:

```powershell
Get-ScheduledTaskInfo -TaskName "Remote Switch - Controller Bridge"
Get-Content C:\RemoteSwitch\logs\switch-pico-bridge.log -Tail 80
```

Then verify:

- Correct COM port.
- Pico USB is on the Switch dock.
- Debug Probe USB is on the Windows host.
- Probe UART **U** port is used.
- GPIO4 → probe RX, GPIO5 → probe TX, and GND → GND.
- Pro Controller Wired Communication is On.
- Exactly one bridge process is running.

### Parsec shows the desktop instead of the Switch

In OBS, right-click `Switch` and choose **Fullscreen Projector (Scene)** on the display Parsec captures. Press **Esc** locally to exit it temporarily.

### Sister hears silence

- OBS Neo meter must move.
- OBS Monitoring Device must be CABLE Input.
- Neo monitoring must be Monitor Only.
- Parsec Host Audio must be CABLE Input.
- Reconnect the Parsec session after changing audio devices.

### Switch is asleep

The HORI compatibility controller cannot wake it. Use a local power-button press or a tested dock-power workaround, then reconfirm docked auto-sleep is Never.

### OBS shows an unclean-shutdown prompt

Connect through Parsec with mouse permission, choose **Run Normally**, select the `Remote Switch` profile and collection, and reopen the fullscreen scene projector.

## 20. Recovery ladder

Use the least disruptive step that works:

1. Disconnect and reconnect the Parsec session.
2. Restart Parsec on the client.
3. Reset Parsec gamepads on the host, reconnect, and press A.
4. Stop and start `Remote Switch - Controller Bridge` in Task Scheduler.
5. Inspect the bridge log.
6. Deactivate and reactivate the Neo source in OBS.
7. Restart OBS and reopen its projector.
8. Restart Windows normally.
9. Power-cycle the dock/Neo HDMI chain if HDMI negotiation is stuck.
10. Cut PC power only as a last resort.

Do not expose RDP, OBS WebSocket, serial ports, or ad-hoc web panels directly to the public Internet.

## 21. Expected experience

### Image and sound

- Switch output: 1920×1080, up to 60 fps.
- Neo capture: 1080p60 SDR.
- OBS: 1080p60 NV12, Rec. 709, Limited/Partial.
- Parsec: H.264 hardware-encoded 1080p60 at up to 30 Mbps.
- Audio: HDMI stereo → Neo → OBS → VB-CABLE → Parsec.
- Family TV: independent HDMI passthrough.

Animal Crossing should look very good. Heavy rain, foliage, or rapid full-screen motion can show some compression.

### Latency

A realistic healthy interstate target is approximately **70–140 ms of added button-to-image latency**:

- Controller forwarding, bridge, UART: a few milliseconds.
- USB capture and OBS preview: commonly two to four 60 Hz frames.
- Parsec encode, network, and decode: commonly another 20–60 ms.

This is comfortable for Animal Crossing and Jackbox. It is not a competitive fighting-game or rhythm-game target.

## 22. Final acceptance checklist

- [ ] Pico still runs the HORI/Pokkén compatibility firmware.
- [ ] Host bridge path is `C:\RemoteSwitch\switch-pico-sdl2`.
- [ ] Pinned SDL2 commit begins with `e13ba50`.
- [ ] Debug Probe COM port is correct in the launcher.
- [ ] Parsec host emulates Xbox 360.
- [ ] Xbox A/B/X/Y map to Switch A/B/X/Y by label.
- [ ] Menu maps to Plus.
- [ ] View maps to Minus.
- [ ] Xbox logo maps to Home.
- [ ] Share maps to Capture when the client exposes it.
- [ ] Sticks remain neutral when released.
- [ ] Scheduled bridge starts at logon and waits for hot-plug.
- [ ] OBS starts with the clean fullscreen Switch scene.
- [ ] Sister receives one clean stereo audio feed.
- [ ] Family TV retains normal video and audio.
- [ ] Animal Crossing loads the sister's original user and resident.
- [ ] Two unattended Windows restart tests pass.

Once every required item passes, the remote-play system is ready for normal use.

## 23. Primary references

- [Pinned switch-pico SDL2 bridge source](https://github.com/jyapayne/switch-pico/blob/e13ba506cfc31fa8f02f50a9ac2a445d1ecf246b/src/switch_pico_bridge/controller_uart_bridge.py)
- [Parsec: Set up a gamepad](https://support.parsec.app/hc/en-us/articles/32381705301908-Setup-Gamepad)
- [Parsec app for Windows](https://support.parsec.app/hc/en-us/articles/32381199341716-Parsec-App-for-Windows)
- [Parsec app for macOS](https://support.parsec.app/hc/en-us/articles/32381394408596-Parsec-App-for-macOS)
- [Apple: Connect and customize a wireless game controller](https://support.apple.com/en-us/111099)
- [Apple: Supported Xbox controllers](https://support.apple.com/en-ca/111101)
- [OBS: Power of Projectors](https://obsproject.com/kb/power-of-projectors)
- [Microsoft Sysinternals Autologon](https://learn.microsoft.com/en-us/sysinternals/downloads/autologon)
