<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>valentine, branch HEAD</title>
<subtitle>Terminal control panel for the Focusrite Scarlett 18i20 — a from-scratch replacement for Focusrite Control.
</subtitle>
<entry>
<id>e7689c3e5f768fbe404f563a85bce70b72921236</id>
<published>2026-06-02T05:10:42Z</published>
<updated>2026-06-02T05:10:42Z</updated>
<title>add MIT LICENSE (public release)</title>
<link rel="alternate" type="text/html" href="commit/e7689c3e5f768fbe404f563a85bce70b72921236.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit e7689c3e5f768fbe404f563a85bce70b72921236
parent a1cbfd6897b236c4e5ab1c76bf5fd0515a3ef4e0
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Tue,  2 Jun 2026 00:10:42 -0500

add MIT LICENSE (public release)

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>a1cbfd6897b236c4e5ab1c76bf5fd0515a3ef4e0</id>
<published>2026-06-02T04:37:47Z</published>
<updated>2026-06-02T04:37:47Z</updated>
<title>feat: install.sh + uninstall.sh, updated README (no dmg — TUI ships as scripts)</title>
<link rel="alternate" type="text/html" href="commit/a1cbfd6897b236c4e5ab1c76bf5fd0515a3ef4e0.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit a1cbfd6897b236c4e5ab1c76bf5fd0515a3ef4e0
parent ea6367f204310f6e9bf3d0b960a12d7520bfac2a
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 23:37:47 -0500

feat: install.sh + uninstall.sh, updated README (no dmg — TUI ships as scripts)

A terminal tool doesn&#39;t benefit from a .app/.dmg (no Finder launch; needs a
TTY). So Valentine ships the way TUI users expect: install.sh builds the release
binary, installs it to ~/.local/bin, and deploys the 10 themes to
~/.config/valentine/themes/. uninstall.sh removes it (--purge for config).
README Install section rewritten + feature list updated (routing editable, 10
shared themes, transparency). Verified install.sh end-to-end.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>ea6367f204310f6e9bf3d0b960a12d7520bfac2a</id>
<published>2026-06-02T04:29:51Z</published>
<updated>2026-06-02T04:29:51Z</updated>
<title>fix: persist theme name + transparency across restarts (Hydra parity)</title>
<link rel="alternate" type="text/html" href="commit/ea6367f204310f6e9bf3d0b960a12d7520bfac2a.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit ea6367f204310f6e9bf3d0b960a12d7520bfac2a
parent 7fbd06301d79a498edce2c6e51a3a0370d5bebb3
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 23:29:51 -0500

fix: persist theme name + transparency across restarts (Hydra parity)

Valentine had NO theme persistence — it forgot both the theme and transparency
on every restart (worse than the Hydra bug, which at least kept the name). Now
~/.config/valentine/ui.toml stores theme name AND transparency together;
resolve() restores both on startup (CLI --theme/--transparent override + persist).
Saved on theme-picker Enter, T toggle, and explicit CLI choice. Regression
tests: transparent_theme_file_loads_transparent + ui_settings round-trip. 71 tests.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>7fbd06301d79a498edce2c6e51a3a0370d5bebb3</id>
<published>2026-06-02T04:07:29Z</published>
<updated>2026-06-02T04:07:29Z</updated>
<title>themes: make red-pink &#39;Ember&#39; the default (drop Hydra&#39;s neutral default)</title>
<link rel="alternate" type="text/html" href="commit/7fbd06301d79a498edce2c6e51a3a0370d5bebb3.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 7fbd06301d79a498edce2c6e51a3a0370d5bebb3
parent d2841d68bc38a87ef5fde99a00c8bd1082f2a393
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 23:07:29 -0500

themes: make red-pink &#39;Ember&#39; the default (drop Hydra&#39;s neutral default)

default.toml is now Valentine&#39;s own plum/rose/coral palette (rose #ff5fa2
highlight) in the shared Hydra format — distinct from Hydra&#39;s neutral default,
which was just Hydra&#39;s. The other 9 themes stay synced with Hydra. Updated the
default-color test + docs.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>d2841d68bc38a87ef5fde99a00c8bd1082f2a393</id>
<published>2026-06-02T04:01:19Z</published>
<updated>2026-06-02T04:01:19Z</updated>
<title>themes: ship exactly 10, remove Navi from the repo</title>
<link rel="alternate" type="text/html" href="commit/d2841d68bc38a87ef5fde99a00c8bd1082f2a393.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit d2841d68bc38a87ef5fde99a00c8bd1082f2a393
parent aa3754980d69c830681aef68e45ee7a37a6eeb48
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 23:01:19 -0500

themes: ship exactly 10, remove Navi from the repo

Drop the tracked themes/navi/ (ember/mono/slate) — personal palettes don&#39;t
belong in the repo (boundary rule). The 10 bundled themes (compiled in via
include_str!) are unchanged and remain the shipped set. Updated theme.rs doc to
point users at ~/.config/valentine/themes/ for their own additions; the Navi
files are preserved off-repo. Builds clean, navi-free.

Co-Authored-By: Claude Opus 4.8 (1M context) &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>aa3754980d69c830681aef68e45ee7a37a6eeb48</id>
<published>2026-06-02T03:46:55Z</published>
<updated>2026-06-02T03:46:55Z</updated>
<title>feat: sync 10 themes with Hydra + transparency toggle; separate Navi themes</title>
<link rel="alternate" type="text/html" href="commit/aa3754980d69c830681aef68e45ee7a37a6eeb48.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit aa3754980d69c830681aef68e45ee7a37a6eeb48
parent 50199c69e1068614cec5a8dbfa5ed2e158a79f82
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 22:46:55 -0500

feat: sync 10 themes with Hydra + transparency toggle; separate Navi themes

- Adopt Hydra&#39;s theme file format verbatim (top-level name/transparent +
  [palette] of 10 keys) so the SAME .toml files work in both apps.
- Bundle Hydra&#39;s 10 themes: default, transparent, nord, gruvbox, dracula,
  rose-pine, tokyonight, catppuccin-mocha, solarized-dark, monochrome.
- Valentine&#39;s own ember/slate/mono moved to themes/navi/ (separate; load only
  if copied to ~/.config/valentine/themes/). Repo no longer auto-bundles them.
- Transparency: Theme.transparent + surface()=Color::Reset; &#39;T&#39; toggles live,
  --transparent CLI flag, main bg uses surface(). Mirrors Hydra exactly.
- Derive Valentine-only roles (border_focus/bg_selected/armed/meter_*) from the
  shared palette so any Hydra theme just works. 69 tests, 0 warnings.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>50199c69e1068614cec5a8dbfa5ed2e158a79f82</id>
<published>2026-06-01T22:54:53Z</published>
<updated>2026-06-01T22:54:53Z</updated>
<title>revert: remove monitor-via-mixer fader from the UI (device-safe)</title>
<link rel="alternate" type="text/html" href="commit/50199c69e1068614cec5a8dbfa5ed2e158a79f82.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 50199c69e1068614cec5a8dbfa5ed2e158a79f82
parent d6d4dfeaf98ef73310e931708f610c309db77dc2
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 17:54:53 -0500

revert: remove monitor-via-mixer fader from the UI (device-safe)

The mix-insert output fader was the only thing that could corrupt routing and
wedge the device (SET_MUX 0x3). Removed it from the Monitor tab + app state:
monitor_key now only does mute/dim; panel shows the read-only hardware knob +
mute/dim. Confirmed with the user this device has no writable output volume and
the ADAT loudness is downstream (external converter / monitor knobs), not
fixable in software. Core group/route methods kept (used by spike diagnostics).
Everything else intact: routing editor, presets, per-input meters, themes,
input toggles, mixer + clear. 67 tests, 0 warnings.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>d6d4dfeaf98ef73310e931708f610c309db77dc2</id>
<published>2026-06-01T21:18:08Z</published>
<updated>2026-06-01T21:18:08Z</updated>
<title>test: offline mux round-trip suite disproves 4 corruption theories</title>
<link rel="alternate" type="text/html" href="commit/d6d4dfeaf98ef73310e931708f610c309db77dc2.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit d6d4dfeaf98ef73310e931708f610c309db77dc2
parent acf91fce8cecdf5ac8d5aabb9e20601124513252
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 16:18:08 -0500

test: offline mux round-trip suite disproves 4 corruption theories

Adds MuxState::roundtrip_decode + tests proving the encoding is structurally
sound (faithful round-trip on the user&#39;s real routing incl ADAT 7/8, all ADAT
dests present, no dup dests, per-table lengths match assignment ≤77). The 0x3
on SET_MUX is therefore not in our encoding logic — it&#39;s live-wire framing or a
device-state precondition. Documented as the key open bug.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>acf91fce8cecdf5ac8d5aabb9e20601124513252</id>
<published>2026-06-01T20:59:37Z</published>
<updated>2026-06-01T20:59:37Z</updated>
<title>feat(spike): adatverify — fresh-process read of actual ADAT routing</title>
<link rel="alternate" type="text/html" href="commit/acf91fce8cecdf5ac8d5aabb9e20601124513252.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit acf91fce8cecdf5ac8d5aabb9e20601124513252
parent d3394aa85a304fca36ade45a3e9e114bdcbc0ccb
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 15:59:37 -0500

feat(spike): adatverify — fresh-process read of actual ADAT routing

Reads (no writes) what truly feeds each ADAT out, to confirm whether the
device accepted ADAT&lt;-Mix or silently kept ADAT&lt;-PCM. Run after adatset to
distinguish &#39;write not applied&#39; from &#39;mix bus not attenuating&#39;.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>d3394aa85a304fca36ade45a3e9e114bdcbc0ccb</id>
<published>2026-06-01T20:48:54Z</published>
<updated>2026-06-01T20:48:54Z</updated>
<title>feat: full TOML theme support — --theme CLI, bundled registry, in-app switcher</title>
<link rel="alternate" type="text/html" href="commit/d3394aa85a304fca36ade45a3e9e114bdcbc0ccb.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit d3394aa85a304fca36ade45a3e9e114bdcbc0ccb
parent 59fadb844d09c033ffa3ff387ec8817cf1e6ee86
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 15:48:54 -0500

feat: full TOML theme support — --theme CLI, bundled registry, in-app switcher

- BUILTIN_THEMES registry: ember (default), slate, mono (all TOML, compiled in).
- CLI: --theme &lt;name|path.toml&gt;, --list-themes, --help. Loads a bundled name, a
  stem from ~/.config/valentine/themes/, or any .toml path.
- In-app theme switcher: &#39;t&#39; opens a picker that live-previews on ↑↓, Enter
  keeps, Esc reverts. Active theme shown in the title bar.
- Theme::resolve/by_name/available_themes; user themes dir ~/.config/valentine/themes/.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>59fadb844d09c033ffa3ff387ec8817cf1e6ee86</id>
<published>2026-06-01T20:40:58Z</published>
<updated>2026-06-01T20:40:58Z</updated>
<title>diag(spike): adatset writes each routing table separately to find 0x3</title>
<link rel="alternate" type="text/html" href="commit/59fadb844d09c033ffa3ff387ec8817cf1e6ee86.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 59fadb844d09c033ffa3ff387ec8817cf1e6ee86
parent 3d156748656c3759baf294fc5e4197a5adc96af9
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 15:40:58 -0500

diag(spike): adatset writes each routing table separately to find 0x3

</content>
</entry>
<entry>
<id>3d156748656c3759baf294fc5e4197a5adc96af9</id>
<published>2026-06-01T20:32:48Z</published>
<updated>2026-06-01T20:32:48Z</updated>
<title>chore(spike): adatset reports which write throws the error</title>
<link rel="alternate" type="text/html" href="commit/3d156748656c3759baf294fc5e4197a5adc96af9.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 3d156748656c3759baf294fc5e4197a5adc96af9
parent 537036c0d3f21caf88150c652ed49b2e11559839
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 15:32:48 -0500

chore(spike): adatset reports which write throws the error

</content>
</entry>
<entry>
<id>537036c0d3f21caf88150c652ed49b2e11559839</id>
<published>2026-06-01T20:30:13Z</published>
<updated>2026-06-01T20:30:13Z</updated>
<title>feat(spike): adatset — persisting ADAT attenuation listen-test</title>
<link rel="alternate" type="text/html" href="commit/537036c0d3f21caf88150c652ed49b2e11559839.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 537036c0d3f21caf88150c652ed49b2e11559839
parent 41649b95e76d4e15572f71771b4b48abcba2f10c
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 15:30:13 -0500

feat(spike): adatset — persisting ADAT attenuation listen-test

Sets ADAT via mixer + a given dB and LEAVES it (no revert), so we can hear
whether writing the mix bus actually attenuates ADAT. &#39;direct&#39; restores
ADAT&lt;-PCM. Isolates the audible effect from all TUI plumbing.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>41649b95e76d4e15572f71771b4b48abcba2f10c</id>
<published>2026-06-01T20:18:38Z</published>
<updated>2026-06-01T20:18:38Z</updated>
<title>fix: faders effective by default — no toggle needed</title>
<link rel="alternate" type="text/html" href="commit/41649b95e76d4e15572f71771b4b48abcba2f10c.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 41649b95e76d4e15572f71771b4b48abcba2f10c
parent 8291d0f2b2aa4f48658acc4421a3b08a4065f72f
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 15:18:38 -0500

fix: faders effective by default — no toggle needed

The adatfader probe proved the device chain works (route+level land at -40dB);
the failure was the TUI gating the fader behind a &#39;v&#39; toggle that fought the
already-via-mixer state. Now: ←→ owns the routing (auto-routes the group via
the mixer on first use), Monitor-tab entry detects already-routed groups and
SEEDS each fader from the device&#39;s actual current level (get_group_level), and
the fader bar always shows. &#39;v&#39; is now just an optional back-to-DAW. No toggling
required.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>8291d0f2b2aa4f48658acc4421a3b08a4065f72f</id>
<published>2026-06-01T20:12:46Z</published>
<updated>2026-06-01T20:12:46Z</updated>
<title>feat(spike): adatfader — trace the ADAT via-mixer fader chain on hardware</title>
<link rel="alternate" type="text/html" href="commit/8291d0f2b2aa4f48658acc4421a3b08a4065f72f.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 8291d0f2b2aa4f48658acc4421a3b08a4065f72f
parent 9d02e362e6366d46b63e5282b34f919a9c37a2ce
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 15:12:46 -0500

feat(spike): adatfader — trace the ADAT via-mixer fader chain on hardware

Runs route_group_via_mixer + set_group_level for the ADAT group and reads the
device back at each step (ADAT out routing, mixer-input feeds, per-bus gains)
to pinpoint why the fader has no audible effect. Restores ADAT to direct after.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>9d02e362e6366d46b63e5282b34f919a9c37a2ce</id>
<published>2026-06-01T19:58:56Z</published>
<updated>2026-06-01T19:58:56Z</updated>
<title>fix: coalesce fader writes per-frame so the fader actually works</title>
<link rel="alternate" type="text/html" href="commit/9d02e362e6366d46b63e5282b34f919a9c37a2ce.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 9d02e362e6366d46b63e5282b34f919a9c37a2ce
parent b873468a5e13f618f1058f5f4d6d5256f6229b2d
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 14:58:56 -0500

fix: coalesce fader writes per-frame so the fader actually works

Previous drain dropped queued events (fader did nothing); before that, a
per-keypress 8-write fader cascaded to silence. Now a fader keypress only
updates the in-memory level + flags a pending write; all queued key events are
processed in one batch per frame, then flush_pending_writes does ONE device
write at the final value. Holding the key ramps smoothly; no cascade, stays
responsive.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>b873468a5e13f618f1058f5f4d6d5256f6229b2d</id>
<published>2026-06-01T19:33:39Z</published>
<updated>2026-06-01T19:33:39Z</updated>
<title>fix: drain queued input after each key so slow writes can&#39;t cascade</title>
<link rel="alternate" type="text/html" href="commit/b873468a5e13f618f1058f5f4d6d5256f6229b2d.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit b873468a5e13f618f1058f5f4d6d5256f6229b2d
parent d6965e725d2eba1c17f2bd45d4b747f4b520cb3a
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 14:33:39 -0500

fix: drain queued input after each key so slow writes can&#39;t cascade

A control change can be many USB writes (8 for an ADAT group fader); while
that runs, held/repeated keys pile up in the terminal buffer and then replay,
making one fader press cascade straight to silence. After handling a key, drain
any already-queued events (non-blocking) so it&#39;s one action per redraw. The
fader math itself was correct/linear — this was buffered key-repeat.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>d6965e725d2eba1c17f2bd45d4b747f4b520cb3a</id>
<published>2026-06-01T19:18:08Z</published>
<updated>2026-06-01T19:18:08Z</updated>
<title>feat(spike): adatcheck — diagnose hot ADAT output (routing + DAW levels)</title>
<link rel="alternate" type="text/html" href="commit/d6965e725d2eba1c17f2bd45d4b747f4b520cb3a.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit d6965e725d2eba1c17f2bd45d4b747f4b520cb3a
parent 5a53c4fc3ff00d1e2c003db19882eb19fad6b08a
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 14:18:08 -0500

feat(spike): adatcheck — diagnose hot ADAT output (routing + DAW levels)

Read-only: shows what feeds each ADAT out (PCM-direct like FC, vs a mix bus
that would sum the wall-of-unity mixer to a hot level) and compares DAW send
levels PCM 13-20 (ADAT) vs PCM 1-2 (main/HP). Pinpoints whether the loud ADAT
is induced routing, DAW levels, or the external converter.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>5a53c4fc3ff00d1e2c003db19882eb19fad6b08a</id>
<published>2026-06-01T19:13:31Z</published>
<updated>2026-06-01T19:13:31Z</updated>
<title>feat: generalize monitor fader to groups; add ADAT 1-8 group</title>
<link rel="alternate" type="text/html" href="commit/5a53c4fc3ff00d1e2c003db19882eb19fad6b08a.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 5a53c4fc3ff00d1e2c003db19882eb19fad6b08a
parent 4e9662a218da717b7626d46eaefa800582145330
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 14:13:31 -0500

feat: generalize monitor fader to groups; add ADAT 1-8 group

Refactored the monitor-via-mixer fader into reusable MonitorGroup (out/bus/
mixer-in/pcm bases + count) with route_group_via_mixer/route_group_direct/
set_group_level/group_is_via_mixer. MONITOR_GROUPS = Analogue 1-2 (buses 0-1)
and ADAT 1-8 (buses 2-9, PCM 13-20) — non-overlapping so both work at once.
Monitor tab: [ ] switches group, v routes it via mixer, arrows are its fader;
title shows the active group. ADAT is the user&#39;s main monitoring path.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>4e9662a218da717b7626d46eaefa800582145330</id>
<published>2026-06-01T19:02:53Z</published>
<updated>2026-06-01T19:02:53Z</updated>
<title>feat: software monitor fader via mixer-inserted output path</title>
<link rel="alternate" type="text/html" href="commit/4e9662a218da717b7626d46eaefa800582145330.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 4e9662a218da717b7626d46eaefa800582145330
parent c89c962772742c013271b3b881fc1f8ba948ce51
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 14:02:53 -0500

feat: software monitor fader via mixer-inserted output path

The device has no writable output volume, so to give Valentine real monitor
level control: &#39;v&#39; on the Monitor tab routes Analogue Out 1/2 through Mix A/B
(Mixer In 1/2 &lt;- PCM 1/2; Out &lt;- Mix A/B), and ←→ sets Mix A/B gain as the
monitor fader. Reversible (v again = direct from DAW). Core adds
route_monitor_via_mixer/route_monitor_direct/set_monitor_level/
monitor_is_via_mixer. Monitor panel shows hardware knob (read-only) + the
software fader. Prototype for the monitor pair; ADAT outs to follow once
verified on hardware.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>c89c962772742c013271b3b881fc1f8ba948ce51</id>
<published>2026-06-01T18:51:45Z</published>
<updated>2026-06-01T18:51:45Z</updated>
<title>feat: &#39;c&#39; clears the mixer to silence (auto-backs-up first)</title>
<link rel="alternate" type="text/html" href="commit/c89c962772742c013271b3b881fc1f8ba948ce51.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit c89c962772742c013271b3b881fc1f8ba948ce51
parent 4358539aeb5174202e6c812c014e725e629b9f93
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 13:51:45 -0500

feat: &#39;c&#39; clears the mixer to silence (auto-backs-up first)

The device sits in a wall-of-unity mixer (288 crosspoints at 0 dB = up to
~+27 dB summing per bus) — a prime loudness suspect. Mixer tab &#39;c&#39; saves the
current mixer to a &#39;mixer-backup&#39; preset, then sets every crosspoint to
silence via Scarlett::clear_mixer. Reversible: load &#39;mixer-backup&#39; with p.
Diagnostic step to confirm whether the mixer feeds the monitors.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>4358539aeb5174202e6c812c014e725e629b9f93</id>
<published>2026-06-01T18:46:14Z</published>
<updated>2026-06-01T18:46:14Z</updated>
<title>feat(spike): presetcheck — read-only mixer loudness diagnostic</title>
<link rel="alternate" type="text/html" href="commit/4358539aeb5174202e6c812c014e725e629b9f93.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 4358539aeb5174202e6c812c014e725e629b9f93
parent 82fdcb2a7e26425769871c000972367b78f1fb2d
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 13:46:14 -0500

feat(spike): presetcheck — read-only mixer loudness diagnostic

Reports non-silent mixer crosspoints, per-bus active counts, and unity-gain
crosspoints, to diagnose whether &#39;too loud&#39; is a hot mix bus (summing many
unity sources) vs a preset round-trip issue. Read-only.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>82fdcb2a7e26425769871c000972367b78f1fb2d</id>
<published>2026-06-01T18:39:39Z</published>
<updated>2026-06-01T18:39:39Z</updated>
<title>fix: presets capture+apply routing; p-only picker with instant Y/N confirm</title>
<link rel="alternate" type="text/html" href="commit/82fdcb2a7e26425769871c000972367b78f1fb2d.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 82fdcb2a7e26425769871c000972367b78f1fb2d
parent 56f904ea99b0dbd86b063f8542ccfd4f446efa19
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 13:39:39 -0500

fix: presets capture+apply routing; p-only picker with instant Y/N confirm

- Preset now includes full routing (mux), captured on save and applied on
  load — fixes &#39;preset doesn&#39;t switch settings&#39; (routing was the missing,
  main thing). apply_preset writes routing atomically; load refreshes views.
- Preset picker is now the &#39;p&#39; key only (dropped L).
- No staging: pick in the picker -&gt; single yes/no confirm window -&gt; instant
  apply. Removes the pending-preset stage/confirm-on-status flow.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>56f904ea99b0dbd86b063f8542ccfd4f446efa19</id>
<published>2026-06-01T18:23:02Z</published>
<updated>2026-06-01T18:23:02Z</updated>
<title>feat: multi-preset support + cross-screen picker/save modals</title>
<link rel="alternate" type="text/html" href="commit/56f904ea99b0dbd86b063f8542ccfd4f446efa19.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 56f904ea99b0dbd86b063f8542ccfd4f446efa19
parent 3c7c75fb6710c6bfa0746b2c94c9972de0fac496
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 13:23:02 -0500

feat: multi-preset support + cross-screen picker/save modals

Presets are now individual &lt;name&gt;.json files. S opens a save-as name entry;
L or p opens a preset picker (↑↓ select, Enter loads → confirm to apply) —
both reachable from ANY tab via a modal overlay that captures input first.
Replaces the single-slot preset.json with presets_dir/preset_file/list_presets.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>3c7c75fb6710c6bfa0746b2c94c9972de0fac496</id>
<published>2026-06-01T18:18:11Z</published>
<updated>2026-06-01T18:18:11Z</updated>
<title>feat: routing grouped by stereo pairs, staged + atomic pair writes</title>
<link rel="alternate" type="text/html" href="commit/3c7c75fb6710c6bfa0746b2c94c9972de0fac496.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 3c7c75fb6710c6bfa0746b2c94c9972de0fac496
parent 273b13d1071a6d14921f41b73d491b1477c95325
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 13:18:11 -0500

feat: routing grouped by stereo pairs, staged + atomic pair writes

Routing panel now lists destinations as stereo pairs (Analogue Out 1-2, ...);
left/right stages a SOURCE PAIR, Enter commits both channels in one atomic
write (set_routes) so a pair never passes through a half-routed state. Off
maps both to Off. Core adds dest_pairs/source_pairs/PairRow + set_routes.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>273b13d1071a6d14921f41b73d491b1477c95325</id>
<published>2026-06-01T18:10:32Z</published>
<updated>2026-06-01T18:10:32Z</updated>
<title>feat: stage-then-confirm for routing changes and preset load</title>
<link rel="alternate" type="text/html" href="commit/273b13d1071a6d14921f41b73d491b1477c95325.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 273b13d1071a6d14921f41b73d491b1477c95325
parent 81a1380dbaf27b6b7929e3722e592f28547b734a
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 13:10:32 -0500

feat: stage-then-confirm for routing changes and preset load

Routing: left/right now STAGE a source for the selected destination (no write);
Enter applies, Esc cancels — avoids momentarily routing through every source
while cycling (feedback-loop risk). Staged source shown in accent with a *.
Preset load: L stages the preset, Enter/Y applies, Esc/N discards (it rewrites
many controls at once). Status line + help reflect the confirm step.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>81a1380dbaf27b6b7929e3722e592f28547b734a</id>
<published>2026-06-01T18:01:34Z</published>
<updated>2026-06-01T18:01:34Z</updated>
<title>feat: interactive routing edit (hardware-verified write path)</title>
<link rel="alternate" type="text/html" href="commit/81a1380dbaf27b6b7929e3722e592f28547b734a.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 81a1380dbaf27b6b7929e3722e592f28547b734a
parent 3b1ff1bf89f035fd06526cc9de818e9d6e57a7f3
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 13:01:34 -0500

feat: interactive routing edit (hardware-verified write path)

Routing panel is now editable: up/down select a destination, left/right cycle
its source (Off = unrouted), written immediately via Scarlett::set_route
(MuxState -&gt; encode 3 tables -&gt; write_routing_tables). Adds mux dest_list/
source_list/get/encode_all; Device.routing is now MuxState. The write path was
proven safe first (muxcheck + --write-noop on hardware).

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>3b1ff1bf89f035fd06526cc9de818e9d6e57a7f3</id>
<published>2026-06-01T16:14:43Z</published>
<updated>2026-06-01T16:14:43Z</updated>
<title>feat(spike): muxcheck --write-noop — verify write path with a no-op rewrite</title>
<link rel="alternate" type="text/html" href="commit/3b1ff1bf89f035fd06526cc9de818e9d6e57a7f3.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 3b1ff1bf89f035fd06526cc9de818e9d6e57a7f3
parent 40d126c571eef6210803e1c52e6b32e2bbbbe37d
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 11:14:43 -0500

feat(spike): muxcheck --write-noop — verify write path with a no-op rewrite

Opt-in flag writes the current routing back unchanged via write_routing_tables,
then re-reads to confirm zero routes changed. Safest possible exercise of the
real SET_MUX path on hardware before enabling actual routing edits.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>40d126c571eef6210803e1c52e6b32e2bbbbe37d</id>
<published>2026-06-01T16:13:03Z</published>
<updated>2026-06-01T16:13:03Z</updated>
<title>feat(core): routing (mux) model + write encoding + read-only safety probe</title>
<link rel="alternate" type="text/html" href="commit/40d126c571eef6210803e1c52e6b32e2bbbbe37d.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 40d126c571eef6210803e1c52e6b32e2bbbbe37d
parent 60b2ccd30be1b4caeb5a5eb16238e81b2b2d94a9
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 11:13:03 -0500

feat(core): routing (mux) model + write encoding + read-only safety probe

scarlett-core/src/mux.rs: port-number&lt;-&gt;hardware-id conversions, MuxState
(flat mux[dest]=src), 3-table mux_assignment, encode_table() packing
dst_id|(src_id&lt;&lt;12) — faithful port of scarlett2_usb_set_mux. matrix.rs adds
write_routing_tables() (3 SET_MUX msgs) + dry_run_routing(). spike/muxcheck:
READ-ONLY probe that re-encodes current routing and verifies it reproduces the
device byte-for-byte (no-op) before any write is enabled. 60 core tests.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>60b2ccd30be1b4caeb5a5eb16238e81b2b2d94a9</id>
<published>2026-06-01T15:56:05Z</published>
<updated>2026-06-01T15:56:05Z</updated>
<title>fix: unify meters tab + inputs panel onto one dBFS scale (clip=0dB)</title>
<link rel="alternate" type="text/html" href="commit/60b2ccd30be1b4caeb5a5eb16238e81b2b2d94a9.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 60b2ccd30be1b4caeb5a5eb16238e81b2b2d94a9
parent c83c637bb41372512d77d7153026470c8cd06b28
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 10:56:05 -0500

fix: unify meters tab + inputs panel onto one dBFS scale (clip=0dB)

The two views disagreed: meters tab was linear (raw/4095) while inputs used
log dBFS with full-scale 16384 (~12dB too high, never hit red). Now both use
raw_to_dbfs + a shared meter_fill() window (-48..0) + shared color thresholds,
and METER_FULL_SCALE = 4095 so an overloading input pegs at 0 dBFS / red.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>c83c637bb41372512d77d7153026470c8cd06b28</id>
<published>2026-06-01T15:50:50Z</published>
<updated>2026-06-01T15:50:50Z</updated>
<title>tune: hotter input meters — -48dB window, amber@-18 red@-6</title>
<link rel="alternate" type="text/html" href="commit/c83c637bb41372512d77d7153026470c8cd06b28.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit c83c637bb41372512d77d7153026470c8cd06b28
parent d31fadaa431b331e68027618f7b88c3642cb8119
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 10:50:50 -0500

tune: hotter input meters — -48dB window, amber@-18 red@-6

Narrowed the inputs meter window from -60 to -48 dBFS so program material
fills more of the bar, and moved color thresholds to DAW-typical points
(amber ~-18, red ~-6). dB calibration (METER_FULL_SCALE) unchanged.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>d31fadaa431b331e68027618f7b88c3642cb8119</id>
<published>2026-06-01T15:41:44Z</published>
<updated>2026-06-01T15:41:44Z</updated>
<title>fix: meter each input where it&#39;s routed (PCM capture), dBFS bars</title>
<link rel="alternate" type="text/html" href="commit/d31fadaa431b331e68027618f7b88c3642cb8119.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit d31fadaa431b331e68027618f7b88c3642cb8119
parent 0bcf3fd3f6d2d95b646e6d4025567e301c3eb53a
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 10:41:44 -0500

fix: meter each input where it&#39;s routed (PCM capture), dBFS bars

Inputs are normally routed straight to the DAW (PCM capture), not the mixer,
so the old mixer-input meters showed nothing for ADAT and wrong levels.
Now read each source&#39;s PCM-capture meter via live routing
(source_to_pcm_capture) and draw a dBFS bar (-60..0). Verified on hardware:
Analogue 3-&gt;PCM cap 3 (raw 2), ADAT 1-&gt;PCM cap 13 (raw 10). Adds
pcm_capture_level/raw_to_dbfs (tested) + Source::hw_id.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>0bcf3fd3f6d2d95b646e6d4025567e301c3eb53a</id>
<published>2026-06-01T15:25:48Z</published>
<updated>2026-06-01T15:25:48Z</updated>
<title>feat(spike): metermap v2 — dump routing + peak-hold every raw index</title>
<link rel="alternate" type="text/html" href="commit/0bcf3fd3f6d2d95b646e6d4025567e301c3eb53a.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 0bcf3fd3f6d2d95b646e6d4025567e301c3eb53a
parent 872781d3d87cfc3d871c0c628a5ce49c9c96eb49
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 10:25:48 -0500

feat(spike): metermap v2 — dump routing + peak-hold every raw index

Prints full decoded routing (sink&lt;-source) and peak-holds all 65 GET_METER
indices for ~12s, labeling each by destination + routed source. Lets us see
exactly where ADAT is routed and which raw index moves (channel mapping) plus
real signal peaks (full-scale calibration vs DAW). Read-only.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>872781d3d87cfc3d871c0c628a5ce49c9c96eb49</id>
<published>2026-06-01T15:20:49Z</published>
<updated>2026-06-01T15:20:49Z</updated>
<title>feat: live per-input meters on the inputs page (hardware-verified mapping)</title>
<link rel="alternate" type="text/html" href="commit/872781d3d87cfc3d871c0c628a5ce49c9c96eb49.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 872781d3d87cfc3d871c0c628a5ce49c9c96eb49
parent 406fbc57ff9927f45af34480776e35ea1cfd9e5a
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Mon,  1 Jun 2026 10:20:49 -0500

feat: live per-input meters on the inputs page (hardware-verified mapping)

Each input row shows a level bar driven by the mixer-input meter span. Mapping
confirmed on the real 18i20 (2026-06-01): mixer input N = raw GET_METER index
40+(N-1); feeding analogue input 3 lit raw 42. Inputs tab now polls meters
every tick; stereo rows show the louder channel. Also fixed metermap probe
labels/offset and added mixer_input_level/raw_index helpers (tested).

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>406fbc57ff9927f45af34480776e35ea1cfd9e5a</id>
<published>2026-06-01T02:30:11Z</published>
<updated>2026-06-01T02:30:11Z</updated>
<title>feat(spike): read-only metermap probe to verify source-&gt;meter mapping</title>
<link rel="alternate" type="text/html" href="commit/406fbc57ff9927f45af34480776e35ea1cfd9e5a.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 406fbc57ff9927f45af34480776e35ea1cfd9e5a
parent ec11802b58ca5856299b2473146e63c30c0dadce
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Sun, 31 May 2026 21:30:11 -0500

feat(spike): read-only metermap probe to verify source-&gt;meter mapping

Samples GET_METER 20x and prints raw levels grouped by meter_map spans (with
raw index + destination), plus a peak summary, so we can empirically see which
index moves when an input is fed — verifying the mixer-input meter mapping
before wiring meters into the inputs UI. Reads only; changes nothing.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>ec11802b58ca5856299b2473146e63c30c0dadce</id>
<published>2026-06-01T02:23:16Z</published>
<updated>2026-06-01T02:23:16Z</updated>
<title>feat(core): port kernel meter-level remap (dest-&gt;raw index)</title>
<link rel="alternate" type="text/html" href="commit/ec11802b58ca5856299b2473146e63c30c0dadce.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit ec11802b58ca5856299b2473146e63c30c0dadce
parent 019b2184f709572d24c47b51cbd50164d2c82761
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Sun, 31 May 2026 21:23:16 -0500

feat(core): port kernel meter-level remap (dest-&gt;raw index)

scarlett-core/src/meter.rs faithfully reimplements
scarlett2_update_meter_level_map: build_level_map() turns the live routing
(mux[dest]=src) + the device meter_map into dest-&gt;raw-index, with source
dedup and Off-&gt;zero. Tested (4 cases). Foundation for per-channel meters;
source-&gt;meter still needs routing inversion + hardware verification.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>019b2184f709572d24c47b51cbd50164d2c82761</id>
<published>2026-06-01T02:06:52Z</published>
<updated>2026-06-01T02:06:52Z</updated>
<title>feat: stereo-pair input view (default) with mono toggle</title>
<link rel="alternate" type="text/html" href="commit/019b2184f709572d24c47b51cbd50164d2c82761.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 019b2184f709572d24c47b51cbd50164d2c82761
parent e9f1cc736c4236d848aa32a7dff8cf98b31a1af7
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Sun, 31 May 2026 21:06:52 -0500

feat: stereo-pair input view (default) with mono toggle

Inputs panel now groups odd/even same-kind sources into stereo rows by
default (s toggles mono). Preamp toggles apply to both channels of a pair
and stay in sync; 48V handles multi-group rows. Vertical scroll, mode shown
in the title and help.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>e9f1cc736c4236d848aa32a7dff8cf98b31a1af7</id>
<published>2026-06-01T01:57:16Z</published>
<updated>2026-06-01T01:57:16Z</updated>
<title>fix: reconcile inputs panel with real sources API; add source catalog</title>
<link rel="alternate" type="text/html" href="commit/e9f1cc736c4236d848aa32a7dff8cf98b31a1af7.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit e9f1cc736c4236d848aa32a7dff8cf98b31a1af7
parent b8b9de94b30c3533c6af9f508834e31367e41dbc
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Sun, 31 May 2026 20:57:16 -0500

fix: reconcile inputs panel with real sources API; add source catalog

The previous commit rewrote inputs.rs against a sources::{Source,SourceType}
API that was never created, leaving the workspace uncompilable. Point the
panel at the actual scarlett-core::sources catalog (all 39 sources: analogue
incl. talkback, ADAT, S/PDIF, PCM), wire Device.sources + main.rs call sites,
and drop dead code. Also: lowercase wordmark/tabs, theme loads ~/.config first.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
<entry>
<id>b8b9de94b30c3533c6af9f508834e31367e41dbc</id>
<published>2026-05-31T23:18:39Z</published>
<updated>2026-05-31T23:18:39Z</updated>
<title>feat: Implement Inputs panel rewrite to support all input types with per-channel strips and meters.</title>
<link rel="alternate" type="text/html" href="commit/b8b9de94b30c3533c6af9f508834e31367e41dbc.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit b8b9de94b30c3533c6af9f508834e31367e41dbc
parent 35effd89312ab0a7013f798b7f5b0a1d3ea82932
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Sun, 31 May 2026 18:18:39 -0500

feat: Implement Inputs panel rewrite to support all input types with per-channel strips and meters.

Co-authored-by: aider (ollama/qwen2.5-coder:14b) &lt;aider@aider.chat&gt;

</content>
</entry>
<entry>
<id>35effd89312ab0a7013f798b7f5b0a1d3ea82932</id>
<published>2026-05-31T23:18:15Z</published>
<updated>2026-05-31T23:18:15Z</updated>
<title>fix: correct capitalization in input panel title</title>
<link rel="alternate" type="text/html" href="commit/35effd89312ab0a7013f798b7f5b0a1d3ea82932.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 35effd89312ab0a7013f798b7f5b0a1d3ea82932
parent 14b34b172794748c6d3fa9f23f7ba33fc19bb37c
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Sun, 31 May 2026 18:18:15 -0500

fix: correct capitalization in input panel title

</content>
</entry>
<entry>
<id>14b34b172794748c6d3fa9f23f7ba33fc19bb37c</id>
<published>2026-05-31T22:02:20Z</published>
<updated>2026-05-31T22:02:20Z</updated>
<title>Valentine: terminal control panel for Scarlett 18i20 3rd Gen</title>
<link rel="alternate" type="text/html" href="commit/14b34b172794748c6d3fa9f23f7ba33fc19bb37c.html" />
<author>
<name>Matthew Gantenbein</name>
<email>ganten1998@gmail.com</email>
</author>
<content>commit 14b34b172794748c6d3fa9f23f7ba33fc19bb37c
Author: Matthew Gantenbein &lt;ganten1998@gmail.com&gt;
Date:   Sun, 31 May 2026 17:02:20 -0500

Valentine: terminal control panel for Scarlett 18i20 3rd Gen

scarlett2 USB control protocol (clean-room, rusb/EP0) + ratatui TUI.
Six panels (Inputs/Monitor/Mixer/Routing/Meters/Clock), presets +
standalone NVRAM save, swappable themes (Ember default). Protocol layer
hardware-validated on the 18i20 g3; routing read-only for now.

Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

</content>
</entry>
</feed>
