Install
Every tagged release ships a native installer for each platform/architecture combination. Head to the Releases page and download the artifact that matches your OS + CPU.
System requirements (minimum OS versions, hardware) live in Requirements. Building from source is covered there too.
The path of least friction is the project’s Homebrew tap:
brew install packetThrower/tap/etch341The cask drag-installs the same .dmg as the manual flow below
and strips the Gatekeeper quarantine attribute during install so
the first launch doesn’t need a right-click → Open dance. Future
releases land via brew upgrade on the next 6-hour bump cron, no
re-clicking installers.
Or, the manual flow:
- Download
etch341-<ver>-arm64-macos.dmg(Apple Silicon) oretch341-<ver>-amd64-macos.dmg(Intel) from the Releases page. - Open the
.dmg, drag etch341 to Applications. - First launch: right-click → Open (not double-click). Gatekeeper shows “etch341 can’t be opened because Apple cannot check it for malicious software” — that’s the standard unsigned-app prompt. “Open” once and macOS remembers it forever.
If you’d rather skip the .dmg and run the .app directly,
etch341-macOS-<arch>-<ver>.zip is the bare bundle. Extract and
move into Applications (or anywhere).
No driver setup is needed — macOS leaves the CH341A’s vendor interface alone, and libusb is statically linked into the binary.
Windows
Section titled “Windows”The CH341A on Windows needs a one-time WinUSB binding before
libusb can talk to it. Without it, Windows either enumerates the
device as “Unknown” or claims it with a vendor serial driver — either
way etch341 sees DeviceNotFound.
-
Plug in the CH341A.
-
Run Zadig (≈600 KB, no installer).
-
In Zadig’s
Optionsmenu, enableList All Devices. -
Select the entry with VID
0x1A86/ PID0x5512, choose WinUSB in the driver dropdown, and clickInstall Driver. -
Install etch341 itself. Easiest path is the project’s Scoop bucket:
Terminal window scoop bucket add packetThrower https://github.com/packetThrower/scoop-bucketscoop install etch341scoop updatepicks up new releases on the bucket’s 6-hour bump cron — no clicking through installers. If you’d rather click, downloadetch341-<ver>-amd64-windows-setup.exe(or-arm64-windows-setup.exe) from the Releases page and run it. Stable tags also ship a proper.msi(etch341-<ver>-<arch>-windows.msi) that integrates with Apps & Features. The portable bare-.exelives inetch341-<ver>-<arch>-windows.zipfor users who want zero installer.
Steps 1–4 are needed once per machine.
If etch341 detect reports DeviceNotFound on Windows after
running it once, the driver binding is usually the cause — re-check
in Zadig that the device is still bound to WinUSB and not to a
vendor driver that took over after an update.
Pick the format for your distro and grab it from the Releases page:
| Distro | Artifact |
|---|---|
| Debian / Ubuntu / Mint | etch341-<ver>-<arch>-linux.deb |
| Fedora / openSUSE / RHEL | etch341-<ver>-1.<arch>.rpm |
| Arch / Manjaro | etch341-<ver>-1-<arch>.pkg.tar.zst |
| Any (universal) | etch341-<ver>-<arch>-linux.AppImage |
The .deb / .rpm / .pkg.tar.zst install paths drop the udev
rule into /usr/lib/udev/rules.d/99-ch341a.rules automatically. For
the AppImage, run this once:
sudo cp 99-ch341a.rules /etc/udev/rules.d/sudo udevadm control --reload# then unplug + replug the CH341A(The udev rule itself is in the repo at
platform/udev/99-ch341a.rules, and inside any of the package
installers.)
Without the udev rule, unprivileged users hit PermissionDenied
opening the CH341A.
From source (cargo)
Section titled “From source (cargo)”git clone https://github.com/packetThrower/etch341.gitcd etch341cargo install --path . # GUI + CLIcargo install --path . --no-default-features # CLI-only, smaller binaryLinux from source needs the GPUI build-time deps:
sudo apt install \ libxkbcommon-dev libxkbcommon-x11-dev \ libwayland-dev libx11-dev libxcb1-dev libxcb-randr0-dev \ libxcb-xkb-dev libxcb-cursor-dev libxcb-shape0-dev \ libxcb-xfixes0-dev libxcb-render0-dev \ libfontconfig1-dev libfreetype-dev pkg-configlibusb is statically linked into the binary via rusb’s vendored
feature, so there’s no libusb-1.0-0-dev requirement at build or
runtime.