Patches the Quest build of Rec Room 2023.03.21 (20230317 / 2128210, the
same appVersion as the PC client) to connect to a DorkNet server, using
one native hook library loaded via DT_NEEDED on libmain.so.
- host rewrite onto <svc>.<ServerHost> or a {service}-dev.example.com template
- Photon app ids and region injection (PhotonRegion must match PC)
- TLS / pinning / image-signature bypass, integrity callbacks neutralised
- no-Meta-account build; the server treats platform id 0/1/blank as a
placeholder and keys those accounts by device id
- build.ps1 -Obb packages a DorkNet-<ver>.xapk with one-command
installers for Windows and macOS/Linux; app is named via AppName
- README, docs/quest.md and NOTICE updated; credits RecFlare and
And64InlineHook (MIT)
Tested on a Quest 2: all hooks arm, requests reach the dev server.
3.6 KiB
Meta Quest client
DorkNet can be played on a standalone Meta Quest headset using a
sideload-patched Rec Room 2023.03.21 client. The patcher and the full build
and install guide live in ../DorkNet.Quest/;
this page is the server operator's view.
Which build
| Rec Room version | 2023.03.21 (versionName 20230317, versionCode 2128210) |
| Package (store) | com.AgainstGravity.RecRoom, arm64-v8a, IL2CPP |
| Ships | single APK + a ~1.4 GB OBB |
This build reports appVersion 20230317 — identical to the PC
march-2023-03-21 client. The server hardcodes "20230317" in presence /
match / notification responses, so Quest and PC players interoperate with no
server change: the version gate (GET api/versioncheck/v4), the presence
appVersion string, and Photon room versioning all line up. Do not patch a
different Quest build (e.g. 20230414) against this branch — a different
appVersion reads as "version mismatch, can't join".
How it connects
There is no MelonLoader on Android, so DorkNet.Quest does the ClientMod +
Photon-byte-patch jobs with one native library (libdorknet.so) injected via a
DT_NEEDED entry on libmain.so. At runtime it:
- rewrites
<service>.rec.net→<service>.<ServerHost>(for a server onDomain:HostStyle = hyphen, setServerHost = {service}-<env>.<apex>) (the name server then hands out every other service URL — same bootstrap as the PC client); - injects the operator's Photon app ids and fixed region (
PhotonRegion; it must match the PC clients'PhotonCloudRegionor the two never meet); - accepts the self-hosted TLS chain and image signatures;
- neutralises the integrity callbacks that would otherwise reject a re-signed, hook-loaded sideload.
So the same DNS, TLS, Photon and image-signing setup from
deploy.md serves Quest — every *.<apex> subdomain the PC
client uses must resolve and be covered by the cert.
Accounts without a Meta account
If the build is made with a blank OculusAppId (the no-Meta-account build), the
client can't produce a real Oculus platform identity, so every headset sends
the placeholder platform user id 1. The server must not treat that as an
identity, or all those players collapse into one shared account and are offered
each other's "remembered logins".
DorkNet handles this server-side in PlayerService
(IsPlaceholderPlatformId): platform ids 0, blank and 1 are never stored on
an account, never matched by the cached-login lookup
(cachedlogin/forplatformid), and never used to synthesise a device id — those
players are keyed by deviceId alone, exactly like the PC Steam-emulator path.
A real Meta platform id (the Meta build) still tags and lists normally.
Thanks to RecFlare for documenting this pitfall in their Quest client notes.
Covered by
DorkNet.Server.Tests/QuestPlaceholderPlatformIdTests.cs. Never add a rule that accepts platform id1as a real identity — the whole no-Meta fleet sends the same value.
Operator checklist
- DNS + TLS for every
*.<apex>service subdomain (seedeploy.md). - Your own Photon Realtime/Voice app ids (see
deploy.md→ Photon Cloud). - Image signing key configured (
ImageSignatureService), as for PC. - Build with
ServerHost=<apex>, the Photon ids and region baked in, passing-Obbso you get a release folder (DorkNet-<ver>.xapkplusinstall.cmd/install.sh). Players run the installer with the headset plugged in; the app appears as DorkNet under Unknown Sources.
No server component is Quest-specific beyond the placeholder-platform-id handling above.