Gopher artwork by Renee French, CC BY 3.0, via golang-samples/gopher-vector
Intro Radio is GEWIS's live stream (Icecast/HLS audio and video) for the student association's introduction week, with a built-in chat between listeners and radio staff and an admin backoffice for staff to manage those conversations.
This repository is a monorepo combining what used to be two separate projects:
frontend/-- the Vue app listeners and staff use to watch/listen and chat (formerlyGEWIS/radioweb). See frontend/README.md.backend/-- the Go server behind the chat and the stream metadata API (formerlyGEWIS/radiogaga). See backend/README.md.
Both READMEs cover their service in depth (environment variables, message formats, HTTP endpoints); this one focuses on running the whole thing together.
intro-radio/
|-- frontend/ Vue 3 + Vuetify SPA: player UI, listener chat, admin backoffice
|-- backend/ Go WebSocket chat server + JSON stream-metadata API
|-- scripts/ dev.sh (run both services) and dev-token.mjs (auth token helper)
|-- docs/ README assets
`-- .claude/ Claude Code launch config for browser-preview tooling
- Node.js 22.x with Corepack-enabled Yarn (see
frontend/.yarnrc.yml) - Go 1.24+ (see
backend/go.mod)
./scripts/dev.shThis starts the backend on http://localhost:8080 and the frontend on http://localhost:3000 (which proxies /api/v1 and /ws to the backend -- see frontend/vite.config.mts), running yarn install first if frontend/node_modules doesn't exist yet. Output from each service is prefixed with [backend] / [frontend]. Press Ctrl+C to stop both, and their child processes, cleanly.
To run a single service on its own instead, see frontend/README.md or backend/README.md. All backend environment variables have safe local defaults -- GEWIS_SECRET and RADIO_CHAT_KEY both default to ChangeMe.
The chat requires an HS512-signed JWT with lidnr / given_name / family_name claims, and there's no local login flow to produce one. scripts/dev-token.mjs signs one directly, using the backend's actual default secret (read from backend/chat.go, not guessed), and prints ready-to-use URLs:
node scripts/dev-token.mjs --lidnr 1337 --given-name Ada --family-name LovelaceListener chat:
http://localhost:3000/?token=eyJhbGciOiJIUzUxMiIs...
Admin / backoffice chat:
http://localhost:3000/backoffice?token=eyJhbGciOiJIUzUxMiIs...&key=ChangeMe
Open either URL once both services are running. --lidnr, --given-name, and --family-name are optional (they default to 1234, Test, and User); set GEWIS_SECRET / RADIO_CHAT_KEY in the environment to override the source-read defaults if you're running the backend with custom secrets.
.claude/launch.json wires up scripts/dev.sh as a named preview target (intro-radio) for Claude Code's browser-preview tooling, so a single preview_start call brings up both services and opens a browser tab on the frontend.
Both services build and publish as Docker images via the shared GEWIS/actions workflows (see frontend/Dockerfile and backend/Dockerfile), triggered on pushes and releases.
AGPL-3.0. See LICENSE.
