Three dead ends, one cause: these routes resolved to pages that stayed on the website, and nothing here answered them any more. /start — this page became the app's front page in the split (it is index.vue now), so every pre-split bookmark and the website's own redirect landed on a 404. Caught here so the app's old URLs work without waiting for the website to be redeployed. /login — the app has no login by design, identity comes from the issuer. But five call sites still send people there: logout, the live-atc session guard, the bridge pairing screen. In the monorepo that path was the website's login form; since the split it was nothing, so signing out dropped the user on a blank page. It is a forwarder to the issuer, not a login form. /logout — after clearing the app session it sent the user to /login, which under SSO means an issuer where they are still signed in: they would be handed a fresh code and land straight back inside. It now signs them out at the issuer too, which bumps tokenVersion and invalidates every refresh token. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Self-host OpenSquawk
OpenSquawk is a browser-based aviation radio training application. It provides Live ATC scenarios with spoken controller responses, a classroom learning mode, and optional simulator/cockpit bridge integration.
This repository contains the Nuxt application and its H3 API. Live ATC routing
and authoritative session state are provided by the separate
OpenSquawk-API
service.
Requirements
- Node.js 22 and Yarn 4
- MongoDB
- Python 3.12 and Poetry for
OpenSquawk-API - An OpenAI-compatible service for cloud STT/TTS, or a configured local speech provider
The simulator/cockpit bridge is optional.
Start locally
Start MongoDB, then prepare the Nuxt application:
corepack enable
cp .env.example .env
yarn install
Generate strong values for JWT_SECRET, APP_JWT_SECRET, and
SERVICE_SECRET. Keep AUTH_MODE=open for a self-hosted instance without a
login. Configure the speech provider variables required by your setup.
In a separate checkout of OpenSquawk-API, start the decision backend:
poetry install
poetry run uvicorn main:app --reload
It listens on http://127.0.0.1:8000 by default. If it runs elsewhere, set
NUXT_PUBLIC_RADIO_BACKEND_URL accordingly.
Start the Nuxt application:
AUTH_MODE=open yarn dev
The application is then available at http://localhost:3000.
Configuration
All documented variables and self-hosting defaults are in
.env.example. MongoDB stores user state, learning progress,
bug reports, and transmission logs locally. Telemetry forwarding is disabled
when TELEMETRY_URL is empty.
Services
OpenSquawk-API: decision flows, routing, and Live ATC session state- MongoDB: application identities, progress, reports, and logs
- OpenAI-compatible or local speech service: transcription and controller audio
- Optional bridge: simulator and cockpit integration
License
OpenSquawk is licensed under the GNU Affero General Public License v3.0 only.