3.8 KiB
CLAUDE.md — Glances Maintainer Context
Auto-loaded by Claude Code at the start of every session. Glances-specific context. Global principles (role, refactoring strategy, contribution tone, communication, output formats) are in
~/.claude/CLAUDE.md.
Tech stack
| Layer | Technology |
|---|---|
| Backend | Python, psutil, FastAPI (REST API), curses (TUI) |
| Frontend | Vue.js, Bootstrap 5, SCSS |
| Export plugins | InfluxDB, MongoDB, MQTT, DuckDB, and others |
| Infrastructure | GitHub Actions, Helm/Kubernetes, Snap (snapcraft) |
| LLM abstraction | LiteLLM (multi-provider) |
| GPU/NPU monitoring | pynvml, sysfs/debugfs |
Reference docs (use @ to load on demand)
- Commands & setup:
@.claude/docs/commands.md - Architecture:
@.claude/docs/architecture.md
Code principles (Glances-specific)
Exception handling for Snap confinement
Wrap the open() call inside try/except, not just the read(). Snap's strict
confinement blocks host file access at the open stage, not the read stage.
Kubernetes workloads
Use a DaemonSet (one pod per node) for system-level monitoring.
Prefer SYS_PTRACE over privileged: true.
Security (Glances-specific)
Glances runs unauthenticated by default — this is intentional and documented. Most users deploy on private networks for personal use. See global CLAUDE.md for the general OSS security philosophy (4 rules).
Sensitive endpoints
/api/4/configand/api/4/args— never expose credentials in plain text (InfluxDB passwords, MongoDB tokens, MQTT passphrases, SSL key paths, etc.) for unauthenticated access. Use the conditionalas_dict_secure()method, applied whenself.args.passwordisFalse.- CORS:
allow_origins=["*"]+allow_credentials=Trueis invalid per the CORS spec and reflected by Starlette. Default:allow_credentials=False. - DNS rebinding:
TrustedHostMiddlewareviawebui_allowed_hosts(optional). The MCP endpoint is already protected viamcp_allowed_hosts+TransportSecuritySettingsinglances/outputs/glances_mcp.py.
Contribution management (Glances-specific)
Before merging a PR
- The code is actively used (no dead code)
- Existing tests pass
- New behaviour is covered by tests
- New configuration keys are documented
- Breaking changes are identified and documented
- The PR targets the correct branch
- Code should be formated and linted (make lint && make format)
Glances-specific output formats
| Deliverable | Format |
|---|---|
| Changelog entry | .rst file following the NEWS.rst format |
| Helm Chart | .tgz archive or structured directory |
Safe refactoring — applied example
Plugin dependency DAG — keep the hardcoded dict as fallback, add class-attribute discovery, deprecate the dict over two releases.
UI / TUI
Web UI
Stack: Vue.js + Bootstrap 5 + SCSS.
Design principles:
- Strict typographic consistency across all plugins (size, weight, opacity, letter-spacing).
- Pixel-perfect sparkline alignment (CSS grid, fixed row heights).
- Footer = vertical alert list (up to 10 entries), not a single horizontal row.
- No gauges — prefer sparklines with an inline current value.
TUI (curses)
- 256-colour system with automatic fallback for limited terminals.
- Lightweight hierarchical separators for information density.
CI/CD — GitHub Actions
In build_docker.yml, the trigger condition combines branch exclusion and event
type — a dynamic matrix with zero entries causes a silent failure without this
guard:
if: >
github.event_name != 'pull_request' &&
(github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/tags/'))
The master branch does not trigger a Docker build (empty matrix = silent
failure without this condition).