Replace hardcoded MaterialYou seed-based color PRESETS dict with a dynamic
directory-scanning scheme system. The wallpaper auto mode (which uses MaterialYou
seed generation from images) is untouched.
schemepalettes.py
Remove old SeedPalette dataclass + PRESETS dict (hardcoded Hct seeds)
Scan assets/schemes/ for .txt palette files; no JSON descriptors needed
Support per-accent files via {accent}-{mode}.txt naming pattern
Expose 13 schemes with 27+ variants; catppuccin has 14 accents × 4 flavors
Catppuccin color correction
Update mocha/macchiato/frappe/latte .txt colors from dankmaterialshell data
Generate 56 per-accent .txt files (rosewater through lavender)
scheme.py CLI
Load .txt palettes directly for presets, bypassing MaterialYou
Add list-presets command (human + --json output)
--preset <scheme>:<variant> selects a palette (removed :accent shorthand)
--accent <name> picks accent for schemes that support it (catppuccin only)
Validate --accent against variant's available accents; reject invalid with clear error
JSON output includes default_accent per variant so QML UI can pre-select
Auto/wallpaper path still uses MaterialYou seeds (unchanged)
shell.py
Add restart command (kill + start)
Fix call command crash when no method args given
Cleanup
Remove dead preset.py/record.py stubs
Delete catppuccin.py + catppuccin.json (replaced by .txt files)
When automatic scheme mode is disabled, it still has the option to change
scheme mode and scheme type. This can cause issues since that affects the
preset color scheme. These options could be hidden when automatic scheme mode
is disabled, optionally revealing the palette options instead.
With the above, I am not sure hiding palette in the first place is the right
approach. Maybe a different implementation like a toggle between automatic vs
palette is better?
## Description
Replace hardcoded MaterialYou seed-based color `PRESETS` dict with a dynamic
directory-scanning scheme system. The wallpaper auto mode (which uses MaterialYou
seed generation from images) is untouched.
### `schemepalettes.py`
- Remove old `SeedPalette` dataclass + `PRESETS` dict (hardcoded Hct seeds)
- Scan `assets/schemes/` for `.txt` palette files; no JSON descriptors needed
- Support per-accent files via `{accent}-{mode}.txt` naming pattern
- Expose 13 schemes with 27+ variants; catppuccin has 14 accents × 4 flavors
### Catppuccin color correction
- Update mocha/macchiato/frappe/latte `.txt` colors from dankmaterialshell data
- Generate 56 per-accent `.txt` files (rosewater through lavender)
### `scheme.py` CLI
- Load `.txt` palettes directly for presets, bypassing MaterialYou
- Add `list-presets` command (human + `--json` output)
- `--preset <scheme>:<variant>` selects a palette (removed `:accent` shorthand)
- `--accent <name>` picks accent for schemes that support it (catppuccin only)
- Validate `--accent` against variant's available accents; reject invalid with clear error
- JSON output includes `default_accent` per variant so QML UI can pre-select
- Auto/wallpaper path still uses MaterialYou seeds (unchanged)
### `shell.py`
- Add `restart` command (kill + start)
- Fix `call` command crash when no method args given
### Cleanup
- Remove dead `preset.py`/`record.py` stubs
- Delete `catppuccin.py` + `catppuccin.json` (replaced by `.txt` files)
- Strip all comments from modified Python files
### Tests
- 22 tests for schemepalettes (parse, discover, palette loading, accent fallback, resolve_preset)
- 10 tests for shell (all commands mocked, restart verifies kill → start order)
## Suggestions to add later
- When automatic scheme mode is disabled, it still has the option to change
scheme mode and scheme type. This can cause issues since that affects the
preset color scheme. These options could be hidden when automatic scheme mode
is disabled, optionally revealing the palette options instead.
- With the above, I am not sure hiding palette in the first place is the right
approach. Maybe a different implementation like a toggle between automatic vs
palette is better?
- Catppuccin txt colors extracted from dankmaterialyou and created txt
files for each.
- Preset is now an option and are exposed.
- Tests test presets, might add workflow to run tests.
Looks good overall, I have two things I wonder about:
Isn't --accent redundant when the second colon is also for setting accent, or am I misunderstanding? However I do think if there is a difference between the [:accent] and --accent then we should probably rename either to avoid confusion.
Some of the schemes have very little contrast, at least on my system. The m3surface and m3surfaceContainer colors are so similar I can barely tell they're different sometimes. We should probably change that at some point, but not necessary before merge I don't think.
Looks good overall, I have two things I wonder about:
1. Isn't `--accent` redundant when the second colon is also for setting accent, or am I misunderstanding? However I do think if there is a difference between the `[:accent]` and `--accent` then we should probably rename either to avoid confusion.
2. Some of the schemes have very little contrast, at least on my system. The `m3surface` and `m3surfaceContainer` colors are so similar I can barely tell they're different sometimes. We should probably change that at some point, but not necessary before merge I don't think.


Agreed, not a huge fan of the surfaces and the container colors.
--accent is reduntant. Probably AI moment and me not checking thoroughly. Will resolve in next commit.
Agreed, not a huge fan of the surfaces and the container colors.
`--accent` is reduntant. Probably AI moment and me not checking thoroughly. Will resolve in next commit.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Description
Replace hardcoded MaterialYou seed-based color
PRESETSdict with a dynamicdirectory-scanning scheme system. The wallpaper auto mode (which uses MaterialYou
seed generation from images) is untouched.
schemepalettes.pySeedPalettedataclass +PRESETSdict (hardcoded Hct seeds)assets/schemes/for.txtpalette files; no JSON descriptors needed{accent}-{mode}.txtnaming patternCatppuccin color correction
.txtcolors from dankmaterialshell data.txtfiles (rosewater through lavender)scheme.pyCLI.txtpalettes directly for presets, bypassing MaterialYoulist-presetscommand (human +--jsonoutput)--preset <scheme>:<variant>selects a palette (removed:accentshorthand)--accent <name>picks accent for schemes that support it (catppuccin only)--accentagainst variant's available accents; reject invalid with clear errordefault_accentper variant so QML UI can pre-selectshell.pyrestartcommand (kill + start)callcommand crash when no method args givenCleanup
preset.py/record.pystubscatppuccin.py+catppuccin.json(replaced by.txtfiles)Tests
Suggestions to add later
scheme mode and scheme type. This can cause issues since that affects the
preset color scheme. These options could be hidden when automatic scheme mode
is disabled, optionally revealing the palette options instead.
approach. Maybe a different implementation like a toggle between automatic vs
palette is better?
Looks good overall, I have two things I wonder about:
--accentredundant when the second colon is also for setting accent, or am I misunderstanding? However I do think if there is a difference between the[:accent]and--accentthen we should probably rename either to avoid confusion.m3surfaceandm3surfaceContainercolors are so similar I can barely tell they're different sometimes. We should probably change that at some point, but not necessary before merge I don't think.Agreed, not a huge fan of the surfaces and the container colors.
--accentis reduntant. Probably AI moment and me not checking thoroughly. Will resolve in next commit.@zach Resolved.