skylander-portal-controller
My kids love Skylanders, but the save data (your levels, gold and Imaginators) lives ON the figure and keeping a PS3 working is even more difficult. So the portal runs in an emulator (RPCS3) and the kids drive it from a phone over the house Wi-Fi: pick a profile (PIN-gated, anti-sibling), pick a game, tap figures onto the emulated portal. The figure files are per-profile copies on the PC, somewhere a vacuum can't end them.
It boots from Steam Big Picture and puts a QR code on the TV. Phones scan in and SHARE one portal — either kid can touch any slot (co-op, free-for-all), a colour dot per slot showing whose figure is whose.
Higher-level pitch + the demo videos: . The source-of-truth docs are in the repo: SPEC.md (the long-form spec + every decision's Q&A), PLAN.md (the execution checklist) and CLAUDE.md (the compact working reference). Research writeups under docs/research/.
Latest version + the full changelog: the Releases page (that's what it's FOR).
How it fits together
flowchart LR
phone["phone / iPadLeptos SPA (WASM)"] -- "REST + WebSocketover LAN Wi-Fi" --> server
subgraph pc["the PC — one binary"]
server["Axum server+ eframe launcher (the TV face)"]
server -- "AF_UNIX IPC(drives g_skyportal direct)" --> rpcs3["patched RPCS3(--no-gui)"]
end
rpcs3 -- renders the game --> tv["TV / HTPC display"]
One binary on the PC does two jobs: an Axum web server (serves the phone SPA + the command API) and the eframe launcher window (the QR + status on the TV). It drives a PATCHED RPCS3 over a local AF_UNIX socket — g_skyportal control direct, instead of a robot clicking through RPCS3's menus on screen (instant, and it can't fumble a button that moved). The phone stays a dumb client: REST to send a command, a WebSocket to get state back.
Install (end users)
You bring your own RPCS3 () and your own firmware + .sky figure dumps. This ships NO game or firmware content (that's piracy — dump your own).
- Install:
winget install ChristopherHotchkiss.SkylanderPortalController. winget is a trusted authority, so you skip the SmartScreen "unknown publisher" scare and it upgrades cleanly. (Or grab the MSI or portable zip off the Releases page — same binary; the MSI installs to Program Files, the zip unpacks anywhere.)
- Point it at your RPCS3. First launch asks for your RPCS3 path + firmware-pack root and remembers them (). It reads firmware + games from your install but drives the portal through its OWN bundled patched RPCS3 — stock RPCS3 doesn't support the level of control we need, which is why the patched build ships alongside.