Releases: smllb/qhints-rs
Releases · smllb/qhints-rs
Release list
1.1.2
Highlights
- New detection pipeline — single edge-based pass: Canny → dilate → connected components. Hints now land directly on the raw components ("pieces"), which detect far more cleanly — especially with a higher kernel_size (try ~6). This replaces the old text-projection + word-overlap-classification approach, which was both slow and unreliable.
- Live pipeline debug viewer — cargo run --example preview : capture a window or the full screen, tune every knob live with sliders + exact-value inputs, toggle pipeline layers, zoom, and save annotated screenshots. This was the tool that made the new detection approach possible.
- AT-SPI is now optional — only runs when it's in your backends config, instead of always burning a 250ms deadline up front.
Breaking-ish changes - All hints are now Element (Text/Element distinction removed from the imageproc path).
- Removed config fields: merge_gap_factor, text_height_factor, text_min_width.
- New config fields: text_height_min, text_height_max (debug only).
- Removed Projection word detection and word-overlap reclassification
1.1.1
1.1.1 — 2026-08-28
Changed
- Replaced the double max/min-of-RGB Canny with a single fused contrast channel (
max − min/2): one Canny pass now covers both dark-on-light edges and bright saturated text (e.g. orange on white) that a plain max-of-RGB channel missed. Faster than the double-channel run while keeping the same detection. - Everything is now done in a single pass.
Removed
min_channel_edgesconfig field — no longer needed, the fused channel always recovers bright colored text.MIN_CHANNEL_EDGESbenchmark environment toggle.
v1.1.0
qhints-rs v1.1.0
Keyboard-driven UI navigation for Linux (X11). Scans a focused window, assigns keyboard labels ("hints"), and lets the user click, hover, drag, or select elements by typing those labels.
This release focuses on detection performance and improved recovery of colored text.
Highlights
- Approximately 30× faster detection. The imageproc detection pipeline (grayscale conversion, Canny edge detection, text projection, dilation, and connected-component labeling) is now parallelized with rayon, distributing work across all available CPU cores. Detection latency is reduced from approximately one second to roughly 35–45 ms per window.
- Colored-text recovery. A secondary Canny pass on the
min(R,G,B)channel — executed in parallel with themaxpass — recovers bright colored text, such as orange text on a white background, that the previous single-channel detector missed. Controlled by themin_channel_edgesoption. - Downscaling.
detection_scalenow accepts values below 1.0, permitting a trade-off between precision and speed. - Screenshot benchmark suite. Screenshots may be placed in
test-assets/screenshots/, named with thresholds (e.g.30_min_60_max.png), andcargo testasserts the resulting hint count.UPDATE_BASELINES=1records the current values as baselines.
Changes since v1.0.0
Performance
- Parallelized imageproc pipeline (grayscale → Canny → combination → projection → dilation → components).
- Independent
max/minCanny passes on separate threads. - Parallel connected-component labeling (run-length encoding with union-find).
- OCR backend reuses the parallel helpers.
Detection quality
min_channel_edgesrecovers bright colored text (enabled by default).detection_scaledownscaling (0.1–4.0) for the speed/quality trade-off.
Tooling
- Screenshot benchmark tests with filename-encoded thresholds and
--update-baselines. - Benchmark pipeline-stage image outputs (
luma,edges,bfs_debug,annotated).
Modes
| Mode | Key | Behavior |
|---|---|---|
| Normal | hint keys | Click element |
| Hover | Ctrl + hint | Move mouse without clicking |
| Double-click | Alt | Toggle then type hint |
| Text select | / |
Pick start → pick end to select text |
| Drag | Shift | Pick source → pick destination to drag |
| Hunt | dev option | Re-scan after every action, Ctrl to quit |
Requirements
- X11 session
xdotool,libgtk-3-0- AT-SPI D-Bus service (
at-spi-dbus-bus.service) - Rust 1.87+ (to build from source)
Install
Download the binary and make it executable:
chmod +x qhints-rs
sudo mv qhints-rs /usr/local/bin/
Or build from source:
cargo build --release
# with OCR: cargo build --release --features ocr
v1.0.0
qhints-rs v1.0.0
Keyboard-driven UI navigation for Linux (X11). Scan a window's elements, assign keyboard hints, and click/hover/drag/select by typing the labels.
Features
- AT-SPI backend — walks the accessibility tree via async D-Bus for fast, accurate element detection
- Imageproc backend — Canny edge detection + BFS connected components + text line projection as fallback
- OCR backend (optional) — ML-powered word detection with BFS gap-filling (
--features ocr) - GTK overlay — transparent popup with Cairo-rendered hint labels, drop shadows, per-character coloring
- Spatial zone grid — hints assigned by screen position (QWERTY rows mapped to zones)
- Spotlight mode — dark overlay with radial holes around matching hints
- Per-app rules — custom Canny thresholds, scale factors, and AT-SPI filters per application
- Config file — JSON at
~/.config/qhints/config.jsonmerged over defaults
Modes
| Mode | Key | Behavior |
|---|---|---|
| Normal | hint keys | Click element |
| Hover | Ctrl + hint | Move mouse without clicking |
| Double-click | Alt | Toggle then type hint |
| Text select | / |
Pick start → pick end to select text |
| Drag | Shift | Pick source → pick destination to drag |
| Hunt | dev option | Re-scan after every action, Ctrl to quit |
Requirements
- X11 session
xdotool,libgtk-3-0- AT-SPI D-Bus service (
at-spi-dbus-bus.service) - Rust 1.87+ (to build from source)
Install
Download the binary and make it executable:
chmod +x qhints-rs
sudo mv qhints-rs /usr/local/bin/
Or build from source:
cargo build --release
# with OCR: cargo build --release --features ocr
What's Changed
- Feat/text line word hints by @smllb in #1
- Feat/stable base by @smllb in #4
- Feat/stable base by @smllb in #5
- Fix/hint text centering by @smllb in #6
- Visual markers by @smllb in #11
- Polish/marker visuals by @smllb in #12
- fFix/edge orientation classifier by @smllb in #13
- fVisuals by @smllb in #14
- Fix spotlight rectangle using center instead of edges for Element children by @smllb in #15
- Docs/mdbook by @smllb in #16
- Feat/no default ocr by @smllb in #17
- fix: draw first text selection marker inside left edge of child box by @smllb in #19
Full Changelog: https://github.com/smllb/qhints-rs/commits/1.0.0