- Python 77.4%
- CSS 13.1%
- JavaScript 8.6%
- Dockerfile 0.9%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| assets | ||
| integrations/gaggimate | ||
| scripts | ||
| .gitignore | ||
| apps.yml | ||
| compose.yml | ||
| DOMAIN_CHECKS.md | ||
| glance.yml | ||
| home.yml | ||
| news.yml | ||
| README.md | ||
| SERVICE_DISCOVERY.md | ||
| services.yml | ||
| VALIDATION.md | ||
Glance dashboard
Three pages for Glance v0.8.7: Overview, Apps, and News. All configuration, CSS, and JavaScript are versioned here. Verified domain links are primary; local links are available in Apps. GaggiMate live status is queried directly over HTTP; shot history uses a minute export job in the same LXC.
Credentials and deployment
Keep the existing values of ADGUARD_USERNAME, ADGUARD_PASSWORD, IMMICH_URL
(base URL without a trailing slash), and IMMICH_API_KEY only in
/opt/glance_data/.env on the Glance host. The Immich key must have permission
to read server statistics. Never copy that file into this checkout.
Glance does not automatically load dotenv files: Compose injects it with
env_file; an existing service must provide those variables equivalently.
The supplied compose.yml is a deployment reference, not a command to run
alongside the existing instance. Preserve the current host, proxy, port, and
container arrangements. Mount this checkout at /app/config:ro, and its tracked
assets/ at /opt/glance_data/assets:ro. This mount serves the Git version
without overwriting persistent data. Back up the running configuration and
record its Git revision before switching. Validate on the host with its existing
environment, then recreate/restart the existing container if its mounts or
environment changed. Verify all three pages and real statistics. Roll back
to the previous revision and mounts if needed. Do not deploy sample data.
Local preview
Use the downloaded v0.8.7 binary, or supply its path:
python3 scripts/preview.py --binary /tmp/minmos-glance-preview/glance
Requires Python and PyYAML. This creates a temporary configuration, binds only
127.0.0.1:8187, validates with the actual binary, and runs until Ctrl+C.
It redirects AdGuard and Immich statistics to localhost with disposable
placeholder credentials, so those cards show connection errors by default.
Add --demo-stats for explicitly labeled sample statistics.
Public RSS, weather, and service probes use real requests.
No production credentials or live configuration are read or changed.
Apps search matches all words across names, categories and link URLs. Clear or Escape resets it. Glance requires JavaScript to load dashboard content. Mobile uses the same visible navigation and stacks all widgets, so statistics are accessible without column switching.
The six feeds are ORF national, ORF Steiermark, Der Standard, It's FOSS, 9to5Linux, and selfh.st. Overview shows four headlines; News has three consolidated lists with a Show more control.
Configuration reference: https://github.com/glanceapp/glance/blob/v0.8.7/docs/configuration.md
Service releases
Overview includes Latest releases: 23 apps from the directory plus Glance, newest first. Six are visible initially; Show more reveals all 24. Sources refresh every six hours and link to their release notes. GitHub sources use the latest non-prerelease endpoint. No extra credentials are required.
Covered apps: Nextcloud, Immich, Actual, Mealie, Vaultwarden, Tuta, Jellyfin, Jellyseerr/Seerr, Jellystat, Sonarr, Radarr, Bazarr, Prowlarr, SABnzbd, Deluge, AdGuard Home, Grafana, Forgejo, Home Assistant, Valetudo, TasmoAdmin, ESPHome, and Zigbee2MQTT. Tuta tracks its published client releases. Jellyseerr's upstream repository now redirects to seerr-team/seerr; a listed release does not imply it is safe to migrate an older installation automatically. Deluge tracks the LinuxServer latest container tag, which includes image rebuilds. Forgejo uses Codeberg.
Proxmox VE and Proxmox Backup share a separate official announcements feed. That feed includes platform announcements as well as version releases. ChatGPT is a managed web app. Asus/Cudy routers and the two printers need exact model/firmware information before appropriate sources can be selected.
These panels report published releases, not installed-version comparisons, unread indicators, or push notifications. Installed-version integrations remain deferred. GitHub's unauthenticated API limit applies; if a shared IP hits it, a read-only token may be added to /opt/glance_data/.env and referenced via the widget's token field. Never put the token directly in Git.
Online markers and first load
All 39 apps and the Overview Services panel share their link and health-check definitions in services.yml. Descriptions have been removed. Glance performs the actual HTTP checks on the server and caches them for one minute. Browser links remain distinct from check-url where needed.
Nextcloud uses status.php, Jellyfin checks its local /health endpoint, and Immich uses /api/server/ping. Checks allow 10 seconds instead of five. Proxmox links use HTTPS. Private IP-based HTTPS alternatives skip certificate validation; normal domain links validate certificates. Zigbee2MQTT's existing port serves HTTP. Micron keeps its micron.local link but checks 10.0.20.181 because Glance's resolver cannot resolve that mDNS name; keep that address reserved in DHCP.
Green means a successful check, red means unreachable or an HTTP error, grey means still checking. ChatGPT's HTTP 403 bot challenge is amber and labeled "Reachable; access restricted", rather than asserting app health. Hover a status icon for details; screen readers receive the same status. Actual’s public URL returns HTTP 502, so its working local HTTPS URL is used. The saved Deluge address still times out and remains a visible failure.
The initial layout comes from tracked assets/startup.js, generated from the same YAML. It contains app links and pending/loading states only, never API credentials, statistics, or stored status results. Links and search work as soon as this local asset loads while native Glance finishes requests in the background. Native widgets then replace the startup layout; search text and focus survive that replacement. No extra backend or integrations are needed, and no checks run cross-origin in the browser.
After changing any YAML app/layout definitions, regenerate and validate:
python3 scripts/build_assets.py
python3 scripts/build_assets.py --check
Keep the generated startup.js in Git and bump its URL query in glance.yml when changing it, so browsers fetch the matching version.
Overview panels and discovery
Overview has one Services panel containing the 13 unique entries previously split between Favorites and Essential services. Its membership is configured in YAML; it is not ranked or selected from usage. Health markers update through Glance's native checks.
Apps contains 39 unique apps, including six verified services from the Proximo discovery: InfluxDB, Zerobyte, Open WebUI, SearXNG, RTSPtoWeb, and VictoriaLogs. CouchDB and Valentine are excluded as requested. The inventory source and verified URLs are in SERVICE_DISCOVERY.md. Running containers without verified web interfaces remain documented there.
Domain links and local access
Apps shows 18 main links in the usual five categories. Local access is collapsed by default and contains 36 links: local-only apps plus 15 verified alternatives to main links. Search includes those links and opens the section when a local result matches. Clear/Escape restores its previous open/closed state. Query, focus, and manual expansion survive replacement of the instant startup layout. No descriptions or browser-side health requests are added.
New apps are Music Assistant, Masterplan, and Glance. Forgejo, Proxmox, Zerobyte,
Open WebUI, and SearXNG now use their domain links in the main directory.
Proxmox, Zerobyte, and Masterplan remain normal items as requested even though
the public Pangolin route serves a private-resource placeholder. Their status
tooltips explain that a successful check uses local routing; external access
requires the private route. The private-access YAML metadata generates those
hints and is ignored by Glance itself.
Open WebUI and SearXNG return HTTP 401 at their public authentication gate and
have working local interfaces. They appear amber, with backend health explicitly
unverified for that gate. A login response does not prove the backend works.
Ironclaw also returns 401, but Proximo confirms its container is stopped, so it
was not added. Previously removed apps stay excluded, including reachable
CouchDB and Valentine. mbckr.at addresses and network CIDRs were outside this
request. See DOMAIN_CHECKS.md for every screenshot domain and its result.
GaggiMate
Overview queries http://10.0.30.123/api/status directly using Glance's custom-api widget, the same HTTP mechanism used for Immich. It shows machine mode, current temperature and target temperature. No API bridge, Docker container, Python service or extra LXC is required. GaggiMate's local status endpoint needs no API key. Glance makes the request on the server; the browser does not contact the machine.
The five-second cache controls how long fetched data is reused. It does not turn the widget into a live shot graph. If the HTTP request fails, Glance uses its native request-error indicator and may retain its last successful content; such readings are not proof the machine is still online.
A portable widget for sharing is integrations/gaggimate/examples/glance-direct-widget.yml. Change its two gaggimate.local URLs for another machine.
For richer WebSocket telemetry (pressure, profiles, warnings and explicit freshness checks), integrations/gaggimate contains an optional publishable Python API package. It can run as a small systemd service in the existing Glance LXC; a service unit and installation instructions are included. Docker remains an optional packaging format. The optional bridge is not required or used by the default dashboard widget.
To preview the direct widget with live readings:
python3 scripts/preview.py --binary /path/to/glance --gaggimate-url http://10.0.30.123
The preview defaults to an unreachable device unless that flag is supplied. No production configuration has been deployed or changed.
Latest shot graph and calendar counters
The Overview history card adds the latest saved shot's pressure, target pressure, pump flow, temperature and target temperature, plus duration, yield, average temperature and peak pressure. The three counters show shots this calendar month, this calendar week (Monday onward), and today in Europe/Vienna.
History is binary on the machine, so this feature needs a small parser. It runs once per minute inside the existing Glance LXC, writes JSON/SVG assets, and exits. Glance serves the files itself; no extra container or API server is used. The basic live-temperature widget continues to call the machine directly.
After pulling this revision, run this one-time setup inside the Glance LXC from the checkout (Python 3.11 or later):
python3 scripts/install_gaggimate_history.py --device http://10.0.30.123
systemctl restart glance
Run as root, or prefix the installer with sudo. Its default assets directory is /opt/glance_data/assets, matching glance.yml. If the running server uses a different assets path, pass --assets-dir /that/path. The widget expects Glance on localhost:8080; adjust its summary URL if your service listens elsewhere. The checkout must remain at the same path because the timer executes its history module directly. Future pulls update that code without reinstalling Python dependencies. Repeat installation if moving the checkout or changing the device, assets directory or timezone.
The installer first exports history, then enables glance-gaggimate-history.timer. It does not change your Glance service, machine settings, profiles or notes. Use --print-only to inspect the generated units before installation.
systemctl status glance-gaggimate-history.timer
journalctl -u glance-gaggimate-history.service
Updates run every minute and Glance caches the history widget for 30 seconds. Refresh the dashboard to fetch new widget content. If the machine is off, cached history still recalculates the three calendar counters across midnight. The UI labels cached data; if the update job stops, it hides stale counters.
Counts cover completed, non-deleted shots still retained on the machine, including manually stopped shots that the firmware saved as complete. Short purges and utility profiles are normally not recorded by the firmware. Deleted, incomplete, invalid-clock and future-dated entries are excluded. Deleted or automatically pruned history cannot contribute to long-term totals.
Generated history and graphs are not committed. To disable updates:
systemctl disable --now glance-gaggimate-history.timer