flow-wm 0.1.1

A scrolling, infinite-horizontal-canvas tiling window manager for Windows
#: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

columns_per_screen = 4



# Minimum column width in pixels. Columns cannot be resized below this.

min_column_width_px = 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.

min_window_height_px = 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.

check_for_updates = 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)

[padding]

window_gap = 16

up = 0

down = 0



# Animation settings for layout transitions.

[animation]

enabled = true

duration_ms = 240

easing = "ease-out-expo"



# Strategy for restoring minimized tiling windows.

# Options: original_slot, right_of_focused, append_right

[minimize_restore]

strategy = "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".

[borders]

enabled = true

thickness = 3

overlap = 1

focused_color = "#00AAFF"

unfocused_color = "#555555"

floating_color = "#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.

[floating]

# 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.

[focus]

foreground_sync_interval_ms = 250