Frame Control 0.3.1: features by OS
Which features are built for each OS, and which were tested against a real Steam Frame
(SteamOS 0.3.0, build 20260922.6101926). Status as of 26 September 2026, for
PR #2 (0.3.1). Every build now bundles its own
Python 3.12, adb and CA certificates, so nothing else needs installing (only ssh on Linux,
plus the system adb on arm64 Linux).
Builds and test machines
macOS
- Built
- Apple Silicon (arm64):
.dmg,.zip. No Intel build. - Signing
- Ad-hoc signed, not notarised
- Tested on
- Apple Silicon Mac, macOS 26, using a local 0.3.1 build with the bundled Python and
adb. All 15 calls it made to the Frame at startup returned OK.
Windows
- Built
- x64: NSIS installer
.exeand.zip - Signing
- Unsigned. SmartScreen shows a warning.
- Tested on
- Windows 11 x64 VM. Real-Frame results below are from 0.3.0. The 0.3.1 installer from CI installs cleanly (31 s) and reinstalls over itself (38 s). The server starts on the bundled Python, and HTTPS to Steam and F-Droid works. The Frame went offline before its 0.3.1 run on the headset.
Linux
- Built
- x86_64 and arm64:
AppImageand.deb - Signing
- n/a
- Tested on
- x86_64 Ubuntu 26.04 with no
adband no clipboard tools, using the 0.3.1 AppImage under Xvfb with the bundled Python andadb. The arm64 builds and the.debpackages weren't run; the arm64 package was only checked to contain an ARM Python.
Features
Tested: worked against the real Frame on that OS
Partial: only part of the feature was tested (see note)
Automated: covered by CI tests on that OS, not tried on a real Frame
Built: in the build, not tested
Not built
| Feature | macOS | Windows | Linux |
|---|---|---|---|
| Connection | |||
Set Up Connection Finds the Frame, writes the frame SSH alias, copies your key using the Frame's password. macOS runs connect.sh in Terminal; Windows and Linux run frame_connect.py. |
Partial Existing alias used, script not re-run |
Tested | Tested |
Shared SSH connection A single SSH connection is reused, so each request takes about 0.3 s. Windows OpenSSH can't do this, so there each request opens its own connection (about 0.5 to 1 s). |
Tested | Not built OpenSSH limitation |
Tested |
| Headset view | |||
Capture headset view The left eye or both eyes as the lenses show them, saved as PNG |
Tested | Tested | Tested |
Capture desktop panel gamescope's flat layer |
Tested | Tested | Tested |
Live view 720p H.264 at about 30 fps, decoded with WebCodecs |
Tested | Tested | Tested |
Headset screenshots Browse the screenshots you took with Steam's shortcut, and save them to ~/Pictures/SteamFrame |
Tested | Partial Listed (5 found); saving not tried |
Partial Listed with thumbnails; saving not tried |
| Status | |||
Battery and charging Percentage, watts, time to full or empty, charger type, temperature |
Tested | Tested | Tested |
System status Storage, memory, temperature, Wi-Fi, uptime, running services |
Tested | Tested | Tested |
Volume and mute |
Tested | Partial Read only |
Partial Read only |
| Games | |||
Owned games with Frame ratings Verified, Playable, Unsupported or Unknown |
Tested | Tested | Tested |
Install a game on the Frame Uses the headset's Steam client, with live progress |
Tested | Built | Built |
Store search, Buy, Store on Frame |
Tested | Built | Built |
Library shelf and Play button |
Built | Built | Built |
| Android apps | |||
Installed Android apps list |
Tested | Tested | Tested |
F-Droid catalogue search About 4,500 apps with Frame ratings, bundled with the app |
Tested | Tested | Tested |
Install, launch, stop, test, remove an app Each app runs as its own Lepton instance, using the bundled adb. APK files are read by a built-in parser (no aapt2) that matched aapt2 on 9 F-Droid APKs. |
Tested Diary: read, install, launch, test, remove |
Built | Partial Launch and stop |
Report an APK Reports are saved on your computer; the shared database is maintainer-only |
Automated | Automated | Automated |
Android display settings Resolution, UI scale, text size |
Tested Density and text size set, then reset |
Built | Partial Read over the bundled adb |
| Transfer | |||
Send files to ~/Downloads Test files had non-English characters in their names (é, ✓). macOS and Linux copy with rsync; Windows uses scp. |
Tested | Tested | Tested |
Drop an APK to install it |
Tested | Built | Built |
Send text or clipboard to the Frame Needs the headset desktop open. The app reads your clipboard through Electron, so no extra tools are needed. |
Tested Reading the clipboard retested in 0.3.1 |
Partial Reached the Frame; desktop was closed |
Partial Clipboard read with no xclip; Frame desktop was closed |
Flatpak install and remove |
Built | Built | Built |
| One-click tools | |||
SSH or SFTP in a terminal macOS: Terminal. Windows: cmd. Linux: GNOME Terminal, Konsole, xterm and others. |
Built | Built | Built |
Steam Link |
Built | Built | Built |
Remote desktop macOS: Windows App. Windows: Remote Desktop. Linux: Remmina or FreeRDP. |
Built | Built | Built |
Sleep, restart, shut down Opens a terminal because SteamOS asks for the sudo password |
Built | Built | Built |
| App | |||
Local server test suite Runs in GitHub Actions on every push (Python 3.12 on macOS and Windows, Python 3.13 on Ubuntu), including the APK reader tests |
Automated | Automated | Automated |
Mac or PC wording The UI says Finder or File Explorer, and Mac or PC, to match your system |
Tested | Tested | Tested |
Notes
- Tested means the app, running on that OS, got a successful response from the real Frame: for example, a PNG from a capture, 868 owned games, or the Android apps listed.
- The Windows VM tests ran in its desktop session.
ssh.exehangs when it's started from a remote SSH session, but a normal desktop user won't hit that. - The macOS test from 25 September also covered the capture shown when the headset is in standby, input validation, and using the clipboard with the headset desktop open.
- Everything marked Built runs a command that works on its own. It just hasn't been tried end to end from the app on that OS yet.