1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#:schema ./schemas/flow-config.schema.json
# Example application configuration for FlowWM.
#
# This file is a HAND-WRITTEN EXAMPLE. `flow config init` copies it verbatim
# into your config directory (~/.config/flow/flow.toml) as a fully-commented
# starting point.
#
# It is NOT read at runtime. The canonical default values live in code, in
# src/config/defaults.rs, and are applied by serde when fields are absent from
# your flow.toml. That means your flow.toml may be partial or even empty.
#
# Keep this file in sync with src/config/defaults.rs: the test
# `default_config_toml_matches_compiled_defaults` enforces that deserializing
# this file yields exactly FlowConfig::default().
#
# For field documentation, see the FlowConfig docstring in src/config/types.rs.
# Number of columns that fit side-by-side on one monitor screen.
# The actual pixel width of each column is computed at runtime from this value,
# the monitor resolution, and window_gap — so the layout always fills the screen.
#
# Power users can override the auto-computed width by setting column_width explicitly:
# column_width = 1280 # (optional) fixed pixel width, ignores columns_per_screen
= 4
# Minimum column width in pixels. Columns cannot be resized below this.
= 640
# Minimum row height in pixels — the floor for any single window's allocated
# height inside a column. Bounds the maximum number of rows that can stack
# inside one column, and the lower clamp for future drag / IPC continuous
# height adjustment of individual rows.
= 100
# Minimum row height in pixels — the dedicated vertical floor for drag-resize
# of a single row. Dragging a row boundary cannot shrink either row below this,
# and once the shrinking row hits it the edge elastically pins (overshoot during
# the drag, snap back on release). Distinct from min_window_height_px (the
# row-stack-count cap); the two are independent.
= 100
# Whether `flow start` checks GitHub for a newer release and, if one exists,
# prints a one-line notification prompting `flow update`. The check runs after
# the daemon is ready, is bounded by a short timeout, and never blocks or
# aborts startup. Explicit `flow update --check` is always available regardless
# of this flag. Set to false to silence the start-time notification.
= true
# Padding / spacing settings in pixels.
#
# - window_gap: uniform gap between all elements (windows and screen edges)
# - up: reserved space above the tiling area
# - down: reserved space below the tiling area (e.g., for taskbar clearance)
[]
= 16
= 0
= 0
# Animation settings for layout transitions.
[]
= true
= 240
= "ease-out-expo"
# Strategy for restoring minimized tiling windows.
# Options: original_slot, right_of_focused, append_right
[]
= "original_slot"
# Window border overlay settings.
#
# Each managed window gets a thin colored ring drawn as a separate layered
# overlay window that follows the target's HWND geometry. This produces sharp
# komorebi/Hyprland-style borders that the default Windows drop-shadow cannot.
#
# - enabled: master switch (false = no overlays created)
# - thickness: border ring width in pixels (applied on all four sides)
# - overlap: px the ring overlaps the window content (0 = full gap,
# thickness = content fills the slot); closes the DWM hairline
# - focused_color: border color for the focused/active window
# - unfocused_color: border color for tiled-but-not-focused windows
# - floating_color: border color for floating windows
#
# Colors are hex strings of the form "#RRGGBB".
[]
= true
= 3
= 1
= "#00AAFF"
= "#555555"
= "#AA00FF"
# Floating window configuration (both fields optional).
#
# When unset, the daemon falls back to a built-in policy: 60% × 80% of the
# monitor work area, capped at ~1536 × 1152 (QHD-derived) so ultrawide / 4K
# monitors don't produce absurdly large popups. An explicit pixel value below
# is always respected as-is — the cap applies only to the fallback path.
[]
# default_width = 1200 # (optional) explicit default float width in pixels
# default_height = 800 # (optional) explicit default float height in pixels
# Focus reconciliation settings.
#
# EVENT_SYSTEM_FOREGROUND is a best-effort stream: under rapid window churn
# (e.g. a browser closing multiple tabs), the OS can settle the foreground
# without emitting the final event, leaving flow's internal focus stuck on a
# stale window. The daemon closes that gap by periodically reconciling its
# tracked focus against the authoritative GetForegroundWindow() query.
#
# - foreground_sync_interval_ms: interval between reconciliation passes (ms).
# The common (in-sync) pass is a single microsecond-scale read that no-ops.
[]
= 250
# Tile-drag configuration.
#
# When a user drags a tiled window by its title bar, a live non-committing
# preview reflows the other windows to the prospective layout on each zone
# change; on release the move commits and the dragged window snaps into its
# slot. Floating windows never enter the drag state machine.
#
# - edge_scroll_width: px band at screen edge that triggers viewport scroll
# - col_edge_ratio: fraction of column width for column-insert edge band
# - col_edge_max_px: pixel cap on the column-insert hit band
# - edge_scroll_initial_delay_ms: gap (ms) from the immediate entry scroll to the
# first repeat; clamped up to the repeat interval
# - edge_scroll_repeat_interval_ms: gap (ms) between successive column scrolls while
# held; clamped up to the animation duration and an
# internal spam-guard floor
[]
= 30
= 0.18
= 120
= 500
= 240
# Loadout save/restore settings.
#
# - default_path: file name (relative to config dir) used by
# `flow loadout save` and `flow loadout restore`
[]
= "loadout.json"