No description
Find a file
Breadway 470d2aa7e9 bread-launcher: log history save failures, clarify LAUNCHER_APP vs event namespace
LaunchHistory::save silently swallowed write errors; now shared by two
hosts (breadbox + breadbar's capsule), a broken cache dir silently
stopped recording launches for both. Log on failure instead.

do_launch/emit_launched's app_id parameter is the caller's bread
event-namespace id (breadbox passes "box"), not LAUNCHER_APP
("breadbox", scoped to cache/history paths only) - two similarly
named but distinct identities. Make the doc comments say so explicitly
and add tests pinning the exact namespace-check relationship, since
confusing them silently drops the emitted event.
2026-08-31 15:15:36 +08:00
.forgejo/workflows ci: export VERSION for rc sign steps and drop unsafe tag path filters 2026-08-23 14:37:08 +08:00
bakery bakery: add system prefix installs for BOS 2026-08-16 00:00:19 +08:00
bread-app workspace: add bread-app crate and first-cut bread-polkit agent 2026-08-16 00:34:12 +08:00
bread-capture bread-capture: add breadbar's capsule-sections and capsule-calc views 2026-08-31 15:14:44 +08:00
bread-launcher bread-launcher: log history save failures, clarify LAUNCHER_APP vs event namespace 2026-08-31 15:15:36 +08:00
bread-onnx bread-onnx: fix workspace test build with load-dynamic dev-dependency 2026-08-07 10:51:24 +08:00
bread-polkit bread-polkit: add bakery.toml so the agent can be published later 2026-08-23 14:38:04 +08:00
bread-screenshots bread-capture: switch capture isolation to headless Sway 2026-07-29 11:15:41 +08:00
bread-theme bread-theme: clamp spring_to's interpolated value to [from,to] 2026-08-31 15:15:36 +08:00
bread-utils bread-utils: pin bread-shared to v0.8.0 2026-08-23 14:38:04 +08:00
ci ci: take product name explicitly instead of deriving it from checkout dir 2026-08-05 09:03:22 +08:00
docs workspace: bump bakery version to 0.7.2 and document tag honesty 2026-08-15 22:13:38 +08:00
packaging/arch workspace: bump bakery version to 0.7.2 and document tag honesty 2026-08-15 22:13:38 +08:00
registry platform: BreadClient command/health, fail-closed get.sh, registry README 2026-08-15 21:39:08 +08:00
scripts platform: BreadClient command/health, fail-closed get.sh, registry README 2026-08-15 21:39:08 +08:00
.gitignore gitignore: exclude graphify-out and .grok local tool caches 2026-08-31 15:15:36 +08:00
AGENTS.md bakery: add system prefix installs for BOS 2026-08-16 00:00:19 +08:00
bakery.toml fix: comprehensive bakery package manager audit and repair 2026-06-11 13:37:09 +08:00
BREAD_DESIGN_SYSTEM.md Fix audit findings: bakery index signing, artifact checksums, stale theme docs 2026-07-17 03:37:51 +08:00
Cargo.lock Add bread-launcher: headless app-launcher core + GTK4 results widget 2026-08-31 15:14:44 +08:00
Cargo.toml Add bread-launcher: headless app-launcher core + GTK4 results widget 2026-08-31 15:14:44 +08:00
CONTRIBUTING.md bread-polkit: add bakery.toml so the agent can be published later 2026-08-23 14:38:04 +08:00
LICENSE Add push-mirror provisioning, bread_client, README/identity fixes; bump to 0.3.0 2026-07-19 03:07:40 +08:00
README.md bread-polkit: add bakery.toml so the agent can be published later 2026-08-23 14:38:04 +08:00
upgrade.md Will change this commit message to mean something later 2026-07-23 11:12:55 +08:00

Bread Ecosystem

A collection of Rust tools for the Linux desktop (Hyprland / Wayland / Arch). Install any product with a single command — no Rust toolchain required.

curl -fsSL https://get.breadway.dev | sh
bakery install breadbar

Products

The table below is generated from registry/bread-ecosystem.toml. Regenerate with scripts/gen-readme-products.sh.

Package Description
bakery Bread ecosystem package manager
bread-theme Shared pywal-accented, fixed-dark-base theming CLI for the bread ecosystem
bread Reactive automation daemon and CLI for Linux desktops
breadbar Minimal status bar and notification daemon for Hyprland
breadbox App launcher for Hyprland / Wayland
breadcrumbs Profile-aware Wi-Fi state machine with Tailscale integration
breadpad Quick-capture scratchpad and note viewer with AI classification
breadpaper Wallpaper manager for the bread desktop
breadmon Terminal UI monitor manager for Hyprland
breadsearch Semantic system-wide search for BOS
breadclip Wayland clipboard history manager for Hyprland
breadshot Screenshot utility for the bread ecosystem
bos-settings System settings app for Bread OS
breadhelp Onboarding and help center for Bread OS
breadcast Cast your screen to any Chromecast/Google TV or DLNA renderer — daemon + GTK4 popup — Bakery product; not included in the BOS ISO
breadarr Single-daemon Sonarr+Radarr+Prowlarr replacement — release watching, matching, grabbing, importing, and a terminal UI, no web UI — Homelab, not shipped on BOS

The ecosystem assumes a Hyprland setup with SUPER as the modifier. The conventional bindings (used by BOS and recommended for any install):

Keys Action
SUPER+Space breadbox — app launcher
SUPER+U breadpad — quick-capture notes/reminders
SUPER+M breadman — note viewer / manager
SUPER+, settings (bos-settings, where installed)

breadbar and breadd are services started at login (exec-once), not bound to keys.

Theming

All GUI products (breadbar, breadbox, breadpad) share one stylesheet via bread-theme. Background, surface, overlay, and foreground are always BOS's fixed dark values; only the accent colors are read from the pywal palette in ~/.cache/wal/colors.json. When that file is absent, the accents fall back to BOS's curated bread-toned defaults (not Catppuccin Mocha). The stylesheet is written to $XDG_RUNTIME_DIR/bread/theme.css; running apps watch that file and recolour live when it changes. Per-app CSS overrides live at ~/.config/<app>/style.css.

wal -i ~/Pictures/wall.png   # regenerate pywal palette
bread-theme generate         # render the shared stylesheet (run from a wal hook)

bread-theme subcommands:

Subcommand Description
generate Render the current palette and write the shared stylesheet (default)
reload Same as generate; use after a palette change to trigger live recolour in running apps
path Print the stylesheet path
print Render the stylesheet to stdout without writing

The shared theming logic lives in the bread-theme crate in this repo. See BREAD_DESIGN_SYSTEM.md for the design tokens (fonts, spacing, radii, colour roles) the stylesheet is built from.

Installing bakery

bakery is the package manager for the ecosystem. Install it with the bootstrap script:

curl -fsSL https://get.breadway.dev | sh

The script downloads the prebuilt bakery binary to ~/.local/bin/bakery and prints a note if that directory isn't on your PATH yet.

Using bakery

bakery list                    # all available packages
bakery list --installed        # only installed packages
bakery info breadbar           # version, binaries, system deps, services
bakery doctor                  # check system deps for installed packages
bakery doctor breadbar         # check system deps for a specific package

bakery install <pkg>           # install a package
bakery update <pkg>            # update a package
bakery update --all            # update everything
bakery remove <pkg>            # remove a package (data files are never deleted)

bakery install runs doctor first and bails with a clear message if any system dependency is missing. Binaries land in ~/.local/bin (override with BAKERY_BIN_DIR).

System prefix (BOS)

Default install root is ~/.local. BOS sets a system prefix so bakery-managed desktop apps live on the @ root subvolume and ride along with snapper/grub-btrfs snapshots:

# /etc/bakery/config.toml
prefix = "/usr/local"

BAKERY_PREFIX overrides the config file. A non-home prefix installs bins to $prefix/bin, share/data/desktop/licenses to $prefix/share/..., and systemd user units to /usr/lib/systemd/user. Per-user state (installed.json, update backups) stays in ~/.local/state/bakery. Writes that need root use sudo -n, then pkexec. bakery doctor prints the active prefix.

Hermes and get.sh are unchanged — they keep the user-local default. See bakery/README.md.

System dependencies by product

bakery doctor checks these automatically before any install. Required deps block installation; optional deps generate a warning but never block.

Package Required Optional
bakery (statically linked, none)
bread systemd-libs openssl zlib bluez hyprland
breadbar gtk4 gtk4-layer-shell iw libpulse hyprland
breadbox gtk4 gtk4-layer-shell librsvg hyprland
breadcrumbs networkmanager tailscale sudo xdg-utils
breadpad gtk4 gtk4-layer-shell rocm-hip-runtime ollama hyprland

Install all required deps with sudo pacman -S <packages>. Use pacman -Q <pkg> to check whether any are already present.

Workspace

This repo is a Cargo workspace. Bakery-channel products shipped from here are bakery and bread-theme; the other members are shared crates sibling apps pin, or in-tree tools that are not bakery packages of their own.

bread-ecosystem/
├── bakery/              # package manager binary
├── bread-theme/         # shared pywal + fixed-dark-base theming crate
├── bread-utils/         # shared plumbing (Hyprland IPC, singleton, XDG, BreadClient, …)
├── bread-app/           # GTK bootstrap new tools should use (app id, singleton, overlay, command listen)
├── bread-polkit/        # themed PolicyKit agent (bakery.toml present; unpublished)
├── bread-onnx/          # shared ONNX runtime helpers
├── bread-screenshots/   # grim capture primitive used by app `--screenshot` modes
├── bread-capture/       # orchestrator that drives those `--screenshot` modes
├── registry/            # bread-ecosystem.toml — product registry
└── scripts/
    ├── get.sh                   # curl | sh bootstrap
    ├── gen-index.sh             # generates dl.breadway.dev/index.json from release artifacts
    └── gen-readme-products.sh   # rewrites the Products table from the registry

New GTK tools

Do not copy another app's main.rs. Depend on bread-app:

  • bread_app::application_id / try_acquire / toggle_or_kill for the com.breadway.* application id and single-instance lock
  • feature gtk re-exports bread_utils::gtk_popup (layer-shell overlay)
  • feature bread-client for listen_commands on bread.command.<app>.**

See the bread-app crate docs. Existing apps are not migrated in this tree; bread-polkit is the first in-tree consumer.

bread-polkit

A session PolicyKit authentication agent (password prompt, cancel, identity). Not a wrapper around polkit-gnome. bread-polkit/bakery.toml exists so it can be published via bakery; it is not in registry/bread-ecosystem.toml and is therefore unpublished — not on the bakery index and not on the BOS ISO lockfile.

cargo run -p bread-polkit

Autostart — pick one:

cp bread-polkit/contrib/bread-polkit.desktop ~/.config/autostart/
# hyprland.conf
exec-once = bread-polkit

Release pipeline

Each product repo (Breadway/bread, Breadway/breadbar, …) has .forgejo/workflows/release-*.yml that triggers on v* tags. The workflow runs on a self-hosted runner on hestia, builds a stripped x86_64 binary, deposits it at dl.breadway.dev/<pkg>/<version>/, updates index.json, and mirrors the binary to GitHub Releases as a fallback.

bakery always tries dl.breadway.dev first and transparently falls back to the GitHub Release URL recorded in the manifest.

Beyond stable releases, most products also publish dev and beta tracks — continuous builds off main (dev) and vX.Y.Z-rc.N tags (beta). See CONTRIBUTING.md for the branch/release workflow and docs/release-channels.md for the full track policy. Switch tracks with bakery track set <stable|beta|dev>.

Release artifact contract

Each product's release.yml must upload the following files alongside the binary to dl.breadway.dev/<name>/<version>/:

File Purpose
bakery.toml Metadata (deps, services, config) read by gen-index.sh
<binary>-x86_64.sha256 Checksum verified by bakery install and get.sh
*.service systemd unit files installed by bakery install
*.example.toml / config.example.toml Example configs copied on first install

gen-index.sh fails loudly if bakery.toml is missing — this is by design to catch omissions in the release workflow before they silently produce empty metadata in production.

License

MIT