🎛️ The control panel for the Octane Rocket League overlay toolkit.
Octane-Admin is a tiny React app that lets a caster, producer, or solo streamer set team names, team logos, series length, and the running series score. It talks to Octane-Bridge over plain HTTP, and the bridge fans the changes out to every connected overlay in real time. 📡✨
- 🏷️ Team names for the blue and orange sides.
- 🖼️ Team logos uploaded straight from disk (stored as data URLs, ≤ 500 KB).
- 🏆 Series length picker (Best of 1, 3, 5, 7, or 9).
- ➕➖ Series wins counters, automatically capped to the win threshold.
- 💾 Auto-save with a 250 ms debounce. No manual save needed.
- 🔌 Live connection badge (
connecting…,connection established,saving…,not connected). - 🔁 Auto-reconnect every 3s if the bridge goes away mid-session.
npm install
npm startThe dev server listens on port 3001 (CRA's default 3000 is left free for other overlay tooling). Open 👉 http://localhost:3001.
npm run build # 📦 production build into ./build
npm test # 🧪 react-scripts test runnerTo use the Admin Panel, make sure:
- 🎯 Rocket League is running (only needed for live overlays, not for editing meta).
- 🛜 Octane-Bridge is running on the same machine.
- 🔢 The bridge's HTTP/WS port is reachable at
http://127.0.0.1:49124(the bridge default).
🪧 The bridge port is currently hard-coded in
src/App.tsxasBRIDGE_URL. If you've changed the bridge'sWS_PORTinapp.ini, edit this constant to match. 🔧
┌───────────────┐ GET /meta ┌──────────────┐ /meta WS ┌──────────────┐
│ Octane-Admin │ ──────────────▶ │ Octane-Bridge│ ────────────▶ │ Overlays 🎬 │
│ (this app) │ ◀────── JSON ── │ meta.json │ │ (Octane-React│
│ │ POST /meta │ on disk 💾 │ │ consumers) │
└───────────────┘ ──────────────▶ └──────────────┘ └──────────────┘
- On load, the admin does a single
GET /metato pull the current state from the bridge. - Every edit triggers a debounced
POST /metawith the full meta document. - The bridge persists to
meta.jsonand broadcasts the new meta over WebSocket so every overlay updates instantly viauseOctaneMeta. - If the bridge stops responding, the admin flips to
not connectedand silently retriesGET /metaevery 3s. As soon as the bridge is back, the local edits are pushed up. 🔁
The shape on the wire (and in meta.json) is:
type Meta = {
bestOf: number // 1 | 3 | 5 | 7 | 9
blue: { name: string; logo: string; wins: number }
orange: { name: string; logo: string; wins: number }
}logois a data URL (e.g.data:image/png;base64,...). Files over 500 KB are rejected client-side to keep the WS payload sane.winsis clamped toceil(bestOf / 2)wheneverbestOfshrinks.- The whole document is sent on every change — there are no partial updates. 🪶
| Control 🎟️ | What it does |
|---|---|
| 🏆 Series length | Pick Best of 1 / 3 / 5 / 7 / 9. Caps both teams' wins automatically. |
| 🏷️ Name | Free-form text per team; shown in the overlay scoreboard. |
| 🖼️ Logo | File picker; the image is read as a data URL and embedded in meta. |
| 🧹 Clear logo | Drops the data URL back to an empty string. |
| ➕➖ Series wins | Stepper buttons, disabled at the min/max for the chosen series length. |
| 🔌 Status badge | Live connection state to the bridge. |
- 🔴
not connected — is the Bridge running?→ start the bridge. The admin will reconnect on its own. - 🟡 Edits don't show up in the overlay → make sure your overlay is using
useOctaneMetaand pointed at the same bridge port. - 🟠 Logo too large → the file picker rejects anything over 500 KB. Run it through an optimiser first.
- 🔵 Wrong port → edit
BRIDGE_URLinsrc/App.tsxto match your bridge'sWS_PORT.
PRs welcome! 💚 Please run npm run build before opening one to make sure the app works.
MIT 🆓