42 KiB
42 KiB
Changelog
All notable changes to RigDoctor are recorded here. Format follows
Keep a Changelog; versioning is SemVer-style
(MAJOR.MINOR.PATCH, pre-1.0). __version__ and pyproject.toml must match the git
release tag (so the auto-updater, D18, can compare versions).
[0.43.0] - 2026-05-29
Added
- GPU stress test + close thermal monitoring (
rigdoctor stress, and a "Stress test…" button on System Health). Runs a GPU load and samples sensors at a high rate (default 0.5 s), then reports per-metric min/avg/peak, how long the core spent above each temperature threshold, power vs the limit, throttling (decoded from the NVML clocks-event bitmask), and any GPU fault (Xid / VA-space freeze / a query-timeout hang) that hit during the window — the on-demand way to reproduce load-correlated crashes. The load comes from an explicit--command(a game or a tool like gpu-burn), an auto-detected loader (gpu-burn/vkmark/glmark2/vkcube), or monitor-only when none is found (you launch the game; it tracks temps while you play). - Drive health & wear in the health report. A new
core/drives.pyparses the fullsmartctl --jsonfor every drive into prioritized findings: the SMART verdict, a derived life-left % (NVMepercentage_usedor the SATA wear-leveling attribute), power-on hours, data written (TBW), temperature, and the early-failure predictors (reallocated / pending / offline-uncorrectable sectors, NVMe media errors, low available spare). Replaces the old pass/fail-only SMART check; flows through the same elevated path (GUI launch /sudo rigdoctor report), degrading to per-drive "needs root" notes unprivileged.
Fixed
- GUI "Add game…" can now link a launcher. The dialog only asked for a name, so a custom game (e.g. SPT) couldn't be given its launch command or log folder from the app — those were CLI-only, leaving it unlaunchable from the GUI. It's now a proper form: name + an optional launch command/script (with a Browse… file picker) + an optional log folder (auto-detected from the script's folder when left blank).
[0.42.0] - 2026-05-29
Added
- Detect hard freezes that log no Xid. The kernel-log scanner caught Xid codes, OOM, panic,
MCE, PCIe AER, thermal events, and amdgpu resets — but a crash that logs no Xid slipped
through. It now flags the NVIDIA open-kernel-module VA-space mapping fault (
gpu_vaspace.c/dmaAllocMappingassertions, NVKMS GEM-allocation failures) — a driver-internal error that can storm for minutes and end in a freeze without the GPU ever "falling off the bus" (distinct from Xid 79). A newcheck_nvidia_module()notes when the open module (nvidia-*-open) is loaded — the context behind these faults — and a newai_knowledgeentry lets the assistant tell the no-Xid freeze apart from the Xid 79 hardware drop. - Add games no launcher reports (e.g. SPT). A user-authored custom-games list
(
core/customgames.py) shows alongside Steam/Lutris/Heroic inrigdoctor gamesand the GUI ("Add game…"), for standalone mod launchers (Single-Player Tarkov), itch.io downloads, or any hand-installed game. Each entry can carry a launch command and a log directory:rigdoctor games add "SPT" --command .../tarkov.sh(a siblinglogs/is auto-detected),rigdoctor games play "SPT"launches it under the crash-capture wrapper (tagged with the real name, not the script's), and the diagnostic now tails the game's own logs — SPT's server/launcher logs — alongside the kernel log so the analysis sees what the game logged before the freeze.
[0.41.0] - 2026-05-25
Added
- Import a crash dump (
.dmp) and explain it with AI. The Games page gains an "Import crash dump…" button (shown once an AI provider is configured) that opens a Windows minidump — the kind a Proton/Wine game writes when it hard-crashes — parses it, and hands the result to the opt-in AI assistant (D24; cloud sends still ask first). A new stdlibcore/minidump.pyreads theMDMPstreams withstruct(no new deps): the exception / crash reason (e.g. access violation0xC0000005), the faulting module (which DLL the crash address lands in —nvwgf2umx.dll,d3d11.dll, an anticheat, the game's own.exe…), OS/CPU, and the loaded-module list. Ifminidump_stackwalk(Breakpad) orminidump-stackwalk(rust-minidump) is on PATH, its fuller report is appended best-effort. The model is told the dump came from a Windows process under Proton, so fixes stay Linux/Proton-side (Proton version, DXVK/VKD3D, driver, launch options) — never Windows admin/registry steps. Newai_knowledgefacts cover the common exception codes and faulting-module signatures. CLI parity:rigdoctor ai dump <file>.
[0.40.0] - 2026-05-22
Added
- RAM speed / XMP-EXPO check. Inventory now shows each module's configured speed and, when it's
below the rated speed, the rating (e.g.
4800 MT/s (rated 5600)); System Health flags it ("RAM at 4800 MT/s (rated 5600 MT/s)") with the fix — enable XMP/EXPO in BIOS. With the profile off, dmidecode only reports the JEDEC base, so the rated speed is read from both dmidecode and the part number (matched against known DDR5 speed grades, so no false positives). Needs dmidecode (root / launch elevation). Completes the "underperforming hardware" trio with PCIe gen + refresh.
[0.39.0] - 2026-05-22
Added
- Displays in the Inventory. A new
core/displays.pylists each connected monitor with its resolution and current/max refresh — e.g.DP-1 · Samsung LC34G55T → 3440x1440 @ 165 Hz. Reads GNOME's MutterDisplayConfigover D-Bus (works on X11 and Wayland), falling back toxrandron other X11 desktops. - System Health flags monitors below their max refresh. If a monitor supports a higher refresh at its current resolution (e.g. a 165 Hz panel set to 60 Hz — an easily-missed gaming setting), Health reports it with the fix (raise it in Display settings). Max is computed at the current resolution, so it never suggests dropping resolution.
[0.38.0] - 2026-05-22
Added
- PCIe link in the Inventory. Each NVMe drive now shows its negotiated PCIe link next to the
model — e.g.
Samsung SSD 980 PRO 1TB (931.5G) · PCIe Gen4 x4— read from sysfs (current/max_link_speed+ width). If a drive negotiates below its capability (a slower M.2 slot, lane-sharing, or a downtrain) it's flagged:PCIe Gen3 x4 (capable of Gen4 x4). So you can confirm a Gen4 SSD is actually in a Gen4 slot. (SATA disks show no PCIe link.) - System Health flags downtrained NVMe links. A new check warns when an NVMe drive negotiates fewer PCIe lanes than it supports (almost always motherboard lane-sharing — a GPU/second card or another M.2 stealing lanes) and notes speed-only reductions as info (a slower slot or idle ASPM). The GPU is deliberately excluded — NVIDIA drops its PCIe gen/width at idle, so a snapshot would false-alarm.
[0.37.1] - 2026-05-22
Fixed
rigdoctor updatenow uses the right method for how RigDoctor was installed. It detects apt (.deb), pip (venv/.run), or source installs (updates.install_kind()); only pip installs self-update in place. An apt install no longer fails with "No module named pip" — it (and the GUI Update button) showssudo apt update && sudo apt install --only-upgrade rigdoctor; a source checkout points togit pull.
[0.37.0] - 2026-05-22
Added
- Version footer — a footer across the bottom of the window shows
RigDoctor v<version>in the bottom-right (moved out of the sidebar).
Fixed
- Pages scroll when content doesn't fit, and the window is no longer pinned to the tallest page's height. Long pages (Settings, Tuning, …) get a scrollbar when too tall — so controls like Uninstall are always reachable — and the window can now be resized smaller than the screen (min height dropped from "taller than the screen" to ~600px). Pages that manage their own scroll/fill (Dashboard, System Health, Inventory, Share) are unchanged.
[0.36.1] - 2026-05-22
Fixed
rigdoctor guiprinted the wrong fix when PySide6 is missing — it suggested the non-existentpython3-pyside6package. Now it names the real split modules (python3-pyside6.qt{widgets,gui,websockets,svg}+python3-pyte).
[0.36.0] - 2026-05-22
Fixed
.debnow installs all dependencies automatically — no manual tool install. The previousRecommends: python3-pyside6named a package that doesn't exist on Debian/Ubuntu (PySide6 is split per module), so apt silently skipped it and the GUI wouldn't start. Now it Recommends the actual modules the GUI imports —python3-pyside6.qt{widgets,gui,websockets,svg}+python3-pyte.
Changed
apt install rigdoctorsets up the whole toolset. The.debalso Recommends the optional diagnostic/gaming tools (smartmontools, lm-sensors, dmidecode, pciutils, libnotify-bin, libsecret-tools, gamemode, mangohud) so they install by default — users never hand-install tools.cpupoweris a Suggests (kernel-tied);--no-install-recommendsstill gives CLI-only.
[0.35.0] - 2026-05-22
Added
.debpackage (M9 / D8) —packaging/make_deb.pybuilds arigdoctor_<version>_all.deb(pure-Python,Architecture: all) viadpkg-deb:Depends: python3, with the GUI deps (python3-pyside6,python3-pyte) as Recommends sosudo apt install ./rigdoctor_*.debgives the full app and--no-install-recommendsgives CLI-only. Installs the package, both launchers, the desktop entry, and the icon. CI (release.yml) builds it as a release asset every release, and optionally publishes it to the Gitea apt registry (set aREGISTRY_TOKENsecret) forsudo apt install rigdoctor. M9 is now complete.
[0.34.0] - 2026-05-22
Added
- Event-based alerts (M8). Beyond temperature + GPU-lost, RigDoctor now notifies on critical kernel events — Xid (GPU error), out-of-memory kills, CPU machine-checks, PCIe AER errors, and disk I/O errors — scanned from the kernel log every ~30s while monitoring and fired one-shot (cooldown-gated, so no spam). A proactive warning the moment something goes wrong, not just on a temperature threshold. Included whenever desktop notifications are on.
[0.33.0] - 2026-05-22
Added
- AI explanations stream live. "Explain with AI" now fills token-by-token as the model
generates (Ollama NDJSON + Claude SSE, both via stdlib
urllib) instead of a multi-second freeze, then re-renders the finished answer as Markdown.core/ai.explain_stream().
[0.32.0] - 2026-05-22
Added
- More for diagnostics & reports:
nvidia-smi -qsnapshot — driver, throttle/clock-event reasons, clocks, power, temps, PCIe link, ECC + retired pages (point-in-time at diagnostic time).- Display-server log — auto-detected:
Xorg.0.logon X11, or the compositor's user-journal slice (gnome-shell/kwin/sway/gamescope) on Wayland. - Full system inventory (M5 hardware/OS) is now included in each stored diagnostic and the
Report bundle — invaluable for larger/shared debugging.
These join the kernel log + coredump records in
syslogs.txt/inventory.*, are saved per diagnostic, included in the Report zip, and (logs) fed to the AI on "Explain".
[0.31.0] - 2026-05-22
Added
- Diagnostics now collect session-scoped system logs (
core/syslogs.py): a kernel-log slice (journalctl -k— Xid, OOM-killer, MCE, PCIe AER, thermal, hung tasks) and crashed-process records (coredumpctl— which executable, signal, and when). They're saved to the diagnostic directory (syslogs.txt), included in the Report bundle, and fed to the AI on "Explain" alongside the game logs. Best-effort — degrades quietly if the tools are missing or access is denied; scoped to the session window so it doesn't drag in old noise.
[0.30.0] - 2026-05-22
Added
- Logging & report bundles (M15, D25) — opt-in via one Settings → Logging toggle
(default off). When on: the app logs to a rotating
app.log, and each diagnostic is stored in its own folder (~/.local/share/rigdoctor/diagnostics/<id>/) with the capture log, a structuredresult.json, a readablereport.txt, a session-scoped game-log snapshot, and anai/record of every AI interaction — the exact data sent, which model, and its reply. - Report — a button on the diagnostic dialog (and
rigdoctor bundle) zips a diagnostic's folder plusapp.loginto~/.local/share/rigdoctor/reports/<id>.zipfor sharing. Everything stays local; the zip only leaves your machine if you share it. Available only when logging is on.
[0.29.0] - 2026-05-22
Added
- AI now resolves Steam app IDs from your library instead of guessing. When app IDs appear
in the logs/findings, RigDoctor looks them up in your scanned games (
steam.appid_names()) and injects an "App IDs (resolved from your installed games)" glossary into the prompt — so the model names games correctly (e.g.2694490 = Path of Exile 2) rather than hallucinating. Only IDs it can resolve locally are listed; no network, no model "training" needed.
[0.28.1] - 2026-05-22
Fixed
- AI explanations were misreading stale/benign logs. Three fixes so the model analyses the
actual session: (1) the prompt now states the real game name, capture duration, and
outcome (clean vs. crash) so the model stops guessing the game from log paths; (2) game logs
are scoped to the session window (Steam-console lines filtered by timestamp; a stale
per-app Proton log from an earlier game is skipped); (3) the reference KB flags common
benign Steam/Proton lines (
libnvidia-ml.so.1assertion, routine minidump uploads, "fork without exec") so they aren't reported as the cause. The system prompt also forbids Windows-only advice (no "run as administrator") and tells the model not to invent a problem when the run was clean.
[0.28.0] - 2026-05-22
Added
- AI explanations now include recent game logs. When you press "Explain with AI" on a
diagnostic, RigDoctor also gathers recent Proton (
~/steam-<appid>.log) and Steam console logs (core/gamelogs.py, tail-read + size-bounded) and passes them to the model, so it can correlate log errors with the sensor findings and pinpoint when something went wrong.
Fixed
- The AI explanation popup now renders Markdown (headings, bold, lists) instead of showing
raw
###/**—QTextEdit.setMarkdown, and the model is told to answer in Markdown.
[0.27.1] - 2026-05-22
Changed
- AI assistant: selecting Ollama now pre-fills the model field with
qwen2.5:7b(a strong 7B that fits an 8 GB GPU; our grounding makes a 7B sufficient). It won't overwrite a model you've already entered, and you can change it freely.
[0.27.0] - 2026-05-22
Added
- AI assistant (M14, D24) — optional, strictly opt-in, never automatic. Explains your
diagnostics in plain language only when you press "Explain with AI" on the diagnostic
dialog (or run
rigdoctor ai explain). You choose a provider explicitly (no default): Ollama (local, private, no key) or Claude (Anthropic; key stored in the keyring, with a consent prompt before any data is sent). Configure in Settings → AI assistant. - Answers are grounded: RigDoctor passes the actual findings plus matched reference facts
from a curated knowledge base (
core/ai_knowledge.py— exact keyword/code match, no embeddings, stdlib only), so even a small local model gets the domain facts it needs. Stdliburllibonly — no new core dependency. Output is advisory (D9). - CLI:
rigdoctor ai status|test|explain.
[0.26.1] - 2026-05-22
Fixed
- Setup wizard contrast. The radio buttons (Recording trigger) were unstyled, so the selected option was invisible on the dark theme — now styled with a clear accent ring + dot. Bundle checkboxes got explicit checked/disabled states, and stay selectable even when a bundle is already installed (the page no longer looks dead when everything's present).
[0.26.0] - 2026-05-22
Added
- Graphical setup wizard (M9). A first-run GUI wizard (
gui/setup_wizard.py) walks through: environment summary → pick dependency bundles (Diagnostics / Monitoring / Gaming / Updates, from the component catalog) → install the missing apt packages → choose the recording trigger → a readiness summary. It shows automatically on first launch (until done), is re-runnable from Settings → Run setup wizard orrigdoctor-gui --setup, andinstall.shlaunches it after a fresh install when a desktop session is present.
[0.25.0] - 2026-05-22
Changed
- Share is now terminal-only (D23, amends D16). The Share page is a single shared-terminal experience: the host shares their shell, the guest watches and may type only if the host ticks "Allow the guest to type" (otherwise read-only). The terminal is larger and either side can pop it full-screen (Esc to exit).
Removed
- The read-only stats view (live sensors/health/inventory over the relay) and the
rigdoctor share serveHTTP server — the shared terminal replaces them. (core/share.pyremoved; theshareCLI command is gone.)
[0.24.0] - 2026-05-22
Added
- Shared terminal is now in color. The terminal view renders pyte's per-cell foreground/
background, bold, and reverse, so the host's real shell keeps its theming — fish,
ls,git, prompts, etc. look the same as locally (the session already runs the host's$SHELLwith its config andTERM=xterm-256color; only the rendering was monochrome).
[0.23.0] - 2026-05-22
Added
- Crash-logger trigger modes (M9 / D6) via
systemd --user, no root: manual, always-on (a background service records continuously), and game-launch (auto-records while a Steam game runs). Set it from Settings → Recording trigger orrigdoctor service mode <manual|always-on|game-launch>;rigdoctor service statusshows it.core/service.pywrites/enables the user units. - Zero-config game-launch watcher (
core/watcher.py,rigdoctor watch) — polls Steam's RunningAppID and brackets a focused capture around the running game (the D12 fallback for users who don't add thewraplaunch option; the wrapper stays the precise primary path).
[0.22.0] - 2026-05-22
Added
- M6 breadth. Environment checks now also report GPU PowerMizer mode (NVIDIA, X — flags Adaptive/Auto and suggests Prefer-Max-Performance), the Wine version, and the Steam client version.
- Non-Steam launchers. Lutris (its SQLite library) and Heroic (Epic + GOG JSON stores) are
detected (
core/launchers.py) and listed on the Games page andrigdoctor games, tagged by launcher. You can Run Diagnostic on them too (records while you play; auto-launch stays Steam-only).
Notes
- The zero-config game watcher (D12 fallback) is deferred to the M9 trigger-mode work, where the service integration lives.
[0.21.0] - 2026-05-22
Added
- Live monitor TUI (M2).
rigdoctor monitoris now a proper curses dashboard: current / session-min / session-max per sensor, grouped by subsystem, with temperature and utilization color bands (and GPU-lost flagged red).qquits,rresets the session min/max. Falls back to a plain full-screen redraw on a non-TTY (--plainforces it). The terminal face of the same live data the GUI dashboard graphs. Completes the Monitoring bundle.
[0.20.0] - 2026-05-22
Changed
- Reorganized navigation into grouped sidebar sections — Monitor (Dashboard) · Diagnose (Games, Recordings, System Health, Tuning) · System (Inventory) · App (Settings, Share) — so it's clear where to go.
- Renames for clarity: Health → System Health (it's the overall 7-day system scan, not per-game), Environment → Tuning (gaming tunables + fixes), Logs → Recordings, Setup → Settings.
- Settings absorbed Notifications (alerts) — app configuration (components/deps, alerts, account access, uninstall) now lives in one page; Notifications is no longer a separate item.
- Recordings is now a hub: pick which captured log to view (always-on capture, last diagnostic, or a preserved crash), Analyze crash in place, alongside the recorder controls.
[0.19.0] - 2026-05-22
Added
- System-tray applet (M11, D13). A tray icon whose menu shows live CPU / GPU temp and
memory used/total, a status line (Normal / Hot / GPU not responding), and is led by a
Run Diagnostic submenu (pick a detected game → the guided session), plus Open dashboard,
Start/Stop recording, Snapshot (copy), and Quit. It reuses the dashboard's sample
stream (no extra sampling). With a tray present, closing the window hides to the tray (Quit
exits);
rigdoctor-gui --traystarts hidden for autostart. Needs a tray host — on GNOME the AppIndicator extension; degrades to a no-op if none is available. Completes the Desktop UI bundle. - GUI smoke tests: construct
MainWindowheadless and exercise the tray, so a startup crash fails the build (closes the gap that let the 0.18.0 import regression ship).
[0.18.2] - 2026-05-22
Fixed
- GUI wouldn't start (0.18.0 regression): the recording indicator used a wrong relative
import (
from .core→rigdoctor.gui.core, which doesn't exist), crashingMainWindowon launch. Corrected tofrom ..core.
[0.18.1] - 2026-05-22
Changed
- Recording badge: dropped the sample count (not useful at a glance) — it now shows just ● Recording + the game, plus a ⚠ GPU-lost line if one is detected.
[0.18.0] - 2026-05-22
Added
- Global recording indicator. While a capture is running, the sidebar shows a red
● Recording badge on every page — with the game being captured and the live sample
count (and a GPU-lost flag if seen). It polls the recorder, so it reflects captures started
any way: manual
record, a guided diagnostic, or the Steam launch wrapper.
[0.17.0] - 2026-05-22
Added
- Inventory page is back in the GUI (it was removed in 0.7.2 in favor of the CLI). Sidebar
Inventory → System / CPU / Firmware / Memory / GPU / Storage / Display as cards, with
Copy Markdown and Save… for pasting into forum/bug reports, and Refresh. Root-only
details (motherboard/BIOS/RAM modules via dmidecode) fill in after the launch password prompt.
Backed by the existing M5
core/inventory.py— the CLIrigdoctor inventoryis unchanged.
[0.16.0] - 2026-05-22
Added
- Automatic crash-capture via a Steam launch wrapper (M6/D12). Set
rigdoctor wrap %command%as a game's Steam launch option (or in Lutris/Heroic's wrapper field) and RigDoctor starts a focused, game-tagged capture when the game launches and stops it cleanly on exit — no manual Run Diagnostic / Finish. A hard freeze leaves the capture unterminated, so it's flagged as a crash next launch. The wrapper resolves the game name from Steam'sSteamAppId, doesn't disturb an existing capture, and returns the game's exit code. (core/wrap.py,rigdoctor wrap.) - GUI Auto-capture… helper on the Games page: shows the exact launch-option line (absolute path, copy button) and how to set it in Steam.
- Auto-capture preserves an unanalyzed crash (
diagnostic-crash.jsonl) before starting a new capture, so relaunching the game can't wipe a crash report you haven't seen yet.
Fixed
docs/MODULES.mdstatus column was stale — M1, M3, M4, M5, M8, M10, and M13 are done and now marked ✅ (only M2 and M11 remain not-started; M6/M9/M12 in progress).
[0.15.0] - 2026-05-22
Added
- Hard-crash detection & recovery for the guided diagnostic. If a focused capture ends
without a clean stop (the recorder never wrote
session-stopand isn't running), RigDoctor treats it as a likely hard freeze. On launch the Games page shows a warning banner — "Your last diagnostic for ended unexpectedly…" — with Analyze crash / Dismiss. - Deeper crash analysis. Analyze crash combines the captured window (final readings before
the freeze + any GPU-lost event) with a focused scan of the previous (crashed) boot's kernel
log (
journalctl -k -b -1: Xid/panic/OOM/MCE/AER/thermal) plus SMART/driver/persistence/ live-temp checks — the full "what happened" picture.core/diagnostic.pygainspending_crash()/analyze_crash();health.check_previous_boot()+run_health_checks(include_journal=False)back it.
[0.14.0] - 2026-05-22
Changed
- Dashboard headline tiles are now history trend graphs instead of single-value gauges —
GPU temp, GPU load, CPU temp, and memory each plot their recent history (with the current
value, window min/max, and a dashed warning-threshold line), so you can see changes over time
rather than only the instantaneous reading. New
HistoryGraphwidget (QPainter, no new deps).
[0.13.0] - 2026-05-22
Added
- Run Diagnostic now explains itself and can launch the game. Clicking Run Diagnostic shows what to do — play the game, reproduce the crash, then Finish & analyze (and that data survives a hard freeze + reboot) — and offers Launch game & start (asks Steam to run it by appid) or Start without launching. The recording banner now spells out the next step instead of just showing a sample count.
Fixed
- Button labels containing "&" (e.g. "Finish & analyze") rendered as "Finish _analyze" because Qt treated the "&" as a keyboard mnemonic — now escaped so the ampersand shows literally.
[0.12.0] - 2026-05-22
Added
- Guided diagnostic in the GUI. Each game on the Games page now has a Run Diagnostic
button → a focused, game-tagged capture starts and a recording banner appears (live sample
count, GPU-lost indicator) with Finish & analyze / Discard. Finishing opens a results
dialog: the window-scoped capture summary (peak temps/power, events, last samples) plus the
health findings as cards. The banner persists/restores if you navigate away and back while a
capture is running. Shares
core/diagnostic.pywith the CLI (one flow, three front-ends).
[0.11.0] - 2026-05-22
Added
- Guided diagnostic session (CLI) — the seed use case, end to end.
rigdoctor diagnose start --game "<name>"runs a focused crash-capture tagged with that game (its own diagnostic log, so the report is scoped to just that session),diagnose statusshows progress, anddiagnose finishstops it and prints a combined report: the capture summary (peak temps/power, GPU-lost events, last samples — M3) plus the health findings (Xid/SMART/driver/etc. — M4). The game can be given by--gameor--appid(resolved from the Steam scan), and is recorded as a log event so it survives a crash + reboot. - Shared orchestration lives in
core/diagnostic.py(one callable for CLI/GUI/tray, per ARCHITECTURE §7.1); the recorder/record rungained an optional--gametag.
[0.10.2] - 2026-05-22
Changed
- When an Environment Apply/Install fails, the status now shows the real reason (cancelled at the password prompt vs. the system rejecting the change, e.g. a BIOS/kernel- locked PCIe ASPM policy) instead of a vague "cancelled, or needs privileges".
[0.10.1] - 2026-05-22
Fixed
- Environment-page contrast. The combo-box drop-down list was rendering light-on-light (the popup view is a separate widget the theme didn't cover) — now dark with readable text.
- The Install / Apply buttons on findings were hard to read (the accent fill didn't paint reliably inside the finding cards, leaving dim dark-on-dark text). They're now an outlined style — bright accent text on the dark card, filling accent on hover — readable regardless, and given a minimum height so the row can't crush them.
[0.10.0] - 2026-05-22
Added
- Actionable Environment page (M6) — install & apply, not just advice. Findings that
recommend a tool or a setting are now one-click:
- Install buttons for GameMode, MangoHud, and cpupower (added to the M9 component catalog, so they also appear on the Setup page with the existing installer).
- Apply controls for runtime-reversible tunables — a dropdown of the live options + Apply,
via a single pkexec prompt, no reboot: CPU governor, NVIDIA persistence mode,
PCIe ASPM policy, vm.swappiness, Transparent HugePages (
core/fixes.py). The chosen value is validated against the live options before anything runs. - This is the consent-gated apply milestone D9 anticipated, scoped to safe settings (D22).
GRUB-based fixes and CPU mitigations stay suggestion-only;
rigdoctor gameenvstill prints the exact commands for headless use.
Changed
- The
Findingmodel gained optionalaction(installable component) andfix(applyable tunable) fields; the sharedfinding_cardwidget renders the matching control.
[0.9.0] - 2026-05-22
Added
- Gaming environment checks (M6) — the evaluate-and-suggest engine. A new read-only report
(D9) that flags system settings which hurt gaming stability/performance and gives the exact fix
command. Checks: PCIe ASPM, NVIDIA persistence mode, CPU governor (the three that
map to the seed-case GPU bus-drop / Xid 79), GameMode, MangoHud,
vm.swappiness, shader disk cache, Transparent HugePages, CPU mitigations, and installed Proton versions.- CLI:
rigdoctor gameenv(text or--json). - GUI: a new Environment page (findings cards, auto-runs on open), reusing the M4
health-report card style via a shared
finding_cardwidget.
- CLI:
Fixed
- Notification icon now uses the RigDoctor icon (matching the app/dock) instead of a generic stock icon — resolved from the installed icon theme, the bundled asset, then a stock fallback.
[0.8.0] - 2026-05-22
Added
- Gaming environment checks (M6) — Steam game detection. RigDoctor now finds your Steam
libraries (across multiple drives, via
libraryfolders.vdf) and the games installed in each (parsingappmanifest_*.acf— stdlib only, no Steam tooling needed). Runtimes, Proton builds, and redistributables are filtered out.- Opt-in libraries: detected libraries are listed with a per-library game count; you check the ones to scan. Nothing is scanned until you pick a library.
- Background scan on every launch: the GUI rescans the selected libraries in the background
when it opens and flags games installed since the last scan with a NEW badge plus a count
on the Games sidebar item (cleared when you view the page). Results are cached
(
~/.local/state/rigdoctor/games.json) so the list shows instantly. - CLI:
rigdoctor gameslists detected games;rigdoctor games libraries [--enable PATH | --disable PATH | --all]lists/selects libraries (headless-complete, D17).
- Config now supports list values (TOML arrays);
steam_librariesrecords the selected libraries.
[0.7.3] - 2026-05-21
Fixed
- Shared terminal now has scrollback — large output (e.g.
ls -la) can be scrolled up to read; it keeps a history buffer and only auto-scrolls to the bottom when you're already there.
[0.7.2] - 2026-05-21
Changed
- Removed the GUI Inventory tab — use the CLI
rigdoctor inventoryinstead. (Inventory is still collected for the relay guest view, so a remote helper still sees the host's hardware.)
Fixed
- Shared terminal caret now sits at the real cursor position (row and column) instead of the start of the line.
[0.7.1] - 2026-05-21
Fixed
- Shared terminal: a guest who joined after the host enabled the terminal stayed read-only. The host now re-sends the terminal state when a guest joins, so the terminal is available.
- Inventory page no longer jumps back to the top when it refreshes (e.g. when elevated data arrives) — scroll position is preserved and unchanged data isn't re-rendered.
- Shared terminal now follows the cursor to the bottom as output arrives (e.g.
ls -la), instead of staying scrolled up.
[0.7.0] - 2026-05-21
Added
- Shared terminal (M12, Tier 3): when the host enables it, the session shares a real PTY
shell — the guest gets an interactive terminal (vim, top, tab-completion, Ctrl-C) running on
the host as the host's user. The host reads along live and can type too, e.g. a
sudopassword — which stays local and is never sent to the guest. Off by default, host-consented. The guest also pulls the host's inventory on join.
Fixed
- Input contrast: all form controls (text fields, spin boxes, combo boxes, terminals) now use the dark theme with readable text (Fusion defaulted them to light-on-light).
[0.6.0] - 2026-05-21
Added
- Session sharing over the relay (M12): a Share tab — Start shared session (host)
hands you a short code and streams a read-only live view; Enter share code (guest) joins
someone else's session and views their sensors/health/inventory. Both connect outbound over
WebSocket to the relay (
relay_url, defaultwss://rigdoctor.jesseyvanofferen.com), gated by your Gitea access token — no port forwarding. Read-only.
[0.5.0] - 2026-05-21
Added
- Session sharing (M12, Tier 2):
rigdoctor share servestarts a read-only live view (sensors auto-refresh + health report + inventory) over a local HTTP server, gated by a random share token. Bind to localhost for local testing, or to all interfaces behind a user-chosen tunnel (Tailscale/cloudflared/SSH) for remote help. No actions, no terminal. (Tier 1 export and Tier 3 gated terminal still to come — D16.)
[0.4.1] - 2026-05-21
Fixed
- Checkbox contrast: a checked checkbox is now a clear accent-filled box with a checkmark (was hard to tell checked from unchecked on the dark theme).
[0.4.0] - 2026-05-21
Added
- Alerts (M8): desktop notifications (via
notify-send) for overheat (GPU/CPU past a threshold), GPU-lost (nvidia-smi timeout), and a new version available (fired once per version). Edge-triggered with a cooldown so it doesn't spam. Degrades gracefully ifnotify-sendisn't installed. - Notifications page: configure alerts (enable/disable, GPU/CPU temperature thresholds)
with a "Send test" button; changes apply live and persist to
config.toml. - App icon: ships a RigDoctor icon and shows it in the dock/launcher. The GUI
self-registers the icon +
.desktopon launch (and sets the Wayland app-id), so a self-update + relaunch picks it up — no need to re-run the installer.
[0.3.2] - 2026-05-21
Changed
- Replaced the per-page "Run with admin" buttons with a single password prompt at launch
(
pkexec): the GUI collects root-only data (SMART + dmidecode board/BIOS/RAM) once and caches it for the session, so Health and Inventory always show the full picture. Falls back to non-root if cancelled/unavailable; disable viaelevate_on_launch = false.
[0.3.1] - 2026-05-21
Fixed
- Changelog/release notes now render Markdown instead of showing raw
#/**markup — the in-app changelog usesQTextEdit.setMarkdown()and the update prompt renders notes as rich text (closes #1).
[0.3.0] - 2026-05-21
Added
- System inventory (M5): CPU, GPU (model/driver/VBIOS/VRAM/PCIe), motherboard/BIOS, RAM
(total + modules), storage, kernel, and display server. CLI
rigdoctor inventory(--json/--markdown/--output) and a GUI Inventory tab with Copy-as-Markdown, Save, and "Run with admin" (fordmidecodeboard/BIOS/RAM details). Fills the last GUI tab.
[0.2.0] - 2026-05-21
Added
- "Check for updates" button in the sidebar — force an immediate version check instead of waiting for the 30-minute poll.
[0.1.1] - 2026-05-21
Fixed
- Dialogs (the update prompt and changelog) were light-on-light and unreadable — they now use the dark theme with readable text.
[0.1.0] - 2026-05-21
First milestone release — a complete, installable, self-updating RigDoctor: live monitoring, crash capture + health report, desktop GUI, user-local install/uninstall, and updates.
Added
- In-app uninstaller: "Uninstall RigDoctor" button on the Setup page (and
rigdoctor uninstall [--purge]) — removes the venv, launchers, and desktop entry, with an option to also wipe settings/token/logs. Runs detached so it can delete its own venv. - In-app changelog: a "Changelog" link in the sidebar opens the release history (tags + notes) fetched from the update server.
[0.0.10] - 2026-05-21
Added
- "Restart now" button after a successful in-app update — relaunches RigDoctor for you instead of asking you to restart manually.
- Real release notes: CI now sets each Gitea release's body from the matching CHANGELOG
section (instead of "Automated release for…"), and the updater shows "What's new" — a
notes dialog before applying (GUI) and in
rigdoctor update(CLI).
Changed
- Setup page /
rigdoctor install: dropped internal module references (M4, M5, …) from the component descriptions — end users don't need them. - Adopting Conventional Commits + git-cliff (
cliff.toml,packaging/changelog.sh) to generate CHANGELOG entries from commit history going forward (D20).
Fixed
- The self-extracting
.runinstaller is now built without makeself (a pure-Python self-extractor,packaging/make_run.py), so it reliably attaches to every release — it was silently skipped before because the CI runner couldn't install makeself.
[0.0.8] - 2026-05-21
Added
- Periodic update checks: the GUI now re-checks for new releases while running (every
update_check_minutes, default 30; 0 disables), so a newly published version is detected without restarting. After applying an update, re-checks stop until restart. - "Run with admin" on the Health page: runs all checks (including root-only SMART) via
pkexec rigdoctor report --json, so the full report — not just "SMART needs root" — is available from the UI.
[0.0.7] - 2026-05-21
Added
- User-local installer
install.sh(no root): creates a private venv, linksrigdoctor/rigdoctor-guiinto~/.local/bin, and adds a desktop entry. Re-run to upgrade;--uninstallto remove. - Self-extracting
.runinstaller viapackaging/make-run.sh(makeself) — one download-and-run executable bundling the wheel +install.sh; built and attached to each release by CI. - Self-update apply (M13):
rigdoctor updatenow installs the newer version via authenticated pip (rigdoctor[gui] @ git+https://oauth2:<token>@…@<tag>); the GUI sidebar "Update to v…" button applies it and prompts to restart. Token is scrubbed from output.
[0.0.6] - 2026-05-21
Added
- Token-gated updates (M13): store a Gitea Personal Access Token, encrypted in the OS
keyring (Secret Service / GNOME Keyring via
secret-tool) with a 0600-file fallback.rigdoctor login/logout/update [--check]; GUI Setup → Update access panel (token field, "Get a token", backend status) and sidebar states (connect / up-to-date / "Update to v…" / access denied). Updates are gated to accounts on the Gitea server (D18). libsecret-toolsadded to the installer catalog (enables encrypted token storage).
Changed
- D18 update mechanism revised from anonymous public HTTP to authenticated HTTP (token) — the Gitea instance requires sign-in for all anonymous access.
[0.0.5] - 2026-05-21
Added
- M9 installer (first cut): detects distro / package manager / GPU; a catalog of optional
components (smartmontools, lm-sensors, dmidecode, pciutils, libnotify) with what each
enables;
rigdoctor install [--check] [-y]installs missing apt packages via pkexec/sudo with consent; GUI Setup tab with one-click install. Fixes the "smartmontools missing" gap in the health report. - Update check (M13, check half): on GUI launch the sidebar checks the Gitea releases API and shows "up-to-date", an "Update to v…" button if a newer release exists, or "update check unavailable" if the API can't be reached anonymously.
[0.0.4] - 2026-05-21
Added
- M4 health report: scans kernel logs (NVIDIA Xid incl. 79 "fell off the bus", kernel panic, OOM, MCE, PCIe AER, thermal, amdgpu reset), SMART health, NVIDIA driver/library mismatch, journald persistence, and live temps → prioritized plain-language findings with suggested fixes (read-only, D9).
- CLI
rigdoctor report(text +--json). - GUI Health tab: runs checks in the background; findings shown as severity-colored cards.
- Tests for the journal scanner.
[0.0.3] - 2026-05-21
Added
- Show the app version (
v<version>) in the GUI sidebar.
[0.0.2] - 2026-05-21
Added
- M3 crash-capture logger: crash-safe JSONL (
fsyncper sample), size-based rotation, GPU-lost/recovered event markers, atomic status file;rigdoctor record run|start|stop| status|report(foregroundrunis the systemd-ready entrypoint). - GUI Recording/Logs page (M10): start/stop/interval controls, live status, and the
post-crash report — driving the same recorder via shared
core.reccontrol. - Shared render helpers (
format_raw,format_headline,render_summary) used by CLI + GUI. - Tests for the crash log (writer, rotation, reader, summary, recorder).
- Gitea Actions release workflow (
.gitea/workflows/release.yml): on push tomain, builds wheel + sdist and publishes a Gitea releasev<version>with the artifacts.
Changed
- GUI-first emphasis (D17): docs reframed; the CLI keeps full parity for headless/SSH.
- CPU core temperatures ordered (package, then core 0, 4, 8, …) at the source — fixes the CLI ordering too.
- Distribution revised (D8): user-local self-updating install is primary,
.deboptional.
Planned (docs only)
- M12 session sharing / remote assist (D16); M13 no-root auto-update from the public repo (D18); versioning/changelog convention (D19).
[0.0.1] - 2026-05-21
Added
- Initial release: planning docs and decisions (D1–D15); M1 sensor core (NVIDIA GPU via
nvidia-smi, CPU via hwmon, memory + DDR5 SPD temps, NVMe); CLI (
snapshot,monitor,sources); and the M10 desktop GUI — dark dashboard with circular gauges and collapsible, temperature-colored cards.