Publish active Chrome tab metadata (title, URL, favicon) to D-Bus so Hyprland/Wayland/X11 tooling can consume it.
The extension sends JSON to a local HTTP endpoint, and a Rust daemon re-publishes enriched updates on D-Bus.
- Chrome extension emits active tab + Chrome window metadata.
- Rust daemon exposes updates over D-Bus signal:
org.imalison.ChromeWindowInfo.Updated. - Payload enrichment includes:
- Hyprland active window (
hyprctl -j activewindow) - Hyprland title matches (
hyprctl -j clients) - X11 active window via
xdotoolwhen available
- Hyprland active window (
- Cached mapping from Chrome
window_id-> Hyprland window address.
extension/manifest.json: Manifest V3 extensionextension/background.js: Active-tab capture and localhost POSTbridge-rs/Cargo.toml: Rust bridge cratebridge-rs/src/main.rs: HTTP -> D-Bus bridge daemonsystemd/chrome-window-info-bridge.service: Optional user service template
Extension posts to:
http://127.0.0.1:38933/update
Chrome extension contexts can do outbound localhost fetch, but cannot host a local server or D-Bus service themselves.
Build standard Linux package:
cd ~/Projects/chrome-favicon-bridge
nix build .#chrome-window-dbus-bridgeRun the built binary:
./result/bin/chrome-window-dbus-bridge --host 127.0.0.1 --port 38933 --path /updateBuild static Linux package (musl):
cd ~/Projects/chrome-favicon-bridge
nix build .#chrome-window-dbus-bridge-staticRun without building explicitly:
cd ~/Projects/chrome-favicon-bridge
nix run .#chrome-window-dbus-bridge -- --host 127.0.0.1 --port 38933 --path /updateInstall in profile:
cd ~/Projects/chrome-favicon-bridge
nix profile install .#chrome-window-dbus-bridgecd ~/Projects/chrome-favicon-bridge
cargo install --path bridge-rs --lockedChrome -> chrome://extensions -> Developer mode -> Load unpacked -> ~/Projects/chrome-favicon-bridge/extension
gdbus monitor --session \
--dest org.imalison.ChromeWindowInfo \
--object-path /org/imalison/ChromeWindowInfoEach Updated signal carries one JSON string payload.
- Bus name:
org.imalison.ChromeWindowInfo - Object path:
/org/imalison/ChromeWindowInfo - Interface:
org.imalison.ChromeWindowInfo - Methods:
GetLastPayload() -> sGetSchema() -> s
- Signal:
Updated(s payload_json)
Useful fields from signal payload:
chrome_window.id: Chrome internal window idbridge.mapped_window.window_id: Cached Hyprland address (when known)wm.hyprland_active.address: Current active Hyprland window addresswm.hyprland_title_matches[]: Candidate Hyprland windows matching tab titlewm.x11_active.id_decimal/wm.x11_active.id_hex: Active X11 window id
mkdir -p ~/.config/systemd/user
cp ~/Projects/chrome-favicon-bridge/systemd/chrome-window-info-bridge.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now chrome-window-info-bridge.serviceThe provided unit uses %h/.nix-profile/bin/chrome-window-dbus-bridge. If you install with cargo install instead, update ExecStart accordingly.
- If daemon is not running, extension fails silently.
- Optional request auth is available with daemon
--token <value>and extension support forX-Bridge-Token.