|
All checks were successful
dev release / build (push) Successful in 46s
The fixed /tmp/bread-ecosystem-ci path races when multiple repos' dev/beta workflows run close together on the same self-hosted runner — one job's rm -rf/clone can stomp another's in-progress checkout, causing the regenerate-index step to fail intermittently. Switch to mktemp -d. |
||
|---|---|---|
| .forgejo/workflows | ||
| src | ||
| .gitignore | ||
| bakery.toml | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
breadmon
A terminal UI monitor manager for Hyprland. Lets you position, configure, and mirror displays interactively, then apply changes live via hyprctl.
Requirements
- BOS (Bread OS)'s patched Hyprland build. Applying changes (the
akey / Global keys "Apply") runshyprctl evalwith ahl.monitor({...})Lua call — a BOS-specific extension that does not exist on vanilla/upstream Hyprland. On a non-BOS Hyprland install,hyprctl evalitself is not a recognized request, and breadmon will fail to apply with an explicit error explaining this instead of the raw hyprctl response. Everything else in the TUI (viewing/arranging/saving profiles) works regardless; only the live-apply step needs BOS. - The
hyprctlbinary must be onPATH - Rust toolchain (to build from source)
Build
cargo build --release
The binary is written to target/release/breadmon.
If you use the bread ecosystem, bakery can install it instead:
bread modules install /path/to/breadmon
Usage
breadmon
The TUI opens with four tabs, switchable by number key or mouse click:
| Key | Tab |
|---|---|
1 / F1 |
Layout |
2 / F2 |
Config |
3 / F3 |
Mirror |
4 / F4 |
Profiles |
Layout
A scaled canvas showing all connected monitors. The selected monitor is highlighted.
| Key | Action |
|---|---|
hjkl / arrow keys |
Move selected monitor 1 px |
Shift+hjkl |
Move selected monitor 10 px |
Tab / n |
Cycle to next monitor |
Shift+Tab / p |
Cycle to previous monitor |
0 |
Auto-arrange monitors left-to-right with no gaps |
[ / ] |
Zoom canvas out / in |
| Mouse drag | Drag monitor to reposition |
Monitors snap to each other's edges when dragged or nudged within 10 px.
Config
Per-monitor settings for the currently selected display.
| Key | Action |
|---|---|
jk / Tab |
Move between fields |
hl / scroll |
Cycle field value |
, / . |
Scale −0.1 / +0.1 |
[ / ] |
Switch to previous / next monitor |
Enter |
Commit scale edit and apply |
Esc |
Discard pending edits |
Fields: Resolution, Refresh rate, Scale, Transform (rotation/flip), VRR, DPMS, Mirror of.
The header shows the monitor's PPI and a suggested fractional scale when physical dimensions are available.
Mirror
Finds the best common mode between two monitors and sets one to mirror the other. Use Tab to move focus between source and target, hl to cycle the selection, Enter to confirm.
Profiles
Named snapshots of the current monitor configuration, stored as TOML files.
| Key | Action |
|---|---|
jk |
Navigate profile list |
Enter |
Load selected profile |
d d |
Delete selected profile (double-press within 3 s) |
Tab |
Move focus to name input / save button |
Profiles are saved to ~/.config/breadmon/profiles/.
Global keys
| Key | Action |
|---|---|
a |
Apply current configuration via hyprctl |
s |
Save current configuration as a profile |
r |
Refresh monitor list from Hyprland |
Ctrl+Z |
Undo last change (up to 20 steps) |
q / Ctrl+C |
Quit (prompts once if there are unsaved changes) |
breadmon also listens on Hyprland's event socket and reloads the monitor list automatically when a display is connected or disconnected.
Config
Profiles are plain TOML files under ~/.config/breadmon/profiles/. Each file records the monitor name, mode, position, scale, transform, VRR, DPMS, and mirror source. They are created and managed through the Profiles tab; there is no hand-written config file.