{"id":50756235,"url":"https://github.com/visorcraft/linsight","last_synced_at":"2026-06-28T05:01:19.186Z","repository":{"id":361217401,"uuid":"1249371598","full_name":"visorcraft/LinSight","owner":"visorcraft","description":"The modern Linux dashboard for multi-GPU systems and beyond. Monitor CPUs, NVIDIA, AMD, and Intel GPUs, memory, disks, and sensors with live charts, expression-based alerts, an extensible plugin system, and an mTLS remote tunnel, all powered by Rust, Qt 6, and Kirigami.","archived":false,"fork":false,"pushed_at":"2026-06-20T20:28:51.000Z","size":4063,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-20T22:13:00.098Z","etag":null,"topics":["amd","dashboard","gpu-monitoring","hardware-monitoring","intel","kde","kirigami","linux","monitoring","nvidia","plugin-system","prometheus","qt6","rust","sensors","system-monitor","system-monitoring"],"latest_commit_sha":null,"homepage":"https://www.visorcraft.com","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/visorcraft.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-25T16:19:47.000Z","updated_at":"2026-06-20T20:28:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/visorcraft/LinSight","commit_stats":null,"previous_names":["visorcraft/linsight"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/visorcraft/LinSight","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/visorcraft%2FLinSight","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/visorcraft%2FLinSight/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/visorcraft%2FLinSight/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/visorcraft%2FLinSight/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/visorcraft","download_url":"https://codeload.github.com/visorcraft/LinSight/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/visorcraft%2FLinSight/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34877471,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amd","dashboard","gpu-monitoring","hardware-monitoring","intel","kde","kirigami","linux","monitoring","nvidia","plugin-system","prometheus","qt6","rust","sensors","system-monitor","system-monitoring"],"created_at":"2026-06-11T05:03:33.222Z","updated_at":"2026-06-28T05:01:19.180Z","avatar_url":"https://github.com/visorcraft.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- SPDX-FileCopyrightText: 2026 VisorCraft LLC --\u003e\n\u003c!-- SPDX-License-Identifier: GPL-3.0-only --\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/LinSight.svg\" alt=\"LinSight logo\" width=\"200\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eLinSight\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eThe fast, modular Linux system-monitoring dashboard.\u003c/b\u003e\n  \u003cbr /\u003e\n  Watch CPU, memory, multi-GPU, storage, network, and sensors — live, in one place.\n  \u003cbr /\u003e\n  Rust core · Qt 6 / Kirigami UI · CLI + GUI · runtime \u003ccode\u003e.so\u003c/code\u003e plugins · mTLS remote · no telemetry · GPL-3.0-only.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/visorcraft/LinSight/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/visorcraft/LinSight?sort=semver\" alt=\"Latest release\" /\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-GPL--3.0--only-blue.svg\" alt=\"License: GPL-3.0-only\" /\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/built%20with-Rust-000000?logo=rust\u0026amp;logoColor=white\" alt=\"Built with Rust\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Qt%206-Kirigami-41cd52?logo=qt\u0026amp;logoColor=white\" alt=\"Qt 6 / Kirigami\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/platform-Linux-333333?logo=linux\u0026amp;logoColor=white\" alt=\"Platform: Linux\" /\u003e\n\u003c/p\u003e\n\n---\n\n## Screenshots\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"packaging/screenshots/overview.png\" alt=\"LinSight Overview page — live CPU, memory, temperature, and frequency tiles with sparklines\" width=\"820\" /\u003e\n  \u003cbr /\u003e\n  \u003cem\u003eOverview: live CPU, memory, temperature, and frequency at a glance.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\" valign=\"top\"\u003e\n      \u003cimg src=\"packaging/screenshots/gpus.png\" alt=\"LinSight GPUs page showing dual NVIDIA GPUs and an integrated GPU\" /\u003e\n      \u003cbr /\u003e\n      \u003cem\u003eMulti-GPU: NVIDIA, AMD, and Intel (xe + i915) side by side.\u003c/em\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"50%\" valign=\"top\"\u003e\n      \u003cimg src=\"packaging/screenshots/network.png\" alt=\"LinSight Network page showing per-interface link speed, state, and byte counters\" /\u003e\n      \u003cbr /\u003e\n      \u003cem\u003eNetwork: per-interface link speed, state, and throughput.\u003c/em\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"50%\" valign=\"top\"\u003e\n      \u003cimg src=\"packaging/screenshots/hardware.png\" alt=\"LinSight Hardware page with per-device nickname editor\" /\u003e\n      \u003cbr /\u003e\n      \u003cem\u003eHardware: every device, with editable per-device nicknames.\u003c/em\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"50%\" valign=\"top\"\u003e\n      \u003cp\u003e\u003cem\u003eScreenshots are captured by \u003ccode\u003e./scripts/dev_screenshot.sh \u0026lt;page\u0026gt;\u003c/code\u003e, which drives LinSight's own \u003ccode\u003eQQuickWindow::grabWindow()\u003c/code\u003e path so the frame is independent of compositor focus.\u003c/em\u003e\u003c/p\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## What is LinSight?\n\nLinSight answers the everyday \"what is my machine doing right now?\"\nquestion. It samples your hardware and kernel and shows it back to you\nlive — as tiles you can rearrange, a scriptable CLI, or a Prometheus feed.\n\nIt is built around three goals:\n\n- **Linux-native and low-overhead.** A pure-Rust daemon with **no async\n  runtime in the hot path** (sync + `polling` only), sampling on demand\n  and serving clients over a postcard-framed Unix socket.\n- **Multi-GPU first.** First-class sensors for NVIDIA (NVML), AMD\n  (amdgpu), and Intel (xe + i915) GPUs — temperature, utilization,\n  memory, power, and processes, per device.\n- **Extensible and scriptable.** Everything the GUI shows is also a\n  `linsight-cli` subcommand, and new metric sources drop in as runtime\n  `.so` plugins (ABI v6) without recompiling the daemon.\n\nWhat it monitors today:\n\n- **GPUs:** NVIDIA, AMD, and Intel (xe + i915), with per-device nicknames.\n- **System:** CPU, memory, NVMe, disk, filesystem, network, hwmon, ZRAM,\n  processes, systemd units, and PSI / load / uptime.\n- **Runtime plugins:** drop a `.so` in to add sensors; the bundled\n  sensors are themselves in-tree plugins. Per-plugin TOML config.\n- **Custom dashboards \u0026 themes:** preset pages (Overview / GPUs /\n  Storage / Network / Hardware) plus a drag-and-drop canvas editor.\n- **Alerts:** `evalexpr` rules with an `exec:\u003cargv\u003e` notifier (no shell\n  injection).\n- **History \u0026 metrics:** optional SQLite history and a Prometheus\n  exporter with a stable `device_key` label.\n- **Remote:** an mTLS bridge (`linsight-tunnel`) for non-SSH topologies.\n\n---\n\n## Try it\n\n**GUI**\n\n```bash\ncargo run -p linsight\n# Kirigami window with a left sidebar:\n#   Workspace → Overview / GPUs / Storage / Network / Hardware / Editor\n#   System    → Settings / About\n# Auto-spawns linsightd as a child if no daemon is running.\n```\n\nKeyboard shortcuts: `Ctrl+1..5` for the workspace pages, `F1` for\nAbout, `StandardKey.Preferences` for Settings.\n\n**CLI**\n\n```bash\njust run-daemon                     # or let the GUI spawn it\njust run-cli list                   # sensor catalogue (52+ entries)\njust run-cli read cpu.util --count 5\njust run-cli read mem.used_bytes --count 3\njust run-cli plugin new my-sensor   # scaffold a third-party plugin\njust run-cli db stats               # row count, sensors, time span, file size\njust run-cli db prune --older-than 7d          # delete rows older than 7 days\njust run-cli db prune --older-than 7d --vacuum # also reclaim file space\n```\n\n**Remote (mTLS, non-SSH topologies)**\n\n```bash\n# On the remote machine running linsightd. Default bind is\n# 127.0.0.1:9443; pass --bind 0.0.0.0:9443 to expose to the network.\nlinsight-tunnel server \\\n  --bind 0.0.0.0:9443 \\\n  --cert server.pem --key server.key --ca clients-ca.pem \\\n  --socket /run/user/1000/linsight.sock\n\n# On your desktop:\nlinsight-tunnel client \\\n  --listen $XDG_RUNTIME_DIR/linsight-remote.sock \\\n  --server remote.host.example:9443 \\\n  --cert client.pem --key client.key --ca server-ca.pem\n```\n\nAny LinSight client then connects to the local socket as usual; bytes\nare piped over mTLS to the remote daemon. See\n[`apps/linsight-tunnel/README.md`](apps/linsight-tunnel/README.md) for a\ntopology diagram, an openssl cert recipe, and the trust-model caveats.\nFor most remote use, an SSH-forwarded socket\n(`ssh -L $XDG_RUNTIME_DIR/linsight.sock:remote-runtime/linsight.sock host`)\nis simpler and equally secure.\n\n**Remote host switching in the GUI**\n\nThe Settings page lets you save remote hosts (`ssh://[user@]host[:port]`)\nand switch between them from the sidebar dropdown. Hosts are persisted in\n`~/.config/linsight/hosts.json`. Selecting a host reconnects the GUI to that\ndaemon; a failed reconnect keeps the previous connection alive and shows an\nerror banner. You can also launch straight to a remote host with\n`linsight --connect ssh://user@host`. Key-based SSH authentication is\nassumed; the trust model is the same as using `ssh -L` manually.\n\n---\n\n## Build\n\nLinSight is a standard Cargo workspace (resolver 3, edition 2024, stable\nRust pinned via `rust-toolchain.toml`). Everything goes through `just`;\ndirect `cargo` invocations are equivalent if `just` isn't installed.\n\n```bash\njust ci              # fmt-check + clippy -D warnings + tests (the CI gate)\njust test-release    # same tests in release mode (catches opt-level bugs)\njust bench           # Criterion benchmarks for protocol/core hot paths\njust build           # debug\njust build-release   # release: lto=fat, codegen-units=1, strip\njust build-release-v3   # x86_64-v3 tuned (CachyOS / modern systems)\n```\n\nGUI smoke (headless, requires `xvfb-run`):\n\n```bash\njust gui-smoke       # builds release GUI and runs under xvfb + llvmpipe\n```\n\nOptional preflight (install with\n`cargo install cargo-deny cargo-audit cargo-about`):\n\n```bash\njust preflight       # ci + deny + audit\njust credits         # cargo about generate → docs/third-party-notices.md\n```\n\n---\n\n## Install\n\nInstall LinSight as a **pacman-tracked package** rather than hand-copying\nbinaries into `/usr/`. For local development, build the working tree and\ninstall it via pacman:\n\n```bash\ncd packaging/arch\nmakepkg -si -p PKGBUILD.local        # build the working tree, install via pacman\n```\n\n| Target            | Command                                              |\n| ----------------- | ---------------------------------------------------- |\n| Arch (local dev)  | `makepkg -si -p packaging/arch/PKGBUILD.local`       |\n| Arch (release)    | `makepkg -si -p packaging/arch/PKGBUILD` (from a tag)|\n\n`PKGBUILD.local` lays down the binaries, desktop entry, metainfo, the\nuser systemd unit, hicolor icons, and `/usr/lib/linsight/plugins`.\nManage it like any package — `pacman -Qi linsight` to inspect,\n`sudo pacman -R linsight` to remove.\n\n---\n\n## Always-on mode (opt-in)\n\n`packaging/systemd/linsight.service` is a systemd **user** unit. Enable\nit once to keep the daemon resident; the GUI / CLI then attach to the\nexisting socket. Always-on mode also gates the optional surfaces —\nhistory (`LINSIGHT_HISTORY`), alerts (`LINSIGHT_ALERTS`), and the\nPrometheus exporter (`LINSIGHT_PROM_BIND`), all off by default. The\nSettings page shows each subsystem's env-var status.\n\nWhen history is enabled, `LINSIGHT_HISTORY_RETENTION` controls how long\nsamples are kept. The format is an integer with a `d`, `h`, or `m` suffix\n(e.g. `30d`, `12h`, `45m`). Unset defaults to `30d`; `0` keeps rows\nforever. An unparseable value logs a warning and falls back to `30d`.\nThe daemon prunes rows older than the window at most once per hour, with\nthe first prune ~5 minutes after startup. The database file does not\nshrink after pruning — freed pages are reused; use\n`linsight-cli db prune --vacuum` for offline space reclamation.\n\n---\n\n## Architecture\n\n- **`apps/linsightd/`** — daemon; hosts plugins, schedules\n  subscription-driven sampling, serves clients over a postcard-framed\n  Unix socket. Optional history (SQLite), alerts (evalexpr), Prometheus\n  exporter.\n- **`apps/linsight-gui/`** — Qt 6 / Kirigami GUI via cxx-qt 0.8. Sidebar\n  shell, preset pages, canvas editor, multi-window. Auto-spawns the\n  daemon if none is listening.\n- **`apps/linsight-tunnel/`** — mTLS bridge for the daemon socket\n  (`server` / `client` subcommands; transparent byte pipe). The only\n  binary that uses tokio — never the daemon hot path.\n- **`crates/linsight-core/`** — shared types and dashboard model (no I/O).\n- **`crates/linsight-protocol/`** — postcard wire format + framing.\n- **`crates/linsight-plugin-sdk/`** — public `LinsightPlugin` trait +\n  `export_plugin!` macro. ABI v6 uses R-mirror types on the FFI boundary\n  for cross-rustc safety; see\n  [`docs/adr/0001-plugin-abi-stabby-deferral.md`](docs/adr/0001-plugin-abi-stabby-deferral.md).\n- **`crates/linsight-sensors/*`** — one in-tree plugin per hardware\n  family / metric source (cpu, mem, net, nvme, nvml, xe, amdgpu, i915,\n  disk, fs, hwmon, proc, system, systemd, zram, smart, sock).\n- **`crates/linsight-cli/`** — `list` / `read` / `plugin {new, install,\n  ls, remove}` / `db {stats, prune}` (offline history-DB inspection and\n  maintenance; works without a running daemon).\n- **`examples/echo-plugin/`** — minimal third-party plugin built as a\n  `cdylib`; exercised by the SDK's `tests/dynamic_load.rs`.\n\nSee [`docs/architecture.md`](docs/architecture.md) for the full process\nmodel and data flow.\n\n---\n\n## Contribute\n\nPatches, bug reports, and design feedback are welcome. The full guide —\nfork → branch → PR flow, coding standards, and commit style — lives in\n[`CONTRIBUTING.md`](CONTRIBUTING.md). Quick rules of thumb:\n\n- Branch from `master`, send a PR.\n- Run `just ci` locally before pushing — it must pass (it's the same\n  gate CI runs).\n- LinSight is GPL-3.0-only; new dependencies must use a license in\n  `deny.toml`'s allowlist.\n\nBugs / feature requests:\n[GitHub issues](https://github.com/visorcraft/linsight/issues).\n\n---\n\n## Documentation\n\n- [Architecture](docs/architecture.md)\n- [Alerts](docs/alerts.md)\n- [Plugin ABI ADR-0001](docs/adr/0001-plugin-abi-stabby-deferral.md)\n- [Remote tunnel](apps/linsight-tunnel/README.md)\n- [Security](docs/SECURITY.md)\n- [Third-party credits](docs/third-party-notices.md)\n\n---\n\n## License\n\nGPL-3.0-only. See [`LICENSE`](LICENSE). Third-party license credits live\nin [`docs/third-party-notices.md`](docs/third-party-notices.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvisorcraft%2Flinsight","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvisorcraft%2Flinsight","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvisorcraft%2Flinsight/lists"}