popin-aladdin
Skill0 starsChanged 5 days agoMITView on GitHub
popIn Aladdin (ceiling-light projector) control. Use when: user asks about the projector / ceiling light — turning the light on/off or adjusting brightness/color, media playback state or volume, casting a video/image URL to the projector, launching an app (YouTube / Netflix / TVer …) or opening a deeplink, navigating its UI with remote keys / text input, taking a screenshot or checking what's on screen, or powering the projector off. Controls the unit via the popin-aladdin-api REST wrapper.
In this repository10 other files it gives its agents.
- AGENTS.mdAGENTS.md
- codex-model-profilesSkill
- cognitive-rhythm-writingSkill
- daikinSkill
- decoSkill
- epgstationSkill
- japanese-tech-writingSkill
- piholeSkill
- stirling-pdfSkill
- switch2-controlSkill
The file
Files
popIn Aladdin
Base URL: https://popin-aladdin.msageha.net/api (FastAPI wrapper around the
popIn Aladdin's local UPnP/DLNA MediaRenderer plus the proprietary control
protocols the official app uses — popIn's own TCP protocol and the XGIMI GMSDK
UDP protocol). Requests to this instance don't need any authentication
header/cookie; the server talks to the unit directly. The reverse proxy only
admits allowlisted LAN client IPs — a 403 with an nginx HTML page means the
caller isn't on that list, not an API error.
Key facts
- Two control planes: DLNA (playback / volume / cast /
/soap) and the proprietary remote protocols (/light,/key,/keyboard,/voice,/deeplink,/remote/*,/discover,/memory/free,/capture,/power/off).POST /remote/pingchecks the latter's TCP reachability. - Requests are serialized behind a server-side lock; call endpoints sequentially, don't fan out parallel requests.
- Light buttons:
switchbrighterdarkercoolerwarmerfullnightonoffecosleep.repeat(1..50) presses any button N times — use it for the step buttons (brighter/darker/cooler/warmer). - Remote keys (
POST /key): D-padupdownleftrightokhome, focusfocus_plusfocus_minus, long-presshome_longmenu_long, hardwarebackmenuvol_upvol_downpowersettings, app shortcutsnetflixyoutubeprime_videocustomcustom_long.poweronly opens the on-screen power menu — it does not switch the unit off. POST /power/off({"confirm": true}required) really powers the projector down, and this API cannot turn it back on — always confirm with the user first.GET /remote/devicereports the foreground app;GET /statusonly knows the DLNA playback state.POST /castneeds a media URL reachable from the device's LAN. It replaces whatever is currently showing — confirm if something is playing.- UDP-based commands (
/key,/memory/free,/power/off) only report that the datagram was sent: they return 200 even when the unit is off. When it matters, verify with/remote/ping,/remote/deviceor/capture. - Verified on the real unit: light, D-pad,
backmenuvol_upvol_downpower, text input, voice, ping. The other keys,/remote/*info endpoints,/discover,/deeplink,/memory/free,/captureand/power/offwere reconstructed from the official app and are unverified. - Writes are immediately visible in the room (light/volume/playback). Safe to
do when asked; confirm first for
/power/off, stopping active playback, casting over running content, and/soapSet-actions (confirm: truerequired). - Errors:
400missingconfirm(/soapSet-actions,/power/off),422body validation (unknown button, volume out of range, …),502device returned a SOAP fault or an unexpected answer (detail; SOAP faults addfault_code+upnp_error_code),504unit unreachable or no UDP reply in time.
Core operations
| Task | Endpoint |
| Ceiling light on/off/brightness/color | POST /light |
| Aggregated playback state (transport/volume/mute/URI/position) | GET /status |
| What's on screen (foreground app) | GET /remote/device |
| Volume / mute | GET/POST /volume, GET/POST /mute |
| Play / pause / stop / next / previous | POST /play, /pause, /stop, /next, /previous |
| Seek (seconds) / play mode | POST /seek, POST /play-mode |
| Cast a media URL to the projector | POST /cast |
| Launch an app / open a URL on the device | POST /deeplink (or POST /key with youtube / netflix / prime_video) |
| Remote key input (D-pad / focus / hardware keys) | POST /key |
| Type text into focused input | POST /keyboard |
| Voice command as text | POST /voice |
| Screenshot (returns an image URL on the device's LAN) | POST /capture |
Power off (destructive, confirm: true) | POST /power/off |
| Device info / playback details | GET /info, /transport, /position, /media, /protocol-info |
| Model / OS / storage / features, photo memory, is an app installed | GET /remote/version, /remote/album, /remote/apps/{package} |
| Find Aladdins on the LAN | GET /discover?wait=3 |
| Free memory / remote ping | POST /memory/free, POST /remote/ping |
| Raw SOAP action (escape hatch) | POST /soap |
| Server health / button list | GET /health, GET /remote/buttons |
Full request/response schemas and ready-to-run curl examples: see references/api-reference.md and references/commands.md.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

