Files
InstanceBrick--nightcap/docs/INSTALL.md
T

6.6 KiB

Install on Steam Frame

Requirements

  • Steam Frame running its ARM64 Linux desktop, with Steam and SteamVR installed.
  • Native SteamVR at /opt/steamvr, including steamxr_linuxarm64.json.
  • The Frame's Turnip/Freedreno Vulkan driver under /usr/lib and its Vulkan ICD under /usr/share/vulkan/icd.d.
  • Rootless Podman, Git, Python 3 and a C++17 compiler on the Frame.
  • zstd for importing the compressed ARM64 release archive.
  • A Linux filesystem for the checkout, internet access and space for the source, Fedora build image and a separate Roblox client download.

The runtime uses Fedora 44 ARM64 in a rootless container. Keep the Frame's own graphics drivers: the launcher mounts them into the container. Building from source also needs a case-sensitive Linux checkout because some Android headers differ only by letter case. The source and ARM64 build are public.

1. Get the source

git clone --branch steam-frame --recurse-submodules \
  https://github.com/InstanceBrick/nightcap.git \
  "$HOME/.local/share/nightcap-steam-frame-src"
cd "$HOME/.local/share/nightcap-steam-frame-src"

2. Install the ARM64 image

Download nightcap-steam-frame-arm64.oci.tar.zst and its .sha256 file from Releases. From the directory containing both files:

set -euo pipefail
sha256sum -c nightcap-steam-frame-arm64.oci.tar.zst.sha256
zstd -dc nightcap-steam-frame-arm64.oci.tar.zst | podman load

The archive imports as localhost/nightcap-vr-arm64:frame-foveated. It contains the ARM64 Nightcap runtime and its Fedora dependencies, with no Roblox client, personal data, SteamVR installation or proprietary graphics drivers.

To build the same image from source instead:

podman build --arch arm64 --jobs 1 \
  -f packaging/steam-frame/Containerfile \
  -t localhost/nightcap-vr-arm64:frame-foveated .

This builds Nightcap and its helpers from source. It does not download or bundle Roblox. The image tag is also the one used by the Frame launcher.

3. Install the launcher and refresh-rate helper

python3 tools/steam_frame/install_launcher.py
mkdir -p "$HOME/.local/share/nightcap-vr-arm64/data/tools"
c++ -std=c++17 -O2 tools/frame_video_settings/refresh_rate.cc -ldl \
  -o "$HOME/.local/share/nightcap-vr-arm64/data/tools/refresh_rate"

The application menu entry is Nightcap Roblox VR.

4. Download the compatible Roblox client

Close Nightcap first. Prepare its data directory and copy the initial settings only if no configuration exists yet:

frame_data="$HOME/.local/share/nightcap-vr-arm64/data"
mkdir -p "$frame_data/.config/mocktail"
if [ ! -f "$frame_data/.config/mocktail/config.yaml" ]; then
  cp config/steam-frame.example.yaml "$frame_data/.config/mocktail/config.yaml"
fi
podman run --rm --arch arm64 --userns=keep-id \
  --security-opt label=disable \
  -v "$frame_data:/data:rw" \
  -e HOME=/data -e XDG_CONFIG_HOME=/data/.config \
  -e XDG_DATA_HOME=/data/.local/share -e XDG_CACHE_HOME=/data/.cache \
  --entrypoint /opt/nightcap-vr-arm64/lib64/mocktail/mocktail_updater \
  localhost/nightcap-vr-arm64:frame-foveated \
  update --no-latest-check --skip-canary

The updater downloads the newest ARM64 client supported by the included catalog. The command retains APK signature, architecture, build identity and payload integrity checks. --skip-canary skips the separate desktop graphics test; VR starts through the Frame launcher in the next step. Client files stay in your local data directory.

5. Launch in VR and add to Steam

Start SteamVR and connect the headset, then open Nightcap Roblox VR from the application menu. Sign in through Roblox's normal interface.

To add the Steam shortcut automatically, enable Steam's local browser debugging endpoint at 127.0.0.1:8080, keep Steam running and use:

python3 tools/steam_frame/register_steam_shortcut.py

The script creates or reuses the launcher shortcut, sets its Nightcap icon and marks it as a VR application. It saves the generated identity locally. If the endpoint is unavailable, use Steam's Add a Non-Steam Game dialog and select ~/.local/bin/nightcap-vr-arm64, then mark the shortcut as a VR application.

6. Add the SteamVR Video controls

The settings integration supports a specific SteamVR dashboard revision. It checks the installed dashboard before applying changes and leaves other revisions untouched. Valve dashboard files are read from your local installation.

With SteamVR closed and the original dashboard files visible:

mkdir -p frame-ui-local/originals frame-ui-local/generated
cp /opt/steamvr/resources/webinterface/dashboard/chunk~8012d0c89.js \
  frame-ui-local/originals/steamvr-dashboard.original.js
cp /opt/steamvr/resources/webinterface/dashboard/systemui.html \
  frame-ui-local/originals/steamvr-systemui.original.html
cp /opt/steamvr/resources/webinterface/dashboard/settings_desktop.html \
  frame-ui-local/originals/steamvr-settings_desktop.original.html
python3 tools/steam_frame/prepare_video_ui.py \
  frame-ui-local/originals frame-ui-local/generated
sudo python3 tools/steam_frame/install_video_ui.py frame-ui-local/generated

Start SteamVR again. The settings are described in Video settings. The service mounts three generated files read-only; the original SteamVR files are preserved. If upgrading an existing installation, reuse your saved original files instead of copying the already patched dashboard.

Update Nightcap

Close Nightcap before replacing its image or launcher. Pull the steam-frame branch, then load the new ARM64 release archive as in step 2 and rerun the launcher installer. Existing Roblox downloads, sign-in state and settings stay in the separate data directory.

For source builds, pull this branch and rebuild under a temporary image tag:

git pull --ff-only
git submodule update --init --recursive
podman build --arch arm64 --jobs 1 \
  -f packaging/steam-frame/Containerfile \
  -t localhost/nightcap-vr-arm64:next .
podman tag localhost/nightcap-vr-arm64:frame-foveated \
  localhost/nightcap-vr-arm64:previous
podman tag localhost/nightcap-vr-arm64:next \
  localhost/nightcap-vr-arm64:frame-foveated
python3 tools/steam_frame/install_launcher.py

Existing Roblox downloads, sign-in state and settings remain in the data directory. To install a newly supported Roblox client, repeat step 4 after updating Nightcap. Automatic client updates are off in the supplied Frame configuration, since the ARM64 VR bridge needs matching client interfaces.

To restore the previous Nightcap image with the app closed:

podman tag localhost/nightcap-vr-arm64:previous \
  localhost/nightcap-vr-arm64:frame-foveated