Release v1.7.1
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 differentadbversion — which stops our bundledadbfrom 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-serverto free the port, thenstart-serverto 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.
- Detects the failed handshake and retries once automatically — it runs
- 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 rawCommand failed: … cannot connect to daemon
dump is replaced with a plain-English explanation: which tools to close
(SideQuest, Rookie, platform-tools), theadb kill-serverescape 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.manifestmismatch 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).
- A mismatch completes the item with a warning instead of erroring it out.
- The manifest no longer flags itself.
release.manifestcan'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 usedauto-fillwith aminmax(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-fillignored 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 (theen/es
string tables,LanguageProvider,useLanguage, and thesettings:get/set- languageIPC) 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-serverfrom
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/UPDATEDbadges driven off reallastUpdatedtimestamps
[ TRANSFERS ]
- Up to 5 parallel downloads with live progress
- Live
// TRANSFER_BUSstrip 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 textureUPDATES— block / unblock the OS updater and Meta StoreSYSTEM— reboot variants, battery, storage, wifi, IP, proximity togglePACKAGES— list 3rd-party / all / current focused appWIRELESS—tcpip 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 → AUTHORIZEDboot 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, ormatrix.wavinto your user-datasounds/folder (no rebuild) orresources/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
- Install the build for your OS
- Plug your Quest in via USB (data-capable cable)
- Allow USB Debugging on the headset
- 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