# IRL Dashboard A single-screen control panel for IRL streaming that runs **on the router in your backpack** — with **SRTLA modem bonding**. Bond every SIM and Wi-Fi uplink into one resilient stream, control your encoder, watch your bitrate and signal, and build live GPS, weather, API, ticker, and custom overlays — all from one page you pull up on your phone mid-stream. No laptop, no cloud service, keeps working on cellular. Built for the new **GL.iNet Mudi 7 (GL-E5800)** — a quad-core ARM router with the horsepower to bond several 5G modems and run the whole dashboard at once. The dashboard runs on any OpenWRT / GL.iNet router; the bonding sender is a native binary built for the Mudi 7 (aarch64). ## Install IRL Dashboard is currently invite only. Every invited person receives a unique installation link that expires after one successful package download. The invite page provides the private command to run from SSH or the LuCI terminal. To request an invitation, email **invite@streamhelpers.com** with your use case, who referred you, and your level of expertise with streaming technology. This mailbox is only for invitation requests, not for technical support: help comes from the community, in the [wiki](https://streamhelpers.com/wiki/) and the [StreamHelpers Discord](https://streamhelpers.com/support/). Requests without those details, including single-line emails, are deleted. Then open `http://YOUR-ROUTER-IP/streaming/` and finish setup in the browser — the first visit lands on the Settings screen. Every setting is optional; leave one blank and the matching tab hides itself. Allow roughly 25 MB free on `/overlay`. The installer: - installs PHP and downloads the dashboard into `/www/streaming`; - adds a `location /streaming/` block to the router's existing nginx server, plus a `location = /ov` rewrite that serves the combined overlay at `http:///ov` (with an automatic backup + rollback if nginx rejects the change or fails to restart); - on the Mudi 7 (aarch64), installs the SRTLA bonding sender (`srtla_send`), `srtla-bond.sh`, a watchdog cron and enlarged UDP socket buffers; - grants the web user passwordless sudo for a few specific binaries only (`gl_modem`, `ubus`, `dmesg`, `srtla-bond.sh`). Re-run it any time to update; it never overwrites your settings (those live in `/etc/irl-dashboard/settings.json`, outside the web root). ## Modem bonding (SRTLA) The Bonding tab turns every modem, tethered phone and Wi-Fi uplink into **one** stream. It's automatic — plug an uplink in and it joins the bond; lose service and it drops out. When one link stutters, the others carry it. ``` Director Mini (SRT) → router (srtla_send, bonds all uplinks) → internet → srtla_rec → Restreamer → YouTube / Twitch / Kick ``` The bonded stream is reassembled on a machine with a public address — the **receiver** — shipped as a Docker package you run on any always-on box: **https://streamhelpers.com/irl-dashboard/receiver/** Set the Bonding tab's *Receiver host* / *Receiver port* to that box, add the Director Mini as an SRT Caller to the router, and press **Start bonding**. The tab shows every uplink, live throughput, and a timestamped connection log. ## The tabs - **Bonding** — SRTLA modem bonding: auto-bonded uplinks, live throughput, buffer tuning, timestamped log - **Go Live** — a checklist before you start, and **Stop stream**, which ends the stream everywhere in order: Restream.io destinations, Restreamer, OBS, the Director Mini, the Companion phones and the DJI camera. **Past streams** keeps each stream: how long it ran, the data each link used, the bitrate, chat messages and chatters, viewers, Super Chats and members, polls, trivia and distance. The router notices a stream by itself, and saves it half an hour after the video stops if Stop stream is never pressed. Delete one or clear them all - **Director Mini** — scenes, GFX, stream targets, screen brightness, start/stop timer, BRB & Security quick actions - **Restreamer** — publishing controls, live statistics, fallback controls and a browser-compatible monitoring copy. Old/ended footage is hidden rather than replayed as live; **Refresh preview only** rejoins without restarting your camera or publications. Playback comes directly from your server, with a clear explanation if the browser cannot reach it - **Network / Modem** — per-uplink monitor, band locking, rescan, modem reboot, connection logging (optionally uploaded to a collector of your own), USB-power warnings. Connection log, internal modem, WiFi options and repeater health all fold away and remember how you left them - **GPS** — live map and track, plus map / satellite / radar and speed overlays - **Weather & Clock** — styleable overlays (border, background, map layers) for the broadcast - **Theme parks** — off until you enable it. Live wait times, show times and dining from [ThemeParks.wiki](https://www.themeparks.wiki/): browse the destination directory, pick a park, choose what to list and which details each row carries, then show it as a ticker, a scroller, a static list or one at a time. The encoder URL never changes, so you can switch park mid-trip without touching the encoder. It also teaches the timer what you are queueing for, from the GPS fix. Its setup steps and preview fold away like the other dashboard sections and remember their open state - **Overlays** — a true 16:9 visual designer with nested live-API feeds, per-field styling and filtering, scrolling tickers, complete design import/export, on-air dashboard switches, and an optional single encoder URL for every graphic - **DJI** — pair a DJI camera over Bluetooth and send it to an RTMP video destination. The Bluetooth stack and the control tool are both installed for you; if you plug the adapter in later, the tab offers to install the stack on the spot. When no video is arriving from any source, the Go Live screen offers buttons to each enabled video-source tab (DJI, SJCAM, phone, Companion, Director Mini) - **Companion** — the StreamHelpers Companion app for Android: every phone on the router shares its GPS and, optionally, its cellular data. Make one phone the **director** and it takes up to four cameras on RTMP slots `cam1`…`cam4`, lays the overlays on top and sends HEVC over SRT into the bond. Cameras always publish to the router, which relays each slot to whichever phone is director, so changing director does not require re-pointing cameras. Companion 0.9.10 and newer offer capability-checked 720p/1080p/4K at 30/60 fps in HEVC or H.264. Save the format for the next start; current video, bitrate and sharing are not restarted. The default remains 1080p30. The stats show battery Celsius separately from Android's device-wide thermal pressure, without inventing a CPU temperature or treating a thermal warning as proof of encoder throttling. Companion 0.9.11 also keeps an existing preview's selected scene when applying a different output format, and 0.9.12 fixes switching between BRB clips and adds a scene caption you can place, size and colour. The caption lives on the router, so it survives a restart and a spare taking over, and it draws on the BRB card only — never over the live camera - **Trivia** — ask the configured AI provider for short questions about where you are (or anything else), keep the good ones in a bank, and air them on a countdown; chat answers are scored and a question card and leaderboard are available as overlays - **Polls** — ask chat a question with numbered choices, written on the overlay or only spoken; the router counts the numbers viewers type and a Poll overlay shows the bars and the winner. Save polls to run again - **Internet failover** (Router tab) — when the WiFi repeater stays connected but has no internet or shows a sign-in page, the router's own traffic (Restream.io, chat, weather, the phones on the rig WiFi) moves to cellular, and back once the WiFi has worked for 30 s. WiFi or cellular first, a Test button, and a list of recent switches. The bonded video is never touched; it already uses every link at once - **Chat** — your YouTube live chat, read and sent from the router. A background collector keeps it complete while the page is closed and catches up by itself after a connection drop, so no messages are lost. Renames the live stream too. Premium Chat can instead connect supported platform accounts through StreamHelpers with subscription-managed, hosted credentials; it is rendered natively in the dashboard rather than embedded from another site. The Director Mini picture can sit behind the chat and go full screen, with a live/bitrate/reachable strip, so one phone shows the shot, the chat and the connection at once - **Links** — your platform dashboards, one tap each Dashboard sections share keyboard focus, spacing and responsive controls. Every tab opens with its panels folded, so the titles and the status in them are the menu; a panel you open stays open on that device. Hidden tabs pause display-only status polling and refresh on return; switching tabs does not cancel a save/upload or stop your stream, OBS connection or chat collection. The small Restreamer preview is released when it is not being watched. **Native 4K through Restreamer.** The receiver can retain native UHD resolution and frame rate using video copy, without a shared UHD software encode. Compatible H.264 publications also copy natively. Destination-specific conversion remains an operator choice, and saved custom outputs are not rewritten. Above-Full-HD server previews require a separate opt-in because even a small preview decodes the whole source; the device preview is separate. The optional server holding clip remains HD/30 fps. See the [wiki](https://streamhelpers.com/wiki/receiver/start) for the limits. ## Security - Downloads are invite only. Invitation tokens are kept in the private invite store so administrators can retrieve commands, while SHA-256 hashes are used for lookup. Direct artifact access is blocked, and the invitation is atomically consumed after one completed package response. - **Set a login** under *Access* in Settings. Without one, anyone who can reach the dashboard has full control — including rebooting your modem and restarting your bond. The password is stored hashed; the settings form is CSRF-protected. - Keep it on your LAN / VPN. **Do not port-forward it.** - `settings.json` holds API keys in plain text on the router, kept outside the web root at mode `600`. - Overlay pages are intentionally unauthenticated so the encoder can load them as browser sources. ## Invite administration On the web server, copy `invite-config.example.php` to `invite-config.php`, set its plain-text administrator password, and keep its data directory, package, and installer paths outside the web root. Visit `/irl-dashboard/invites.php` to add an invited person, record their use case, referrer, and experience, and generate their one-time install command and invitation URL. The same page can retrieve a command, revoke, reactivate, archive, or permanently delete an invitation. Reactivation always rotates the token. Successful package downloads are counted per invitation and in a lifetime total that is not reduced when records are deleted. ## Files - `install.sh` — supplied through a private invitation - [`install.txt`](install.txt) — plain-text quick guide - `irl-dashboard.tar.gz` — protected one-time dashboard package - [`bin/`](bin/) — the aarch64 binaries: bonding (`srtla_send`, `daemonize`, `srtla-bond.sh`), `djictl` for the DJI camera, `mediamtx` for camera ingest and `irl-rtmp-relay` / `irl-cam-relay.sh` for the Companion camera relay - [`receiver/`](receiver/) — the SRTLA receiver Docker package - [`docs/RELEASE-HISTORY.md`](docs/RELEASE-HISTORY.md) — the release history The guides — updating, overlays, Premium Chat, security, recovery, the receiver and the Companion — are in the community wiki, . Questions, bug reports and feature requests: . --- Provided free and **as-is**, with no warranty and no personal support; the community helps at . The source code is not shared — not open source, not on request, and not up for debate ([why](https://streamhelpers.com/wiki/community/source-code)). See the [disclaimer](https://streamhelpers.com/legal.html). The bonding is SRTLA by the [BELABOX project](https://github.com/BELABOX/srtla) — thank you. `srtla_send` / `srtla_rec` are built from it unmodified, under the AGPL-3.0, and the package carries its licence and the exact source in [`pkg/streaming/licenses/`](pkg/streaming/licenses/). `djictl` is from [xaionaro-go/djictl](https://github.com/xaionaro-go/djictl) (CC0). Every bundled program and library, with its authors and licence, is in [THIRD-PARTY-NOTICES.txt](pkg/streaming/licenses/THIRD-PARTY-NOTICES.txt) — on the router, Settings → Credits & licences. Theme park data is supplied by [ThemeParks.wiki](https://www.themeparks.wiki/about), a free community-run API — please keep the on-screen credit, or mention them on stream. Another fine product of [Blue Soup Enterprises](https://bluesoup.biz/).