eqtui 0.1.1-alpha.1

Terminal-native(TUI) audio effects processor for PipeWire
docs.rs failed to build eqtui-0.1.1-alpha.1
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.

eqtui

License: GPL-2.0-only

A keyboard-driven parametric EQ for PipeWire that lives in the terminal. Built with Ratatui.

EasyEffects is great, but sometimes I just want a simple EQ — not a full DSP pipeline with a GTK(now Qt) UI. And also i want to learn little bit about DSP stuff.

Runs as a background daemon so the EQ keeps going even after closing the TUI.

Quick Start

cargo install eqtui
eqtui daemon    # start the engine (background)
eqtui           # open the TUI
eqtui stop      # stop the daemon

Close with q — the EQ keeps running. Re-attach anytime with eqtui attach.

Keybindings

eqtui uses Vim-inspired keybindings across several modes.

Normal Mode (Navigation & Quick Actions)

Key Action
q Quit TUI (Daemon stays running)
Tab Switch focus between Devices and Pipeline (EQ)
j / Down Move selection down
k / Up Move selection up
h / Left Move column selection left (Pipeline only)
l / Right Move column selection right (Pipeline/Devices)
i Enter Insert Mode to edit selected cell
v Enter Visual Mode
: Enter Command Mode
a Add a new EQ band
dd Delete selected EQ band
gg Jump to the first EQ band
r Reset selected band (Gain: 0, Q: 1)
R Reset all bands in current profile
+ / = Increment selected cell value
- Decrement selected cell value
{ / } Switch to previous/next profile
b Toggle EQ Bypass
c / C Toggle connection to selected device (Devices only)

Insert Mode (Cell Editing)

Key Action
Enter Confirm changes and return to Normal Mode
Esc Cancel changes and return to Normal Mode
Backspace Delete character
Any char Type into cell

Filter Types: In the "Type" column, type PK (Peak), LS (LowShelf), or HS (HighShelf).

Visual Mode (Bulk Operations)

Key Action
j / Down Move selection down
k / Up Move selection up
d Delete selected EQ band and return to Normal Mode
Esc Return to Normal Mode

Command Mode

Command Action
:q Quit TUI
:w Save current profile to profiles.toml
:flat Set all gains in current profile to 0.0dB
:load <path> Load a PEQ file (AutoEQ/Squiglink format)
:bypass Toggle EQ Bypass
:preamp <val> Set preamp gain (e.g., :preamp -6.0)
:add [freq] Add a band at optional frequency (default 1000Hz)
Esc Clear command and return to Normal Mode

Features (the short version)

  • Daemon/TUI split — EQ engine stays alive when the UI closes
  • Parametric EQ — frequency, gain, Q, filter type per band
  • AutoEQ import:load any PEQ file from AutoEQ / Squiglink
  • Profile system — save/switch presets with :w
  • Vim-ish controls — Normal/Insert/Visual/Command modes
  • No GTK, no Qt — just a terminal and PipeWire

Config & Profiles

Settings are stored in standard XDG locations.

  • Config: ~/.config/eqtui/config.toml
  • Profiles: ~/.config/eqtui/profiles.toml
  • Logs: ~/.local/share/eqtui/eqtui.log

Profile System

There are 5 profile slots available for saving different presets.

  • Saving & Applying: Use :w to save the current EQ bands and preamp gain to the active slot. This also sends the settings to the audio engine.
  • Switching: Use { and } to navigate between profiles.
  • Persistence: The daemon loads these profiles automatically on startup.
  • External Files: Profiles can be linked to external PEQ files. These profiles are read-only and display an [RO] indicator in the TUI.

Resetting Profiles

To reset EQ setings there is three ways:

  • Reset All Bands (R): Resets every band in the current profile (Gain: 0.0, Q: 1.0).
  • Reset Selected Band (r): Resets only the highlighted band (Gain: 0.0, Q: 1.0).
  • Flatten Gains (:flat): Sets all gains to 0.0dB but keeps your frequencies and Q values.

Normal vs Read-Only ([RO])

Feature Normal Profile [RO] Profile
Reset in UI Yes Yes (Temporary)
Apply to Sound Yes (:w) No (Locked to file)
Save to Disk Yes (:w) No (Locked to file)

Note: Changes made to [RO] profiles in the TUI are temporary and cannot be saved or applied to the DSP engine.

Profile File Format

The profiles.toml file contains an array of 5 profiles. A profile can either define its own bands or link to an external path.

Example with external file:

[[profiles]]
name = "AutoEQ Preset"
path = "@eqs/CVJVIVIANS1_Filters.txt"

Example with inline data:

[[profiles]]
name = "Custom Tune"
preamp = -6.0
[[profiles.bands]]
frequency = 100.0
gain = 3.5
q = 0.7
filter_type = "LowShelf"

Fields:

  • path: (Optional) Portable path to an external PEQ file. Use @ for paths relative to the config directory.
  • preamp: Global gain offset in dB.
  • bands: List of EQ filters (ignored if path is set).
    • frequency: Center frequency in Hz.
    • gain: Boost or cut in dB.
    • q: Quality factor (bandwidth).
    • filter_type: Either "Peak", "LowShelf", or "HighShelf".

Customizing Keys

You can change the default controls in your config.toml:

[keys.normal]
toggle_bypass = 'b'
add_band = 'a'
delete_band = 'd'

[keys.insert]
confirm = '\n'
cancel = '\x1b'

Background Process Details

The daemon uses a few standard Linux mechanisms to work correctly:

  • XDG_RUNTIME_DIR: The Unix socket is placed here. The daemon will not start if this variable is missing.
  • User Check: The daemon only accepts connections from the same user ID that started it.
  • File Locking: Uses a lock file to make sure only one daemon instance runs at a time.
  • POSIX Daemon: Uses standard fork and setsid to detach from the terminal.

Install from Source

git clone https://github.com/SiputBiru/eqtui
cd eqtui
cargo build --release

Needs PipeWire and a Nerd Font.


Project by SiputBiru — patches welcome but no promises :^)