mirror of github.com/Breadway/breadmon
Find a file
Breadway d73eacf40f
All checks were successful
check / check (push) Successful in 26s
ci: build against bread-ecosystem's shared Arch CI image, add check.yml
Same fix as breadpad: build inside the shared pinned Arch container
(bread-ecosystem/ci/, cloned at the sha in ci/bread-ecosystem.rev)
instead of building natively against whatever's on the runner host.
Adds check.yml (clippy + test on feature/**/fix/**) as a fast-fail gate
before anything reaches main.

Turning on clippy -D warnings for the first time surfaced 10 pre-existing
warnings (int_plus_one, ptr_arg on &mut Vec params, collapsible_if,
collapsible_match) across layout.rs, mirror.rs, profile.rs, and the
config/mirror TUI views — all fixed exactly per clippy's suggested diffs,
verified behavior-preserving (the mirror_view.rs collapse in particular:
confirmed the "do nothing" fallthrough when mirror.result is None is
unchanged, since that was already the fallthrough behavior of the
original nested if with no matching else on the outer condition).

Verified locally: build, clippy, and test all pass through the new
container path.
2026-08-05 14:02:47 +08:00
.forgejo/workflows ci: build against bread-ecosystem's shared Arch CI image, add check.yml 2026-08-05 14:02:47 +08:00
ci ci: build against bread-ecosystem's shared Arch CI image, add check.yml 2026-08-05 14:02:47 +08:00
src ci: build against bread-ecosystem's shared Arch CI image, add check.yml 2026-08-05 14:02:47 +08:00
.gitignore random commit message, read it yourself 2026-07-22 11:55:43 +08:00
bakery.toml Initial commit 2026-07-02 20:59:16 +08:00
Cargo.lock Switch to tag-pinned bread-ecosystem deps; bump version to v0.1.2 2026-07-19 03:52:45 +08:00
Cargo.toml Switch to tag-pinned bread-ecosystem deps; bump version to v0.1.2 2026-07-19 03:52:45 +08:00
CONTRIBUTING.md CONTRIBUTING.md: document single-trunk + RC-tag release model 2026-07-31 11:08:41 +08:00
LICENSE Initial commit 2026-07-02 20:59:16 +08:00
README.md breadmon: clear error for missing BOS hyprctl eval extension, doc, version fix 2026-07-17 03:22:52 +08:00

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 a key / Global keys "Apply") runs hyprctl eval with a hl.monitor({...}) Lua call — a BOS-specific extension that does not exist on vanilla/upstream Hyprland. On a non-BOS Hyprland install, hyprctl eval itself 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 hyprctl binary must be on PATH
  • 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.