Reference
Configuration file
Every setting lives in one JSON file that you can edit by hand or through Settings.
On this page
The file
The file is ~/.config/mielwm/config.json. mielwm reads it when it starts and again whenever it changes, so edits apply as soon as you save. Settings writes the same file, and Settings > Advanced > Config file opens it.
A key you leave out keeps its default, so a short file is normal:
Keys can be flat, like "distortion:strength": 0.18, or nested, like "distortion": { "strength": 0.18 }. Both mean the same.
Errors
If the file isn't valid JSON, mielwm keeps its defaults and the menu bar item turns into a warning sign. A key with a bad value or an unknown name is skipped on its own and the rest still apply. Settings > Advanced and the menu's Config has problems… list each error. A number outside a setting's range is clamped to the nearest one that works.
How Settings writes it
Settings leaves keys it didn't touch alone, but JSON comments get lost. A setting changed back to its default disappears from the file.
Layout and workspaces
| Key | Type | Default | What it does |
|---|---|---|---|
layout:default |
text | "tiles" |
The layout of a new workspace: tiles, stack or floating. |
layout:orientation |
text | "auto" |
Tiles side by side, horizontal, above each other, vertical, or by the display's shape, auto. |
layout:stack_peek |
number, 0 to 16 | 0 |
Points the windows behind a stack's front one move aside, so their edges show. |
layout:floating_apps |
text | System Settings, Activity Monitor, Calculator, Archive Utility | Bundle ids, comma separated, whose windows always float. |
layout:workspace_rules |
text | "" |
bundle.id=N pairs, comma separated: that app's windows open on workspace N. |
layout:cross_workspaces |
true or false | false |
Focus and move keys go on into the next workspace at the edge, instead of stopping. |
layout:auto_back_and_forth |
true or false | false |
The key of the workspace you're on takes you to the one before. mielwm workspace N and menu bar apps stay put. |
rules |
object | none | Window rules by app name, bundle id or title. See Window rules. |
Gaps
| Key | Type | Default | What it does |
|---|---|---|---|
gaps:inner_horizontal |
number, 0 to 200 | 8 |
Points between tiles side by side. |
gaps:inner_vertical |
number, 0 to 200 | 8 |
Points between tiles above each other. |
gaps:outer_left, gaps:outer_right, gaps:outer_bottom |
number, 0 to 400 | 12 |
Points between the tiles and the screen edge. |
gaps:outer_top |
number, 0 to 400 | 12 |
The top gap. In Custom, only on the built-in display. |
gaps:outer_top_external |
text or number | "auto" |
The top edge. "auto" adds the height of a status bar found along the top, "same" uses only gaps:outer_top, and a number is Custom: the top gap on every display but the built-in one. |
canvas:gap |
number, 0 to 200 | 12 |
How far Fill, ⌥T, stays from the screen edges. |
Layouts and gaps explains the top edge modes.
Input
| Key | Type | Default | What it does |
|---|---|---|---|
input:swipe_workspaces |
true or false | true |
Three-finger swipes switch workspaces. |
input:move_modifier |
text | "ctrl+opt" |
Held with a drag to move or resize a window anywhere. Any of ctrl, opt, cmd and shift, joined by +. |
input:pan_sensitivity |
number, 0.05 to 5 | 1 |
How far the canvas moves per pan. |
input:scroll_factor |
number, 0.05 to 10 | 1 |
How fast the wheel zooms. |
input:drag_threshold |
number, 0 to 100 | 10 |
Points a middle-button press travels before it pans instead of clicking. |
navigator:pointer |
true or false | true |
Clicks, drags, scrolls and hover work in the overview. |
The overview
| Key | Type | Default | What it does |
|---|---|---|---|
canvas:initial_zoom |
number, 0.05 to 0.95 | 0.72 |
The farthest the overview zooms out when it opens. |
canvas:min_zoom |
number, 0.01 to 1 | 0.05 |
The farthest you can zoom out. |
canvas:max_zoom |
number, 1 to 10 | 2.5 |
The closest you can zoom in. |
canvas:zoom_step |
number, 0.01 to 1 | 0.12 |
One zoom step with ⌘= and ⌘-. |
navigator:enabled |
true or false | true |
The search field and its results. |
navigator:labels |
true or false | true |
The name of the selected window. |
navigator:dim_unmatched |
number, 0 to 1 | 0.7 |
How much windows that don't match a search fade. |
navigator:corner_labels |
true or false | false |
A small readout of zoom, window count and display. |
canvas:minimap_enabled |
true or false | true |
The minimap. |
canvas:minimap_width, canvas:minimap_height |
number | 240, 150 |
Its size in points, 80 to 800 wide and 60 to 600 tall. |
canvas:minimap_margin |
number, 0 to 200 | 24 |
Its distance from the corner. |
canvas:minimap_opacity |
number, 0 to 1 | 0.8 |
Its opacity. |
Panels and color
| Key | Type | Default | What it does |
|---|---|---|---|
navigator:accent |
text | "auto" |
auto for the system accent, a preset name, or #rrggbb. The presets are orange, amber, yellow, lime, green, mint, teal, cyan, sky, blue, indigo, violet, purple, magenta, pink, red and white. |
appearance:glass |
text | "liquid" |
What panels are made of: liquid or frosted. Before macOS 26 they are always frosted. |
navigator:hud_scale |
number, 0.5 to 2 | 1 |
The size of the search field, results and hints. |
navigator:width |
number, 360 to 1400 | 680 |
Width of the search field in points. |
navigator:top |
number, 0 to 0.5 | 0.1 |
Where it sits, as a share of the screen height. |
navigator:search_height |
number, 36 to 110 | 56 |
Height of the search field. |
navigator:rows |
number, 3 to 12 | 6 |
How many results show. |
navigator:row_height |
number, 36 to 96 | 44 |
Height of a result row. |
navigator:query_size, navigator:title_size, navigator:detail_size |
number | 24, 13, 12 |
Text sizes of the search text, result titles and their details. |
navigator:label_size, navigator:corner_size |
number | 12, 12 |
Text sizes of window names and the corner readout. |
The lens and the background
| Key | Type | Default | What it does |
|---|---|---|---|
distortion:enabled |
true or false | true |
The curved lens. |
distortion:strength |
number, -0.5 to 0.5 | 0.14 |
How strongly it bends. Below zero it bends inward. |
distortion:edge_scale |
number, 1 to 1.5 | 1.08 |
How far the canvas extends under the bent edge. |
distortion:feather |
number, 0 to 0.25 | 0.025 |
How softly the bend fades in at the edge. |
distortion:transition_power |
number, 0.1 to 8 | 1 |
How the bend grows as you zoom out. |
distortion:edge_blur, distortion:edge_blur_start |
number | 0, 0.45 |
Blur toward the edges, 0 to 1, and where it starts, 0 to 0.95. |
distortion:vignette |
number, 0 to 1 | 0 |
Darkened corners. |
distortion:chromatic |
number, 0 to 1 | 0 |
Color fringing at the edges. |
wallpaper |
true or false | true |
Your desktop picture behind the canvas. |
canvas:background_dim |
number, 0 to 0.9 | 0.35 |
How much the background darkens. |
blur |
true or false | false |
Blur the background. |
blur_strength |
number, 0 to 1 | 0.7 |
How much. |
canvas:grid_enabled |
true or false | true |
The grid on the canvas. |
canvas:grid_style |
text | "dots" |
dots or lines. |
canvas:grid_size |
number, 24 to 400 | 80 |
Grid spacing in points. Moved and tidied windows snap to it. |
canvas:grid_width, canvas:grid_dot_size |
number | 1, 2.5 |
Line width, 1 to 8, and dot size, 2 to 16. |
canvas:grid_opacity |
number, 0 to 0.5 | 0.1 |
How strong the grid is. |
parallax:enabled |
true or false | true |
The background moves a little slower than the canvas. |
parallax:strength, parallax:depth |
number | 0.06, 0.12 |
How much, 0 to 0.5, and how deep it feels, 0 to 1. |
window:rounding |
number, 0 to 40 | 10 |
Window corners in the overview. |
window:shadow |
true or false | true |
Window shadows in the overview. |
Placement and tidying
| Key | Type | Default | What it does |
|---|---|---|---|
canvas:remember_layout |
true or false | true |
Windows come back to their places after a restart. |
canvas:auto_place |
true or false | true |
A floating window found off screen gets a free spot near the camera. |
canvas:placement_gap |
number, 0 to 400 | 40 |
Space it keeps from other windows. |
canvas:snap_enabled |
true or false | true |
Moved and tidied windows snap to the grid. |
canvas:arrange_context_grouping |
true or false | true |
Tidying groups windows by what they're for. |
canvas:arrange_size_similarity |
number, 0 to 0.5 | 0.12 |
How alike sizes must be to share a row when tidying. |
canvas:arrange_resize_limit |
number, 0 to 0.5 | 0.15 |
How much tidying may resize a window. |
Animation, menu bar and apps
| Key | Type | Default | What it does |
|---|---|---|---|
animation:enabled |
true or false | true |
Camera flights. Off, mielwm cuts. |
animation:speed |
number, 0.2 to 8 | 1 |
1 flies in 0.8 seconds, 2 in 0.4. |
animation:curve |
text | "spring" |
spring or bezier. |
menubar:style |
text | "all" |
What the menu bar item shows: all workspaces with windows, the current one only, or the icon. The older "menubar:workspaces": false still means icon. |
notices:workspace |
true or false | true |
The workspace pill shows at the bottom of the display for a moment after you switch. |
integrations:barik |
true or false | false |
A supported menu bar app shows mielwm's workspaces. Turn it on in Settings, which also edits the app's config. See AeroSpace-compatible apps. |
Shortcuts
keys:<chord> binds a chord to an action. Write chords as modifiers and a key joined by +: ctrl+opt+g, opt+shift+left, cmd+,. Modifiers are ctrl, opt, cmd and shift. Set a chord to "none" to unbind a default, or to "noop" to have it do nothing at all, so the key never reaches an app.
The action names are the same as the command line ones. By default ⌥0, ⌥⇧0 and ⌥; are noop, so they never type º, ‚ or … by accident.
The layout file
mielwm remembers where your windows sit in ~/Library/Application Support/mielwm/layout.json, so they come back to their spots after a restart. It writes that file on its own, and you never need to edit it. If windows keep coming back in strange places, quit mielwm, delete the file and open mielwm again.
{ "layout:default": "tiles", "gaps:inner_horizontal": 8, "layout:workspace_rules": "com.spotify.client=2,com.hnc.Discord=1", "distortion": { "strength": 0.18 }, "navigator:accent": "cyan", "keys:opt+space": "overview", "keys:ctrl+opt+g": "none" }