mirror of github.com/Breadway/breadsearch
Find a file
2026-07-02 20:59:18 +08:00
breadmill Initial commit 2026-07-02 20:59:18 +08:00
breadsearch Initial commit 2026-07-02 20:59:18 +08:00
breadsearch-shared Initial commit 2026-07-02 20:59:18 +08:00
docs/error-reports Initial commit 2026-07-02 20:59:18 +08:00
packaging Initial commit 2026-07-02 20:59:18 +08:00
.gitignore Initial commit 2026-07-02 20:59:18 +08:00
bakery.toml Initial commit 2026-07-02 20:59:18 +08:00
benchmark_embed.py Initial commit 2026-07-02 20:59:18 +08:00
Cargo.lock Initial commit 2026-07-02 20:59:18 +08:00
Cargo.toml Initial commit 2026-07-02 20:59:18 +08:00
config.example.toml Initial commit 2026-07-02 20:59:18 +08:00
DESIGN.md Initial commit 2026-07-02 20:59:18 +08:00
LICENSE Initial commit 2026-07-02 20:59:18 +08:00
original-info-signature.txt Initial commit 2026-07-02 20:59:18 +08:00
original-model-signature.txt Initial commit 2026-07-02 20:59:18 +08:00
quantize_nomic.py Initial commit 2026-07-02 20:59:18 +08:00
quantized_info.csv Initial commit 2026-07-02 20:59:18 +08:00
README.md Initial commit 2026-07-02 20:59:18 +08:00
test_npu_quantized.py Initial commit 2026-07-02 20:59:18 +08:00

breadsearch

Semantic document search for Bread OS. Type a concept — not a keyword — and get ranked hits from your documents.

Two binaries in one Cargo workspace:

  • breadmill — background daemon. Walks configured directories, extracts text, chunks and embeds documents with nomic-embed-text-v1.5 (768-dim ONNX), stores vectors in an HNSW index (usearch) backed by SQLite metadata, and serves queries over a Unix socket. Watches for filesystem changes and re-indexes incrementally.
  • breadsearch — GTK4 overlay GUI. Queries breadmill via the Unix socket and shows ranked results. Press Enter to open a file, Ctrl+Enter to reveal its folder, Esc to close. Bind it to a hotkey (e.g. Super+/) and invoke it as a toggle.

Build

System dependencies: gtk4, gtk4-layer-shell, librsvg.

cargo build --release

The ort crate downloads a bundled ONNX Runtime at build time (no system onnxruntime needed for the default CPU build).

Optional features:

Feature What it adds
npu AMD XDNA NPU via VitisAI ONNX Runtime EP (requires Ryzen AI SDK)
rocm AMD iGPU via ROCm ONNX Runtime EP
# NPU build
cargo build --release -p breadmill --features npu

Setup

1. Fetch the embedding model (~550 MB, downloaded once from Hugging Face):

breadmill fetch-model

Model files are stored in ~/.cache/breadsearch/models/.

2. Enable the systemd user service:

cp packaging/breadmill.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now breadmill

Or run it directly: breadmill serve (or just breadmill).

3. Copy the example config (optional — built-in defaults are used otherwise):

mkdir -p ~/.config/breadsearch
cp config.example.toml ~/.config/breadsearch/config.toml

breadsearch (GUI)

breadsearch

Invoking again while running closes the window (PID-toggle). Bind to a hotkey in your compositor config.

Results show: filename/title, full path, and a snippet from the matching chunk. Score is cosine similarity as a percentage.

User CSS overrides go in ~/.config/breadsearch/style.css.

breadmill (daemon / CLI)

# Start the daemon (also the default when called with no arguments)
breadmill serve

# Force a full re-index from scratch
breadmill reindex

# Download model files
breadmill fetch-model

# Query from the terminal
breadmill query "tax stuff"

# Show daemon status (chunks indexed, pending, model ready)
breadmill status

# Backend flags (requires the matching Cargo feature)
breadmill --npu
breadmill --rocm

Config

~/.config/breadsearch/config.toml — all keys are optional; built-in defaults are shown.

[index]
roots        = ["~/Documents", "~/Projects", "~/.config/breadpad"]
extensions   = ["md", "txt", "org", "pdf", "odt", "docx"]
excludes     = []          # paths to skip (prefix match)
max_file_mb  = 10.0

[search]
limit        = 10          # max results per query
snippet_len  = 200         # max characters in result snippet

[model]
name         = "nomic-embed-text-v1.5"
dim          = 768
backend      = "cpu"       # "cpu", "npu", or "rocm"

roots and excludes support ~/ expansion. The index respects .gitignore files found during the walk.

NPU backend

Set backend = "npu" in config (or pass --npu) when running a build compiled with --features npu. breadmill looks for the VitisAI EP config file in this order:

  1. $VAIP_CONFIG
  2. ~/.config/breadsearch/vaip_config.json
  3. ~/.local/share/ryzen-ai-1.7.1/voe-4.0-linux_x86_64/vaip_config.json
  4. /etc/vaip_config.json
  5. /opt/xilinx/vaip_config.json

Runtime paths

Purpose Path
Config ~/.config/breadsearch/
Index (SQLite + HNSW) ~/.local/state/breadsearch/
Model cache ~/.cache/breadsearch/models/
Unix socket $XDG_RUNTIME_DIR/breadmill.sock