2026-10-03 13:08:27 -04:00
2026-10-04 23:04:49 -04:00

PhoneCast VR

Your Android phone, inside Steam Frame. No PC required.

Mirror your phone into VR, check notifications, watch videos with optional phone audio, and interact using your controllers—all while a standalone game runs underneath.

v0.9.0 · Connection and support update · Early-access software

Downloads & release notes · Report a bug · Build from source

See it in action

Phone overlay during gameplay Dashboard and settings
Gameplay photo coming soon Controls photo coming soon

Demo video: coming soon—showing launch, pairing, phone interaction, and standalone gameplay.

What you can do

  • View your phone in VR: local-network H.264 streaming targeting 30 FPS, with portrait and landscape support.
  • Place it where you want: world/head placement or left/right controller docking, with move and resize handles.
  • Control Android: tap, hold, swipe, drag-scroll, and Android Back with the dashboard laser when optional remote control is enabled.
  • Hear phone audio: optional supported playback capture, headset volume/mute controls, and local-phone mute.
  • See notifications: optional cards, app allow/block lists, and notification-to-app navigation; sensitive content is redacted by default.
  • Keep setup convenient: Find headset on LAN, saved receiver details, Android Quick connect widget, in-headset settings, and reconnect during an active capture session.
  • Get clear connection feedback: receiver-response status, stable retry warnings, and actionable guidance instead of treating local capture as a successful connection.
  • Get support information: About/version details and privacy-safe diagnostic exports to Downloads on phone and headset.
  • Dim the physical phone: default-on dimming while casting, subject to Android approval, with temporary restore controls.
  • Prevent idle phone locking while casting: temporary screen-timeout protection with Modify system settings access, restored afterward; intentional manual locking remains available.

The primary release target is the native Steam Frame ARM64 receiver + Android app. A Windows SteamVR receiver also works, but is a secondary development/fallback path—not the focus of v0.9.0. A Windows-hosted overlay cannot follow you into headset-native standalone games.

Before you install

Trusted private LAN only. The current pairing gate does not encrypt video, audio, notifications, or remote-control traffic. Do not expose the receiver to the Internet or use it on an untrusted/shared network.

You need:

  • Steam Frame with native SteamVR running.
  • Android 10 or newer, with screen-capture and H.264 encoder support. Individual apps may block capture.
  • Both devices on the same trusted local network, with phone-to-headset TCP access on port 49321. The optional LAN finder also needs UDP 49322; manual IP entry remains available if discovery is blocked.

PhoneCast has been physically used on Steam Frame with standalone Cubism, phone interaction, notifications, rotation, and sustained phone video/audio playback. It is still early-access software: broader game compatibility, both launch orders, sleep/wake, and failure recovery are not fully validated.

Quick start

Download the Steam Frame ARM64 receiver archive and Android APK from GitHub Releases. Use the matching v0.9.0 assets, not GitHub's automatically generated source-code archives. If v0.9.0 is not listed yet, publication is still pending. The release also includes SHA256SUMS-v0.9.0 for verifying downloads.

1. Install on Steam Frame

  1. Download phonecast-vr-v0.9.0-steam-frame-arm64.tar.gz to the headset's Downloads folder. Quit PhoneCast first if updating.

  2. Open a terminal in desktop mode and paste these commands to extract and install it. Run as your normal user—not with sudo:

    set -eu
    cd "$HOME/Downloads"
    tar -xzf phonecast-vr-v0.9.0-steam-frame-arm64.tar.gz
    cd phonecast-vr-v0.9.0-steam-frame-arm64
    ./steam-frame-installer/install-phonecast.sh
    

    If you saved the archive elsewhere, change the first cd to that folder.

  3. With SteamVR running, open its dashboard, select +, and launch PhoneCast VR.

Installation currently needs a terminal; ordinary launches afterward do not. The installer creates a desktop entry and installs under ~/.local/opt/phonecast-vr. A second launch is designed to focus the existing receiver instead of starting another copy. Autostart is not required or currently provided.

2. Install and connect Android

  1. Install the downloaded APK. Android may ask you to allow installation from the browser/file manager you used.
  2. Open PhoneCast, choose Find headset on LAN, and explicitly select your headset. Enter the six-digit pairing code shown in its PhoneCast dashboard. If discovery finds nothing, enter the headset's current local IP address from its network settings. Discovery does not bypass pairing or screen-sharing consent.
  3. Start with the Standard streaming profile.
  4. Press Start casting and approve Android's screen-sharing prompt.
  5. In the headset's PhoneCast dashboard, choose Show.

PhoneCast remembers connection details. Android may require fresh screen-sharing consent for each new capture session. If connecting fails, check the address, pairing code, VPN and whether guest Wi-Fi/client isolation prevents devices from talking to each other. Amber means the receiver is not yet confirmed; green requires a receiver reply, not merely a running encoder. A green status does not prove decoded picture delivery. Retry warnings remain visible between attempts; tap the connection details text for the full message.

If the headset IP changes during a failed cast, stop casting, search/select again, and start a new cast. Silent active-session IP retargeting is not implemented.

3. Use it in VR

  • Open the normal SteamVR dashboard and select PhoneCast for Show/Hide, placement, Settings, and Quit.
  • Show places the phone at your configured world-space Start Location while preserving its size.
  • With the dashboard open, point the controller laser at the phone to interact. Hold the bottom Move handle to reposition; use joystick push/pull while holding it to adjust depth. Use the Resize corner to change size.
  • The phone footer keeps Android Back, Move, Close, and Resize separate. Close hides the panel; dashboard Quit stops the receiver.
  • With the dashboard closed, the phone remains visible but is view-only, preserving game input.
  • Dashboard-closed shortcuts: long-press either stick to toggle visibility; double-click a stick to dock to that hand; repeat while docked to pin in world space. These may conflict with game controls—remap or unbind them in SteamVR. Per-shortcut toggles are not implemented yet.

Optional Android features and permissions

Casting works without enabling remote control, notifications, or phone audio.

Feature What to enable Important detail
Remote control Allow remote control while casting and the PhoneCast remote control Accessibility service Both gates are required. The service does not retrieve window content. Sideloaded apps may need Android's Allow restricted settings approval before Accessibility can be enabled.
Notifications Notification forwarding and Android notification access Disabled by default; revealing sensitive title/body text requires a separate opt-in.
Phone audio Phone playback audio and Android audio permission; start a new cast Playback only, not microphone capture. Protected/capture-blocked audio is unsupported. Optional local-phone mute is separate.
Phone dimming Dim phone while casting and Android Modify system settings access Preference is on by default, but without permission casting continues undimmed. Restore via the app/foreground notification; Android brightness controls are the emergency fallback.
Idle-lock prevention Android Modify system settings access; start a new cast after granting it Temporarily extends the screen timeout independently of dimming and restores the original on reachable stop paths. Manual locking still ends projection. OEM/device-admin restrictions may apply.

See remote control, notifications, phone audio, and phone dimming for details.

Can't enable Accessibility? Allow restricted settings

Android 13 and newer may block Accessibility access for a sideloaded APK with a Restricted setting warning. If you trust the PhoneCast build you installed:

  1. Open Android Settings → Apps → PhoneCast → App info. You can also long-press the PhoneCast app icon and select App info.
  2. Tap the three-dot menu in the top-right and choose Allow restricted settings. Confirm your identity if prompted.
  3. Return to Settings → Accessibility, select PhoneCast remote control, and enable it. The service may appear under Downloaded apps or Installed apps.
  4. In PhoneCast, also enable Allow remote control while casting—both this toggle and the Accessibility service are required.

Menu names and availability vary by phone and Android version. This approval does not enable remote control by itself. Casting still works without Accessibility. Only allow restricted settings for an app you trust; see Android's restricted-settings guidance.

Known limitations in v0.9.0

  • Native GPU/decoder reliability is still follow-up work. Video freezes and Adreno/Vulkan device-loss exits have occurred in some sessions, including game-active launches. Decoder recovery is implemented but its fault cases still need physical validation; bounded Vulkan recovery is not implemented. GPU resets can also affect the running game. Save game progress before testing.
  • Headset sleep/wake, SteamVR restart, crash recovery, and broader launch-order/game compatibility are not fully validated. Relaunching PhoneCast or starting a new cast may be necessary.
  • Locking the phone can end Android screen sharing. Unlock, start a new cast, and grant consent again; PhoneCast does not bypass lock-screen privacy.
  • Controller-docked panels can jitter during movement. Defaults may need per-hand calibration.
  • Keyboard/text entry and wrist gestures are backlogged. Hotkeys are not guaranteed conflict-free.
  • Audio capture depends on the source app's policy; source UI mute is not always reflected in Android playback capture.
  • Android Force Stop cannot immediately restore brightness, screen timeout or phone volume. Best-effort later recovery depends on retained permissions; manual recovery may be needed.
  • LAN discovery is a bounded IPv4/default-port finder, not authenticated identity. Broadcast-blocked, guest/client-isolated, cross-subnet or IPv6-only networks may need manual entry. Broader discovery/network and storage-failure cases remain to be exercised.
  • SteamOS/SteamVR updates may change compatibility. Broader Android-device testing is welcome.

The detailed roadmap and physical evidence distinguish owner-approved behavior from automated tests and deferred cases. No measured photon-level latency or universal compatibility claim is made.

Update, uninstall, and troubleshoot

Update: quit PhoneCast, extract the new receiver bundle, and rerun its installer. Install the matching Android APK. Use APKs signed with the same signing key for in-place Android updates.

Uninstall receiver: quit PhoneCast, then run:

~/.local/opt/phonecast-vr/uninstall-phonecast.sh

Receiver settings and pairing remain in ~/.config/phonecast-vr unless you remove them separately.

Export logs without ADB or SSH

On the headset:

  1. Open the SteamVR dashboard → PhoneCast → Settings → About / Export logs.
  2. Select Export logs once. The row changes to Confirm export.
  3. Select the same row a second time to confirm. These are two deliberate clicks/selections, not the thumbstick double-click hotkey.
  4. Wait for Saved to Downloads and note the displayed filename, phonecast-headset-<timestamp>.txt. Find it in the headset's Downloads folder using the desktop file manager.

On the phone: open Settings → About → Export diagnostic logs to Downloads, review the privacy notice, and confirm Export. The result shows the saved phonecast-android-<timestamp>.txt location.

Exports are bounded support summaries, not unrestricted system/raw-log dumps. Review files before sharing privately; never post pairing codes, credentials or private phone content. About shows installed version/build information. When reporting an issue, include both app versions, Android device/OS, SteamOS/SteamVR version, game, launch order, and reproduction steps.

For deeper diagnosis, native raw logs normally live in ~/.local/state/phonecast-vr/receiver.log, with diagnostics in the adjacent performance.csv. Review/redact raw files before sharing. See v0.9 support details and validation boundaries.

Windows receiver and development

The Windows x64 receiver is available from source for PC-hosted SteamVR use. It is secondary to the native headset release. Never start or restart SteamVR through Windows Remote Desktop; follow the physical-console guidance in development instructions.

Build instructions and tests:

Contributing

Bug reports, device compatibility reports, documentation improvements, and focused pull requests are welcome. Preserve portable Core/VR boundaries and isolate platform-specific code. Hardware claims should name the tested device/runtime and whether the result was physically observed.

Do not commit credentials, .env files, device-specific secrets, Android local.properties, signing keys, build output, or authentication configuration.

AI-assisted development

PhoneCast VR was developed with substantial AI coding-agent assistance for research, planning, implementation, tests, debugging, and documentation. The project owner directs the work and performs physical Android/headset validation. AI assistance is not a correctness or security guarantee; review the source, permissions, and known limitations before relying on it.

Support development

Enjoy PhoneCast? Buy me a coffee to optionally support development. PhoneCast remains free and open source; donations do not purchase features or guaranteed support.

License

MIT. Free and open source.

S
Description
GitHub pull mirror of bangfireball/Phonecast_VR. GitHub repository ID: 1402651377.
https://github.com/bangfireball/Phonecast_VR Readme MIT
899 KiB
0 Stars 1 Watchers 0 Forks
Languages
C++ 67.7%
Java 25.4%
JavaScript 2.2%
CMake 2%
PowerShell 1.8%
Other 0.8%