📱 You're browsing QuestLoader on this headset. Games with just an APK can install directly below — no cable needed. Bigger games with extra data files still need a computer; those are marked 🔌 needs a PC.

Dashboard

Plug your Quest into this computer with a data-capable USB-C cable, click connect, then accept the "Allow USB debugging" prompt inside the headset.

First time? Setup checklist
  • Enable Developer Mode: create a free developer org at developer.oculus.com, then toggle it in the Meta Quest phone app → Headset Settings.
  • Use a data USB-C cable (many charge-only cables won't work).
  • After clicking connect, put the headset on and accept the USB debugging prompt (tick "Always allow").
  • Close SideQuest / Android Studio — only one ADB client can talk to the headset at once. If stuck, run adb kill-server in a terminal.
Model
Android / OS
Battery
Storage
Sideloaded apps
Serial

Stats refresh on connect.

Game library

Loads a catalog from a public JSON manifest you configure in Settings — download and install straight to the headset. Works fully offline too: without a manifest, use the Install local tab instead.

Sort:
No catalog loaded yet.

⚠ Only list and install content you own or that is legally free to distribute (open-source games, itch.io freeware, your own builds). You are responsible for what your manifest links to.

Installed apps

Sideloaded apps on the connected headset. In VR, find them under App Library → dropdown → “Unknown Sources”.

Connect a headset first.

How to use QuestLoader

A complete, step-by-step guide to getting games onto your Meta Quest headset. Follow the steps in order — the whole process takes about 15 minutes.

What you need before you start

  • A Meta Quest headset (Quest 2, 3, or Pro).
  • A computer (Windows, Mac, or Chromebook) using the Chrome or Edge web browser. This won't work in Safari or Firefox.
  • The charging cable that came with your headset (or any USB-C cable that can carry data).
  • About 15 minutes, and a payment card for purchasing games.

First time only: your headset needs Developer Mode enabled — a simple setting that allows apps to be installed from outside the store. The next section covers exactly how.

Turning on Developer Mode

Developer Mode is a free setting from Meta that lets your headset install apps from outside the official store — which is what makes sideloading possible. You only do this once. It takes about five minutes, most of which is a one-time account step.

First, register as a developer (one time)

Meta requires anyone using Developer Mode to have a free developer account. There's no fee and no application to be approved — it's just a box to tick on your account.

  1. On a computer or phone browser, go to developer.oculus.com and sign in with the same Meta account your headset uses.
  2. Open your account settings and find the developer section. You may be asked to create an organisation — this sounds formal, but it's just a name. Type anything (your own name is fine) and confirm.
  3. Accept the developer agreement when prompted. That's the registration done.

Then, flip the switch in the phone app

Developer Mode itself is toggled from the Meta Horizon app on your phone — the same app you used to set up your headset.

  1. Open the Meta Horizon app on your phone. Make sure your headset is turned on and nearby, so the app can reach it.
  2. Tap Menu (or Devices), then select your headset from the list.
  3. Open Headset settings, then Developer Mode.
  4. Switch Developer Mode on. If the toggle is greyed out, it means the developer registration above hasn't finished syncing yet — give it a few minutes and reopen the app.
  5. Restart your headset once (hold the power button → Restart). This makes sure the new setting takes effect.

That's it — Developer Mode stays on from now on. When you first plug the headset into your computer, it'll ask you to Allow USB debugging; that prompt appearing is the sign it all worked. Step 1 picks up from there.

Installing without a PC

Most games can be installed straight from the headset itself — put the headset on, open its own browser, and go to this site. No cable, no computer.

Games are marked one of three ways in the library. 📱 installs here means just tap it — a plain APK, done in two taps. 📁 one extra step means the game also has data files (OBBs); those download the same way but need a quick manual move afterward, covered below. 🔌 needs a PC is rare — only games with files bound for the app's fully private folder, which nothing outside a cable can reach.

  1. On the headset, open its browser and go to this site.
  2. Tap a game to download it, then tap the download again when it appears — that starts the actual install.
  3. If it's marked 📁 one extra step: after the data file(s) finish downloading, open the headset's Files app, go to Downloads, and drag each one into the folder named after the game shown on screen (inside Android/obb/).
  4. If nothing prompts to install automatically, open Files or Downloads and tap the downloaded APK directly.

This needs Unknown Sources allowed on the headset — the same one-time setting sideloading always needs. If a download doesn't offer to install, that's usually why.

1 · Plug in and connect your headset

headset computer
  1. Enable Developer Mode (first time only). On your phone, open the Meta Horizon app → select your headset → Headset settingsDeveloper Mode → switch it on. You may need to register a free developer account first, which takes about two minutes.
  2. Plug the cable from your headset into your computer.
  3. Put on the headset. You'll see a message asking "Allow USB debugging?" — look at it and click Allow (tick "Always allow" so it doesn't ask again).
  4. On the computer, go to the Dashboard tab and click Connect. Pick your headset from the little list that pops up.

When connected, the status indicator in the corner turns green and reads online, confirming the computer and headset are communicating.

2 · Buy some credits

Games are unlocked with credits. It's simple: $1 = 1 game. Buy 3 credits, pick 3 games. Buy 5, pick 5. They're yours to keep forever.

$1 = 1 game 🎮
  1. Click the big ★ Buy games button (bottom-left of the screen).
  2. Use the + and buttons to choose how many games you want to buy. Or tap a quick amount like $3 or $5.
  3. Click Continue to secure checkout. This takes you to Stripe — a trusted, safe payment page used by big companies.
  4. Enter the card details and complete payment. QuestLoader never sees your card — Stripe handles it privately and securely.

Your payment is processed entirely on Stripe's secure page. Card information is never seen or stored by QuestLoader.

3 · Choose your games

After payment, you return to QuestLoader and a window opens showing every game. Locked games appear in grey; games you unlock turn full colour and remain in your library permanently.

🎮 locked (grey) tap it! 🎮 yours! (colour)
  1. Tap a grey game you want.
  2. It uses one credit and turns colourful with a green ✓ — that game is now yours forever.
  3. Keep tapping games until your credits run out. Owned games stay in colour every time you come back.

4 · Install a game onto the headset

  1. Close the pop-up and go to the Game library tab.
  2. Your unlocked games are in full colour with a Download & install button.
  3. Click Download & install. You'll see a bar fill up as it downloads and copies the game to your headset. Big games take a few minutes — that's normal.
  4. Want several at once? Click install on lots of games — they line up and install one after another by themselves. You can watch the queue with the ⬇ button in the corner.

Keep the headset plugged in and the cable undisturbed during installation. When the status reads Installed ✔, the game is ready.

5 · Play your game

  1. Put on your headset.
  2. Open your apps, and at the top find the section called "Unknown Sources" (tap the little dropdown that usually says "All").
  3. Your new game is in there. Click it and play!

Installed games always appear under Unknown Sources, separate from your Store games. This is the first place to look if a game seems missing.

Troubleshooting

  • The Connect button does nothing. Use Chrome or Edge (not Safari/Firefox), and make sure Developer Mode is on. Then re-plug the cable.
  • It doesn't ask "Allow USB debugging". Take the headset off and put it back on — the message appears inside the headset. Tick "Always allow".
  • My game won't download. Check the corner pill says green online. If not, reconnect on the Dashboard.
  • I paid but see no credits. Wait a few seconds and reopen Buy games — the payment takes a moment to confirm.
  • I can't find my game in the headset. Look under Unknown Sources, not the normal library.
  • Still stuck? The Fixes tab has more detailed help.

Community

Chat with other players about problems and fixes. Be kind — this channel is public and moderated.

Loading messages…
Pick a username in Settings to join the conversation.

Feedback & requests

Rate QuestLoader, request a game you'd like added, or suggest a feature. Every message comes straight to the QuestLoader team.

Rate your experience

How's QuestLoader working for you?

Send a message

Your feedback is private and goes directly to the team. Thanks for helping make QuestLoader better.

Install from this computer

Install an APK from your hard drive, with optional OBB data files for larger games.

APK file

Drop an .apk here, or click to browse

OBB data files (optional)

Drop .obb file(s) here, or click to browse

OBBs are pushed to /sdcard/Android/obb/<package>/. Standard OBB filenames look like main.1.com.example.game.obb.

Run

Console

Everything QuestLoader does, in order, with any errors.

Fixes

Common failures and exactly what to do about them. Errors in the Console link straight to the relevant fix.

“Unable to claim interface” / another program is using the headset

Only one program can hold the headset's ADB connection at a time. SideQuest, Meta Quest Developer Hub, Android Studio, Unity, scrcpy and Vysor all start a background adb server that grabs it — and quitting the window often leaves that server running.

1 · Quit the apps properly

Close SideQuest, Meta Quest Developer Hub, Android Studio, Unity, scrcpy, Vysor. On macOS use Cmd+Q — closing the window isn't enough.

Also close any other browser tab running QuestLoader. A second tab holds the device just as effectively as another app.

2 · Kill the leftover adb server

Windows — Task Manager (Ctrl+Shift+Esc) → Details tab → find adb.exe → End task. There may be more than one. Or in Command Prompt:

taskkill /F /IM adb.exe

macOS — Terminal:

killall adb

Linux — Terminal:

pkill adb

If you have Android platform-tools installed, this is the polite version on any OS:

adb kill-server

3 · Replug and retry

Unplug the cable, plug it back in, then click Connect on the Dashboard. If it still fails, reboot the headset (hold power → Restart) — that releases the interface for certain.

Stuck on “waiting for headset” / no response after 45 seconds

The headset is asking “Allow USB debugging from this computer?” and nobody has answered it. That prompt only renders inside VR, so it's invisible from your desk.

  1. Put the headset on. This is the whole fix, nine times out of ten.
  2. Look for the dialog. It can sit behind whatever app is open — press the Oculus/Meta button to return to Home if you don't see it.
  3. Tick “Always allow from this computer”, then tap Allow.
  4. Click Connect again on the Dashboard.

No dialog at all? Unplug and replug the cable while wearing the headset — the prompt fires on connect. If it's still absent, your computer's key was probably remembered and then broken: see revoking debugging authorisations.

Quest not listed in the USB picker / “ADB interface NOT FOUND”

Without Developer Mode the headset never exposes its ADB interface, so Chrome genuinely cannot see it.

Enable Developer Mode

  1. Go to developer.oculus.com, sign in, and create an organisation (free, any name — this is what unlocks the toggle).
  2. Open the Meta Horizon / Meta Quest phone app, pair with your headset.
  3. Devices → your headset → Headset Settings → Developer Mode → ON.
  4. Reboot the headset. The toggle doesn't take effect until you do.

Then run Dashboard → Run diagnostics. If it reports ADB interface (FF/42/01): FOUND, you're set.

Also check the headset isn't sitting in charge-only mode — put it on, open the notification panel and select the USB connection, choosing File Transfer (MTP) if prompted.

Nothing appears in the picker at all

Usually the cable. Many USB-C cables — especially the ones bundled with chargers and power banks — carry power only, no data, and behave exactly like a broken port.

  • Use the cable that came with the headset, or a known data cable (a Link cable is ideal).
  • Plug into a port directly on the computer, not a hub, dock or monitor.
  • Try a different port — USB 3 (blue) ports are the safer bet.
  • Quick test: if the headset shows a "USB connected" notification in VR, the cable carries data. If it only charges, it doesn't.

Linux also needs a udev rule before the browser may touch the device:

echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2833", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-oculus.rules && sudo udevadm control --reload-rules

Then replug the headset.

It used to work / stale debugging keys

The headset remembers which computers it trusts. If that record is stale — you cleared browser data, or paired through SideQuest previously — it can refuse silently and never re-prompt.

  1. In the headset: Settings → System → Developer → Revoke USB debugging authorisations.
  2. Unplug and replug the cable while wearing the headset.
  3. Click Connect here and accept the fresh prompt.

QuestLoader's own key lives in this browser's storage. Clearing site data for this page forces a brand-new key, which triggers a fresh prompt too.

“ADB library FAILED to load” / Console is empty

The page couldn't fetch the ADB library from esm.sh, so nothing can connect.

  • Script/ad blocker (uBlock, Brave Shields, Privacy Badger) — allowlist this page and reload.
  • Content-Security-Policy on your site — if you serve a CSP header, it must permit script-src https://esm.sh and connect-src for your download hosts. This is the most common cause when it works locally but breaks once hosted.
  • Corporate network / firewall blocking esm.sh.
  • Offline — the library is loaded from a CDN, so the page needs internet on first load even for offline installs. To make it truly offline, self-host the library files alongside the page and change the import URLs.
WebUSB unavailable / “requires HTTPS”

WebUSB only runs in a secure context. The page must be served over https:// or from localhost — opening the file directly with file:// will not work.

  • Use desktop Chrome, Edge, or another Chromium browser. Firefox and Safari don't implement WebUSB at all, and there's no workaround.
  • Chrome on iOS/Android won't work either — this needs a desktop.
  • To test locally, serve the folder rather than double-clicking the file:
python3 -m http.server 8000

Then open http://localhost:8000/.

Catalog or download fails with “Failed to fetch”

That's CORS: the browser asked another server for a file and the server didn't say it was allowed. The fix lives on the file host, not here.

  • The host must return Access-Control-Allow-Origin: * (or your domain) on the APK/OBB/JSON files.
  • Hosting the files on the same domain as this page avoids CORS entirely — simplest solution by far.
  • Code adapters run in a null-origin sandbox, so their sources need Access-Control-Allow-Origin: * specifically — an echo of your domain won't match.
  • The URL must be HTTPS. An http:// download from an https:// page is blocked as mixed content.
WebDAV won't connect / “CORS” or PROPFIND errors

A browser is a stricter WebDAV client than a desktop app. The server must explicitly allow this page. Three things must all be true:

  • HTTPS. An http:// server cannot be used from an https:// page.
  • CORS allows this origin, including the PROPFIND method and the Authorization, Depth and Range headers, and it must answer the OPTIONS preflight.
  • Basic auth. Digest cannot work: computing the response needs the server's nonce from the WWW-Authenticate header, which browsers refuse to expose cross-origin. No client-side code can work around this.

nginx

add_header Access-Control-Allow-Origin $http_origin always; add_header Access-Control-Allow-Credentials true always; add_header Access-Control-Allow-Methods "GET,HEAD,OPTIONS,PROPFIND" always; add_header Access-Control-Allow-Headers "Authorization,Depth,Content-Type,Range" always; add_header Access-Control-Expose-Headers "Content-Length,Content-Range,Accept-Ranges,DAV,ETag" always; if ($request_method = OPTIONS) { return 204; }

Apache

Header always set Access-Control-Allow-Origin "https://yoursite.com"

Expose-Headers matters. Without Content-Length and Accept-Ranges exposed, the browser hides them — progress percentages vanish and resume silently turns off, even though downloads still work.

Check it from a terminal

curl -sI -X PROPFIND -u user:pass -H "Depth: 1" https://example.com/files/

A healthy server answers 207 Multi-Status. A 401 means bad credentials; 405 means WebDAV is off or a proxy stripped PROPFIND.

Nextcloud / ownCloud

Use the full WebDAV path, not the web UI URL: https://host/remote.php/dav/files/USERNAME/. Generate an app password (Settings → Security) rather than using your login, and note that Nextcloud does not send CORS headers to arbitrary origins by default — hosting QuestLoader on the same domain avoids the problem entirely.

My games.json won't load / entries get rejected

QuestLoader validates every entry and drops bad ones rather than half-working. The Console lists each rejection with a reason. The usual causes:

  • Not valid JSON — a trailing comma after the last item, single quotes instead of double, or smart quotes from a word processor. Paste the file into jsonlint.com to find the exact line. Edit JSON in a code editor, never in Word or Notes.
  • Got HTML instead of JSON — the URL returned a 404 page. Open the URL directly in a browser tab: you should see raw JSON, not a webpage.
  • “missing or invalid packageName” — must be the real Android package (letters, numbers, dots only), e.g. com.yourstudio.yourgame. Not the game's title.
  • “apk must be an http(s) URL” — must be a full absolute URL starting https://, not /files/game.apk, and it must be a direct file link. Google Drive / Dropbox share pages return an HTML preview, not the APK.
  • Wrong shape — the top level must be {"games":[…]} or a bare array […].

Check your URL from a terminal

curl -sI https://yoursite.com/games.json | grep -i "access-control\|content-type"

You want to see access-control-allow-origin: * and content-type: application/json. No CORS line means the browser will refuse it — see the CORS fix above.

Finding your package name

Install the APK once via the Install local tab, then look at the Installed tab — the exact package name is listed there. Copy it into your JSON.

Install fails after upload
  • INSTALL_FAILED_VERSION_DOWNGRADE — a newer build is installed. Turn on Allow downgrades in Settings, or uninstall it from the Installed tab first.
  • INSTALL_FAILED_UPDATE_INCOMPATIBLE — the APK is signed with a different key than the installed copy. Uninstall the existing one first (this deletes its save data).
  • INSTALL_FAILED_INSUFFICIENT_STORAGE — check the storage meter on the Dashboard.
  • INSTALL_PARSE_FAILED_NO_CERTIFICATES — the APK is unsigned or corrupt. Re-download it.
  • INSTALL_FAILED_NO_MATCHING_ABIS — the APK is for a different CPU architecture. Quest needs an arm64 build.
  • Installs but crashes on launch — it probably needs OBB data files. Use the OBB box on the Install tab, and make sure the package name matches exactly.

Settings

Settings are saved in this browser when possible.

Catalog source

Online mode
Fetch the game catalog from a public JSON manifest URL. Turn off to use QuestLoader fully offline (local APK/OBB installs only).
What is this, and how does it unlock the library?

The Game library tab doesn't hold a fixed list of games. It reads one from a file called games.json — the catalog. That file says what exists, what it's called, and where the APK lives. Point this box at one and the library fills in.

Using this site's games

Leave it as /games.json. That's the catalog on this site, and it's already filled in for you. You need an access key to read it — the button below gets you one.

Using someone else's, or your own

Paste the full address of their games.json, e.g. https://theirsite.com/games.json, then press Test catalog now. It'll tell you straight away whether it worked and how many games it found.

Their server has to allow other sites to read the file (CORS). Most static hosts — GitHub raw, GitHub releases, Cloudflare R2 — already do. If it can't be read, the test says so rather than failing silently.

Hosting your own

A catalog is just a text file. The smallest working one is two fields per game:

{
  "games": [
    {
      "name": "My Game",
      "apk": "https://mysite.com/mygame.apk"
    }
  ]
}

Add version, description, image and packageName if you want nicer cards. Games with expansion data also need obbs — and those do need packageName, since the files must land in a folder named after it. The Fixes tab has the full format and the usual mistakes.

Your library unlocks when you support QuestLoader. Buy credits, pick the games you want, and they stay in your library for good — no keys, no passwords, no ads.

Unlock games
Every $1 unlocks one game of your choice. Support once, choose your games, keep them forever.

Your account

Pick a username so we can send you free credits in giveaways — and so you can invite friends. Free, and you don't need to buy anything first.

Install behavior

Grant all permissions on install
Adds -g to pm install so games don't nag for permissions in-headset.
Allow downgrades
Adds -d so an older version can replace a newer installed one.

About

QuestLoader runs entirely in your browser using WebUSB and an open-source JavaScript implementation of the ADB protocol (ya-webadb). Nothing is uploaded anywhere — files go straight from your computer to the headset over the cable. Requires HTTPS and Chrome or Edge on desktop.