The open-source replacement for the Holoscope app.
Control P56 / Holoscope POV hologram fans from Windows, Android, the command line or Home Assistant.
Local, fast, no account, no cloud.
|
Full control Upload anything Live cast |
True preview Network setup Home Assistant |
Media: text, photo, GIF or video, with the round preview and the picture as the fan receives it |
The same app on Android |
Cast: a test card, your media, a video, the camera or the screen, live |
The look is called Baan (Dutch for orbit): everything is round, like the fan itself. See docs/DESIGN.md.
Step by step for everyday use: user guide.
- Download
P56.Studio_…_x64-setup.exefrom the latest release and install it. - Connect the PC to the fan's Wi-Fi hotspot, or put the PC and the fan on the same router.
- Close Holoscope: only one program can serve a fan at a time.
- Start P56 Studio. Windows asks to open the firewall the first time: allow it for private networks.
- The fan appears by itself.
Good to know: a P56 has a 2.4 GHz Wi-Fi radio only (so use a 2.4 GHz network for router mode), and with an empty playlist it blinks four blue LEDs: keep one black picture on it.
- Download
P56-Studio-…-android.apkfrom the latest release and open it (allow installing from your browser if asked). - Join the fan's Wi-Fi hotspot (or the same router) and open P56 Studio.
The app keeps using the fan's Wi-Fi even though it has no internet, and keeps the screen on while you cast.
Install the add-on and integration from trackerr/home-assistant-p56:
one-click install buttons, a sidebar panel with this app, and actions like p56_pov.show_text.
Fan not showing up? Check that both devices are on the same network, that Holoscope is closed, and that the firewall allows UDP 8988 and TCP 6666. You can also enter the fan's IP in the App tab (Fan IP, if you know it).
p56-sim behaves exactly like a real fan on your network, so you can try everything without hardware.
p56-sim # one simulated P56
p56-sim --count 3 # three fansOpen P56 Studio and the simulated fan connects by itself. http://localhost:8099/ shows what it displays, its settings and any protocol errors.
p56: every feature from a terminal or script
p56 info # all fans with their status
p56 upload photo.jpg --slot 1 # also .gif, and video when ffmpeg is installed
p56 cast test --seconds 10 # live test card
p56 brightness 12
p56 angle -45
p56 name LivingRoom
p56 router MyWifi mypassword # put the fan on your Wi-Fi
p56 --helpOptions for all commands: --target <fan-ip>:8988 (reach a fan directly), --fan <n> / --all (several fans), --type <fan type>, --wait <seconds>.
p56-server runs the same engine headless, with an HTTP API, live events and this web app:
p56-server --http-port 8765 # add --simulate for a virtual fanThen open http://localhost:8765/. It powers the Home Assistant add-on; static Linux builds (x86_64 and aarch64) are in every release.
It answers only this machine until you add --lan; protect that with --api-token <token>.
--fan-allow <ip> limits which addresses may connect as a fan. --comfyui http://<pc>:8188
makes AI pictures with ComfyUI and Qwen Image 2.1 on a computer in your
house (--comfyui-size, default 768); see the
add-on documentation.
One server can be the single controller of your fans while Home Assistant, browsers and P56 Studio on other phones and computers use it at the same time (App tab → Control through a P56 server): a fan keeps one connection, to the app or server it found.
API in short
| Request | What it does |
|---|---|
GET /api/state |
Connected fans, status and playlists |
POST /api/show |
Show text or a picture: {"text": "Hello", "show_seconds": 30} |
POST /api/call/<command> |
Any app command, e.g. control {"id": 1, "action": "off"} |
GET /api/events |
Live events (server-sent events) |
POST /api/call/show_ai |
An AI picture on the fan: {"prompt": "a jellyfish", "show_seconds": 30} |
GET /api/shown/<mac> |
PNG of what the fan was last sent (faded when it is no longer on it) |
Full reference: add-on documentation.
| Fan types (as reported by the fan) | Status |
|---|---|
| 8 (P56), 1, 2, 3, 4, 5, 11, 14, 17 | ✅ Supported (JPEG picture format) |
| 6, 7, 12, 13, 15 | |
| others | ❌ Not implemented yet |
The protocol was worked out from the Holoscope app and is documented in PROTOCOL.md. Everything is tested against the built-in simulator.
flowchart LR
core["p56-core<br/>protocol, pictures, network"]
service["p56-service<br/>upload, cast, text, settings"]
app["P56 Studio<br/>Windows and Android"]
server["p56-server<br/>HTTP API and web app"]
ha["Home Assistant<br/>add-on and integration"]
cli["p56<br/>command line"]
sim["p56-sim<br/>virtual fans"]
fan(("POV fan"))
core --> service
service --> app
service --> server
server --> ha
core --> cli
core --> sim
app -.->|"UDP 8988, TCP 6666"| fan
server -.-> fan
Repository layout
| Folder | What |
|---|---|
crates/p56-core |
Protocol, picture conversion (polar warp, JPEG), network link |
crates/p56-service |
Everything the apps do, behind one command API |
app/ |
P56 Studio: Tauri 2 shell + React UI (app/ui, Radix primitives with its own design: DESIGN.md) |
crates/p56-cli |
p56 command line |
crates/p56-sim |
Simulated fans with a web view |
crates/p56-server |
Headless server for Home Assistant and other hosts |
ha/ |
Home Assistant add-on and integration — the source of home-assistant-p56, which is published from this folder with git subtree split --prefix ha (make changes here, not there) |
e2e/, scripts/ |
End-to-end tests, gauntlet loop, Android build, README screenshots |
Build from source
Requirements: Rust (stable), Node 20 + pnpm; for Android the SDK/NDK (see scripts/android.ps1).
cargo build --release --workspace # p56, p56-sim, p56-server, P56 Studio
cd app/ui && pnpm install && pnpm run bundle # after UI changes → app/src/index.html
cd app && npx tauri build # Windows installer
powershell -File scripts/android.ps1 build # Android APKRelease signing of the APK reads app/src-tauri/gen/android/keystore.properties (not in git).
Run the tests
cargo test --workspace # unit, simulator, CLI and server tests
powershell -File scripts/gauntlet.ps1 -Rounds 20 # everything, repeated until something fails
node e2e/app-e2e.mjs # the real app against the simulator
cd ha && pytest # Home Assistant integration against p56-serverGitHub Actions runs the Rust tests, the UI build and the Home Assistant tests on every push, and builds all release files from a version tag.
MIT licensed · Not affiliated with the maker of the fans or of Holoscope.
The protocol was worked out for interoperability with hardware you own; no vendor code or binaries are included.