mirror of
https://github.com/saphid/frame-control.git
synced 2026-10-06 07:00:37 +02:00
Frame Control can now show any Mac window, or a whole screen, as its own SteamVR panel on the Steam Frame (Tools -> Mac in the headset, macOS only). Place it with the SteamVR dashboard; the laser clicks and scrolls, and the Mac's own keyboard types. - mac/frame-mac-view (Swift, no dependencies): ScreenCaptureKit capture per window or display, VideoToolbox H.264 with low-latency rate control (JPEG fallback), a loopback HTTP/WebSocket server, CGEvent/AX input playback, and a display-awake assertion while anyone watches. - ui/frame_macview.py: starts the agent, runs an ssh -R tunnel with a supervisor that reopens it on the same port, and launches a Chromium app window per stream on gamescope's :0, tagged with STEAM_GAME for its own panel. - Frame Control's key never leaves the Mac: viewers get single-use, per-source tickets and reconnect keys that Stop revokes. - ui/mac-view.html: WebCodecs decode, keyframe recovery, pointer/wheel/keys back. - Bundled in the Mac app build; tests/test_macview.py builds and drives the agent on macOS. Verified on the Frame (build 20260925.6191901) with the test pattern: panel in about 1.5 s, about 60 fps, Mac-to-window about 11-17 ms, tunnel recovery in 4 s. Laser input and real window capture still need a person in the headset. Also commits the other thread's first-party rule (steam-frame skill) and the first-party options table in docs/streaming.md. Reviewed by GPT-6 Astra (xhigh, read-only) over six rounds; all findings fixed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
174 lines
4.4 KiB
JSON
174 lines
4.4 KiB
JSON
{
|
|
"name": "frame-control",
|
|
"productName": "Frame Control",
|
|
"version": "0.3.1",
|
|
"description": "Desktop app for managing a Valve Steam Frame over SSH",
|
|
"private": true,
|
|
"main": "main.js",
|
|
"license": "MIT",
|
|
"scripts": {
|
|
"start": "env -u ELECTRON_RUN_AS_NODE electron .",
|
|
"icon": "env -u ELECTRON_RUN_AS_NODE electron build/make-icon.js",
|
|
"dist": "sh ../mac/frame-mac-view/build.sh && node build/fetch-deps.js mac arm64 && electron-builder --mac --arm64 --publish never",
|
|
"dist:dir": "sh ../mac/frame-mac-view/build.sh && node build/fetch-deps.js mac arm64 && electron-builder --mac --arm64 --dir",
|
|
"dist:linux": "node build/fetch-deps.js linux x64 arm64 && electron-builder --linux --x64 --arm64 --publish never",
|
|
"dist:win": "node build/fetch-deps.js win x64 && electron-builder --win --x64 --publish never"
|
|
},
|
|
"devDependencies": {
|
|
"electron": "^44.4.5",
|
|
"electron-builder": "^26.15.3"
|
|
},
|
|
"build": {
|
|
"appId": "com.saphid.frame-control",
|
|
"productName": "Frame Control",
|
|
"protocols": [
|
|
{
|
|
"name": "Frame Control install link",
|
|
"schemes": [
|
|
"frame-control"
|
|
]
|
|
}
|
|
],
|
|
"directories": {
|
|
"output": "dist",
|
|
"buildResources": "build"
|
|
},
|
|
"files": [
|
|
"main.js",
|
|
"preload.js",
|
|
"install-link.js",
|
|
"package.json",
|
|
"build/icon.png"
|
|
],
|
|
"extraResources": [
|
|
{
|
|
"from": "../ui",
|
|
"to": "ui",
|
|
"filter": [
|
|
"*.py",
|
|
"*.html"
|
|
]
|
|
},
|
|
{
|
|
"from": "../scripts",
|
|
"to": "scripts",
|
|
"filter": [
|
|
"*.sh"
|
|
]
|
|
},
|
|
{
|
|
"from": "../frame/android",
|
|
"to": "frame/android",
|
|
"filter": [
|
|
"*.sh",
|
|
"*.py"
|
|
]
|
|
},
|
|
{
|
|
"from": "../frame/devkit-utils",
|
|
"to": "frame/devkit-utils",
|
|
"filter": [
|
|
"**/*",
|
|
"!**/__pycache__/**"
|
|
]
|
|
},
|
|
{
|
|
"from": "../apk-catalog",
|
|
"to": "apk-catalog",
|
|
"filter": [
|
|
"*.py",
|
|
"pins.json",
|
|
"site/apps.js"
|
|
]
|
|
},
|
|
{
|
|
"from": "build/deps/${os}-${arch}/python",
|
|
"to": "python",
|
|
"filter": [
|
|
"**/*"
|
|
]
|
|
},
|
|
{
|
|
"from": "build/deps/${os}-${arch}/tools",
|
|
"to": "tools",
|
|
"filter": [
|
|
"**/*"
|
|
]
|
|
}
|
|
],
|
|
"mac": {
|
|
"category": "public.app-category.utilities",
|
|
"icon": "build/icon.icns",
|
|
"identity": "-",
|
|
"hardenedRuntime": false,
|
|
"target": [
|
|
"dmg",
|
|
"zip"
|
|
],
|
|
"extraResources": [
|
|
{
|
|
"from": "../mac/bin",
|
|
"to": "mac/bin",
|
|
"filter": [
|
|
"frame-mac-view"
|
|
]
|
|
}
|
|
],
|
|
"extendInfo": {
|
|
"NSAppleEventsUsageDescription": "Frame Control opens Terminal for SSH sessions and for power actions that need the Developer Mode password.",
|
|
"NSLocalNetworkUsageDescription": "Frame Control connects to your Steam Frame over SSH on the local network.",
|
|
"NSScreenCaptureUsageDescription": "Frame Control shows your Mac's windows and screens inside the Steam Frame when you ask it to."
|
|
},
|
|
"artifactName": "Frame-Control-mac-${arch}.${ext}"
|
|
},
|
|
"dmg": {
|
|
"title": "Frame Control ${version}"
|
|
},
|
|
"electronFuses": {
|
|
"runAsNode": false,
|
|
"enableNodeOptionsEnvironmentVariable": false,
|
|
"enableNodeCliInspectArguments": false
|
|
},
|
|
"linux": {
|
|
"target": [
|
|
"AppImage",
|
|
"deb"
|
|
],
|
|
"category": "Utility",
|
|
"icon": "build/icon.png",
|
|
"executableName": "frame-control",
|
|
"synopsis": "Manage a Valve Steam Frame over SSH",
|
|
"artifactName": "Frame-Control-linux-${arch}.${ext}",
|
|
"desktop": {
|
|
"entry": {
|
|
"StartupWMClass": "frame-control"
|
|
}
|
|
}
|
|
},
|
|
"deb": {
|
|
"depends": [
|
|
"openssh-client"
|
|
]
|
|
},
|
|
"win": {
|
|
"target": [
|
|
"nsis",
|
|
"zip"
|
|
],
|
|
"icon": "build/icon.png",
|
|
"artifactName": "Frame-Control-win-${arch}.${ext}"
|
|
},
|
|
"nsis": {
|
|
"oneClick": false,
|
|
"perMachine": false,
|
|
"allowToChangeInstallationDirectory": true,
|
|
"artifactName": "Frame-Control-Setup-${arch}.${ext}"
|
|
}
|
|
},
|
|
"homepage": "https://github.com/saphid/steam-frame",
|
|
"author": {
|
|
"name": "saphid",
|
|
"email": "4596216+saphid@users.noreply.github.com"
|
|
}
|
|
}
|