Commit Graph
70 Commits
Author SHA1 Message Date
spoopyghosty0 107215525f Save backups: choose the folder, quick actions, automatic snapshots (#352)
Settings -> Data picks the PC backup folder (e.g. a cloud-sync folder; old folders stay listed) and turns on
automatic snapshots (off by default): Quest launchers snapshot the saves when the game closes, under the launch lock,
keeping the newest three changed ones on the Frame, and FramePort imports them as automatic backups when it connects.
Agent v101. Checked on the Frame with BlazeRush (snapshot per close, one import per snapshot).
2026-10-17 21:29:32 -04:00
spoopyghosty0 9106d3f090 Agent: uninstall works with Steam library mode later/off (#305)
cmd_shortcuts returns without "started" when it queues (later) or skips the change; cmd_uninstall indexed it
and failed after the shortcut removal was already queued, leaving the game installed. Found on the Frame.
2026-10-17 16:23:27 -04:00
spoopyghosty0 39fefd225f Steam library scheduling: now / later / off (#305)
Installing on the Frame restarted Steam to add the shortcuts, which also closed FramePort running there.
Settings -> Installing gets a Steam library mode: now (as before; restarts also wait while FramePort runs on
the Frame), later (no restart: Steam's next start re-applies and verifies the shortcuts through bounded
steam.service hooks) or off (no shortcuts; Play starts the game from FramePort). Restart Steam now bypasses
the holds and asks before ending a running game. Agent v99.

Based on the feature branch's two commits (a311498, cf05ce2), merged onto main.
2026-10-17 16:23:26 -04:00
spoopyghosty0 d7f0d51472 Foveation as a per-game setting; "Sharpness" is "Render resolution" (#365)
Foveation (Default / Eye-tracked / Fixed / Off, radius, test) moves from Customize to Game settings →
Picture. It's a user preference, not part of the recipe: existing recipes are migrated once and Share
working config leaves it out. Agent v98 set_settings rewrites only the launcher's foveation exports, so a
change applies at the next game start without a rebuild (checked on the Frame: Fixed adds the FDM exports,
Default removes them). The APK-side parts (Batman allocation fix, Climb 2 bridge) stay in the build.
The scale setting's label is now "Render resolution (supersampling)". ui_smoke: game-settings-dialog step.
2026-10-17 15:46:35 -04:00
spoopyghosty0 8169574d89 Agent: merge case-variant duplicate shortcut keys instead of refusing them (#300 follow-up)
Pre-#263 agents left shortcuts.vdf entries with both appname and AppName; vdf_decode then refused the file
("duplicate VDF key") and Add to Steam library failed. Duplicates are now merged into one key: Steam's capitalized
spelling kept, the last value taken. Clean files still round-trip unchanged.
2026-10-15 00:50:33 -04:00
spoopyghosty0 5910a8d3c7 Agent 91: the logcat keeper also catches a silent or failing Lepton mirror
After "Waiting for app", a failure line or 20 s without a logcat line start FramePort's own reader, from the
launcher's start (logcat -T <epoch>) when the mirror never wrote, else from just before its last line. The reader
restarts from where it ended, stops when Lepton's lines come back, the container's log buffer is 16 MiB, and every
decision goes to logcat-keeper.log.
2026-10-14 22:27:49 -04:00
spoopyghosty0 927dae5ff8 Merge main into aarch32testing; maintainer fixes for the 32-bit bridge
Merged main (agent 90, ANALYSIS_VERSION 17/18 after main's 15/16) and rebuilt the bridge, foveation and a32
libraries from source (deterministic, no local paths).

Fixes on top:
- a32 loader: apply DT_ANDROID_RELR relocations (Journey of the Gods crashed at start)
- VrApi bridge: vrapi_Get/SetTrackingTransform (floor-level tracking; Shadow Point's player was below the floor)
- a32: never submit an untracked default head pose (hold up to 100 ms, repair or drop); pose consistency per display
  time; submit/tracking counters
- VrApi bridge: wait again when xrWaitFrame gives a display time in the refresh just submitted (the runtime rejected
  the second frame with AlreadySubmitted; Journey of the Gods ran at ~120 fps on a 90 Hz display and the scene slid
  and snapped back); pacing counters
- VrApi bridge: GLES re-entry polls events before reusing the kept session (a lost or exiting session is replaced, a
  stopped one waits for READY)
- VrApi bridge: STAGE is the runtime's STAGE space (play-area centre and orientation, unchanged by recentering);
  LOCAL_FLOOR keeps the head-based origin
- signer certificate: pick the certificate the SignerInfo names, not the first in the PKCS#7 block
- flat 32-bit apps keep the bridge (it isn't a VR-only fix)
- Frida gadget loads are stripped before translation
- launcher restart test fixed; native/.cache is no longer committed
- catalog: Shadow Point and Journey of the Gods work (headset, 2026-10-14; min_app 1.1.2)
2026-10-14 20:10:10 -04:00
coah 13a350b3bf fix: fall back to a devkit entry when Steam drops the library shortcut
On Frames whose Steam drops FramePort's shortcuts.vdf entries on every restart
(GitHub #41/#42), "Add to Steam library" restarted Steam twice and then failed
with "Steam removed the new library entry again after restarting". Play's
fallback (the devkit entry, the one Steam keeps) was never reached because
_add_then_play gave up first.

After the second loss the shortcuts worker now adds the devkit entry while
Steam runs, so the game ends up in the library as "Devkit Game: <title>" and
the job succeeds. Agent v89.
2026-10-14 12:36:53 -04:00
spoopyghosty0 c1653f21b1 Fix case-insensitive Steam shortcut keys (#263) 2026-10-13 19:20:39 -04:00
UnicronNLandClaude Opus 5.5 2acfd64f7f Sports Scramble runs: Quest builds on the a32 bridge, Unreal's self-restart
Sports Scramble (a 32-bit Santa Cruz build: UE 4.21, OVRPlugin on VrApi 1.21)
now plays in the headset with both controllers.

a32 bridge:
- AAsset_getBuffer: the host buffer lies above 4 GiB, so the guest gets a
  copy in its own memory, freed in AAsset_close (Unreal read its
  UE4CommandLine.txt this way and aborted on the NULL it got before)
- AKeyEvent_getFlags and the remaining AConfiguration getters
- Touch controllers for Quest builds: apps that require 6DoF head tracking
  (uses-feature android.hardware.vr.headtracking version 1) get
  assets/fp_a32_headset.txt = "quest" at conversion; the bridge then passes
  both Frame controllers through (input devices, caps, state, tracking,
  vibration; struct tails per VrApi minor) and sends no synthetic touchpad
  events. Gear VR / Go games keep the remote emulation. A32_TOUCH=1/0
  overrides.

Analysis: detect.requires_6dof, headset "quest" for such 32-bit apps
(ANALYSIS_VERSION 13).

Agent 82: Unreal restarts the app once after its first-run shader precompile
(the "optimizing" screen): it starts its own launcher activity and exits, and
Lepton ends the container with the first process. Skipping the restart or
turning it off (r.ProgramBinaryCache.RestartAndroidAfterPrecompile=0) left
the game on that screen for good. launch.sh now starts Lepton once more when
the system log shows the app's own LAUNCHER start right before its
System.exit(0) (_restart_requested; first run kept as
launch-before-restart.log; FRAMEPORT_NO_RESTART=1 turns it off).
upgrade_launchers adds it to existing launchers. Crashes, quitting from the
game and Steam's Exit game don't match.

Catalog: Sports Scramble works (owner, headset, 2026-10-13).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:48:53 +02:00
spoopyghosty0 78ac1a2865 Agent: the cloud-saves line takes the package as given (the launcher template doesn't check names elsewhere); test template call updated (#240) 2026-10-12 21:21:06 -04:00
Nick Leach d6c8315463 Fix Aftermath backup data detection and first-launch cloud saves 2026-10-12 16:25:43 -06:00
spoopyghosty0 1c02ebe1d3 Lint: line lengths, unused import; scripts/upload_bench.py (upload speed by method, discussion #242) 2026-10-12 18:15:09 -04:00
spoopyghosty0 401fbed1d5 Games on drives with a space in their name start again; EOS keychain loop patch; Climb's CryEngine detected
- Agent 83: Valve's Lepton pastes the game's paths unquoted into shell commands (liblepton mounting.sh), so a game on
  a card named "Steam Frame 512g" never got its internal storage (no saves, no SharedPreferences). The Quest launcher
  now links the game folder to ~/.local/share/frameport/lepton-paths/<pkg> at every start and gives Lepton that path;
  upgrade_launchers converts existing launchers, move and uninstall handle the link (#213, #214, #215, #221).
- frame.eos_keychain_loop (opt-in, offered by triage): Epic Online Services' resetKeychain returns at once, so a
  keychain it can't write no longer loops forever (Beyond Sandbox, #214).
- Triage lepton-data-link-failed and eos-keychain-loop.
- CryEngine also from libAndroidLauncher.so + a .cryproject (Climb 1, #238); ANALYSIS_VERSION 12.
2026-10-12 17:55:03 -04:00
spoopyghosty0 9de0707070 Diagnostics: a zip saved while a Quest game runs includes threads.txt (each thread's wait, syscall and CPU use, TCP sockets) to find what a hanging game waits for (agent v79, GitHub #157) 2026-10-11 09:58:09 -04:00
spoopyghosty0 5b0bd2589b PC Steam shortcuts: Revive games (all started by ReviveInjector.exe) are told apart by the game in the launch options; a second Revive game overwrote the first one's shortcut 2026-10-10 21:44:47 -04:00
spoopyghosty0 423b2e1c3e Rename… for every library entry: the name is kept from then on and reaches Steam without a new shortcut (agent v77 rename)
Game menu (Library right-click, game page "Name and artwork") and CLI 'frameport rename <pkg> "<name>"|--reset'.
The title is locked (title_locked + auto_title for the reset); rescans, Rift store matches and install links only
update auto_title; a chosen name gets no Quest/Rift twin suffix. Installed copies: the Frame's deployment.json title
changes and the shortcut is rewritten with the same appid (matched by Exe), one Steam restart; PC VR installs on this
PC keep their appid too (reinstalls and library updates now record the shortcut's real appid). A Frame that isn't
connected shows "Update name on Frame" on the game page until then or the next install.
2026-10-10 21:38:56 -04:00
spoopyghosty0 a4f73a88b7 Merge origin/main into site
Conflicts kept main's features with the site branch's wording: the uninstall
dialog's new delete-saves option, hardware video decoding and last-session help,
new Game settings (plain labels), agent 73 (main's 72 plus the Take screenshot
command from v66). Main's new texts follow docs/STYLE.md (for example, patch/setting
instead of fix). Pages rebuilds on docs changes and daily; the CNAME file is
gone (the domain is a Pages setting).
2026-10-10 17:18:37 -04:00
spoopyghosty0 8167cb86c6 Merge the shared hardware video decoder (PR #128, adapted: per game, off switch, VP9 fixes)
# Conflicts:
#	agent/frameport_agent.py
2026-10-10 02:25:41 -04:00
spoopyghosty0 3fb2621030 Shared video decoder: per game (frame.hw_video_decode) with a global off switch; 8K retry at start and VP9 fixes from the hw-video-decode branch
- Opt-in per game: only launchers of games whose recipe has frame.hw_video_decode (install stage, no APK change;
  suggested from analysis media_codec, ANALYSIS_VERSION 8) get the codec line (deployment.json hw_video_decode,
  finalize + upgrade_launchers). Games that had agent 70's per-game codec (Batman) keep it; their old
  <base>/frameport-codec folders are removed afterwards. Batman: catalog + migration batman_video_patches
  (frame.hw_video_decode + the hidden adapter setting surface_native, no more package check); 4XVR catalog.
- Off switch: Settings -> Installing "Hardware video decoding" (library video.hw_decode, default on) -> agent
  video_codec_switch (video-codec/disabled, checked by the launcher line and the wrapper); FRAMEPORT_NO_HW_VIDEO=1
  for one game.
- Connection: the codec is checked once per connection, also after a failed install; a Frame keeps the same or a
  newer revision built elsewhere (logged) instead of flip-flopping between PCs.
- Wrapper: the merged media_codecs.xml goes to $XDG_RUNTIME_DIR/frameport-video, never into the version directory.
- Decoder: refused (busy) Iris sessions retry until 20 s after the plugin loaded (SteamVR's link holds a session
  ~12 s at game start), else 2 s, before the software fallback; VP9 capped at 4096x2304 (XML + component, larger
  decodes in software); hidden VP9 frames' pictures dropped. Manifest revision 7.
- build.py builds from paths with spaces and from freshly extracted FFmpeg sources. Artifacts rebuilt here, identical
  from two trees (ext4 and the NTFS repo path, two NDK copies); PR #128's own sources rebuild to its binary.
- AGENT_VERSION 71 (matches the connection's gate); triage hw-video-decoder-busy, PLAYBOOK row, docs.
2026-10-10 00:58:24 -04:00
spoopyghosty0 e64e8a95e0 Uninstall dialog: option to also delete the game's saves and everything it stored on the Frame (mods, downloads); they survived every uninstall before (GitHub #130) 2026-10-10 00:28:37 -04:00
spoopyghosty0 7c37b479db Agent v68: launch tests count their window from Lepton's 'Waiting for app' (up to 240 s more for boot + install). The first start after an APK change installs the app first; a 45 s window from the launcher stopped the container mid-install and left a broken installed APK ('base.apk is not zip') that never started again (VR HOT) 2026-10-09 11:58:54 -04:00
spoopyghosty0 5d44831757 Agent v67: keep launch.log filling when Lepton's logcat mirror dies ('logcat: Unexpected EOF!' right after the game starts, about 1 launch in 50: Vader Immortal on Lepton 3.0.5, Under Cover on 2.8.14). launch.sh starts _logcat_keeper, which then reads the container's logcat itself (podman exec ... logcat -T 2000, up to 5 restarts) so the dashboard auto-hide and launch tests see the game; upgrade_launchers adds it to existing launchers 2026-10-09 10:14:57 -04:00
spoopyghosty0 456880501b PC VR: a catalog recipe verified with another build (different VR APIs) keeps the build's own launch arguments; Electron launchers rank below the game; agent v67 collects Unity's Player.log / output_log.txt / crash error.log for launch tests and diagnostics; triage unity-vr-init and unity-crash (GitHub #105) 2026-10-09 10:10:33 -04:00
spoopyghosty0 02c697c2f0 Take screenshot via OpenVR: RequestScreenshot (SteamVR captures) + SubmitScreenshot (Steam saves it under SteamVR), ctypes on SteamVR's libopenvr_api.so; verified on the device. The dashboard's debug screenshot_request did nothing and is gone. Messages for SteamVR not running / headset asleep 2026-10-08 22:22:53 -04:00
spoopyghosty0 511051952c Screenshots: Take screenshot button (agent v66 take_screenshot = SteamVR's own screenshot_request over its web mailbox; waits for Steam's file, says when the headset is in standby) 2026-10-08 22:09:23 -04:00
spoopyghosty0 ec701e6e56 Install links (FrameDrop's "Install with FrameDrop" button protocol), drop files on the Library, add a lone Windows .exe, VR / flat window choice, x86_64 Linux apps through FEX
- deeplink.py: framedrop:// and frameport:// links and the pasted https://framedropvr.com/install?manifest=|url= link; manifest framedrop.install/v1; https only (http on loopback), no credentials, no LAN addresses (also after DNS and redirects), sha256 checked, cancel/mismatch leave no .part
- urlhandler.py: per-scheme registration (Settings → Install links, links.framedrop / links.frameport, default on; another program's scheme only taken on request) through a handler script that queues the link and starts FramePort (a flet build bundle can't take a URL argument); the GUI's heartbeat + link inbox
- GUI: Add games → Install from a link… and Add a Windows program (.exe)…; confirmation before any download; files dropped on the Library (packaged app); CLI frameport open-link
- patch device.display_mode (Automatic / VR / Flat window), verified on the Frame with 4XVR
- x86_64 Linux apps run through FEX (agent v61: FEX installed unattended, STEAM_COMPAT_DATA_PATH set, RootFS from SteamOS's /usr/share/guestos/fex-mesa); verified on the Frame with an x86_64 test program; triage linux-x86-no-fex
2026-10-07 16:06:40 -04:00
spoopyghosty0 1e96abebbb Agent v59: close Steam's 'Resume game' menu for 120 s after the first VR frame, up to 10 times (it came back after the first 30 s); still stops once the player opens the dashboard 2026-10-06 15:24:16 -04:00
spoopyghosty0 8a08733be8 Agent v58: Play re-adds a devkit entry Steam forgot (no NOT_IN_LIBRARY, no Steam restart); installs and art updates of devkit games only copy art; the app treats Steam's AppError_16 as already starting and ignores repeated Play clicks for 20 s (GitHub #41/#42) 2026-10-06 13:09:39 -04:00
spoopyghosty0 edf9f494e8 Agent v57: one launcher per game (flock on <base>/.launch.lock). Play pressed again while Lepton still booted made the second Lepton stop the first container and both died (Vader Immortal, BattleSisters); a second launch now exits and leaves the first running. upgrade_launchers adds it to existing launchers; verified on the device 2026-10-06 11:25:56 -04:00
spoopyghosty0 23f4192cfd Game page offers a newer catalog config for recipes the user edited (GitHub #10: a saved Game settings dialog stopped catalog fixes; saving without a change no longer marks the recipe as the user's); launch tests fail when frames stop while the process lives on (frames-stopped) and on Unity render-thread crashes in the GL driver (unity-render-crash) 2026-10-05 21:03:02 -04:00
spoopyghosty0 bad59bfb5b Steam library fallback (agent v56, GitHub #41): Play re-registers a devkit entry Steam forgot after a restart, the console-log appid comes from the current Steam session only, and art updates also reach the devkit entry 2026-10-05 18:57:25 -04:00
spoopyghosty0 1301e60be1 Play's devkit fallback finds the entry's appid in Steam's console log when Steam doesn't save shortcuts.vdf (agent v55; GitHub #42: every game showed 'Game configuration unavailable') 2026-10-05 18:50:23 -04:00
spoopyghosty0 7058105056 Launch tests wait for a first boot after an APK change (agent v54: Lepton's transient 'is not a running context' stopped them); Vulkan shim vk_validation (diagnostics: adds Khronos' validation layer, bundled in a test APK, to the game's instance; a global debug.vulkan.layers property kills Lepton's container) 2026-10-05 17:59:03 -04:00
spoopyghosty0 44a056095d Dashboard worker (agent v53) leaves a dashboard the player opened with the controller alone (v52 closed it 60 ms after each press, the game stayed paused); Into The Radius 2: focus_hold up to 2.5 s (the Frame dropped focus for 0.4 s and 1.0 s and Unreal paused each time), notes from the headset test 2026-10-05 15:58:50 -04:00
spoopyghosty0 6037b13e88 Dashboard at game start (agent v52): watch from the game's first submitted frame instead of the first pacing summary, which came ~8 s after Steam's "Resume game" menu (seen with Into The Radius 2); incremental log reads, 0.5 s checks 2026-10-05 15:46:54 -04:00
spoopyghosty0 05843633a7 Proton: the stable one is the default again (agent v51), Experimental suggested when a PC VR game fails; USB setup: "OR" between the two setup buttons and a Developer Mode pop-up first; tr_n crash in the catalog toast/Settings fixed; no "configs updated" toast on the first download 2026-10-05 14:55:23 -04:00
spoopyghosty0 a49cfb0b57 PC VR games default to Proton Experimental (agent v49), with Stable one click away: Customize shows the Proton version as a dropdown, and a launch test that fails on Experimental suggests "Try the stable Proton and reinstall". Installing asks again for the runtime Steam names only after Proton is installed 2026-10-05 13:35:26 -04:00
spoopyghosty0 2f740bbb41 Agent v48: incomplete deployment records (no base/appid) no longer break every connection with KeyError: 'base' (GitHub #40); the app logs unexpected connect errors with their traceback 2026-10-05 08:21:21 -04:00
spoopyghosty0 8b9657b2e6 Frame power bar in the sidebar: Sleep / Restart / Shut down above the Frame card, each with a confirmation (agent v47 power: a user timer runs systemctl, since logind only allows it from the user's units). Restart verified on the device. ui_smoke: configurable port, power confirmation step 2026-10-05 00:07:16 -04:00
spoopyghosty0 f37f7be9c7 Agent: install arm64 Linux apps (GitHub #31; agent v45): prepare/finalize_linux (AppImages extracted once, missing shared libraries reported via ldd of the app's programs), launcher with the exit watchdog, Steam tag "Linux app on Frame", launch test, stop, uninstall. Verified on the device with an AppImage (Venera: libwebkit2gtk missing, reported) and a tar build (FramePort arm64: runs from Steam, Exit game, uninstall). The app no longer replaces a newer agent on the Frame (an older FramePort kept downgrading it) 2026-10-04 23:43:32 -04:00
spoopyghosty0 208d7bb4dd Close SteamVR's dashboard once a FramePort game shows its first VR frames (it was open at every start, also over Lepton's 2D launcher): launch.sh starts the agent's dashboard helper, which uses Steam's UI (CEF devtools); existing launchers get it in place (agent v44) 2026-10-04 23:08:41 -04:00
spoopyghosty0 cf1a2c9181 launch.sh ends the game when Steam's reaper is gone (GitHub #36: Exit game left Lepton running); existing launchers get the watchdog in place (agent v44); PLAYBOOK rows for the Steam library fallback and Exit game 2026-10-04 23:03:02 -04:00
spoopyghosty0 83a614d645 Steam library fallback (GitHub #21/#30): when the Frame's Steam doesn't know FramePort's shortcut (Play: AppError_9), the game is added through Steam's devkit interface, live and without a restart, with its art; uninstall/purge remove it. Play reads Steam's AppError lines; diagnostics include Steam's shortcut log and devkit games (agent v43) 2026-10-04 21:38:50 -04:00
spoopyghosty0 11c8802b07 Remember the window position and maximized state (GitHub #32); diagnostics for Steam refusing FramePort's games (GitHub #21/#30): Play reports what Steam's log says about the launch, diagnostics include the Steam library state and Steam's launch log lines (agent v42) 2026-10-04 20:22:47 -04:00
spoopyghosty0 4fdeeaf829 FrameBridge emulates Android video panels (XR_KHR_android_surface_swapchain: I Am Monkey's intro, surface_emul); the launcher repairs save folders without group write (SUPERHOT quit at start, agent v41); SUPERHOT (Quest) and I Am Monkey recipes; Lucky's Tale's out-of-memory diagnosis 2026-10-04 18:07:22 -04:00
spoopyghosty0 f86d9021f9 Steam library fixes (GitHub #4, #21, #27): shortcuts go to every Steam account, the agent waits for Steam's helpers before writing and checks the entries survived Steam's restart (writes once more, else reports it; agent v38); Play's add-to-library repair no longer crashes (TypeError since 0.6.3). Uploads resume after a transient OSError (Windows Errno 22). Recipes: Riven (#26), SUPERHOT VR Rift version (#28) 2026-10-04 16:03:38 -04:00
spoopyghosty0 7cd9a38eaf Headset round 3: Blade & Sorcery's freezes are the headset's wear sensor flickering off while worn (SteamVR 'HMD off' 0.5-2 s), which only this game pauses on: new adapter setting focus_hold_ms (default 1000; 2500 in its recipe). Installs no longer restart Steam when the game's shortcut is unchanged (a reinstall ended a game being played), and wait while a game runs when Steam has to restart (agent v37). frame.vk_sanitize also covers own-engine libraries that load libvulkan.so by name (Roblox's crash is on Fossilize's recording thread). Myst: app space warp off (object glitches). frame.unity_oculus_check is opt-in (Unity 2017's frame loop never waits: dashboard freeze). focus_hold: 1 s focused / 1 s dips by default 2026-10-04 14:15:50 -04:00
spoopyghosty0 76d4390b19 Steam library entries (issues #4, #5: 'Game configuration unavailable', no shortcuts): agent v35 adds shortcuts for the signed-in Steam account (loginusers.vdf), else every account, instead of failing when the Frame has several; Play launches the shortcut's own id and says when a game isn't in the library, and the app then adds it and starts the game; an install whose library entry isn't confirmed says so. Triage: OVRPlugin's routine 'Unavailable OpenXR extension: XR_FB_scene' no longer suggests scene emulation 2026-10-04 01:10:52 -04:00
spoopyghosty0 a5722b50a0 Windows games without VR (Reddit request): a game folder added with 'Add one game folder…' that has no VR runtime becomes a flat Windows game: only the Proton patches, a launcher without SteamGameId (Proton sets up no VR), a non-VR Steam shortcut (OpenVR=0, tag 'Windows game on Frame'), labels 'Windows game (Proton)'; no 'Play on this PC' 2026-10-03 19:38:23 -04:00