Files
2026-03-30 23:06:06 -04:00
..
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00
2026-03-30 23:06:06 -04:00

MangoTune — Agent Master Plan

Project Summary

MangoTune is a GTK4 + libadwaita desktop application written in Rust for Linux. It is a superior replacement for GOverlay — a GUI configurator for MangoHud, with first-class support for config conflict detection, strict validation, visual config-layer stacking (like CSS cascade), live preview via test launchers, and integrations with GameMode, Steam, Lutris, and Heroic Games Launcher.

Agent Instructions — READ FIRST

  1. Read this file completely before doing anything.
  2. Read docs/architecture.md for the full module map and dependency graph.
  3. Read docs/mangohud_schema.md for the complete MangoHud option reference.
  4. Read docs/design_system.md for all UI/UX rules and GTK4 widget patterns.
  5. Read phases/phase_XX.md for the specific phase you are implementing.
  6. Each module has its own spec file in modules/. Read the relevant spec before writing code.
  7. Never modify files outside your assigned phase without noting it in a comment block.
  8. After completing a phase, verify against the acceptance criteria in that phase file.

Directory Layout (this plan repo)

mangotune-plan/
├── README.md                  ← YOU ARE HERE — read first
├── docs/
│   ├── architecture.md        ← module map, crate deps, file tree
│   ├── mangohud_schema.md     ← every MangoHud config option, types, constraints
│   ├── config_resolution.md   ← how MangoHud config files are discovered & prioritized
│   ├── design_system.md       ← GTK4/libadwaita UI rules, widget patterns, UX decisions
│   └── integrations.md        ← GameMode, Steam, Lutris, Heroic specs
├── modules/
│   ├── config_parser.md       ← parser/writer module spec
│   ├── config_schema.md       ← schema/type system module spec
│   ├── config_validator.md    ← validation engine module spec
│   ├── config_resolver.md     ← multi-file conflict resolver module spec
│   ├── system_detect.md       ← system detection module spec
│   ├── launcher.md            ← test launcher module spec
│   └── ui_pages.md            ← all UI page/widget specs
├── phases/
│   ├── phase_01.md            ← Project scaffold, Cargo.toml, build system
│   ├── phase_02.md            ← Config parser + schema + validator (no UI)
│   ├── phase_03.md            ← Config resolver + system detection (no UI)
│   ├── phase_04.md            ← GTK4 app skeleton, main window, navigation
│   ├── phase_05.md            ← Performance & GPU/CPU pages (core UI)
│   ├── phase_06.md            ← Appearance, layout, colors, typography pages
│   ├── phase_07.md            ← Conflict resolver UI (cascade stack view)
│   ├── phase_08.md            ← Keybindings, logging, FPS limits pages
│   ├── phase_09.md            ← Test launcher (vkcube, glxgears, custom)
│   ├── phase_10.md            ← Integrations (GameMode, Steam, Lutris, Heroic)
│   └── phase_11.md            ← Polish, packaging, .desktop file, final QA
└── ui/
    ├── widget_toggle.md       ← toggle switch widget spec
    ├── widget_color.md        ← color picker widget spec
    ├── widget_hotkey.md       ← hotkey capture widget spec
    ├── widget_cascade.md      ← config cascade/layer stack widget spec
    └── widget_validation.md   ← inline validation error display spec

Target Source Tree (the actual Rust project)

mangotune/
├── Cargo.toml
├── Cargo.lock
├── build.rs
├── data/
│   ├── com.mangotune.MangoTune.gschema.xml
│   ├── com.mangotune.MangoTune.desktop
│   └── icons/
│       └── com.mangotune.MangoTune.svg
├── src/
│   ├── main.rs                ← entry point only — app init + run
│   ├── app.rs                 ← Application struct, GtkApplication setup
│   ├── window.rs              ← MainWindow: AdwApplicationWindow
│   ├── config/
│   │   ├── mod.rs
│   │   ├── parser.rs          ← read/write .conf files, preserve comments
│   │   ├── schema.rs          ← typed schema: all ~120 MangoHud options
│   │   ├── validator.rs       ← validation logic, dependency checks
│   │   ├── resolver.rs        ← discover all config files, build priority stack
│   │   └── types.rs           ← shared enums/structs (ConfigValue, OptionType, etc.)
│   ├── system/
│   │   ├── mod.rs
│   │   ├── detect.rs          ← detect MangoHud version, tools, GPU, display server
│   │   └── paths.rs           ← XDG path resolution, known config locations
│   ├── launcher/
│   │   ├── mod.rs
│   │   └── runner.rs          ← spawn vkcube/glxgears/custom with MANGOHUD=1
│   ├── integrations/
│   │   ├── mod.rs
│   │   ├── gamemode.rs
│   │   ├── steam.rs
│   │   ├── lutris.rs
│   │   └── heroic.rs
│   └── ui/
│       ├── mod.rs
│       ├── pages/
│       │   ├── mod.rs
│       │   ├── overview.rs
│       │   ├── performance.rs
│       │   ├── gpu.rs
│       │   ├── cpu.rs
│       │   ├── memory.rs
│       │   ├── io_network.rs
│       │   ├── media_player.rs
│       │   ├── battery.rs
│       │   ├── appearance.rs
│       │   ├── colors.rs
│       │   ├── typography.rs
│       │   ├── keybindings.rs
│       │   ├── fps_limits.rs
│       │   ├── logging.rs
│       │   ├── blacklist.rs
│       │   ├── opengl_quirks.rs
│       │   ├── raw_editor.rs
│       │   └── conflicts.rs
│       └── widgets/
│           ├── mod.rs
│           ├── toggle_row.rs
│           ├── color_row.rs
│           ├── hotkey_row.rs
│           ├── cascade_view.rs
│           ├── validation_label.rs
│           └── launch_bar.rs

Core Design Principles

  • Strict validation — the Save button is disabled if any field contains an invalid value. Inline error labels appear below each offending field. No config is written to disk in an invalid state under any circumstances.
  • Comment preservation — the parser round-trips existing files preserving all comments, whitespace, and ordering. Only changed lines are modified.
  • Dependency awareness — the schema encodes option dependencies (e.g. gpu_mem_clock requires vram=1). Enabling a dependent option auto-enables its parent and shows a notice.
  • Config cascade visibility — the conflict page shows all detected config files as a vertical stack ordered by MangoHud's actual priority (env > app-local > per-app XDG > global). Each option that is overridden shows which file wins and which files are shadowed.
  • No hardcoded paths — all paths resolve via XDG spec, $HOME, and runtime detection.
  • Graceful degradation — if MangoHud is not installed, the app opens but shows a clear install prompt. Missing optional tools (vkcube, glxgears, GameMode) are indicated per-feature, not as global errors.

Key Differentiators vs GOverlay

Feature GOverlay MangoTune
Config conflict detection None Visual cascade
Option dependency validation None Full schema
Comment preservation Destroys them Preserved
Multi-file editing Global only All layers
Strict type validation None Blocks save
Wayland support Broken Native GTK4
HiDPI Buggy GTK4 native
XDG compliance Fixed in v1.7 From day one
Toolkit Qt (AppImage) GTK4/Adwaita
Live test launcher vkcube only vkcube+glx+custom