Skip to content

Release v1.7.1

Choose a tag to compare

@github-actions github-actions released this 10 Aug 01:59

VR CyberDeck v1.7.1 — COMMON_SENSE_OR_GTFO

> ACCESS GRANTED. JACK IN. OPERATE. DEPLOY. CONTROL.

VR CyberDeck is a cross-platform desktop deck for managing, sideloading, and uploading content to Meta Quest devices. It started as a fork of ApprenticeVR by jimzrt (huge thanks — the core engine is theirs) and grew into a full neon-terminal rebrand of the experience.


// CHANGELOG

A stability-and-recovery release: the deck now heals a broken ADB connection on its own, a bad download manifest no longer bricks an otherwise-good install, the card-size slider actually works across its whole range, and getting your logs to us is now one click from the main screen. Plus a big internal cleanup — the entire translation layer is gone.

Since 1.7.0 · PRs #32, #33, #34, #35, #36


🔌 ADB — auto-recovery from a stuck server (#34)

  • The deck now recovers on its own when another ADB server is hogging the port.
    The #1 "my Quest won't connect" cause is a different ADB daemon already
    holding port 5037 — SideQuest, Rookie Sideloader, Android platform-tools, or
    just a different adb version — which stops our bundled adb from handshaking
    (could not read ok from ADB Server / cannot connect to daemon). Instead of
    failing on launch, VR CyberDeck now:
    • Detects the failed handshake and retries once automatically — it runs
      kill-server to free the port, then start-server to bring up our own
      daemon, and re-attempts device tracking. In the common case your headset
      just shows up and you never see an error at all.
  • When recovery can't help, you get a message you can act on.
    If the port is held by something we can't stop (or a firewall/AV is blocking
    the loopback socket), the old raw Command failed: … cannot connect to daemon
    dump is replaced with a plain-English explanation: which tools to close
    (SideQuest, Rookie, platform-tools), the adb kill-server escape hatch, and a
    reminder that you can keep sideloading local files in the meantime.
  • A failed ADB start no longer wedges every future retry. The tracking state
    is reset cleanly on failure, so hitting Scan after closing the conflicting
    tool works instead of staying stuck.

📦 Download integrity — manifest mismatch is now a warning, not a wall (#35)

  • A release.manifest mismatch no longer blocks an install outright.
    In 1.7.0 a size mismatch against the release manifest failed the item hard.
    That was too aggressive: a release can simply ship a wrong or stale
    manifest
    , leaving you unable to install a download that's actually fine. Now:
    • A mismatch completes the item with a warning instead of erroring it out.
      The download stays in the Completed state so you can choose to install
      anyway
      .
    • Auto-install is skipped for a warned item — the deck won't silently push
      a possibly-incomplete build; the decision is explicitly yours. Installing
      from Completed clears the warning (you've accepted the risk).
  • The manifest no longer flags itself. release.manifest can't reliably
    state its own byte size (writing the size in changes the size), so some
    releases list a stale size for it — which produced a guaranteed false
    mismatch. The check now skips the manifest file itself.
  • The genuine-corruption safety net is intact: a real truncated/partial download
    still surfaces the mismatch loudly — it just informs instead of forbids.

🎚️ Games view — card-size slider fixed across its full range (#32)

  • The card-size slider now changes the layout at every position, not just the
    last few.
    The old grid used auto-fill with a minmax(max(--card-min, …))
    floor. Whenever the target card width dropped below the 140px minimum — which
    is most of the slider's travel, and nearly all of it on a narrow window —
    auto-fill ignored the slider entirely and just packed 140px columns, pinning
    the count to a constant. That was the "slider does nothing until you slam it to
    the end" dead zone.
  • The grid now renders exactly the requested column count directly
    (repeat(var(--card-cols), minmax(0, 1fr))), so every slider step maps to a
    distinct layout. Columns still shrink to share the row on narrow windows
    without overflowing.

📝 Logs — "send your damn logs" is now one click away (#33)

  • Added an in-app link to the step-by-step log-upload wiki guide, so you're
    not left guessing how to report a bug.
  • Placed it where a stuck user can actually reach it: on the main deck / games
    view
    , and also on the startup dependency-error screen (where Settings
    isn't reachable yet). Both open the guide in your system browser.
  • Still backed by the existing one-click Settings → Log Upload → Upload to
    rentry.co
    , which copies the shareable code to your clipboard.

🧹 Under the hood — internationalization layer removed (#36)

  • Removed the entire i18n / translations system. The app has always shipped
    English-only in practice, and the half-wired translation layer (the en/es
    string tables, LanguageProvider, useLanguage, and the settings:get/set- language IPC) was dead weight causing interface issues. All UI strings are now
    plain, direct English.
  • Net effect: ~470 lines of translation tables and ~140 lines of plumbing
    deleted
    , a simpler provider tree, and fewer moving parts to break. No
    user-facing feature was lost — nothing was actually translated.

Notes for testers

  • ADB recovery (#34): open SideQuest (or run adb start-server from
    platform-tools) before launching VR CyberDeck, then launch it — the deck
    should recover automatically and connect. Kill our recovery by holding the
    port with a process it can't stop and confirm you get the plain-English
    message, not the raw command dump.
  • Manifest warning (#35): a download whose manifest doesn't match should land
    in Completed with a warning and not auto-install — verify you can still
    install it manually.
  • Card slider (#32): drag the size slider end-to-end on both a wide and a
    narrow window; every position should visibly change the columns.

## // HEADLINE FEATURES (Click to Expand - ITS A SPOILER!)

[ LIBRARY ] — optional, when you add a server

  • Sideloader-first: works first launch with zero config; add your own server (a server config or an rclone config) under Manage Remotes for a browsable library
  • Card view and table view (table now stretches edge-to-edge in wide windows)
  • Persistent sort, density presets, 18+ filter, mirror management with public fallback
  • NEW / UPDATED badges driven off real lastUpdated timestamps

[ TRANSFERS ]

  • Up to 5 parallel downloads with live progress
  • Live // TRANSFER_BUS strip in the header — rotates through active transfers with name, stage, %, speed, and ETA
  • Unified Transfers drawer with stage-aware labels (Installing APK..., Copying OBB...)
  • Cyberdeck warns you with [ TRANSFERS IN PROGRESS ] if you try to close the window mid-transfer (works for both X and Cmd+Q)
  • Scan existing downloads folder, retry, clear-completed, per-item delete

[ DEVICE / ADB ]

  • Auto-connect Quest on launch, WiFi bookmarks for wireless ADB
  • ADB Shell with built-in quick-command shortcuts:
    • PERFORMANCE — pin CPU/GPU level, swap refresh rate (72/90/120Hz), reset texture
    • UPDATES — block / unblock the OS updater and Meta Store
    • SYSTEM — reboot variants, battery, storage, wifi, IP, proximity toggle
    • PACKAGES — list 3rd-party / all / current focused app
    • WIRELESStcpip 5555, adb devices
  • Custom user macros — define your own labelled pill for any command you spam (right-click to edit/delete, persisted across sessions)
  • Disable-sideloading toggle for safety

[ TRAILERS ]

  • Switched from youtube trailers to meta trailers... and back again.
  • No ads, no suggested videos, no subscribe buttons, no comments, no end-screen "Watch next" grid — just the trailer, then it stops
  • Autoplays as soon as you open the trailer drawer

[ INTERFACE ]

  • Glitch UNAUTHORIZED → AUTHORIZED boot intro
  • Matrix-style random g33ky_u$3rn4m3$ per session
  • Neon Hacker Console in the header (live SYS_STATUS readout — now properly fits the 88px header without clipping)
  • Font picker — swap Courier New for Console / Terminal / System Mono if the default is hard to read
  • Optional sound effects (drop-in) — drop click.wav, type.wav, or matrix.wav into your user-data sounds/ folder (no rebuild) or resources/sounds/ (bundled), and the UI plays them on button clicks, the boot-intro typing, and the ADB shell matrix load. Settings has a master toggle, volume slider, TEST button, and a per-file "✓ READY / — missing" status readout. Lookup order: user data → bundled, so you can override bundled sounds without recompiling.
  • Colorblind mode now covers the whole UI — version subtitles, filter counters, Transfers button, battery pill, breach animation all swap palette
  • Accent color picker, font scale up to 200%, tab memory
  • Compact, laptop-friendly layout (900x640 minimum window)
  • One-click log upload from Settings → Log Upload

// DOWNLOAD

Pick the build for your platform — same set of artifacts as the prereleases:

File Platform
vr-cyberdeck-1.7.1-x64.dmg macOS x64
vr-cyberdeck-1.7.1-arm64.dmg macOS arm64
vr-cyberdeck-1.7.1-setup-x64.exe Windows — Installer
vr-cyberdeck-1.7.1-portable-x64.exe Windows — Portable
vr-cyberdeck-1.7.1-x86_64.AppImage Linux x64
vr-cyberdeck-1.7.1-arm64.AppImage Linux ARM64
vr-cyberdeck-1.7.1-amd64.deb Debian/Ubuntu x64
vr-cyberdeck-1.7.1-arm64.deb Debian/Ubuntu ARM64

macOS — "App is damaged":

xattr -c /Applications/VR\ CyberDeck.app

Linux AppImage:

chmod +x vr-cyberdeck-1.7.1-x86_64.AppImage
./vr-cyberdeck-1.7.1-x86_64.AppImage

Already on a 0.x build? It will auto-update.


// JACK_IN

  1. Install the build for your OS
  2. Plug your Quest in via USB (data-capable cable)
  3. Allow USB Debugging on the headset
  4. Drag an APK, ZIP, game folder, or OBB folder onto the deck to sideload it

That's it — no account, no server, no JSON to edit. Want a browsable library instead? You can add your own server (a server config or an rclone config) under Manage Remotes — either you already know one, or you just use it as a sideloader. Power-user knobs (custom servers, mirrors, rclone configs, ADB macros, sound effects) all live in Settings.


// FEEDBACK

  • 🐛 Open an issue for bugs — include a rentry link of the log from Other Settings → //Upload Log.

// CREDITS

Built on top of ApprenticeVR by jimzrt. Without that foundation this project doesn't exist.

Special thanks to Rod — my crazy friend who believes in megalodons on Mars and gave me incredible feedback during the prerelease cycle.

And to everyone who tested the 0.x builds and reported issues — y'all shaped the 1.0.0 polish list.

// LICENSE

GNU Affero GPL v3


Need help adding a server? Tutorial Video by CrazyScamp here

> v1.7.1 — END_OF_FILE