mirror of
https://github.com/saphid/frame-control.git
synced 2026-10-06 04:04:21 +02:00
An iPhone can't run Python or ssh, but the Frame can. The app (ios/, SwiftUI) connects with its own SSH key (Citadel), copies the server and helpers to ~/.cache/frame-control/<version> on the Frame once per version, starts ui/server.py there with FRAME_LOCAL=1 on the Frame's 127.0.0.1, and shows the page through an SSH tunnel. The server exits when the phone disconnects. Server: FRAME_LOCAL=1 puts ui/local-bin on PATH, whose ssh stand-in runs each `ssh frame COMMAND` locally (and serves as rsync's transport), so desktop and phone share one code path. Android display goes through podman exec there, as the Frame has no adb. FRAME_UI_KEY replaces the fixed X-Frame-UI value with a per-session key. Power actions take the Developer Mode password via sudo -S. --port 0 now prints the port it took. Page: a bottom tab bar and safe areas on phones, Play buttons visible on touch screens, saving through the share sheet, SSH/SFTP/Steam Link/remote desktop opening in their iOS apps, and a password dialog for power. App: pairing with the Developer Mode password once (never stored) or with a key the user adds; host key pinned on first use; plain-language connection errors with quiet retries; frame-control://install links; alerts and confirms. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
77 lines
2.8 KiB
YAML
77 lines
2.8 KiB
YAML
name: FrameControl
|
|
options:
|
|
bundleIdPrefix: com.saphid
|
|
deploymentTarget:
|
|
iOS: "17.0"
|
|
createIntermediateGroups: true
|
|
packages:
|
|
Citadel:
|
|
url: https://github.com/orlandos-nl/Citadel.git
|
|
exactVersion: 0.12.1
|
|
settings:
|
|
base:
|
|
SWIFT_VERSION: "5.0"
|
|
MARKETING_VERSION: "0.1.0"
|
|
CURRENT_PROJECT_VERSION: "1"
|
|
targets:
|
|
FrameControl:
|
|
type: application
|
|
platform: iOS
|
|
sources:
|
|
- path: FrameControl
|
|
dependencies:
|
|
- package: Citadel
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: com.saphid.framecontrol
|
|
PRODUCT_NAME: Frame Control
|
|
TARGETED_DEVICE_FAMILY: "1,2"
|
|
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
|
GENERATE_INFOPLIST_FILE: YES
|
|
INFOPLIST_FILE: FrameControl/Info.plist
|
|
ENABLE_USER_SCRIPT_SANDBOXING: NO
|
|
info:
|
|
path: FrameControl/Info.plist
|
|
properties:
|
|
CFBundleDisplayName: Frame Control
|
|
UILaunchScreen:
|
|
UIColorName: ""
|
|
UISupportedInterfaceOrientations: [UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight]
|
|
UISupportedInterfaceOrientations~ipad: [UIInterfaceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight]
|
|
UIUserInterfaceStyle: Dark
|
|
NSLocalNetworkUsageDescription: Frame Control connects to your Steam Frame over your local network with SSH.
|
|
NSAppTransportSecurity:
|
|
NSAllowsLocalNetworking: true
|
|
LSApplicationQueriesSchemes: [ssh, sftp, steamlink, rdp]
|
|
CFBundleURLTypes:
|
|
- CFBundleURLName: com.saphid.framecontrol.install
|
|
CFBundleURLSchemes: [frame-control]
|
|
preBuildScripts:
|
|
- name: Pack the Frame bundle
|
|
# The server, headset helpers and catalogue, as the app copies them to the Frame.
|
|
script: |
|
|
python3 "${SRCROOT}/scripts/make_frame_bundle.py" "${DERIVED_FILE_DIR}/frame-bundle.tar.gz" > "${DERIVED_FILE_DIR}/frame-bundle.version"
|
|
mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
|
|
cp "${DERIVED_FILE_DIR}/frame-bundle.tar.gz" "${DERIVED_FILE_DIR}/frame-bundle.version" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
|
|
basedOnDependencyAnalysis: false
|
|
FrameControlTests:
|
|
type: bundle.unit-test
|
|
platform: iOS
|
|
sources:
|
|
- path: FrameControlTests
|
|
dependencies:
|
|
- target: FrameControl
|
|
settings:
|
|
base:
|
|
GENERATE_INFOPLIST_FILE: YES
|
|
TEST_HOST: "$(BUILT_PRODUCTS_DIR)/Frame Control.app/Frame Control"
|
|
BUNDLE_LOADER: "$(TEST_HOST)"
|
|
schemes:
|
|
FrameControl:
|
|
build:
|
|
targets:
|
|
FrameControl: all
|
|
FrameControlTests: [test]
|
|
test:
|
|
targets: [FrameControlTests]
|