2026-03-13 15:32:43 +01:00
2026-03-13 15:32:43 +01:00
2026-03-13 15:32:43 +01:00
2026-03-13 15:37:26 +01:00

fluxo-rs

fluxo-rs is a high-performance system metrics daemon and client designed specifically for waybar. it replaces standard shell scripts with a compiled rust binary that collects data via a background polling loop and serves it over a unix domain socket (/tmp/fluxo.sock).

description

the project follows a client-server architecture:

  • daemon: handles heavy lifting (polling cpu, memory, network) and stores state in memory.
  • client: a thin cli wrapper that connects to the daemon's socket to retrieve formatted json for waybar.

this approach eliminates process spawning overhead and temporary file locking, resulting in near-zero cpu usage for custom modules.

modules

  • net: network interface speed (rx/tx mb/s)
  • cpu: global usage percentage and package temperature
  • mem: used/total ram in gigabytes
  • disk: disk usage for a specific mountpoint
  • pool: aggregate storage usage (e.g., btrfs)
  • vol: audio output volume and device management
  • mic: audio input volume and device management

dependencies

system

  • iproute2 (for network interface discovery)
  • wireplumber (for volume and mute status via wpctl)
  • pulseaudio (for device description and cycling via pactl)
  • lm-sensors (recommended for cpu temperature)

rust

  • cargo / rustc (edition 2024)

setup

  1. build the project:

    $ git clone https://git.narl.io/nvrl/fluxo-rs
    $ cd fluxo-rs
    $ cargo build --release
    
  2. start the daemon:

    $ ./target/release/fluxo-rs daemon &
    
  3. configure waybar (config.jsonc):

    "custom/cpu": {
        "exec": "/path/to/fluxo-rs cpu",
        "return-type": "json"
    }
    

development

architecture

  • src/main.rs: entry point and cli argument parsing
  • src/daemon.rs: uds listener and background thread orchestration
  • src/ipc.rs: thin client socket communication
  • src/modules/: individual metric implementation logic
  • src/state.rs: shared in-memory data structures

adding a module

  1. define the state structure in state.rs
  2. implement the waybarmodule trait in src/modules/
  3. add the polling logic to the background thread in daemon.rs
  4. register the subcommand in main.rs

build and debug

build for release:

$ cargo build --release

run with debug logs:

$ RUST_LOG=debug ./target/release/fluxo-rs daemon
Description
No description provided
Readme 140 KiB
Languages
Rust 100%