HUB MOON v1.2.0

Documentation · Download

Ready to hear it? Download Hub Moon.

A parametric EQ that writes to your Moondrop DAC's own DSP — installer, app and command line in one package. Pick your platform; everything below is built from the same release.

Stable 1.2.0· Released 2026-08-17· Beta 2.0.0b1· Licence MIT· Free, and no account

Windows interface tested · no DAC

Two shapes: an installer that adds a Start-menu entry and an uninstaller, or a portable zip you can unpack onto a stick and run. Neither needs Python — the runtime is inside the build.

Download the installer

HubMoon-Setup-1.2.0.exe from the release page. The portable build is HubMoon-1.2.0-windows-portable.zip in the same list.

Run it, and click through SmartScreen

The installer is not code-signed — signing certificates cost money this project does not have — so Windows will interrupt with a blue panel. Choose More info → Run anyway. If that makes you uncomfortable, build it yourself from source; the workflow that produces this file is in the repository.

Plug the DAC in and open Hub Moon

No driver and no udev rule: Windows exposes HID devices to userspace already. The app should name your DAC in the header within a second of launching — and if it does not, please say so, because nobody has run this build with a DAC attached on Windows yet. What has been checked there is that the app installs, opens and can browse the community library.

Take a backup before you change anything

Open a terminal in the install directory and snapshot the device — it writes to the DAC's flash, and this file puts every byte back.

PowerShell
> .\hub-moon.exe --list
> .\hub-moon.exe --export-json profile-backup.json

macOS tested on an M4 MacBook Air

A normal drag-to-Applications disk image, built for Apple Silicon and run on an M4 MacBook Air. It is ad-hoc signed rather than notarized, which is the only thing that makes the first launch awkward.

Download the disk image

HubMoon-1.2.0-macOS-arm64.dmg. On an Intel Mac, Rosetta 2 runs the arm64 build; there is no separate Intel download.

Drag Hub Moon into Applications

The image opens with the app and an Applications shortcut side by side.

First launch: right-click → Open

The app is ad-hoc signed but not notarized — notarization needs a paid Apple Developer ID — so Gatekeeper calls it an unidentified developer. Right-click the app and choose Open once, and macOS remembers. From a terminal, the equivalent is:

Terminal
$ xattr -dr com.apple.quarantine "/Applications/Hub Moon.app"

Plug in and back up

macOS grants HID access without extra permissions. Snapshot the device before you start editing.

Terminal
$ "/Applications/Hub Moon.app/Contents/MacOS/hub-moon" --export-json profile-backup.json

Linux developed and tested here

Every packaging format is built for each release, so use whatever your distribution prefers. The quickest path is the AppImage; the tidiest is your own package manager. The .deb, .rpm and Arch packages install the udev rule for you, which is what lets the tool open the DAC without sudo.

The quick way — AppImage

One file, no install, runs on any glibc distribution.

Any distribution
$ chmod +x HubMoon-1.2.0-x86_64.AppImage
$ ./HubMoon-1.2.0-x86_64.AppImage

Or install it properly

Debian, Ubuntu, Mint, Pop!_OS · Fedora, RHEL, Rocky, Alma · openSUSE · Arch, CachyOS, EndeavourOS, Manjaro · NixOS · Steam Deck · anything else — each has its own command, all of them on the Linux page.

Give yourself HID access

Only needed if you used the AppImage or the tarball — the packages do this for you. Without it the tool reports that it failed to open the device. Both lines matter: these builds bundle a libusb-backed hidapi, which opens /dev/bus/usb/… rather than /dev/hidraw…, so a hidraw-only rule grants access to a node the program never looks at.

/etc/udev/rules.d/70-moondrop.rules
$ echo 'SUBSYSTEM=="hidraw", ATTRS{idVendor}=="35d8", TAG+="uaccess", MODE="0660"'
    | sudo tee /etc/udev/rules.d/70-moondrop.rules
$ echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="35d8", TAG+="uaccess", MODE="0660"'
    | sudo tee -a /etc/udev/rules.d/70-moondrop.rules
$ sudo udevadm control --reload-rules && sudo udevadm trigger
# then unplug and replug the DAC

Find it, then back it up

Shell
$ hub-moon --list
Connected Moondrop Devices:
  - DAWN PRO2 [Vendor ID: 0x35D8, Product ID: 0x011D] (Path: /dev/hidraw2)
$ hub-moon --export-json profile-backup.json
01

Every download

One release, built on three runners, attached to the same tag. Sizes are approximate — the bundles carry their own Python runtime.

PlatformDownloadInstall with
Windows HubMoon-Setup-1.2.0.exe 17 MB Double-click. Start-menu entry and an uninstaller.
Windows · portable HubMoon-1.2.0-windows-portable.zip 22 MB Unpack and run hub-moon.exe. Nothing is installed.
macOS · Apple Silicon HubMoon-1.2.0-macOS-arm64.dmg 21 MB Drag to Applications, then right-click → Open the first time.
Linux · portable HubMoon-1.2.0-x86_64.AppImage 37 MB chmod +x and run. No install, no root.
Debian · Ubuntu hub-moon_1.2.0-1_amd64.deb 40 MB sudo apt install ./…deb
Fedora · RHEL · openSUSE hub-moon-1.2.0-1.x86_64.rpm 40 MB sudo dnf install ./…rpm
Arch · CachyOS · Manjaro hub-moon-1.2.0-1-x86_64.pkg.tar.zst 38 MB sudo pacman -U ./…pkg.tar.zst
Any distribution HubMoon-1.2.0-linux-x86_64.tar.gz 39 MB Unpack and run ./hub-moon/hub-moon.
Beta · 2.0.0b1

Newer than stable and where the current work lands. Everything on this channel has been built and tested on Linux with real hardware; Windows and macOS are built by CI and tried by whoever volunteers. If you want the features above before they are stable, this is where they are.

On it right now: 2.0.0b1, published 2026-08-18. What changed in it · what the line it belongs to is for. A beta may change the settings format: your profiles survive a rollback to stable, but anything the older build has no field for is dropped on the way back.

You do not have to reinstall to keep up with it. Once you are on any build, Settings ▸ Updates ▸ Channel ▸ Beta switches the app itself over, and it will offer each new beta as it lands. Switching back to Stable offers you the return trip — the app calls that one a rollback, because it is installing something older than what you are running.

PlatformDownloadInstall with
Windows HubMoon-Setup-2.0.0b1.exe 17 MB Double-click. Start-menu entry and an uninstaller.
Windows · portable HubMoon-2.0.0b1-windows-portable.zip 22 MB Unpack and run hub-moon.exe. Nothing is installed.
macOS · Apple Silicon HubMoon-2.0.0b1-macOS-arm64.dmg 21 MB Drag to Applications, then right-click → Open the first time.
Linux · portable HubMoon-2.0.0b1-x86_64.AppImage 37 MB chmod +x and run. No install, no root.
Debian · Ubuntu hub-moon_2.0.0b1-1_amd64.deb 40 MB sudo apt install ./…deb
Fedora · RHEL · openSUSE hub-moon-2.0.0b1-1.x86_64.rpm 40 MB sudo dnf install ./…rpm
Arch · CachyOS · Manjaro hub-moon-2.0.0b1-1-x86_64.pkg.tar.zst 38 MB sudo pacman -U ./…pkg.tar.zst
Any distribution HubMoon-2.0.0b1-linux-x86_64.tar.gz 39 MB Unpack and run ./hub-moon/hub-moon.

Distribution-by-distribution commands — including openSUSE, Void, Gentoo, Alpine and the Steam Deck — are on the Linux page.

02

From source, with pip

The one to use if you want hub-moon on your PATH and moondrop_control importable. If you only want the app, use a package above instead — it installs a launcher entry and you never touch a terminal. Two entry points are installed here: hub-moon, the CLI, and hub-moon-gui, which goes straight to the window (windowed — no console on Windows). Note that a pip install differs from a packaged one here: bare hub-moon prints help rather than opening the app, so use hub-moon-gui.

pip · CLI + desktop app
$ pip install "hub-moon[gui] @ git+https://github.com/MiyukiVigil/Hub_Moon"

# CLI only — hidapi and certifi, nothing else
$ pip install "hub-moon @ git+https://github.com/MiyukiVigil/Hub_Moon"
Clone · if you want the repository
$ git clone https://github.com/MiyukiVigil/Hub_Moon.git
$ cd Hub_Moon
$ pip install -r requirements.txt       # just hidapi
$ pip install -r gui/requirements.txt   # adds slint, for the window
$ python3 moondrop_control.py --list
Externally managed environments

Arch, Debian and Fedora now refuse a global pip install. Use pipx install "hub-moon[gui] @ git+…", a virtualenv, or your distribution's package — do not reach for --break-system-packages on a machine you care about.

Runtime
Python 3.9 or newer
CLI dependencies
hidapi · certifi
GUI extra
slint ≥ 1.13, lazy-imported — the CLI never loads it
Settings
~/.config/hub-moon/settings.json — appearance only, never device state
Cache
~/.cache/hub_moon/ — the community index, refetched daily
03

First run

In this order. The third step is the one people skip and then wish they had not.

Find it, read it, back it up
1 · is the DAC there at all
$ hub-moon --list

2 · what does it say about itself
$ hub-moon --info
Device Name:       DAWN PRO2
Firmware Version:  1.5
Active EQ Profile: 9
Pre-Gain:          -4.80 dB
Global Gain:       0.00 dB
PEQ Bands:         8

3 · take a backup before you change anything
$ hub-moon --export-json profile-backup.json

4 · then open the app from your launcher, or keep going in the shell
$ hub-moon-gui
It writes to flash by default

Writes go to the DAC's flash unless you pass --no-flash. The backup in step 3 is a complete snapshot — eight bands, pre-gain, global gain — and --import-json puts every byte of it back. Keep it.

On a DAWN PRO2, the EQ has a hardware switch

Press both volume buttons to switch between the default (no EQ) mode and custom EQ. PEQ writes only affect the sound in custom-EQ mode — so if your edits are inaudible, check that before you suspect the tool. The long version.

FIG 01 First launch · the welcome screen names the device it found
The Hub Moon welcome screen: a crescent mark, the device that was found, and four cards explaining the interactions
04

Updating and removing

Since 1.1.0 the app checks for itself — one small manifest a day, and a banner in Settings when there is something newer. There is a stable channel and a beta one, and you can turn the whole thing off.

It only installs an update where doing that is safe. Five of the ways Hub Moon ships are owned by a package manager, and an application that overwrites files dpkg believes it owns has broken the system it meant to update — so on those it shows you the command instead of a button that would lie.

How you installed itWhat the update button does
Windows installerDownloads and runs the new one — it upgrades in place and keeps your Start-menu entryautomatic
Windows portableSwaps the extracted folder and restartsautomatic
macOSMounts the new .dmg and replaces the app in placeautomatic
AppImageReplaces the single file and restartsautomatic
Linux tarballSwaps the unpacked directory and restartsautomatic
deb / rpm / Arch / NixNothing — it shows you apt, dnf, pacman or nix as appropriatemanual
pip / pipxNothing — it shows you pipx upgrade hub-moonmanual

Every download is checked against a SHA-256 taken from the manifest, and an asset without one is refused rather than installed. Each release also carries its own SHA256SUMS-*.txt if you would rather check by hand.

That is the whole of it, stated plainly: the manifest is served over TLS from a domain this project controls, so if the manifest is genuine the download is. Nothing here is code-signed — the Windows installer is unsigned and the macOS bundle is only ad-hoc signed — so this protects you from a corrupted download, not from somebody who can serve you a manifest.

Checking defaults to on where Hub Moon ships the build itself and off where a package manager owns it, because there is nothing an update check can tell an Arch user that -Syu will not. HUB_MOON_NO_UPDATE_CHECK=1 disables it everywhere without opening the app, and hub-moon --check-update asks once from the shell.

Windows
Run the new installer over the old one, or uninstall from Settings → Apps
macOS
Replace the app in Applications; remove by dragging it out
AppImage
Replace the file. Nothing was ever written outside your home directory
deb / rpm / Arch
Install the new package; remove it the way you remove any other
pip
pip install --upgrade "hub-moon[gui] @ git+…" · pip uninstall hub-moon
Left behind
Settings, the preset cache and the log — see below. None of it holds device state: your DAC keeps its EQ in its own flash

Where it keeps its files. These moved in 1.1.0 on Windows and macOS, which had been using the Linux layout; an existing config is carried across the first time 1.1.0 runs, and the Linux paths have not changed.

Linux
settings ~/.config/hub-moon · cache ~/.cache/hub_moon · log ~/.local/state/hub-moon
macOS
settings ~/Library/Application Support/HubMoon · cache ~/Library/Caches/HubMoon · log ~/Library/Logs/HubMoon
Windows
settings %APPDATA%\HubMoon · cache %LOCALAPPDATA%\HubMoon\Cache · log %LOCALAPPDATA%\HubMoon\Logs

Every session writes to that log, and an unhandled error is recorded there with its traceback. If you are reporting a bug, that file is what to attach — Settings has an Open log folder button.

05

Troubleshooting

No devices found

Check the DAC is on the USB bus at all: lsusb | grep 35d8 on Linux. If the system sees it but the tool does not, it is almost always permissions — the udev rule.

Failed to open the device

Either permissions, or something else already holds the handle. Only one process can usefully hold the hidraw at a time, so close the desktop app before running a write from the shell — two readers pick up each other's replies.

The EQ changed, but nothing sounds different

On a DAWN PRO2 the equaliser is toggled on the hardware — both volume buttons. Writes only affect the sound in custom-EQ mode, and the device does not report which mode it is in.

A filter was refused

Deliberate: the coefficients would not fit the firmware's Q2.30 range, and the official app wraps silently rather than failing. The error names the largest gain that fits — see the overview.

hidapi will not install

It needs the system library to build against — Arch: pacman -S hidapi; Debian/Ubuntu: apt install libhidapi-hidraw0 libhidapi-dev; Fedora: dnf install hidapi-devel. Or skip it and use a packaged build.

Windows says the publisher is unknown

The installer is unsigned. More info → Run anyway, or build it yourself from source — the GitHub Actions workflow that produces the file is in the repository.

macOS says the app is damaged or from an unidentified developer

Ad-hoc signed, not notarized. Right-click → Open once, or xattr -dr com.apple.quarantine "/Applications/Hub Moon.app".

Old Fashioned is refused

Also deliberate. That device programs its EQ through registers rather than biquad coefficients, so none of these commands would mean anything to it.

Still stuck

Open an issue with the output of hub-moon --list and hub-moon --json — those two say almost everything about what your device reports. github.com/MiyukiVigil/Hub_Moon/issues