Files
saphid--frame-control/docs/frame-plugin-author.md
T
Alex SouthwellandSAPHID 234b0a1814 Add managed Decky store and Frame plugin compatibility audit (#208)
* Add managed Decky store plugins and Frame compatibility audit

* Reject malformed flags and linked plugin folders

---------

Co-authored-by: SAPHID <saphid@users.noreply.github.com>
2026-10-25 06:15:42 +00:00

1.9 KiB

Write a plugin for Frame

There are two paths. Choose the one that matches your feature.

Frame Control extension

Use a Frame Control extension for a panel, status view, or guide that does not need to change the headset. Put extension.json and index.html in one folder under ~/.local/share/frame-control/extensions. The opt-in headset panel lists the folder and opens it in a sandboxed iframe. The version 1 bridge has only capabilities and read-only status. It cannot call Steam, change settings, or run privileged code. See the extension API and its example.

Decky plugin

Use a Decky plugin only if you need Decky's backend or Gamepad UI integration. Build an official-format ZIP with one top-level folder, plugin.json, and a frontend bundle in dist/index.js. A Python main.py backend is optional. Test on ARM64. If you ship an ELF helper, build it for AArch64 (ELF machine 183). Avoid root, sudo, Steam Deck TDP controls, fixed x86 binaries, and paths under /etc. Frame Control's managed loader is a normal user service; it blocks root plugins and x86 archives. Keep data under your plugin folder or the user's home directory, and provide a removal path.

The current Frame SteamVR shell does not expose Decky's Steam Deck Quick Access Menu. A backend Loaded log only proves backend startup. Test any frontend page, setting, notification, route, and controller input while wearing a Frame before describing it as working in VR. Until a QAM bridge is verified, a Frame Control extension is the practical route for a visible read-only VR panel.

To test safely, use a separate Frame Control managed Decky install, verify the ZIP digest from the official store, install one plugin at a time, and inspect journalctl --user -u frame-control-decky.service. Remove only your own plugin folder when you finish. See the current compatibility table.