Cross-platform parametric EQ editor for compatible USB DACs. Glacier EQ talks to hardware over HID, edits EQ locally, and works offline.
⚡ Try the web version directly in your browser: bukutsu.github.io/glacier-eq
- 10-band PEQ editor with preamp, undo/redo, graph preview, and target curves
- Pull, RAM-apply, push, verify, and rollback EQ on supported DACs
- Local profiles with search, import/export, copy/paste, and one-tap apply
- Measurement overlays from files or optional Squiglink offline cache
- Native AutoEQ matching against measurement and target curves
- Walkplay/Savitech, Moondrop, and FiiO EQ protocol support
- Hardware controls for supported Walkplay/Savitech DACs: DAC filter, amp mode, output gain, balance, mic monitor, and reset modes
- Desktop and Android layouts, themes, diagnostics, and dev dummy DAC
Download builds from the releases page.
Arch Linux:
git clone https://github.com/Bukutsu/glacier-eq.git
cd glacier-eq
makepkg -siThe Arch package installs udev/99-glacier-eq.rules; after replugging a
supported DAC, the Linux desktop build can open it directly without the polkit
elevation popup.
From source:
git clone https://github.com/Bukutsu/glacier-eq.git
cd glacier-eq
npm install
npm run tauri devGlacier EQ includes a fully offline CLI for scripting, piping profiles, and bulk AutoEQ tasks.
Data goes to stdout, diagnostics to stderr.
For the full command reference, syntax, and examples, see the CLI Documentation.
- Plug in a supported DAC.
- Open Glacier EQ.
- Select the DAC and connect.
- Pull the current hardware state.
- Edit preamp, bands, filter type, frequency, gain, and Q.
- Push changes back to the device.
If your DAC appears here, plug it in and check the device picker. Family match
means the USB family looks compatible, but the exact model still needs more
hardware reports.
| Status | Device |
|---|---|
| Confirmed | EPZ TP35 Pro |
| Confirmed | TRN Black Pearl |
| Family match | Audiocular Aura |
| Family match | Fosi Audio DS2 / iBasso DC04 Pro |
| Family match | JCally JM20 / Savitech Generic |
| Family match | JCally JM20 Pro / Alt Savitech |
| Testing | Moondrop Dawn Pro |
| Testing | Moondrop Dawn Pro 2 |
| Testing | FiiO JA11 |
| Testing | JCally JM12 |
| Testing | FiiO KA Series |
| Testing | Truthear KEYX |
The app uses one registry for discovery, validation, capabilities, and the
chooser list:
glacier-core/src/device/walkplay.rs.
Requirements:
- Node.js and npm
- Rust
- Tauri v2 platform dependencies
- USB/HID permissions for real hardware testing
Useful commands:
npm run dev # frontend only
npm run tauri dev # desktop app
npm run build # TypeScript + Vite
cargo check # Rust workspace
cargo test -p glacier-coreOptional local guard before pushing:
git config core.hooksPath .githooksAndroid:
npm run android:doctor
npm run android:init
npm run android:dev
npm run android:apkRelease APK signing is not configured by default.
- Real-time frequency response graph
- AutoEQ matching
- Desktop and Android builds
- More DAC families beyond Walkplay/Savitech
- Interactive filter adjustment from the graph
- Full-screen Android filter adjustment
- Command-line profile tools
- Multi-device support
- Localization
On Linux, Chromium-based browsers and the desktop build can need udev access to
raw USB HID devices. Installing the packaged udev/99-glacier-eq.rules lets the
desktop build skip the polkit elevation popup. If you see a NotAllowedError: Failed to open the device error when connecting in the browser:
- Create a udev rule file:
sudo nano /etc/udev/rules.d/50-glacier-dac.rules
- Paste the following rule to allow access to compatible DACs:
# Walkplay / FiiO / Moondrop / EPZ DACs KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="3302", MODE="0666", TAG+="uaccess", TAG+="udev-acl" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="262a", MODE="0666", TAG+="uaccess", TAG+="udev-acl" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2fc6", MODE="0666", TAG+="uaccess", TAG+="udev-acl" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2972", MODE="0666", TAG+="uaccess", TAG+="udev-acl" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0661", MODE="0666", TAG+="uaccess", TAG+="udev-acl" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0666", MODE="0666", TAG+="uaccess", TAG+="udev-acl" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="35d8", MODE="0666", TAG+="uaccess", TAG+="udev-acl" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="31b2", MODE="0666", TAG+="uaccess", TAG+="udev-acl" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0d8c", MODE="0666", TAG+="uaccess", TAG+="udev-acl" - Reload udev rules and replug the device:
Note: If you use the Chromium Flatpak or Snap version, you might also need to allow USB access in your sandbox permissions manager (e.g. Flatseal).
sudo udevadm control --reload-rules sudo udevadm trigger
glacier-core/ Rust EQ and device logic
src/ React frontend
src-tauri/ Tauri backend
tauri-plugin-hid/ Local HID plugin
scripts/ Helper scripts
- Tauri
- React
- hidapi
- devicePEQ
- AutoEQ-C
- Audiocular-Aura, used as a reference for Moondrop and FiiO HID protocol behavior
GPL-3.0-only. See LICENSE.
