Two installers give ft-camd its capabilities: hands/run.sh install and the Hand Recorder's (through hands/run.sh caps). #30 made hands/run.sh uninstall take them back unconditionally, before it removed the units. With the recorder installed too, its next session then stopped at "ft-camd needs its capabilities", and so did ft-cutouts. The recorder's own uninstall, the one hand-recorder.md points to, still left them on the binary. One rule now: hands/run.sh uncaps takes them back only while neither the Hand Recorder's menu entry nor the frametop-camd unit is installed, and says which one keeps them otherwise. It checks through on_frame, in one call, so it works from a PC too. hands/run.sh uninstall runs it after removing the units, and hands/rec/install.sh uninstall after removing the entry, so each stops counting itself. uninstall.sh removes both and always takes them back. The docs say which commands ask for the password, and AGENTS.md says uninstall.sh also has to undo file capabilities. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.8 KiB
Working on Frametop
Rules for people and coding agents changing this repo. The README covers what Frametop is and how to install it; docs/reference.md covers each component, and docs/design.md records how SteamVR on the Frame behaves and why things are built the way they are. Read its notes on SteamVR before changing how the screens, the pointer, or the input relay talk to SteamVR.
Two ways to run the scripts
Every script works in both modes, and must keep working in both:
- On the Frame (SteamOS, VR variant), commands run locally, in this checkout.
- From a PC over SSH, the repo is synced to
~/dev/frametopon the Frame (scripts/sync.sh), and commands run there.scripts/_env.shworks out which mode applies (FRAME_LOCAL,FRAME_HOST,FRAME_REPO).
scripts/sync.sh # PC -> ~/dev/frametop on the Frame
scripts/frame.sh -C <dir> '<build cmd>' # runs in the "dev" Fedora distrobox
scripts/frame.sh --host '<cmd>' # runs on the SteamOS host
- From a PC, edit only on the PC. The Frame's copy is a mirror that
sync.shoverwrites. - Build inside the
devcontainer. The SteamOS host has a read-only root and no compilers. Container builds link against the container's libraries, so they run in the container (distrobox enter dev -- ...); the SteamVR driver is built to run on the host. - Container packages the build needs go in the list in
setup/dev-container.sh, so the container can be rebuilt. - Build output goes in
build/next to the sources. It's gitignored and never synced.
The headset may be in use
A Steam Frame is someone's personal headset, and they may be wearing it while you work.
- Don't kill or restart
gamescope,steam,vrserver,vrcompositor, the gamescope session, or the Frametop desktop without asking. Each one ends or disrupts whatever is happening in VR. - Don't run host
sudo,steamos-readonly disable,steamos-devmodechanges, pacman installs, or reboots without explicit approval. Three installers need hostsudo, and they ask for it: the Bluetooth fixes (setup/bluetooth/install.sh), hand tracking (hands/run.sh installandcaps, which set ft-camd's file capabilities withsetcap, anduninstallanduncaps, which take them back), and our own eye tracker's frame grabber (gaze/tracker/install.sh). - Write only inside the repo,
/tmp, and the container unless told otherwise. The installers are the exception: they write the user services, launchers, and the SteamVR driver into the home folder. The Bluetooth fixes and the eye tracker's frame grabber also install root-owned files and system services under/etc(/etc/steamframe,/etc/frametop,/etc/systemd/system). When an installer starts writing something new outside the repo, or sets file capabilities, add it touninstall.shtoo: users uninstall with that script, not with each installer'suninstall. - Never copy
.netrc, SSH keys, or Steam config off the Frame or into this repo.
SteamOS updates
A SteamOS update replaces SteamVR, KWin, and gamescope with the rest of the OS image. When a change starts depending on something from the image (a host file, an OpenVR interface outside the bundled header, an undocumented layout or output format, a SteamVR or KWin quirk), add a check for it to scripts/update-check.py, or a retest hint for its package there. docs/design.md has the background.
Names
User-facing names are "Frametop", "Frametop Display Settings", and "Frametop Input Settings". Programs and files use the ft- / ft_ prefix (ft-screens, ft-pointer, ft-layout, the ft_pointer driver); config, units, and overlay keys use frametop. Program names must stay within 15 characters: Linux truncates process names there, and the scripts find programs with pgrep -x / pkill -x.