37 KiB
PROJECT_MAP.md
Auto-generated project index. Update this file whenever you add, remove, or significantly change a file or feature.
Last updated: 2026-03-28 - the old single-file Studio preview binary has been replaced with a socket-driven mangotune-preview companion under src/bin/mangotune-preview/, MangoTune now passes studio defaults through env vars and hot-reloads the preview over a Unix socket instead of only relying on CLI args/restarts, the dashboard/help/docs have been updated to match the new preview contract, MangoHud option help still comes from a verified docs/MANGOHUD_OPTION_BEHAVIOR.md reference cross-checked against a local upstream source snapshot plus upstream README/config docs, the schema/validator follow MangoHud semantics more closely (unsigned offset_x/offset_y, flexible xkb-style keybind validation, legacy warning for benchmark_percentiles, upstream preset as a list-valued special option, the full documented option surface now represented in the live schema, threshold-color toggles now declare the supporting metric/value/color dependencies they actually need, MangoTune strips the mistaken standalone gpu_load / cpu_load keys because MangoHud itself rejects them as top-level options, rewrites stale profile aliases like compact/stretch into modern hud_compact/horizontal_stretch, default-on MangoHud flags now serialize as explicit =0 when disabled, and negative legacy offsets are normalized back to unsigned values), Studio preview sessions still calibrate against the actual scaled window size after launch, preview-only right-anchor emulation remains in place because fully native right-side positions regressed horizontal preview visibility, horizontal auto-layout previews still get a bounded width estimate, ordinary Studio config edits now rewrite the temp MANGOHUD_CONFIGFILE and rely on MangoHud's file watcher instead of restarting the window, those live preview writes are GTK-debounced to reduce churn, preset/profile/revert-style config replacements now use the same live-apply path where possible, the save menu now includes reset-to-defaults, restore-latest-safety-backup, and a real Switch Active Config… action, resetting still rebuilds a sane MangoTune baseline config instead of leaving an effectively empty config, explicit config switching now changes the actual editable target in state.config.path with save/discard guarding instead of overloading the layer-stack strip, the unreliable preview-docking preference has been removed from the UI, backup-style helper .conf files are filtered out of the detected per-app layer list, the top config strip now refreshes into a read-only layer-stack summary with detected conflict counts instead of a static status label or fake selector, Studio preview now exposes direct renderer controls for scene, FPS cap, particle count, particle size, repeated GPU passes, CPU interaction steps, VRAM pressure, VSync, and pause state instead of the older derived load + advanced model, with lower defaults (Dark scene, 120 FPS cap, 1000 particles, 0.03 particle size, 1 pass, 0 VRAM pressure, 0 CPU interaction) so the built-in preview starts safely on faster GPUs and stays visually spread instead of collapsing into a tiny edge-on cluster; the particle renderer now uses standard alpha blending instead of additive bloom so larger particles remain readable against the darker scene, and the scene selector is exposed in the dashboard while also updating the running preview over the socket, app toasts now clear older queued messages and use shorter lifetimes by default, palette-style color fields get swatch controls outside the dedicated colors page too, unset swatches render as neutral placeholders instead of alarming red defaults, comma-separated palette entry fields now live in a fixed editor cluster with stable width instead of collapsing around short values, swatch edits now commit through the same validation/save-state path as text edits, section badges now share a tighter mono sizing system, the dashboard profile picker remembers the last selected profile and mirrors that choice into the save-name field, numeric controls now use compact explicit spin-button fields with typed/pasted junk filtered at the editable layer, the Layer Conflicts page now explains what counts as a true layer collision and gives a concrete repro recipe, the dashboard save menu now offers explicit config-target switching while the top strip stays a read-only layer-stack summary keyed to the actual active file, the new HUD Order page under Tools reorders currently enabled visible HUD blocks by moving their real config lines up and down with live preview refresh, and the dashboard preset buttons now load the real Benchmark / Competitive / Performance / Streaming profile files into the current workspace when those profiles exist, with the older built-in mappings kept only as fallback safety
🗺️ Project Overview
MangoTune is a Rust GTK4/libadwaita desktop app for Linux gamers who want to configure MangoHud safely without editing .conf files by hand. It combines schema-aware validation, config-layer awareness, quick launch/testing, and desktop integrations in a native Linux GUI.
🏗️ Architecture Summary
src/main.rs starts the libadwaita app in src/app.rs, which creates the main window in src/window.rs. The window builds page widgets from src/ui/pages/, while config parsing/validation/resolution lives under src/config/, managed live-preview state now lives in src/preview/, system detection under src/system/, launcher/test-process logic under src/launcher/, and launcher-string/platform helpers under src/integrations/.
Representative flow:
startup detection/config load -> window.rs builds navigation + shared state -> page/widget edits mutate in-memory AnnotatedConfig -> validator updates inline state/save availability -> parser writes MangoHud config to disk when saved.
Dashboard preview flow:
dashboard control change -> in-memory config updates -> src/preview/mod.rs writes a temporary preview-only config -> MangoHud Studio preview reparses the temp file in place for ordinary edits, while true preview-window changes still relaunch without touching the user’s saved config.
📁 File & Folder Map
| Path | Role | Notes |
|---|---|---|
Cargo.toml |
Rust manifest | App metadata, GTK/libadwaita/runtime dependencies |
Cargo.lock |
Dependency lockfile | Pinned crate graph |
build.rs |
Build helper | Compiles GSettings schema/assets |
README.md |
User-facing intro | Install, rationale, launcher/config-layer behavior |
LICENSE |
Project license | MIT |
THIRD_PARTY_LICENSES.md |
Dependency licensing | Third-party notice bundle |
Makefile |
Install/build convenience | Release install helpers for both mangotune and mangotune-preview |
ROADMAP.md |
Tactical roadmap | Tracks current UX direction, near-term milestones, and preview-renderer follow-up |
docs/MANGOHUD_OPTION_BEHAVIOR.md |
Verified MangoHud reference | Cross-checked against a local upstream source snapshot plus upstream README.md and data/MangoHud.conf; covers parsing/defaults/positioning rules, special-case options like preset, and the full currently documented option surface MangoTune now represents |
docs/MANGOHUD_POSITION_LAB.md |
Direct MangoHud test notes | Documents the native MangoHud position lab, expected semantics, isolated-Xorg workflow on arch.lan, and the right-alignment test matrix |
data/ |
Desktop app assets | Desktop entry, metainfo, schema, icon, CSS |
data/com.mangotune.MangoTune.gschema.xml |
GSettings schema | Window/app preferences, launcher defaults, remembered profile selection, and studio renderer tuning defaults such as load/FPS/VSync |
data/style.css |
App styling | Global CSS hooks for badges, compact dashboard cards, tool-page shells, custom control-row styling, and the newer sharper redesign-inspired visual treatment across shell chrome, sidebar/search/header controls, split/content surfaces, stock-ish GTK surfaces, custom unsaved-changes dialog chrome, section headers, chips, cards, rows, inputs, and callouts, now with a tighter shared mono badge system plus less rounding and denser spacing across the main shells, darker themed container seams between header/sidebar/content areas, plus a distinct active-conflict tint in the layer-stack strip |
docs/plan/ |
Planning/spec docs | Architecture, design system, schema, phase plans |
src/main.rs |
Binary entry point | Runs MangoTuneApp |
src/bin/mangotune-preview/ |
Companion preview renderer | Socket-driven Studio preview app split into main.rs/renderer.rs/scene.rs/socket_api.rs/workload.rs, with direct runtime controls for FPS cap, VSync, VRAM pressure, particle count, particle size, repeated surface passes (gpu_passes), pause state, and CPU interaction steps; the renderer still uses the heavier volumetric particle path and parallel CPU interaction work, but MangoTune now exposes the real knobs directly instead of deriving them from a synthetic load slider |
src/bin/preview_probe.rs |
Dev preview harness | Loads a saved profile, launches a controlled preview session, and makes local screenshot-based alignment debugging reproducible |
scripts/mangohud-position-lab.sh |
Direct MangoHud launcher | Runs MangoHud directly against glxgears/vkcube, records logs, captures window geometry, saves both app-window and full-root screenshots, and crops the root capture back to the app bounds when overlays are composited separately |
scripts/mangohud-position-matrix.sh |
Direct matrix runner | Generates margin-on/off variants from the standard sparse/full right-alignment profiles and captures them through MangoHud directly |
src/lib.rs |
Library root | Re-exports core modules for app/tests |
src/debug_log.rs |
In-app diagnostics buffer | Shared recent-log ring buffer used by the app shell and config parser, with copy/clear support for the Debug page |
src/app.rs |
Application bootstrap | GTK/libadwaita app setup, CSS load, startup detection |
src/window.rs |
Main shell | App state, header/actions, sidebar, accordion-style section navigation, async config-bar layer discovery, visible-page rebuilds with scroll-position preservation, calmer config-bar language that now frames the strip as a detected read-only layer stack summary instead of an editable target selector, periodic layer-summary refresh with real detected-conflict counts, narrower default sizing and a slimmer sidebar so the app fits better on typical 16:9 desktops, dashboard-first startup without restoring the last visited page, a clearer header-led save/reload/revert/close flow, reset-to-defaults and restore-latest-safety-backup menu actions alongside safety backups, an explicit Switch Active Config… flow that lets users move the real editable target between the writable global/per-app XDG configs with save/discard guarding, a sane MangoTune baseline for reset instead of an empty config, selective app-preference reset for preview/backup defaults, a save-menu Auto backup on save toggle instead of a mostly-empty Preferences screen, explicit shell styling hooks for the header/sidebar/config strip, and an Adwaita in-app unsaved-changes alert sheet instead of a standalone popup window |
src/preview/ |
Managed live preview | Preview-session state, temp preview config writing, start/reload/restart/stop flow |
src/preview/mod.rs |
Preview controller | Uses a temporary preview config and launches the actual preview/test process directly, including persisted studio load/FPS/VSync settings, live socket-driven Studio runtime updates for load/FPS/VSync/VRAM/particle/pause controls, temp-config live-apply for ordinary Studio edits without signaling/restarting the process, safer studio restart behavior for window-size changes, legacy flag normalization before preview writes, explicit horizontal_stretch=0 serialization for stretch-off sessions, effective HUD-width-based preview sizing, preview-only bounded widths for horizontal auto-layout sessions, per-metric auto-width estimation with separate sparse compact/non-compact tuning, preview-only right-anchor emulation for horizontal right-aligned layouts, and Studio-only post-launch window-size calibration so fractional desktop scaling does not throw off width-sensitive preview placement |
src/config/normalize.rs |
Legacy option cleanup | Shared normalization for old flag/bool encodings like key=0/key=1, normalization of old negative offsets back to unsigned values, plus cleanup for the mistaken standalone gpu_load / cpu_load keys; reused by save/load/profile/preview flows |
src/config/ |
MangoHud config domain | Parser, schema, validation, resolver, help/types |
src/config/parser.rs |
Config I/O | Comment-preserving parse/write, duplicate-key collapse on parse, whitespace-normalized values, safer stale-backup handling, in-memory mutation, and explicit zero serialization for MangoHud flags that default on upstream (horizontal_stretch, frametime, frame_timing, fps, gpu_stats, cpu_stats, legacy_layout, text_outline) |
src/config/schema.rs |
Schema catalog | Typed definitions for MangoHud options and categories, now aligned more closely with upstream semantics including unsigned edge offsets, list-valued preset, and most practical upstream options that were previously missing |
src/config/validator.rs |
Validation rules | Value validation, dependency/conflict checks, flexible xkb-style keybind parsing, and warning-level handling for legacy benchmark_percentiles |
src/config/resolver.rs |
Layer discovery | Finds config sources and effective priority order, with user-facing layer labels tuned for clearer “built-in defaults” vs “saved global config” wording, backup-style helper .conf files filtered out of the detected per-app list, and reusable layer-conflict detection used by both the inspector page and the top shell summary |
src/config/types.rs |
Shared config types | AnnotatedConfig, ConfigValue, categories, validation types |
src/config/help.rs |
Help text map | UI summaries/default/tooltips plus friendly display titles and polished summaries per key, now loaded from docs/MANGOHUD_OPTION_BEHAVIOR.md instead of the older planning doc |
src/system/ |
Environment detection | MangoHud/tool/display/GPU detection and XDG paths |
src/system/detect.rs |
Runtime detection | Checks MangoHud/tools/display server/GPU vendor |
src/system/paths.rs |
XDG path logic | Resolves MangoHud config locations |
src/launcher/ |
Test launch flow | Spawns/stops/reloads MangoHud test processes |
src/launcher/runner.rs |
Process management | Launch, stop, reload, and retained X11 window-management helpers from the preview-lab/docking experiments |
src/integrations/ |
External launchers/tools | Steam/Lutris/Heroic/GameMode helpers |
src/profiles/ |
Profile storage | Save/list/load/delete real MangoHud .conf profile files under MangoTune's XDG config directory, including normalization of legacy values when applying one into the active target |
src/ui/ |
UI layer | Page builders and reusable widgets |
src/ui/toast.rs |
Toast helper | Shared short-lived toast helper that dismisses older queued messages and gives errors/warnings a slightly longer lifetime |
src/ui/widgets/tool_page.rs |
Shared page/window scaffolds | Owns the shared page frame/header, section shells, callouts, and now the reusable utility-window shell used by raw editor and small modal-style utility windows so spacing/frame rules stay consistent |
src/ui/pages/mod.rs |
Page registry | Sidebar structure, navigation-page factory, current-config snapshots, shared live-preview helper, calmer section naming/order, a debounce-backed temp-config apply path for ordinary Studio edits, explicit restart flow that can still pass the current preview width into preview refreshes, and a saveable-config gate so invalid intermediate edits do not crash the preview |
src/ui/pages/overview.rs |
Dashboard page | Dashboard now uses the same flat page-header scaffold and outer spacing as the rest of the app, while focusing on quick everyday tuning: Layout & Position, Make It Readable, Show These Metrics, a compact profile utility strip with icon actions, and a single-line status strip at the bottom. Live Preview and Presets now live on their own dedicated pages under Start, while the dashboard keeps MangoHud-faithful unsigned offsets and the most common metric/appearance toggles |
src/ui/pages/live_preview.rs |
Live Preview page | Dedicated Start page for Studio preview launch/apply/restart/stop, preview window size, scene selection, and direct runtime tuning controls without touching the saved MangoHud config, using the same flat page-header scaffold and spacing rules as the rest of the app |
src/ui/pages/presets_page.rs |
Presets page | Dedicated Start page for loading the practical starter presets/profile-backed overlay shapes without mixing them into the preview workflow, using the same flat page-header scaffold and spacing rules as the rest of the app |
src/ui/pages/debug.rs |
Debug page | Tool-page style diagnostics surface with a live recent-log view, current in-memory config snapshot, and clipboard actions for support/debugging |
src/ui/pages/conflicts.rs |
Layer conflict view | Inline cascade/conflict inspection with filter toggles, explicit empty states, and a built-in explanation/repro recipe clarifying that this page only shows layer-on-layer overrides, not validator-style logical conflicts inside a single file |
src/ui/pages/appearance.rs |
Layout page | Appearance-layout schema rows |
src/ui/pages/colors.rs |
Color page | Appearance-color schema rows regrouped into clearer palette sections, plus moved-in FPS/GPU/CPU signal palettes and friendlier color titles/subtitles sourced from schema help |
src/ui/pages/typography.rs |
Typography page | Appearance-typography schema rows, including secondary-size controls for supporting text |
src/ui/pages/performance.rs |
Display config page | FPS/frametime/general display options, plus runtime/render-stack details and Gamescope/FSR/HDR controls, with styling controls moved out to Colors and Theme |
src/ui/pages/gpu.rs |
GPU config page | GPU-specific metrics options, with signal/load colors moved out to Colors and Theme |
src/ui/pages/cpu.rs |
CPU config page | CPU metrics options, with signal/load colors moved out to Colors and Theme |
src/ui/pages/memory.rs |
Memory config page | RAM/VRAM swap display options |
src/ui/pages/io_network.rs |
IO/network page | Disk/network display options |
src/ui/pages/media_player.rs |
Media player page | Media integration metrics |
src/ui/pages/battery.rs |
Battery page | Battery-related overlay options |
src/ui/pages/keybindings.rs |
Keybinding page | Toggle/shortcut options |
src/ui/pages/fps_limits.rs |
FPS limits page | MangoHud frame cap/list options |
src/ui/pages/logging.rs |
Logging page | Logging and dump options |
src/ui/pages/blacklist.rs |
Blacklist page | Injection/config-exclusion options plus an advanced special-directives section for help and inherit |
src/ui/pages/opengl_quirks.rs |
OpenGL page | OpenGL-specific workarounds |
src/ui/pages/raw_editor.rs |
Raw editor | Tool-page style raw-config launcher with workspace stats, lighter-use guidance, and a richer editor pop-out now using the shared utility-window shell instead of hand-rolled framing |
src/ui/pages/integrations.rs |
Integrations page | Tool-page style Steam/Lutris/Heroic/GameMode helpers with live Steam command generation |
src/ui/widgets/toggle_row.rs |
Schema row factory | Builds switch/combo/entry rows plus explicit compact spin-button suffix controls for numeric schema fields, applies verified friendly titles/help text, surfaces inline validation, refreshes live preview after edits, routes palette-style comma-separated color fields to richer swatch controls, treats free-text entries as commit-based preview updates that only fire after an actual edit, and filters typed/pasted junk out of numeric controls at both the key and editable layers instead of only validating later |
src/ui/widgets/hotkey_row.rs |
Hotkey row widget | Keybinding editor rows with a modal edit dialog now using the shared utility-window shell instead of a one-off padded box |
src/ui/widgets/tool_page.rs |
Tool-page shell builder | Shared custom page hero/section/callout helpers used to move deep pages away from stock preferences layouts, including top-aligned section badges, explicit section-header wrappers, and chip rows that follow the redesign-inspired shell language |
src/ui/widgets/color_row.rs |
Color control widget | Hex + color-dialog row with shared live-preview refresh, plus palette-list swatches for comma-separated color fields like fps_color, gpu_load_color, and cpu_load_color; text editing now validates live but only refreshes preview on commit/focus-leave after a real edit, unset swatches now render in a neutral placeholder state, and palette entry fields live in a fixed editor cluster instead of resizing around current content |
src/ui/widgets/hotkey_row.rs |
Hotkey widget | Keybinding capture/edit UI with shared live-preview refresh |
src/ui/widgets/cascade_view.rs |
Conflict widget | Cascade/layer visualization plus filter-aware visibility helpers |
src/ui/widgets/validation_label.rs |
Validation helper | Inline row error presentation |
src/ui/widgets/color_utils.rs |
Shared color helpers | Hex/RGBA conversion utilities shared by dashboard and color rows |
🧭 Hot Paths
- Add or change a major window/workflow:
src/window.rs,src/ui/pages/mod.rs, affected page module(s),data/style.css - Change a MangoHud option’s validation/type/category:
src/config/schema.rs,src/config/help.rs,src/config/validator.rs, affected page insrc/ui/pages/ - Change config parsing or write behavior:
src/config/parser.rs,src/config/types.rs, parser tests - Change launcher/test-preview behavior:
src/preview/mod.rs,src/bin/mangotune-preview.rs,src/launcher/runner.rs,src/ui/pages/overview.rs,data/com.mangotune.MangoTune.gschema.xml,Makefile - Change direct MangoHud validation flow:
scripts/mangohud-position-lab.sh,scripts/mangohud-position-matrix.sh,docs/MANGOHUD_POSITION_LAB.md - Change profile behavior:
src/profiles/mod.rs,src/ui/pages/overview.rs - Change config-layer/conflict behavior:
src/config/resolver.rs,src/ui/pages/conflicts.rs,src/window.rs - Change desktop app settings/preferences:
data/com.mangotune.MangoTune.gschema.xml,build.rs,src/window.rs - Change integration strings/behavior:
src/integrations/*.rs,src/ui/pages/integrations.rs
🔑 Key Concepts & Domain Terms
AnnotatedConfig: in-memory MangoHud config preserving file lines plus indexed option state- Config layer/cascade: MangoHud config priority stack (env > app-local > per-app > global > defaults)
SchemaEntry: typed definition for one MangoHud option, including category/dependencies/conflicts- Validation state: per-key result map used to block invalid saves and surface inline errors
- Managed live preview: a preview-only MangoHud config generated from unsaved in-memory edits and applied to a real preview process
- Companion renderer:
mangotune-preview, a dedicated animated preview executable for MangoHud tuning - Test launcher: helper flow that launches a real process with MangoHud enabled for verification
- Profile: a saved real MangoHud
.conffile stored under MangoTune’s XDG config dir and applied into the active config target on demand
🔗 Persistence / Data Contracts
- MangoHud global config default:
~/.config/MangoHud/MangoHud.conf(resolved viasrc/system/paths.rs) - Profile storage:
~/.config/mangotune/profiles/*.confunlessMANGOTUNE_PROFILES_DIRoverrides it - GSettings schema:
com.mangotune.MangoTune - Preferred preview scene setting: GSettings key
preview-scenenow defaults tostudio - Studio preview tuning settings: GSettings keys
preview-studio-scene,preview-fps-cap,preview-vsync,preview-vram-pressure,preview-particle-count,preview-particle-size,preview-gpu-passes, andpreview-interaction-steps(preview-loadremains only as a legacy compatibility key) - Companion renderer binary:
mangotune-previewis discovered via env override, sibling binary, orPATH - Launcher environment contract: MangoTune sets
MANGOHUD=1andMANGOHUD_CONFIGFILE=<config path>for launched preview/test processes - Preview temp config contract: live preview writes a temporary MangoHud config under the system temp dir instead of modifying the user’s saved config, and forces
no_displayoff for preview visibility - Config file format contract: MangoHud
.confsyntax with comment preservation and “last duplicate wins” behavior - Game config hint DB: bundled at
data/game_config_db.toml, generated/maintained viascripts/build_game_config_db.py, documented indocs/GAME_CONFIG_DB.md, and used by the per-app config creation flow to search games and suggest likely executable/config names
🖥️ User-Facing Command / Feature Surface
- Main dashboard with live preview, workspace status, visual position picking, smarter edge-gap controls, quick appearance controls, starter presets, common metrics, profile save/restore/delete, page-jump shortcuts, preview window size controls, and a denser compact layout that uses less vertical space
- Header-led save flow with
Save Configas the single primary save surface, plus secondary actions for saving a copy, discarding unsaved changes, and creating a safety backup - Sidebar navigation with search plus accordion-style section expansion, calmer section naming/order, and a less heavy “config layer” top bar
- Startup now always opens on the dashboard instead of restoring the last visited page
- Deep settings pages with a custom control-deck shell instead of plain stock preferences groups for the main appearance/display/behavior surfaces
- Config layer selector + conflict visibility
- Appearance controls: layout, colors, typography
- Metrics controls: performance, GPU, CPU, memory, I/O/network, media, battery
- Behavior controls: keybindings, FPS limits, logging, blacklist
- Advanced tools: OpenGL quirks, raw editor
- Live preview/testing: managed Studio-only preview from unsaved edits using
mangotune-preview, with dashboard-level defaults, auto-refreshing status, dashboard window-size controls, preview-onlyno_displayoverride, explicithorizontal_stretch=0writes when stretch is disabled, effective-HUD-width window sizing for horizontal auto-layout, preview-only right-offset compensation for right-aligned horizontal layouts, Studio-specific post-launch width calibration for scaled desktops, temp-config live-apply for ordinary Studio config edits, debounced live preview writes for high-frequency controls, safer studio restart behavior for true window-size changes, wheel-safe dashboard controls, live runtime updates for Studio load/FPS/VSync, advanced Studio runtime controls for particle density/VRAM pressure/pause, and an in-window control strip plus visible key hints for the studio renderer - Integrations: Steam, Lutris, Heroic, GameMode
- Profiles: save the active config target as a profile, then apply a profile back into the active target
🧪 Test Coverage Map
- Unit tests live inline in Rust modules such as
src/config/parser.rs,src/launcher/runner.rs,src/profiles/mod.rs,src/integrations/steam.rs, andsrc/ui/pages/overview.rs - Parser/schema/validator/resolver changes should get module tests updated where the logic lives
- Launcher/preview behavior changes usually require tests in
src/launcher/runner.rs,src/preview/mod.rs,src/bin/mangotune-preview.rswhen practical, and any overview helpers that drive preview state - UI shell/page layout currently has light automated coverage; visual/interaction changes need manual GTK testing in addition to
cargo test
🧩 Feature Areas & Ownership Map
- App shell and navigation:
src/app.rs,src/window.rs,src/ui/pages/mod.rs,data/style.css - MangoHud config engine:
src/config/ - Runtime/system detection:
src/system/ - Preview/test launching:
src/preview/,src/bin/mangotune-preview.rs,src/launcher/,src/ui/pages/overview.rs - Profiles:
src/profiles/,src/ui/pages/overview.rs - Desktop integrations:
src/integrations/,src/ui/pages/integrations.rs - Page-specific UI:
src/ui/pages/ - Reusable controls:
src/ui/widgets/
⚠️ Known Issues / Tech Debt
- The dedicated preview renderer is still early and could use even richer scene/load presets plus deeper in-preview UI polish
- The preview renderer still needs more ambitious scene design and richer in-window guidance beyond the current first pass
- UI test coverage is limited; large UX changes currently rely heavily on manual validation
🔄 Update Triggers
Update this file when:
- a command, route, page, or feature area is added/removed/renamed
- a meaningful source file/module is added/removed/renamed
- a persistence format, config location rule, or launcher contract changes
- architecture changes materially
- a major known issue is discovered or resolved
Do not update this file for:
- tiny wording tweaks
- purely local refactors with no ownership/structure impact
- dependency bumps with no workflow impact
📝 Change Log (agent session)
- 2026-03-22 Initial map created
- 2026-03-22 Added
src/preview/mod.rs, replaced Overview with a dashboard-first live-preview workflow, and removed the old launch-bar widget - 2026-03-22 Added
ROADMAP.md, persisted the preferred preview scene, and expanded the dashboard with common metric toggles - 2026-03-22 Added searchable sidebar navigation, dashboard page-jump actions, and the
mangotune-previewcompanion renderer - 2026-03-22 Added dashboard-level controls for the studio preview renderer's scene, load factor, and FPS cap
- 2026-03-22 Switched preview launching to direct-process tracking and added in-window studio controls with more distinct scene rendering
- 2026-03-22 Added automatic preview-state refresh in the dashboard plus safer reload fallback behavior
- 2026-03-22 Added one-click starter presets to the dashboard for common overlay setups
- 2026-03-22 Collapsed deeper sidebar sections by default while keeping search fully discoverable
- 2026-03-22 Added a dashboard workspace-status card with validation summary, save state, runtime details, and quick actions
- 2026-03-22 Made studio preview reload restart safely and changed the sidebar to auto-collapse other sections when opening a new one
- 2026-03-22 Forced preview visibility when saved configs use
no_displayand stopped pinning the scene selector after previews stop - 2026-03-22 Added screen-clamped preview docking, dashboard controls for preview window size, and a shared custom shell for the main deep settings pages
- 2026-03-22 Fixed the validation-save deadlock, moved layer conflicts inline, added profile deletion, and made dashboard preview controls safer to scroll/use
- 2026-03-22 Moved raw editor and integrations onto the custom shell and fixed Steam launch-option generation to follow the selected method
- 2026-03-23 Gave right-aligned previews extra width and stopped side-docking them to reduce off-screen HUD placement failures
- 2026-03-23 Added explicit empty states for filtered conflicts/integration detection and surfaced profile-folder open failures instead of failing silently
- 2026-03-23 Extracted shared color conversion helpers and deduplicated the saved-snapshot restore path in window actions
- 2026-03-23 Moved config-layer discovery off the synchronous shell path and hardened parser round-trips against duplicate keys and accidental value whitespace
- 2026-03-23 Rebuilt visible pages from shared state on navigation, refreshed live preview from non-dashboard editors, widened right-aligned horizontal preview safety margins, narrowed default shell sizing, and made stale
.mangotune.bakpaths non-fatal during save - 2026-03-23 Normalized legacy flag values across preview/profile/reload paths and refreshed the visible page + preview after revert/reload/profile restore so stale
horizontal_stretch=0-style states don’t linger - 2026-03-23 Added a preview-only bounded width fallback for horizontal auto-layout previews, renamed/moved the sidebar layer viewer section, softened config-bar labels, narrowed the default shell width again, and simplified raw-editor guidance
- 2026-03-23 Preserved scroll position during visible-page rebuilds, removed the extra dashboard guidance card, tightened dashboard spacing, and narrowed sidebar/window defaults further
- 2026-03-23 Fixed disabled
horizontal_stretchserialization, made preview reload use the current computed width, resethorizontal_stretchin dashboard presets, and stopped dashboard polling timers from leaking across page rebuilds - 2026-03-24 Corrected the MangoHud behavior references against the deep-research report and local upstream source, including
preset,benchmark_percentiles,inherit, and keybind/default caveats - 2026-03-24 Aligned MangoTune's live schema and validation with the corrected MangoHud reference by making offsets unsigned, broadening keybind parsing, warning on legacy
benchmark_percentiles, treatingpresetas a list-valued upstream option, and adding the missing practical upstream options that belong in the GUI - 2026-03-24 Surfaced the last documented upstream options in the UI too, including runtime/Gamescope sections on the Performance page, secondary typography sizing, and an advanced Blacklist subsection for special directives like
helpandinherit - 2026-03-24 Stopped text-entry fields from reloading the preview on every keystroke, added a saveable-config gate before preview reloads, and tightened threshold-color dependencies so incomplete threshold setups do not immediately destabilize the preview
- 2026-03-23 Added preview-only right-offset compensation for horizontal right-aligned layouts after stretch-off was confirmed fixed but right alignment still failed
- 2026-03-23 Added Studio-only post-launch preview-size calibration so right-aligned horizontal HUD placement can use the actual scaled Studio window width instead of only the requested logical width
- 2026-03-24 Expanded the MangoHud source-truth docs with explicit
fullexclusions, offset parsing quirks, and isolated-X capture limitations after direct-lab verification onarch.lan - 2026-03-24 Switched shared control rows, colors, and keybindings to friendly display titles sourced from the verified MangoHud reference instead of raw key-shaped labels
- 2026-03-24 Added polished UI-facing summaries for common MangoHud options so shared rows and keybinding descriptions read like product copy instead of schema text
- 2026-03-24 Simplified the shell save flow by making the header the single primary save surface, softening layer-bar wording, and always starting the app on the dashboard
- 2026-03-24 Moved FPS/GPU/CPU color editors out of the telemetry pages and consolidated them under
Colors and Themeso metric pages focus on what is shown while appearance pages own styling - 2026-03-24 Regrouped
Colors and Themeinto clearer sections for core palette, hardware labels, signal thresholds, and extra integrations/status colors - 2026-03-25 Replaced the placeholder hotkey toggler with a real modal keybind editor, guarded color-entry/swatch synchronization to avoid recursive GTK edit loops, and corrected GPU/CPU threshold-color dependencies to point at
gpu_stats/cpu_stats - 2026-03-25 Switched ordinary Studio preview edits from restart-driven reloads to debounced temp-config rewrites so MangoHud can reparse changes in place without relaunching the window
- 2026-03-25 Changed dashboard profile restore and presets to use the same Studio live-apply path instead of forcing a preview restart, removed the redundant preview-renderer label from the dashboard card, and added save-menu actions for reset-to-defaults and restore-latest-safety-backup
- 2026-03-26 Removed the unreliable preview-docking preference from the UI, switched dashboard offset controls back to MangoHud’s real unsigned offset semantics, normalized legacy negative offsets on load, and started writing explicit
=0for upstream default-on flags likeframetimeandframe_timing - 2026-03-24 Simplified preview-only right-anchor emulation by dropping fake vertical offsets and adding a small no-margin right-edge safety for horizontal right-aligned layouts
- 2026-03-24 Tried preserving native MangoHud right-side positions directly, but reverted that change after it made horizontal previews disappear again; preview-side right-anchor emulation remains the last usable path while MangoHud-native behavior is being investigated separately
- 2026-03-24 Added a direct MangoHud position lab and matrix runner so margin/compact/right-anchor behavior can be validated outside MangoTune on a real X11 session, including an isolated-Xorg workflow for
arch.lan