Skip to content

applications/luci-app-starlink-panel: add dashboard#8609

Open
bigmalloy wants to merge 1 commit intoopenwrt:masterfrom
bigmalloy:add-starlink-panel
Open

applications/luci-app-starlink-panel: add dashboard#8609
bigmalloy wants to merge 1 commit intoopenwrt:masterfrom
bigmalloy:add-starlink-panel

Conversation

@bigmalloy
Copy link
Copy Markdown

Description

Adds luci-app-starlink-panel, a LuCI dashboard for monitoring a Starlink dish. Provides dish telemetry (state, latency, drop rate, throughput, SNR, obstructions), GPS/alignment/attitude stats, alerts, IPv6 connectivity info, router traffic stats, and a reboot button.

Depends on the starlink-dish package (openwrt/packages#29302) for gRPC communication with the dish at 192.168.100.1:9200.

Changes vs PR #8441

  • Removed external grpcurl install hint from the "dish unavailable" message (per @geldot)
  • CSS is now theme-agnostic: inherits from the active LuCI theme; uses @media (prefers-color-scheme:dark) for dark overrides instead of forcing dark background
  • PKG_MAINTAINER: full name + email
  • Added SPDX-License-Identifier: MIT to Makefile
  • rpcd backend: VLAN-aware LAN IPv6 detection, PID-scoped ping temp files, removed unused disable_hw_offloading handler

Signed-off-by: Michael Eiberg berghotspot@gmail.com

function fmtBytes(b) {
b = parseInt(b) || 0;
if (b === 0) return '0 B';
var units = ['B', 'KB', 'MB', 'GB', 'TB'];
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you should use const/let instead.

Comment on lines +98 to +140
var CSS = '<style>' +
':root{--sl-border:rgba(0,0,0,0.15);--sl-subtle:rgba(0,0,0,0.05);--sl-muted:#555;--sl-accent:#0550ae;--sl-green:#1a7f37;--sl-yellow:#9a6700;--sl-red:#cf222e}' +
'@media (prefers-color-scheme:dark){:root{--sl-border:rgba(255,255,255,0.12);--sl-subtle:rgba(255,255,255,0.06);--sl-muted:#8b949e;--sl-accent:#58a6ff;--sl-green:#3fb950;--sl-yellow:#d29922;--sl-red:#f85149}}' +
'.sl-wrap{font-family:inherit;padding:20px;min-height:400px}' +
'.sl-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;padding-bottom:16px;border-bottom:1px solid var(--sl-border)}' +
'.sl-title{font-size:1.3em;font-weight:700;color:var(--sl-accent);display:flex;align-items:center;gap:8px}' +
'.sl-meta{font-size:0.8em;color:var(--sl-muted);display:flex;align-items:center;gap:10px}' +
'.sl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}' +
'.sl-card{border:1px solid var(--sl-border);border-radius:8px;overflow:hidden}' +
'.sl-card-full{grid-column:1/-1}' +
'.sl-card-hd{display:flex;align-items:center;gap:8px;padding:10px 14px;border-bottom:1px solid var(--sl-border);font-size:0.88em;font-weight:600;color:var(--sl-muted);text-transform:uppercase;letter-spacing:.06em}' +
'.sl-card-icon{font-size:1.1em}' +
'.sl-card-bd{padding:12px 14px}' +
'.sl-row{display:flex;justify-content:space-between;align-items:center;padding:5px 0;border-bottom:1px solid var(--sl-border);font-size:0.88em;gap:8px}' +
'.sl-row:last-child{border-bottom:none}' +
'.sl-lbl{color:var(--sl-muted);white-space:nowrap}' +
'.sl-val{font-weight:500;text-align:right;word-break:break-all}' +
'.sl-big-row{display:flex;justify-content:space-around;padding:10px 0}' +
'.sl-big-item{text-align:center}' +
'.sl-big-num{font-size:1.5em;font-weight:700}' +
'.sl-big-lbl{font-size:0.75em;color:var(--sl-muted);margin-top:2px}' +
'.sl-qdisc{font-family:monospace;font-size:0.78em;color:var(--sl-muted);padding:8px;background:var(--sl-subtle);border-radius:4px;margin-top:10px;word-break:break-all}' +
'.sl-na{color:var(--sl-muted);font-size:0.85em;font-style:italic;text-align:center;padding:12px 0}' +
'.sl-note{background:var(--sl-subtle);border:1px solid var(--sl-border);border-left:3px solid var(--sl-accent);border-radius:0 4px 4px 0;padding:10px 12px;font-size:0.82em;color:var(--sl-muted);margin-top:8px}' +
'.sl-note code{background:var(--sl-subtle);padding:1px 5px;border-radius:3px;font-family:monospace;color:var(--sl-accent)}' +
'.sl-alert-row{margin-top:4px;font-size:0.85em;color:var(--sl-yellow)}' +
'.sl-align-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:4px 0}' +
'.sl-align-item{text-align:center;background:var(--sl-subtle);border:1px solid var(--sl-border);border-radius:6px;padding:12px 8px}' +
'.sl-align-val{font-size:1.4em;font-weight:700;letter-spacing:-0.01em}' +
'.sl-align-lbl{font-size:0.78em;color:var(--sl-muted);margin-top:4px}' +
'.sl-align-ok{font-size:1.1em;font-weight:600;color:var(--sl-green);text-align:center;padding:8px}' +
'.sl-reboot-btn{width:100%;margin-top:12px;padding:8px 0;background:var(--sl-subtle);border:1px solid #f0883e;color:#f0883e;border-radius:6px;font-size:0.88em;font-weight:600;cursor:pointer;letter-spacing:.03em}' +
'.sl-reboot-btn:hover{background:rgba(240,136,62,0.15);border-color:#f0883e}' +
'.sl-reboot-btn:disabled{opacity:0.4;cursor:not-allowed}' +
'.sl-al-list{display:grid;grid-template-columns:1fr 1fr;gap:0}' +
'.sl-al-item{display:flex;align-items:center;gap:8px;padding:6px 4px;border-bottom:1px solid var(--sl-border);font-size:0.87em}' +
'.sl-al-item:nth-child(odd):last-child{grid-column:1/-1}' +
'.sl-al-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}' +
'.sl-al-ok{background:var(--sl-green)}' +
'.sl-al-err{background:var(--sl-red)}' +
'.sl-al-txt-ok{}' +
'.sl-al-txt-err{color:var(--sl-red);font-weight:600}' +
'</style>';
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not put this into a separate file and make it humanly readable?

@bigmalloy
Copy link
Copy Markdown
Author

Switched module-level declarations to const. Also moved the CSS to a separate status.css file with proper formatting — good call, definitely more maintainable.

@github-actions

This comment has been minimized.

LuCI application that provides a Starlink dish status dashboard.
Queries dish telemetry via starlink-dish (gRPC), displays connection
state, latency, obstruction, alignment, alerts, outages, and IPv6
connectivity. Polls every 10 seconds via two parallel rpcd calls.

Signed-off-by: Mike Eiberg <eiberg.michael@gmail.com>
@bigmalloy bigmalloy force-pushed the add-starlink-panel branch from 32586fd to 753cddc Compare May 9, 2026 11:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants