From dbabb3734324ddcfdd032cfc6cd7d9fa9aadf537 Mon Sep 17 00:00:00 2001 From: spoopyghosty0 <336754034+spoopyghosty0@users.noreply.github.com> Date: Sun, 4 Oct 2026 17:08:34 -0400 Subject: [PATCH] FramePort 0.7.0 --- CLAUDE.md | 5 ++++- agent/frameport_agent.py | 13 ++++++++++++- docs/INSTALL.md | 8 ++++++++ src/frameport/_version.py | 2 +- src/frameport/frame/local.py | 2 +- 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 730da53..e88ea09 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -464,7 +464,10 @@ Lepton's Android 11 has no clipboard service (134 services; checked with `podman SDL/LÖVE apps crashed at start → `frame.sdl_clipboard` (`apk/dex.py`: in-place dex edit, nops one invoke, fixes the header checksum/signature; verified with LÖVE for Android 11.5, GitHub #24 Dramatic Shape). 2D apps (vr_kind none) keep every suggested patch that isn't about VR (`needs_vr = False`), not a fixed list. FramePort on the Frame: -`frame/local.py` (127.0.0.1, own key authorized) and Steam library changes wait while Desktop Mode is open. +`frame/local.py` (127.0.0.1, own key authorized; "This Frame (experimental)"; app data in +~/.local/share/frameport-app because ~/.local/share/frameport is the agent's) and Steam library changes wait while +Desktop Mode is open. Verified on the device 2026-10-04 (install + launch test from the Frame). Library updates on the +Frame run one at a time (agent v40 flock): two quick uninstalls used to bring a removed shortcut back (Roblox). Headset round 3 (owner's verdicts, 2026-10-04): Blade & Sorcery works — its freezes were the headset's wear sensor flickering off while worn (vrserver.txt "HMD off/on" 0.5-2 s) → per-game `focus_hold_ms=2500` (only this game reacts; not a default). BattleGlide works (focus_hold). Myst works with issues (object glitches; space warp ruled out, its diff --git a/agent/frameport_agent.py b/agent/frameport_agent.py index f9b36f0..d01ef6d 100644 --- a/agent/frameport_agent.py +++ b/agent/frameport_agent.py @@ -35,7 +35,7 @@ import sys import time import zlib -AGENT_VERSION = 39 +AGENT_VERSION = 40 HOME = os.path.expanduser("~") STEAM = os.path.join(HOME, ".local/share/Steam") ANCHORS = os.path.join(HOME, "Applications/quest-frame") @@ -1041,6 +1041,17 @@ def game_running(): def shortcuts_worker(payload): + """One library update at a time: two at once each read shortcuts.vdf, changed it and wrote it back, so the second + write brought back a shortcut the first had removed (uninstalling two games quickly left Roblox in Steam).""" + import fcntl + + os.makedirs(os.path.dirname(STATUS_FILE), exist_ok=True) + with open(STATUS_FILE + ".lock", "w") as lock: + fcntl.flock(lock, fcntl.LOCK_EX) + _shortcuts_worker(payload) + + +def _shortcuts_worker(payload): args = json.loads(payload) result = {"state": "done", "added": [], "errors": [], "finished": None} os.makedirs(os.path.dirname(STATUS_FILE), exist_ok=True) diff --git a/docs/INSTALL.md b/docs/INSTALL.md index 0099a6f..63796a3 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -54,6 +54,14 @@ Lepton from the Steam Frame page afterwards if it's missing. If the setup command only says "timed out", a firewall on your computer blocks the Frame; the setup page says which after about 45 seconds. Details per system: [FRAME_SETUP.md](FRAME_SETUP.md#network-and-firewalls). +## Running FramePort on the Frame (experimental) + +FramePort can run on the Steam Frame itself, without a PC: in **Desktop Mode**, download +`FramePort-linux-arm64.tar.gz`, unpack it (`tar xzf FramePort-linux-arm64.tar.gz`) and start `FramePort/FramePort`. +Turn on **Developer Mode** first (Steam → Settings → System); FramePort then manages "This Frame" directly, with +no pairing. Games are added to the Steam library when you go back to **Gaming Mode** (Steam has to restart for it, +which would end Desktop Mode). This is new: please report anything odd with **Report a problem**. + ## Installing games - **Install on Frame** on a game's page (or select several in the Library and install them together). Installs run diff --git a/src/frameport/_version.py b/src/frameport/_version.py index e8c3476..dcdf691 100644 --- a/src/frameport/_version.py +++ b/src/frameport/_version.py @@ -1,2 +1,2 @@ # The FramePort version: the single source (pyproject reads it via hatch; CI checks a release tag matches it). -__version__ = "0.6.3" +__version__ = "0.7.0" diff --git a/src/frameport/frame/local.py b/src/frameport/frame/local.py index ed6a837..1e0c273 100644 --- a/src/frameport/frame/local.py +++ b/src/frameport/frame/local.py @@ -9,7 +9,7 @@ import os import platform from pathlib import Path -LOCAL_NAME = "This Frame" +LOCAL_NAME = "This Frame (experimental)" # FramePort running on the Frame itself @functools.lru_cache(maxsize=1)