Skip to main content

max / alloy

skel: repair the configs that were being discarded at runtime Three apps were running on stock defaults because their config named something the package no longer accepts. None of them says so; each fails the whole file and carries on. rio: `backend = "Automatic"` is a variant rio 0.4.11 dropped. An unknown enum is a TOML parse error, not a warning about one key, so rio discarded the entire file and ran stock. That is why the terminal shipped with none of the Akari palette and none of the font settings. Omitting the key is what "Automatic" was asking for anyway; rio's own --write-config output carries no [renderer] section at all. The schema in schemas/ documented the same dead default and is corrected. yazi: the theme schema moved and yazi 26 drops unknown keys in silence, so the old spellings parsed clean and painted nothing. [manager] is [mgr], rules match on `url` rather than `name`, hovered became an [indicator] section, tabs and mode became their own sections, permissions_* became perm_*, [select] is [pick], [completion] is [cmp], and [help] exec is run. Migrated against yazi's own embedded preset theme rather than guesswork. The preset's `reversed = true` for the hovered row inverts whatever filetype color the row carries, which turned it into a dark navy block against this palette, so the pair is named explicitly. gammastep: every key was padded with spaces to align the values, and its INI parser does not trim the key, so each line was read as a setting named "temp-day " and reported unknown. Cosmetic alignment disabled the whole file and the screen never warmed at night. rio also moves to the single-cell Nerd Font family; see the fontconfig change for why.
Co-Authored-By
Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-07-22 21:13 UTC
Signed with PGP, not checked
Commit: a7d57fb226c278bc0fa3d2bb9562a718d03c82fd
Parent: 773e083
5 files changed, +183 insertions, -69 deletions
@@ -97,12 +97,13 @@
97 97 description = "Render-loop performance target. Lower reduces GPU load on battery."
98 98 values = ["High", "Low"]
99 99
100 - [[field]]
101 - path = "renderer.backend"
102 - type = "enum"
103 - default = "Automatic"
104 - description = "GPU backend. Automatic lets wgpu pick vulkan / gl / metal per platform."
105 - values = ["Automatic", "Vulkan", "GL", "Metal", "DX12"]
100 + # renderer.backend is deliberately absent.
101 + #
102 + # It was described here as an enum defaulting to "Automatic". Rio 0.4.11 does
103 + # not accept that variant, and rejecting a value is not local to the key: the
104 + # file fails to parse and rio falls back to stock defaults entirely. Alloy's
105 + # config now omits the key, which is what "Automatic" meant, so there is no
106 + # variant list here to drift out of step with the package again.
106 107
107 108 [[field]]
108 109 path = "renderer.disable-unfocused-render"
@@ -3,22 +3,29 @@
3 3 ; Time-based transitions with sensible temperate-zone defaults. Adjust
4 4 ; dawn-time / dusk-time to your local sunrise / sunset window, or switch
5 5 ; to location-provider=geoclue2 if you want automatic sun-position input.
6 + ;
7 + ; Keys are written tight against the `=` on purpose. gammastep's INI parser
8 + ; does not trim the key, so `temp-day = 6500` is read as a setting literally
9 + ; named "temp-day " and reported as unknown. Aligning the values, which every
10 + ; other config in this tree does, silently disabled every line in this file:
11 + ; the screen never warmed at night and gammastep ran on its own defaults.
12 + ; Verified against gammastep's own `-p` output.
6 13
7 14 [general]
8 - temp-day = 6500
9 - temp-night = 3700
10 - fade = 1
11 - gamma = 1.0
12 - adjustment-method = wayland
13 - location-provider = manual
15 + temp-day=6500
16 + temp-night=3700
17 + fade=1
18 + gamma=1.0
19 + adjustment-method=wayland
20 + location-provider=manual
14 21
15 22 ; Fallback location if you don't set the [time] section.
16 23 ; Central US-ish default; adjust to your latitude/longitude.
17 24 [manual]
18 - lat = 40.0
19 - lon = -105.0
25 + lat=40.0
26 + lon=-105.0
20 27
21 28 ; Uncomment to switch from location-based to time-based transitions.
22 29 ; [time]
23 - ; dawn-time = 6:30-7:45
24 - ; dusk-time = 18:00-19:30
30 + ; dawn-time=6:30-7:45
31 + ; dusk-time=18:00-19:30
@@ -16,7 +16,15 @@
16 16
17 17 [renderer]
18 18 performance = "High"
19 - backend = "Automatic" # wgpu picks vulkan/gl/mtl per platform
19 + # No `backend` key. Rio 0.4.11 dropped the `Automatic` variant, and a value it
20 + # does not recognise is not a warning about one line. It is a TOML parse
21 + # error, and rio discards the WHOLE file and falls back to stock. That is how
22 + # this terminal shipped black-on-white with none of the palette below and none
23 + # of the font settings above: one stale enum, every other key silently inert.
24 + #
25 + # Omitting the key is what "Automatic" was asking for anyway. Rio's own
26 + # `--write-config` output carries no `[renderer]` section at all, so the
27 + # default already is "let wgpu pick per platform", with nothing to go stale.
20 28 disable-unfocused-render = false
21 29
22 30 # -------------------------------------------------------------------
@@ -25,25 +33,25 @@
25 33 # -------------------------------------------------------------------
26 34 [fonts]
27 35 size = 12
28 - family = "IosevkaTerm Nerd Font"
36 + family = "IosevkaTerm Nerd Font Mono"
29 37
30 38 [fonts.regular]
31 - family = "IosevkaTerm Nerd Font"
39 + family = "IosevkaTerm Nerd Font Mono"
32 40 style = "Normal"
33 41 weight = 400
34 42
35 43 [fonts.bold]
36 - family = "IosevkaTerm Nerd Font"
44 + family = "IosevkaTerm Nerd Font Mono"
37 45 style = "Normal"
38 46 weight = 600
39 47
40 48 [fonts.italic]
41 - family = "IosevkaTerm Nerd Font"
49 + family = "IosevkaTerm Nerd Font Mono"
42 50 style = "Italic"
43 51 weight = 400
44 52
45 53 [fonts.bold-italic]
46 - family = "IosevkaTerm Nerd Font"
54 + family = "IosevkaTerm Nerd Font Mono"
47 55 style = "Italic"
48 56 weight = 600
49 57
@@ -2,86 +2,173 @@
2 2 #
3 3 # Palette source: makeover's themes/akari-dawn.toml.
4 4 # Filetype icons come from IosevkaTerm Nerd Font (STACK.md#fonts).
5 + #
6 + # Written against yazi 26's theme schema, which is not the one this file was
7 + # first authored for. Yazi reorganised it and does not complain about the
8 + # difference: an unknown section or key is dropped in silence, so the old
9 + # spellings parsed cleanly and simply never painted anything. What moved:
10 + #
11 + # [manager] -> [mgr]
12 + # hovered / preview_hovered -> [indicator] current / parent / preview
13 + # tab_active / tab_inactive -> [tabs] active / inactive
14 + # tab_width -> gone
15 + # [status] mode_* -> [mode] normal_main / normal_alt / select_* / unset_*
16 + # [status] separator_* -> [status] sep_left / sep_right, as open/close pairs
17 + # [status] permissions_* -> [status] perm_type / perm_read / perm_write / perm_exec
18 + # [select] -> [pick]
19 + # [completion] -> [cmp]
20 + # [help] exec -> [help] run
21 + #
22 + # Yazi loads its own theme-dark.toml or theme-light.toml first, chosen by the
23 + # terminal's background, and treats this file as an override on top. Rio ships
24 + # a light background (surface.page), so the light preset is the one underneath.
25 + # Only keys named here are ours; anything omitted stays yazi's.
5 26
6 - [manager]
7 - cwd = { fg = "#1a1816" } # text-primary
27 + # : Manager {{{
28 + [mgr]
29 + cwd = { fg = "#1a1816" } # content.primary
8 30
9 - hovered = { fg = "#1a1816", bg = "#dad2c7" } # border-subtle
10 - preview_hovered = { underline = true }
31 + # Find
32 + find_keyword = { fg = "#b07840", bold = true } # status.warning
33 + find_position = { fg = "#3a5830", bold = true } # status.success
11 34
12 - find_keyword = { fg = "#b07840", bold = true } # accent-warn
13 - find_position = { fg = "#3a5830", bold = true } # accent-ok
35 + # Symlink
36 + symlink_target = { italic = true }
14 37
15 - marker_selected = { fg = "#3a5830", bg = "#3a5830" }
38 + # Marker
16 39 marker_copied = { fg = "#b07840", bg = "#b07840" }
17 40 marker_cut = { fg = "#6a2828", bg = "#6a2828" }
41 + marker_marked = { fg = "#304050", bg = "#304050" }
42 + marker_selected = { fg = "#3a5830", bg = "#3a5830" }
18 43
19 - tab_active = { fg = "#1a1816", bg = "#ede7de", bold = true } # surface-raised
20 - tab_inactive = { fg = "#514b45", bg = "#e4ded6" } # text-muted / surface
21 - tab_width = 1
22 -
44 + # Count
23 45 count_copied = { fg = "#ede7de", bg = "#b07840" }
24 46 count_cut = { fg = "#ede7de", bg = "#6a2828" }
25 47 count_selected = { fg = "#ede7de", bg = "#3a5830" }
26 48
49 + # Border
27 50 border_symbol = "│"
28 - border_style = { fg = "#cabeae" } # border
51 + border_style = { fg = "#cabeae" } # line.border
52 + # : }}}
29 53
54 + # : Indicator of hovered file {{{
55 + # Yazi's preset uses `reversed = true` here, which inverts whatever filetype
56 + # color the row already carries. Against this palette that turned the hovered
57 + # row into a dark navy block, because directories are content.secondary. Naming
58 + # the pair explicitly keeps the hover on the surface ramp.
59 + [indicator]
60 + parent = { fg = "#1a1816", bg = "#dad2c7" } # border-subtle
61 + current = { fg = "#1a1816", bg = "#dad2c7" }
62 + preview = { underline = true }
63 + # : }}}
64 +
65 + # : Tabs {{{
66 + [tabs]
67 + active = { fg = "#1a1816", bg = "#ede7de", bold = true } # surface.raised
68 + inactive = { fg = "#514b45", bg = "#e4ded6" } # content.muted
69 + # : }}}
70 +
71 + # : Mode {{{
72 + [mode]
73 + normal_main = { fg = "#1a1816", bg = "#ede7de", bold = true }
74 + normal_alt = { fg = "#514b45", bg = "#dad2c7" }
75 + select_main = { fg = "#ede7de", bg = "#b07840", bold = true }
76 + select_alt = { fg = "#b07840", bg = "#dad2c7" }
77 + unset_main = { fg = "#ede7de", bg = "#6a2828", bold = true }
78 + unset_alt = { fg = "#6a2828", bg = "#dad2c7" }
79 + # : }}}
80 +
81 + # : Status bar {{{
30 82 [status]
31 - separator_open = ""
32 - separator_close = ""
33 - separator_style = { fg = "#cabeae", bg = "#ede7de" }
83 + overall = { fg = "#1a1816", bg = "#ede7de" }
34 84
35 - mode_normal = { fg = "#1a1816", bg = "#ede7de", bold = true }
36 - mode_select = { fg = "#1a1816", bg = "#b07840", bold = true }
37 - mode_unset = { fg = "#1a1816", bg = "#6a2828", bold = true }
85 + # Permissions
86 + perm_sep = { fg = "#514b45" }
87 + perm_type = { fg = "#222d38" } # content.secondary
88 + perm_read = { fg = "#b07840" }
89 + perm_write = { fg = "#6a2828" }
90 + perm_exec = { fg = "#3a5830" }
38 91
92 + # Progress
39 93 progress_label = { fg = "#1a1816", bold = true }
40 94 progress_normal = { fg = "#3a5830", bg = "#dad2c7" }
41 95 progress_error = { fg = "#6a2828", bg = "#dad2c7" }
96 + # : }}}
42 97
43 - permissions_t = { fg = "#222d38" }
44 - permissions_r = { fg = "#b07840" }
45 - permissions_w = { fg = "#6a2828" }
46 - permissions_x = { fg = "#3a5830" }
47 - permissions_s = { fg = "#514b45" }
48 -
49 - [select]
98 + # : Picker {{{
99 + [pick]
50 100 border = { fg = "#cabeae" }
51 - active = { fg = "#b07840" }
101 + active = { fg = "#8a4530", bold = true } # action.primary
52 102 inactive = {}
103 + # : }}}
53 104
105 + # : Input {{{
54 106 [input]
55 107 border = { fg = "#cabeae" }
56 108 title = {}
57 109 value = {}
58 - selected = { reversed = true }
110 + selected = { fg = "#1a1816", bg = "#dad2c7" }
111 + # : }}}
59 112
60 - [completion]
113 + # : Completion {{{
114 + [cmp]
61 115 border = { fg = "#cabeae" }
62 - active = { bg = "#dad2c7" }
116 + active = { fg = "#1a1816", bg = "#dad2c7" }
63 117 inactive = {}
118 + # : }}}
64 119
120 + # : Task manager {{{
65 121 [tasks]
66 122 border = { fg = "#cabeae" }
67 123 title = {}
68 - hovered = { underline = true }
124 + hovered = { fg = "#8a4530", bold = true }
125 + # : }}}
69 126
127 + # : Confirmation {{{
128 + [confirm]
129 + border = { fg = "#cabeae" }
130 + title = { fg = "#8a4530" }
131 + body = {}
132 + list = {}
133 + btn_yes = { fg = "#ede7de", bg = "#8a4530", bold = true }
134 + btn_no = {}
135 + # : }}}
136 +
137 + # : Spotter {{{
138 + [spot]
139 + border = { fg = "#cabeae" }
140 + title = { fg = "#8a4530" }
141 + tbl_col = { fg = "#222d38" }
142 + tbl_cell = { fg = "#1a1816", bg = "#dad2c7" }
143 + # : }}}
144 +
145 + # : Notification {{{
146 + [notify]
147 + title_info = { fg = "#3a5830" }
148 + title_warn = { fg = "#b07840" }
149 + title_error = { fg = "#6a2828" }
150 + # : }}}
151 +
152 + # : Which {{{
70 153 [which]
71 154 mask = { bg = "#ede7de" }
72 - cand = { fg = "#3a5830" } # accent-ok
155 + cand = { fg = "#3a5830" } # status.success
73 156 rest = { fg = "#514b45" }
74 157 desc = { fg = "#b07840" }
75 158 separator = " "
76 159 separator_style = { fg = "#cabeae" }
160 + # : }}}
77 161
162 + # : Help menu {{{
78 163 [help]
79 164 on = { fg = "#b07840" }
80 - exec = { fg = "#3a5830" }
165 + run = { fg = "#3a5830" }
81 166 desc = { fg = "#514b45" }
82 - hovered = { bg = "#dad2c7", bold = true }
167 + hovered = { fg = "#1a1816", bg = "#dad2c7", bold = true }
83 168 footer = { fg = "#e4ded6", bg = "#222d38" }
169 + # : }}}
84 170
171 + # : File-specific styles {{{
85 172 [filetype]
86 173 rules = [
87 174 # Images
@@ -89,19 +176,23 @@
89 176 # Videos
90 177 { mime = "video/*", fg = "#b07840" },
91 178 # Audio
92 - { mime = "audio/*", fg = "#9a6bb0" },
179 + { mime = "audio/*", fg = "#806080" },
93 180 # Archives
94 - { mime = "application/zip", fg = "#4a86c0" },
95 - { mime = "application/gzip", fg = "#4a86c0" },
96 - { mime = "application/x-tar", fg = "#4a86c0" },
97 - { mime = "application/x-bzip", fg = "#4a86c0" },
98 - { mime = "application/x-bzip2", fg = "#4a86c0" },
99 - { mime = "application/x-7z-compressed", fg = "#4a86c0" },
100 - { mime = "application/x-rar", fg = "#4a86c0" },
101 - { mime = "application/xz", fg = "#4a86c0" },
181 + { mime = "application/zip", fg = "#304050" },
182 + { mime = "application/gzip", fg = "#304050" },
183 + { mime = "application/x-tar", fg = "#304050" },
184 + { mime = "application/x-bzip", fg = "#304050" },
185 + { mime = "application/x-bzip2", fg = "#304050" },
186 + { mime = "application/x-7z-compressed", fg = "#304050" },
187 + { mime = "application/x-rar", fg = "#304050" },
188 + { mime = "application/xz", fg = "#304050" },
102 189 # PDF
103 190 { mime = "application/pdf", fg = "#6a2828" },
191 + # Broken links and executables, ahead of the catch-alls
192 + { url = "*", is = "orphan", fg = "#6a2828" },
193 + { url = "*", is = "exec", fg = "#8a4530" },
104 194 # Fallback
105 - { name = "*", fg = "#1a1816" },
106 - { name = "*/", fg = "#222d38" }, # directories
195 + { url = "*", fg = "#1a1816" },
196 + { url = "*/", fg = "#222d38" }, # directories
107 197 ]
198 + # : }}}
@@ -5,8 +5,15 @@
5 5 # (STACK.md#terminal); no explicit backend key needed here.
6 6 #
7 7 # Theme in theme.toml.
8 + #
9 + # Two key names here track yazi's schema and have already moved once. The
10 + # section is `[mgr]`, renamed from `[manager]` in 25.5.31, and rules match on
11 + # `url`, renamed from `name`. Both were still on the old spelling against yazi
12 + # 26.5.6, and yazi does not warn about a key it does not know: it fails to
13 + # parse the file, prints "continue with preset settings", and runs stock. The
14 + # whole Akari theme in theme.toml went with it. Check both after a yazi bump.
8 15
9 - [manager]
16 + [mgr]
10 17 ratio = [1, 3, 4] # parent / current / preview
11 18 sort_by = "natural"
12 19 sort_sensitive = false
@@ -52,13 +59,13 @@
52 59
53 60 [open]
54 61 rules = [
55 - { name = "*/", use = "open" },
62 + { url = "*/", use = "open" },
56 63 { mime = "text/*", use = "edit" },
57 64 { mime = "image/*", use = "view" },
58 65 { mime = "video/*", use = "play" },
59 66 { mime = "audio/*", use = "play" },
60 67 { mime = "application/pdf", use = "read-pdf" },
61 - { name = "*", use = "open" },
68 + { url = "*", use = "open" },
62 69 ]
63 70
64 71 [tasks]