docs: record live Twitch concept milestone

This commit is contained in:
2026-08-17 12:03:37 -07:00
parent df984690ce
commit 9ebd1ea283
@@ -0,0 +1,70 @@
_model: devlog-entry
---
schema_version: 1
---
title: Twungeon reaches a live Twitch concept milestone
---
date: 2026-08-17
---
author: Codex and Christopher Chambers
---
summary: Twungeon moved from a local proof of concept to a live Twitch-connected deployment with broadcaster OAuth, Extension identity sharing, Channel Points resurrection, a focused viewer control panel, and an authenticated spawn button.
---
tags: implementation, concept validation, deployment, Twitch, Twitch Extension, OAuth, Channel Points, Twurple, Cloudflare, testing
---
source_commit: df984690cedf84fc58d3eb6e2000d2df567a8d5d
---
body:
Twungeon is now running as a live Twitch-connected concept on the
[Labyricorn Twitch channel](https://www.twitch.tv/labyricorn). The deployed
service connects Twurple chat and EventSub to the broadcaster account, verifies
Twitch Extension identity on the server, and serves the Extension through the
public Cloudflare tunnel at `https://twungeon.labyricorn.com`.
The authentication path required more than supplying a static token. Twungeon
now provides a confidential OAuth authorization-code flow with state
validation, checks that Twitch returned the configured broadcaster and required
scopes, stores access and refresh credentials outside the repository with
restricted permissions, and persists refreshed credentials atomically. The
Extension exchanges its signed Twitch JWT for a short-lived Twungeon session;
the shared Extension secret remains server-side.
The first setup attempt exposed several integration mismatches. The original
Twitch application had been registered as a public client before the callback
endpoint existed, so live server authorization required a new confidential
application and the exact HTTPS `/oauth/callback` redirect. Enabling identity
linking also made a privacy notice mandatory before the Extension version could
advance. Both requirements are now reflected in the implementation and operator
documentation.
The first live Extension view rendered the complete broadcast game instead of
a compact control surface. The shared frontend now switches to a controller-only
layout at `/extension`, while `/` remains the full game view used by the stream.
Cloudflare also continued serving an older JavaScript bundle during testing;
static responses now use `Cache-Control: no-store`, and the Extension loads a
versioned script URL to force the current controller code.
Spawning revealed one final usability gap. Chat `!spawn` was not sufficient for
the broadcaster because a channel owner cannot follow their own channel, and
the Extension offered no direct alternative. The control panel now includes a
**Spawn character** button backed by an authenticated server endpoint. It uses
the verified Twitch viewer ID, applies the normal follower rule, and treats the
configured broadcaster as eligible. The same eligibility correction also
allows broadcaster chat spawning.
The current deployment reports healthy with the Twitch adapter ready. Viewers
can authorize their identity, spawn from the Extension, and use the movement,
attack, heal, and pass controls for their own character. The configured custom
Channel Points reward drives resurrection through EventSub. The final automated
run passed linting, strict type checking, 24 domain tests, 10 integration and
multi-viewer tests, and the production build.
This establishes the live interaction concept, but it is not a claim that every
MVP acceptance gate is complete. Broader real-viewer, multi-viewer, usability,
fault-injection, soak, and independent-operator evidence remains to be recorded.
Game state is still intentionally in memory, so restarting the service starts a
new run.
The live Twitch integration and spawn-control milestone are recorded in
[commit `df984690cedf84fc58d3eb6e2000d2df567a8d5d`](https://git.labyricorn.com/Labyricorn/Twungeon/commit/df984690cedf84fc58d3eb6e2000d2df567a8d5d).