+
+
Downloads
+
+ Rec Room for DorkNet, built from the DorkNet source by the build server. The SHA-256 next to each file
+ lets you check your download.
+
+
+
+ {err &&
Couldn't load the builds: {err}
}
+ {m === undefined && !err &&
Loading builds…
}
+ {m === null &&
This server doesn't offer downloads.
}
+ {m && !releases.length &&
No builds have been published yet.
}
+
+ {releases.map((rel) => (
+
+
+
Rec Room {rel.title}
+ {rel.game_version && Game build of {fmtDate(`${rel.game_version}T12:00:00Z`)}}
+
+ {PLATFORMS.map((p) => {
+ const files = rel.files.filter((f) => f.platform === p.id);
+ if (!files.length) return null;
+ return (
+
+
+
+ {files.map((f) => )}
+
+
+ );
+ })}
+
+ ))}
+
+ {releases.length > 0 && (
+
+ These builds contain Rec Room's own game files. They're for this community only: please don't re-share them.
+
+ )}
+
+ );
+}
diff --git a/DorkNet.Server/site/src/pages/Quest.tsx b/DorkNet.Server/site/src/pages/Quest.tsx
index 4775dfd..98f8a8d 100644
--- a/DorkNet.Server/site/src/pages/Quest.tsx
+++ b/DorkNet.Server/site/src/pages/Quest.tsx
@@ -1,6 +1,8 @@
-import { useRef, useState } from 'react';
-import { openXapk, type Xapk } from '../lib/xapk';
+import { useEffect, useRef, useState } from 'react';
+import { useSearchParams } from 'react-router';
+import { fileSource, openXapk, urlSource, type Xapk } from '../lib/xapk';
import { connectHeadset, installXapk, webUsbSupported, type Headset, type Progress } from '../lib/questInstall';
+import { fileUrl, getDownloads, questBuild, type QuestBuild } from '../lib/downloads';
const fmtSize = (n: number) =>
n >= 1e9 ? `${(n / 1e9).toFixed(2)} GB` : n >= 1e6 ? `${(n / 1e6).toFixed(1)} MB` : `${Math.max(1, Math.round(n / 1e3))} KB`;
@@ -43,15 +45,36 @@ export function Quest() {
const [err, setErr] = useState