v0.5.1
fretwire 0.5.1
Live-follow is back. Every GUI build since 2026-08-25 — 0.4.0 and 0.5.0 among them — opened,
connected and edited normally, but footswitch presses and panel changes on the pedal never
reached the window. The frontend's subscription to the device's pushes was being refused by the
webview, silently, and the same refusal hid the IR export's save dialog. Fixed, with a test that
keeps it fixed. Alongside it, what landed in the two days since 0.5.0: a full device backup
(presets, IRs and global settings in one file, restored by difference), tempo sync shown as
one control, latching / momentary footswitch type, and two POD Go corrections.
9 commits since v0.5.0.
The bug
Tauri grants the webview its plugin calls — the event listener, the file dialogs — from a
capability file that the crate's build script compiles into the binary. A 2026-08-25 rewrite of
that script (to warn about a stale frontend) dropped the one call that does the compiling. App
commands have no such list and kept working, so the editor looked healthy; every plugin call was
refused with event.listen not allowed. Plugin not found, a message that goes to the JavaScript
console and nowhere else. Three listeners in the frontend, three refusals; the one for
device-pushes is live-follow.
It went unnoticed here because cargo reuses a build script's output directory when the package's
metadata is unchanged, so the development tree kept serving the file an earlier build had written.
A fresh clone, a CI runner, or a version bump got a clean directory and an empty list — which is
why a git bisect on the symptom named the 0.4.0 version bump.
- The call is back, with the reason written above it.
dialog:allow-saveis granted now too: the IR export's save dialog had never been in the
capability file, so it was refused even when the list was compiled.- The GUI logs to stderr, so
fretwire-gui 2> gui.logcaptures what the bug-report
instructions say it does. - A test in the GUI crate asks the compiled authority whether
plugin:event|listenand the two
dialogs resolve for the main window. With the call removed it fails, and CI runs it on a fresh
runner — the environment where the list was missing.
Found by the POD Go owner on issue #15, from the webview's devtools after two logs and a bisect
had said nothing. Confirmed on an HX Stomp with a full rebuild before this release.
Full device backup
fretwire backup-device writes every setlist's presets, the user IR store and the global
settings to one file; restore-device puts them back. The restore compares before writing —
a preset as its writable blob, an IR by checksum, a setting by value after a type check — so a
fresh backup restored onto its own pedal writes nothing, and a pedal that lost one setlist gets
that setlist and nothing else. A dry run prints the plan; --yes runs it; --no-presets,
--no-irs, --no-settings scope it; the file's device must match unless --force. The GUI has
the pair under its ⋯ menu, with a restore dialog that reads the file's counts first and a report
after. The format is version 3; a file with neither IRs nor settings is still written as
version 2, so every released build keeps reading a presets-only export.
Measured on an HX Stomp: 126 presets, one IR and 154 settings in 715 KB; a restore of that file
onto the same pedal wrote the eight virgin "New Preset" slots once (saving a preset flips its
active snapshot's in-use flag, so a slot backed up virgin differs from the file by one boolean for
good) and nothing else.
Tempo sync as one control
A delay's Time, its tempo-sync switch and its note value are three parameters on the wire and
one control in HX Edit. Which parameter a TempoSync/SyncSelect pair governs turned out to be
stated in HX_ModelCatalog.json — 159 groups across 144 models, every one the same shape — so
the panel now shows the governed knob with a ♩ button and, while sync is on, the note-value
selector in its place. Seen live on a Bucket Brigade, a Harmonic Tremolo and a two-group 70s
Chorus. The MCP server's new model_params tool describes a model's parameters the same way.
Also
- Footswitch type. Latching or momentary, read and written through the same document path
as the label and colour:fretwire switch-type, the GUI's switch editor, the MCP server.
Confirmed under a foot: a momentary FS1 held its block flipped only while pressed. - POD Go:
IR Selectis one-based. The IR block's selector showed each IR one row off (value
6 is the IR listed as 006); it now names the right one and no longer overflows its cell. - POD Go: slots 9 and 10 take an add. A guard added in 0.5.0 refused them on a misreading of
two earlier incidents (one was an add into slot 11, the other a chain missing its mandated
blocks).addnow refuses only a slot outside 1–10. POD Go Edit's own fill of an empty slot
was captured and is the same op fretwire sends. fretwire check-update --auto on|offhas its own on/off argument.
The update check's first real run
0.5.0 shipped the opt-in update check and had nothing newer to find. If you said yes to it, this
is the release it shows you.
Known limits
- Serve mode has no TLS of its own; put it behind a tunnel or a proxy beyond a trusted LAN.
- POD Go: the IR directory is scanned rather than decoded; live-follow on a POD Go with this
build has not yet been reported (the pushes decode infretwire watch, so it is expected to
work). - Grid and routing planning is still DSP-0 only; the settings namespace is mapped in part;
IR reorder is delete-and-re-upload. - No firmware, flash or DFU traffic, by design and permanently. See
docs/safety.md.
Installing
Grab the .deb, .rpm, .AppImage or the Arch .pkg.tar.zst for the GUI, or the static
tarballs that run on any distro, x86-64 or arm64: fretwire-cli-* (the CLI),
fretwire-serve-* (the daemon, one file with the editor inside) and fretwire-mcp-*
(the MCP server). The deb, rpm and Arch package install the udev rule and the CLI alongside the
app; for the AppImage or the tarballs, install packaging/70-hxstomp.rules yourself and replug
the pedal.
On first run the app imports the model and preset reference data from your own HX Edit
installation (POD Go owners: from POD Go Edit). Nothing proprietary is shipped in these
packages, and nothing is sent anywhere unless you say yes to the update check.
Thanks
@jamesremuscat on issue #15, who ran the logs, ran the bisect, opened the devtools and
handed over the one line that explained everything — and captured POD Go Edit filling an empty
slot on the same day.