Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
b3d3334
Integrate IWSDK Quest Studio: add package.json
devshieldhq Nov 7, 2026
c9249d5
Integrate IWSDK Quest Studio: add vite.config.ts
devshieldhq Nov 7, 2026
63ad167
Integrate IWSDK Quest Studio: add index.html
devshieldhq Nov 7, 2026
b61ab85
Integrate IWSDK Quest Studio: add iwsdk.config.json
devshieldhq Nov 7, 2026
9acb7a6
Integrate IWSDK Quest Studio: add tsconfig.json
devshieldhq Nov 7, 2026
60a0cd5
Integrate IWSDK Quest Studio: add index.ts
devshieldhq Nov 7, 2026
1c973ce
Integrate IWSDK Quest Studio: add assets.ts
devshieldhq Nov 7, 2026
ad71e76
Integrate IWSDK Quest Studio: add components.ts
devshieldhq Nov 7, 2026
e9fc3ae
Integrate IWSDK Quest Studio: add main.iwsdk.scene.json
devshieldhq Nov 7, 2026
76a382d
Build IWSDK Quest Studio into the StreamLink web container
devshieldhq Nov 7, 2026
8f46578
Route Try it in VR to integrated Quest Studio
devshieldhq Nov 7, 2026
b01dfc6
Serve IWSDK Quest Studio on the StreamLink origin
devshieldhq Nov 7, 2026
85e8f68
Add CI validation for integrated Quest Studio
devshieldhq Nov 7, 2026
8e8a637
Keep Quest Studio CI independent of generated lockfiles
devshieldhq Nov 7, 2026
23f1be3
Build IWSDK Quest creator control panel
devshieldhq Nov 7, 2026
e02d1c0
Connect IWSDK Quest Studio to existing StreamLink backend
devshieldhq Nov 7, 2026
9f9d53d
Fix Quest camera cleanup on page exit
devshieldhq Nov 7, 2026
165cb66
Run Quest CI for backend integration branch
devshieldhq Nov 7, 2026
e31c38c
Add IWSDK hand-interactive Quest Studio and VR Arena
devshieldhq Nov 7, 2026
f0166cf
Refine movable Quest controls and Arena entity cleanup
devshieldhq Nov 7, 2026
8a56b17
Add in-headset destination and StreamBot controls
devshieldhq Nov 7, 2026
6264121
Run full Quest experience CI
devshieldhq Nov 7, 2026
0d555dd
Make IWSDK the only StreamLink VR route
devshieldhq Nov 7, 2026
6642e26
Remove Classic VR links from StreamLink website
devshieldhq Nov 7, 2026
08253cc
Redirect legacy VR URLs to IWSDK Quest Studio
devshieldhq Nov 7, 2026
c3a912b
Document Meta VR Start eligibility and test checklist
devshieldhq Nov 7, 2026
f990641
Add Docker and route smoke tests for Quest Studio
devshieldhq Nov 7, 2026
d8c8d2d
Exclude generated Quest assets and node_modules from Docker context
devshieldhq Nov 7, 2026
4824090
Add IWSDK emulator development and preview scripts
devshieldhq Nov 7, 2026
011e103
Add IWER emulator test instructions
devshieldhq Nov 7, 2026
7d16ea2
Allow judges to try VR Arena in guest mode
devshieldhq Nov 7, 2026
62e9220
Capture container logs when route smoke test fails
devshieldhq Nov 7, 2026
9e7e9a3
Fix early middleware redirect for legacy VR URLs
devshieldhq Nov 7, 2026
5c86f61
Add account sign-in link to Quest Studio
devshieldhq Nov 7, 2026
c00b89a
Smoke-test Supabase config and platform registry routes
devshieldhq Nov 7, 2026
8f92d27
Keep StreamBot out of the competition Quest demo
devshieldhq Nov 7, 2026
47a563b
Remove StreamBot controls from competition demo
devshieldhq Nov 7, 2026
d480991
Remove StreamBot from competition readiness checklist
devshieldhq Nov 7, 2026
9453bdb
Remove StreamBot event handling and legacy VR references
devshieldhq Nov 7, 2026
47a4de6
Point final homepage CTA to IWSDK Quest Studio
devshieldhq Nov 7, 2026
ea7d647
Capture server logs around legacy redirect smoke test
devshieldhq Nov 7, 2026
dcb531d
Log container state and HTTP response for legacy redirect test
devshieldhq Nov 7, 2026
360e15b
Stop Arena timer and clean targets when leaving the page
devshieldhq Nov 7, 2026
072e384
Use explicit 308 response for legacy VR redirects
devshieldhq Nov 7, 2026
0eb3d7b
Optimize Quest Arena and controls for seated two-foot reach
devshieldhq Nov 7, 2026
1ad8bab
Keep destination control within the seated panel bounds
devshieldhq Nov 7, 2026
9405e08
Join the active stream session before receiving telemetry
devshieldhq Nov 7, 2026
58c2929
Remove Classic VR navigation from the IWSDK-only Quest experience
devshieldhq Nov 7, 2026
9e6182e
Add hands-first Arena pause and resume control
devshieldhq Nov 7, 2026
c047117
Preserve HTTP diagnostics when legacy route resets connection
devshieldhq Nov 7, 2026
11d9000
Avoid curl broken pipes in backend smoke tests
devshieldhq Nov 7, 2026
ae5cf80
Normalize Location header in redirect smoke test
devshieldhq Nov 7, 2026
f43e5de
Normalize Location header in redirect smoke test
devshieldhq Nov 7, 2026
c4c57a4
Make Location header check portable across awk versions
devshieldhq Nov 7, 2026
893ba53
Exclude IWER emulator runtime from production Quest build
devshieldhq Nov 7, 2026
9d4d26d
Make Focus Mode simplify the in-world studio
devshieldhq Nov 7, 2026
1c771cd
Reset Focus Mode and restore the full studio layout
devshieldhq Nov 7, 2026
07cd544
Make competition division recommendation conditional on project history
devshieldhq Nov 7, 2026
f91a864
Make Docker route smoke tests report each endpoint separately
devshieldhq Nov 7, 2026
eee62ea
Correct project history date for competition division
devshieldhq Nov 7, 2026
487f9a6
Fix /quest slash redirect without looping on /quest/
devshieldhq Nov 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions .github/workflows/quest-studio-integration.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: StreamLink Quest Studio Integration

on:
pull_request:
branches: [main, iwsdk-streamlink-integration, iwsdk-backend-port]
paths:
- "streamlink-server/quest-competition/**"
- "streamlink-server/Dockerfile"
- "streamlink-server/server.js"
- ".github/workflows/quest-studio-integration.yml"
push:
branches: [iwsdk-streamlink-integration, iwsdk-backend-port, iwsdk-full-quest-experience]

jobs:
build-quest-studio:
runs-on: ubuntu-latest
defaults:
run:
working-directory: streamlink-server/quest-competition
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm install
- run: npm run typecheck
- run: npm run build
- name: Build the complete StreamLink Docker image
working-directory: streamlink-server
run: docker build -t streamlink-xr-ci .
- name: Smoke-test the Quest route and legacy redirect
working-directory: .
shell: bash
run: |
docker run -d --name streamlink-xr-ci -p 3000:3000 -e PORT=3000 streamlink-xr-ci
trap 'docker rm -f streamlink-xr-ci >/dev/null 2>&1 || true' EXIT
ready=false
for attempt in {1..30}; do
quest_code=$(curl -sS -o /tmp/quest.html -w '%{http_code}' http://localhost:3000/quest/ || true)
if [ "$quest_code" = "200" ]; then ready=true; break; fi
running=$(docker inspect -f '{{.State.Running}}' streamlink-xr-ci 2>/dev/null || echo false)
if [ "$running" != "true" ]; then break; fi
sleep 2
done
config_code=$(curl -sS -o /tmp/config.js -w '%{http_code}' http://localhost:3000/config.js || true)
platforms_code=$(curl -sS -o /tmp/platforms.json -w '%{http_code}' http://localhost:3000/platforms || true)
legacy_code=$(curl -sS -o /dev/null -w '%{http_code}' --max-redirs 0 http://localhost:3000/app || true)
redirect=$(curl -sSI http://localhost:3000/app 2>/dev/null | awk 'tolower($1)=="location:" {gsub("\\r", "", $2); print $2}' || true)
echo "Quest route: $quest_code; config route: $config_code; platforms route: $platforms_code; legacy route: $legacy_code; redirect: $redirect"
echo "--- StreamLink container logs ---"
docker logs streamlink-xr-ci || true
docker inspect -f 'container state: {{.State.Status}} exit={{.State.ExitCode}}' streamlink-xr-ci || true
test "$ready" = "true"
grep -q 'StreamLink XR' /tmp/quest.html
test "$config_code" = "200"
grep -q '__SUPABASE__' /tmp/config.js
test "$platforms_code" = "200"
grep -q 'youtube' /tmp/platforms.json
test "$legacy_code" = "308"
test "$redirect" = "/quest/"
56 changes: 56 additions & 0 deletions COMPETITION_READINESS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Meta VR Start Developer Competition 2026 — StreamLink XR Readiness

## Eligibility checklist

The official rules require the entrant (or every team member, where applicable) to:
- Be at least 18 and the age of majority in their jurisdiction.
- Have an active Meta account with Developer Access enabled by submission.
- Have the submitting representative be a member in good standing of Meta VR Start by submission.
- Reside in an eligible location and satisfy the banking / sanctions restrictions in the official rules.
- Submit only one entry as an individual or team representative.

Kenya is not named among the excluded locations in the competition rules. Entrant eligibility still depends on the individual requirements above.

Before submission, the entrant must personally confirm: age requirement, Developer Access status, Start membership in good standing, Devpost registration, and correct individual/team representative status.

## Recommended project positioning

- Project: StreamLink XR — a hands-first spatial creator studio for controlling and monitoring live broadcasts, with an original in-world VR Arena.
- Track recommendation: Productivity. The primary product is a creator workspace; Arena is an interactive onboarding / engagement mode. The sponsor can reassign track placement.
- Division recommendation: The repository's earliest visible commit is September 28, 2026, which is inside the September 24–November 18 competition window. If no earlier codebase, prototype, early-access build, or published app existed elsewhere before September 24, choose New Experience. If StreamLink or its underlying code existed before September 24, choose Adapted / Significantly Updated Experience; the IWSDK Quest port, hands-first spatial controls, and Arena are substantial competition-window updates. The sponsor makes the final division determination.
- Originality: The core spatial workspace and Arena remain useful without third-party streaming destinations or the AI agent. Those services extend the project; they are not the entire project.

## Submission requirements

- A working IWSDK/WebXR URL that judges can open and test; this project is hosted on the existing StreamLink domain.
- A public demonstration video under 3 minutes, showing actual Quest / XR Simulator / equivalent emulator footage.
- Devpost project name, 140-character tagline, track, division, inspiration, implementation approach, future plans, and target launch date.
- For an adapted project, a clear summary of the new competition-window features, with screenshots / changelog / video recommended.
- Describe hands-first interactions and what is exciting about future VR (optional field).
- Keep the project free and accessible through the winner announcement (December 11, 2026).
- Submission deadline: November 18, 2026 at 12:00 PM Pacific (11:00 PM East Africa Time).

## Technical acceptance checklist

### Automated checks
- [ ] TypeScript typecheck passes.
- [ ] IWSDK production build passes.
- [ ] Docker image builds with the nested Quest build step.
- [ ] Express serves /quest/ and redirects /app to /quest/.
- [ ] Existing /config.js, Supabase auth, platform credentials, stream APIs, FFmpeg and Socket.IO remain functional.

### XR / gameplay checks
- [ ] Run the IWSDK development server with `cd streamlink-server/quest-competition && npm install && npm run dev`; use the injected IWER Quest 3 emulator to enter XR and test hands / pointers on desktop.
- [ ] Quest Browser opens the app over HTTPS and enters immersive VR.
- [ ] Hands are available without pairing controllers.
- [ ] Pinch and poke operate every in-world control.
- [ ] Control panel can be grabbed and repositioned.
- [ ] Arena starts, spawns five targets, scores +10 per hit, counts down from 45 seconds, stops cleanly, and can restart.
- [ ] Seated use works within a comfortable reach / narrow field of view.
- [ ] Focus, Comfort and Reset controls work.
- [ ] Start / Stop, quality, destination entry and telemetry are tested end-to-end.
- [ ] Pause / resume and session exit do not leave camera, microphone, stream or timer resources running.
- [ ] Measure frame rate on Quest; target at least 60 FPS.
- [ ] Confirm free, reliable judge access without requiring a developer login or private invitation.

Important: A successful desktop CI build does not prove headset hand tracking, comfort, frame rate, or end-to-end streaming. Those require XR emulator and/or physical Quest validation.
7 changes: 7 additions & 0 deletions streamlink-server/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Keep local dependencies and generated assets out of the Docker build context.
node_modules/
**/node_modules/
quest-competition/dist/
public/quest/
.git/
*.log
17 changes: 8 additions & 9 deletions streamlink-server/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
# Portable container for the StreamLink relay backend — works on Render,
# Fly.io, DigitalOcean App Platform, or Railway (Railway accepts Dockerfiles
# too, if you ever come back). Installs ffmpeg at the OS level, which is the
# one thing a plain Node buildpack won't give you for free.

FROM node:20-slim
# StreamLink XR backend and same-origin IWSDK Quest Studio.
FROM node:22-slim

RUN apt-get update \
&& apt-get install -y --no-install-recommends ffmpeg \
Expand All @@ -16,8 +12,11 @@ RUN npm install --omit=dev

COPY . .

# Render (and most platforms) inject PORT at runtime; server.js already
# reads process.env.PORT with a fallback, so nothing to change there.
EXPOSE 3000
# Build the Quest experience into the Express public directory so /quest
# shares this service's HTTPS origin, auth configuration, and backend APIs.
RUN npm --prefix quest-competition install \
&& npm --prefix quest-competition run typecheck \
&& npm --prefix quest-competition run build

EXPOSE 3000
CMD ["node", "server.js"]
12 changes: 6 additions & 6 deletions streamlink-server/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
<a href="profile.html">Profile</a>
<a href="messages.html">Messages</a>
<a href="docs.html">Docs</a>
<a href="/app">VR room</a>
<a href="/quest">Quest Studio</a>
<a href="/account.html">Account</a>
</div>
<button class="nav-toggle" type="button" aria-label="Open navigation" aria-expanded="false" aria-controls="primary-navigation"><span></span><span></span><span></span></button>
Expand All @@ -92,7 +92,7 @@ <h1>One control room. Every platform. Control it with both hands or your phone.<
<div class="hero-actions">
<a href="/live" class="btn-primary">Go live from your phone</a>
<a href="/gamey" class="btn-secondary">Gamey</a>
<a href="/app" class="btn-secondary">Try it in VR</a>
<a href="/quest" class="btn-secondary">Try it in VR</a>
</div>
</section>

Expand Down Expand Up @@ -199,7 +199,7 @@ <h2 class="section-title">Simple pricing</h2>
<li>720p max quality</li>
<li>Basic stream health</li>
</ul>
<a href="/app" class="btn-secondary" style="width:100%;text-align:center;display:block">Start free</a>
<a href="/quest" class="btn-secondary" style="width:100%;text-align:center;display:block">Start free</a>
</div>
<div class="pricing-card featured">
<div class="pricing-tier">Pro</div>
Expand All @@ -211,7 +211,7 @@ <h2 class="section-title">Simple pricing</h2>
<li>Full AI co-pilot</li>
<li>Live telemetry</li>
</ul>
<a href="/app" class="btn-primary" style="width:100%;text-align:center;display:block">Go Pro</a>
<a href="/quest" class="btn-primary" style="width:100%;text-align:center;display:block">Go Pro</a>
</div>
<div class="pricing-card">
<div class="pricing-tier">Studio</div>
Expand All @@ -230,8 +230,8 @@ <h2 class="section-title">Simple pricing</h2>

<section class="cta-section">
<h2>Ready to run your broadcast from inside it?</h2>
<p>Set up your platforms once. Let the co-pilot handle the rest.</p>
<a href="/app" class="btn-primary">Get started</a>
<p>Set up your destinations once. Control your creator workspace in Quest.</p>
<a href="/quest" class="btn-primary">Get started</a>
</section>

<footer>
Expand Down
72 changes: 72 additions & 0 deletions streamlink-server/quest-competition/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#090d18" />
<meta name="description" content="StreamLink XR hands-first Meta Quest creator studio." />
<title>StreamLink XR — Quest Studio</title>
<style>
* { box-sizing: border-box; }
html, body, #scene-container { width: 100%; height: 100%; margin: 0; overflow: hidden; background: #090d18; color: #f4f7ff; font-family: Inter, system-ui, sans-serif; }
#scene-container { position: fixed; inset: 0; }
#hud { position: fixed; z-index: 5; top: 16px; left: 18px; pointer-events: none; text-shadow: 0 2px 8px #000; }
#hud strong { display: block; font-size: 19px; letter-spacing: .02em; }
#hud span { color: #aab8d2; font-size: 11px; }
#actions { position: fixed; z-index: 8; right: 16px; top: 16px; display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; }
a, button { border: 1px solid #52658e; border-radius: 9px; padding: 10px 13px; background: #263d72; color: white; font: 700 12px system-ui, sans-serif; text-decoration: none; cursor: pointer; }
a.secondary, button.secondary { background: #121b30; }
button:disabled { opacity: .45; cursor: not-allowed; }
#studio-panel { position: fixed; z-index: 7; top: 76px; left: 16px; bottom: 58px; width: min(370px, calc(100vw - 32px)); overflow-y: auto; padding: 16px; border: 1px solid #2a3b60; border-radius: 14px; background: rgba(7, 12, 27, .94); box-shadow: 0 12px 48px #0008; }
#studio-panel h2 { margin: 0 0 5px; font-size: 18px; }
#studio-panel p, #studio-panel small { color: #9eacc8; font-size: 12px; line-height: 1.5; }
.field { margin: 12px 0; }
label { display: block; margin-bottom: 5px; color: #aebbd4; font-size: 11px; }
input, select { width: 100%; padding: 9px 10px; border: 1px solid #263653; border-radius: 7px; background: #0c1428; color: #f4f7ff; font: 12px system-ui, sans-serif; }
.platform { padding: 9px 0; border-top: 1px solid #1c2a46; }
.platform strong { display: block; margin-bottom: 6px; font-size: 12px; }
.platform input + input { margin-top: 5px; }
.actions-row { display: flex; gap: 8px; margin-top: 12px; }
.actions-row button { flex: 1; }
#status { position: fixed; z-index: 8; bottom: 14px; left: 16px; right: 16px; color: #d2dcf1; font-size: 12px; background: #090d18dd; border: 1px solid #263653; padding: 10px 12px; border-radius: 8px; }
#telemetry { margin-top: 12px; padding: 10px; background: #111c32; border-radius: 8px; color: #aebbd4; font: 11px/1.7 ui-monospace, monospace; }
#agent-row { display: flex; gap: 6px; margin-top: 8px; }
.hidden { display: none !important; }
@media (max-width: 620px) { #studio-panel { top: 68px; bottom: 56px; } #actions a { padding: 9px; font-size: 10px; } #hud { top: 12px; left: 12px; } }
</style>
</head>
<body>
<div id="scene-container"></div>
<div id="hud"><strong>STREAMLINK XR</strong><span>IWSDK · HANDS-FIRST QUEST STUDIO</span></div>
<nav id="actions">
<a class="secondary" href="/">Website</a>
<a class="secondary" href="/account.html">Account</a>
<a class="secondary" href="/gamey">Gamey</a>
<button id="enter-xr" type="button" disabled>Checking XR…</button>
</nav>

<aside id="studio-panel">
<h2>Creator Studio</h2>
<p id="account-line">Checking your StreamLink account…</p>
<div class="field"><label for="session-id">SESSION ID</label><input id="session-id" autocomplete="off" spellcheck="false" /></div>
<div class="field"><label for="quality">STREAM QUALITY</label>
<select id="quality">
<option value="ultra">Ultra · 60fps</option><option value="high" selected>High · 30fps</option>
<option value="medium">Medium · 30fps</option><option value="low">Low · 24fps</option><option value="mobile">Mobile · 20fps</option>
</select>
</div>
<div id="platform-list"><small>Loading your streaming destinations…</small></div>
<div class="actions-row"><button id="start-stream" type="button">Go Live</button><button id="stop-stream" class="secondary" type="button" disabled>Stop</button></div>
<div id="telemetry">Stream: idle<br>Bitrate: —<br>Uptime: —</div>
<p><small>Sign in and manage saved stream keys in your account. Credentials are saved through your existing Supabase account and are never sent to the AI agent.</small></p>
<div id="passport" class="hidden"></div>
</aside>
<div id="status" role="status">Preparing the IWSDK Quest experience…</div>

<script src="/config.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2"></script>
<script src="/auth.js"></script>
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
<script type="module" src="./src/index.ts"></script>
</body>
</html>
21 changes: 21 additions & 0 deletions streamlink-server/quest-competition/iwsdk.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"$schema": "./node_modules/@iwsdk/core/dist/schemas/iwsdk-project.v1.schema.json",
"version": "iwsdk.project.v1",
"scene": "./public/scenes/main.iwsdk.scene.json",
"assets": { "module": "./src/assets" },
"world": {
"xr": {
"mode": "vr",
"features": { "handTracking": { "required": true } }
},
"render": { "camera": { "position": [0, 1.3, 0] } },
"features": {
"grabbing": { "useHandPinchForGrab": true },
"locomotion": true,
"spatialUI": true
}
},
"dev": {
"emulator": { "device": "metaQuest3", "activation": "always", "injectOnBuild": false }
}
}
29 changes: 29 additions & 0 deletions streamlink-server/quest-competition/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "streamlink-quest-studio",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite --host 0.0.0.0",
"typecheck": "tsc --noEmit",
"build": "vite build",
"preview": "vite preview --host 0.0.0.0"
},
"dependencies": {
"@iwsdk/core": "1.1.0-rc.1",
"three": "npm:super-three@0.185.0"
},
"devDependencies": {
"@iwsdk/cli": "1.1.0-rc.1",
"@iwsdk/vite-plugin-dev": "1.1.0-rc.1",
"@types/three": "^0.185.0",
"typescript": "^5.5.0",
"vite": "^7.1.4"
},
"overrides": {
"three": "npm:super-three@0.185.0"
},
"engines": {
"node": ">=20.19.0 <21.0.0-0 || >=22.12.0 <23.0.0-0 || >=24.0.0"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"version": "iwsdk.scene.v1",
"units": "meters",
"components": {
"com.iwsdk.components.DomeGradient": {
"sky": [0.025, 0.045, 0.12, 1],
"equator": [0.06, 0.09, 0.18, 1],
"ground": [0.015, 0.025, 0.06, 1],
"elevationDeg": 25,
"azimuthDeg": -35,
"dither": true
},
"com.iwsdk.components.IBLGradient": {
"sky": [0.12, 0.16, 0.28, 1],
"equator": [0.1, 0.14, 0.24, 1],
"ground": [0.035, 0.045, 0.08, 1],
"intensity": 0.45
}
},
"environment": { "toneMapping": "aces", "exposure": 1.1, "shadows": true, "shadowMapType": "pcf" },
"resources": {},
"nodes": []
}
2 changes: 2 additions & 0 deletions streamlink-server/quest-competition/src/assets.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import { defineAssets } from '@iwsdk/core';
export default defineAssets({});
2 changes: 2 additions & 0 deletions streamlink-server/quest-competition/src/components.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import { defineComponents } from '@iwsdk/core';
export default defineComponents([]);
Loading
Loading