Christopher Hotchkiss

Christopher Hotchkiss

Crafting Solutions, Shaping Products: From Concept to Code

Skylander Portal Controller

Skylanders the way my kids actually want it — grab a figure off the shelf, tap it on the portal, and the game just runs. No PS3 to keep alive, and no save trapped on a toy the vacuum can find.

What it is

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, so a sibling can't wreck your save), 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 straight from Steam Big Picture and puts a QR code on the TV. Phones scan in and SHARE one portal — either kid can drop a figure on any slot (co-op, free-for-all), a colour dot per slot showing whose figure is whose.

Why I built it

Two reasons, both real. First, to keep it playable: my kids (7, 17 and 18) love Skylanders, and the figures and the games are steadily breaking as the years go on. The save data lives ON the physical figure and the game wants a PS3 that gets harder to keep running every year — so a cracked figure or a dead console quietly ends a game they've put years into. Emulating the portal, with the figures as per-profile copies on the PC, means a broken toy doesn't take the save with it.

The real collection — the years-of-it scale this is preserving

Second, and honestly the thing that drove the build: picking a figure in stock RPCS3 means digging through a basic Windows file dialog — slow and tedious, and it BREAKS the gameplay every time you want to swap one in. Tapping it from your phone instead is what makes the whole thing something my 7-year-old can run himself.

See it in action

The 45-second pitch — real gameplay driven from a phone

That's the real RPCS3 viewport on the left and the phone driving it on the right. Tap a figure on the phone and it lands on the portal while the game keeps running.

A figure tapped in on the phone, live in the running game

What it looks like

A whole session, screen by screen.

First-launch setup wizard

First launch, about thirty seconds: point it at your existing RPCS3 install (that's where your PS3 firmware + games already live). A Skylanders figure pack is OPTIONAL — scan figures with an NFC reader, or start empty and roll your own in Imaginators. (There IS setup before the fun — you supply the firmware + games, this ships neither.)

Scan the QR, pick a profile, tap in a PIN

The TV shows a QR code, the phone scans it, you pick your profile and tap a 4-digit PIN. The PIN is anti-sibling, not real security — it just stops a little brother from undoing a save that took years.

The collection grid with game / element / category filters

The whole family's collection in one grid, filtered by game, element or category. The phone never sees a filename or a path — only stable figure IDs, so there's nothing for a bug to leak.

Two phones on one portal, ownership dots per slot

The little colour dot on each slot is whose figure it is — so when both kids are dropping figures on the same portal, nobody argues about who put that there.

A third phone takes over — Kaos eviction screen

A third phone joins by evicting the OLDEST one (Kaos shows up to gloat, naturally). A one-minute cooldown kills the eviction ping-pong, and the booted phone keeps a "kick back" button to climb right back in.

Hold to shut down — the launcher's farewell screen

Done for the night? HOLD to shut down — the emulator quits clean and the launcher waves goodbye. Nothing left humming in the cabinet.

How it works

The part I'd brag about on a whiteboard: it drives a PATCHED RPCS3 directly, over a local socket (AF_UNIX), talking to the emulator's portal device (g_skyportal) — instead of a robot clicking through RPCS3's on-screen menus. That's the gap between "instant, and it can't fumble a button that moved" and a script that breaks the first time the UI shifts a pixel.

One binary on the PC does two jobs: an Axum web server (serves the phone app + the command API) and the launcher window that shows the QR + status on the TV. The phone stays a dumb client — REST to send a command, a WebSocket to get state back — so all the real logic lives in one place. The phone app itself is a Leptos single-page app compiled to WebAssembly.

Stock RPCS3 doesn't expose the level of control this needs, which is why a patched build ships alongside (the patch series is in the repo). The long-form spec — every decision and its Q A — is in SPEC.md.

The full run-through

Want the whole thing end to end — boot from Big Picture, the QR handoff, picking profiles, a real co-op session? Here's the long cut.

The full run-through — Big Picture boot, QR handoff, a real co-op session

Get it

  • Source: github.com/chotchki/skylander-portal-controller (GPL-2.0 — it builds on RPCS3, which is GPLv2).
  • Windows: winget install ChristopherHotchkiss.SkylanderPortalController (winget is a trusted authority, so you skip the "unknown publisher" scare). Windows x86_64 is the shipping target.
  • macOS: Grab the latest signed + notarized release from GitHub. The Mac build bundles the patched emulator, so there's nothing else to install but your own firmware + games.
  • You bring your own PS3 firmware + games + .sky figure dumps (point first-launch setup at your existing RPCS3 install). This ships NO game or firmware content — that's piracy; dump your own.