Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
408 commits
Select commit Hold shift + click to select a range
06eaaa2
docs: P4-020 design addendum -- shared I2S bus, not mutual exclusion
Skeyelab Jul 9, 2026
53a5458
test: add failing host tests for follow_beat (P4-020)
Skeyelab Jul 9, 2026
d979e36
fix: add missing -I../KitchenSync/main to test_follow_beat rule
Skeyelab Jul 9, 2026
5cc2541
feat: pure follow_beat tempo detector (P4-020)
Skeyelab Jul 9, 2026
b1da587
fix: follow_beat -- DC-remove autocorrelation + shrink analyze() stac…
Skeyelab Jul 9, 2026
85797e6
feat: add follow_beat_enable config field (P4-020)
Skeyelab Jul 9, 2026
3d44843
feat: wire follow_beat_enable through the config form grammar (P4-020)
Skeyelab Jul 9, 2026
47d96b7
feat: add follow-beat fields to /status JSON (P4-020)
Skeyelab Jul 9, 2026
eade67e
fix: use standard C++ list-init instead of a GNU compound literal
Skeyelab Jul 9, 2026
1832232
feat: shared full-duplex I2S bus + ES8311 owner (P4-020)
Skeyelab Jul 9, 2026
9a55096
docs: document i2s_audio_bus's clock-driver asymmetry + init failure …
Skeyelab Jul 9, 2026
598dd5e
refactor: metronome_audio consumes the shared I2S bus (P4-020)
Skeyelab Jul 9, 2026
56860ee
fix: check es8311_voice_volume_set's return value in metronome_audio_…
Skeyelab Jul 9, 2026
733d24f
fix: call es8311_microphone_config in the shared codec bring-up
Skeyelab Jul 9, 2026
2825763
feat: follow_beat_io mic capture task (P4-020)
Skeyelab Jul 9, 2026
8873150
fix: harden follow_beat_io's capture loop + fix partial-start cleanup
Skeyelab Jul 9, 2026
011aa56
feat: wire follow_beat into boot sequence + web UI (P4-020)
Skeyelab Jul 9, 2026
b404140
fix: distinguish "off" from "listening" in the Follow Beat status row
Skeyelab Jul 9, 2026
d3653f5
fix: audio bus unconditionally enables TX as shared clock driver + se…
Skeyelab Jul 9, 2026
6064acf
Merge pull request #45 from ericdahl-dev/feature/p4-020-follow-beat
Skeyelab Jul 9, 2026
252ce6e
P4-014: version the persisted config so layout changes reset, not cor…
Skeyelab Jul 10, 2026
4190256
feat(X32Link): battery gauge (LiPo BFF / MAX17048) in /status + web UI
Skeyelab Jul 10, 2026
f84b29c
fix(wifi): event-driven reconnect + hidden-SSID scan fix, longer conn…
Skeyelab Jul 10, 2026
5f9ba5e
docs: cross-target OTA deployment playbook
Skeyelab Jul 10, 2026
8aba191
ci: compile + test the X32 emulator (ESP-002)
Skeyelab Jul 10, 2026
471c19b
tasks: close out ARC-004/ESP-003-005/LNK-032/P4-014/P4-020, file ESP-007
Skeyelab Jul 10, 2026
5a64b51
fix(ks_web): MIDI Clock Out section can't collapse on desktop
Skeyelab Jul 10, 2026
fd78248
P4-032: Link Audio PoC PROVEN -- onboard mic -> Live 12.4, in session…
Skeyelab Jul 10, 2026
6994bd6
P4-032: 44.1kHz stereo over Link Audio; audio bus goes rate-parametric
Skeyelab Jul 10, 2026
aa37313
P4-032: adapt to the Link session's sample rate (kills the resampler …
Skeyelab Jul 10, 2026
4b5e09a
P4-032: audio quality + beat-sync calibration -- clicks land on Live'…
Skeyelab Jul 10, 2026
d3b0790
tasks: ESP-008 -- Link Audio Tier 4, USB composite audio+MIDI ingest …
Skeyelab Jul 10, 2026
930df05
tasks: ESP-009 -- LED standby heartbeat (connected-but-stopped != dead)
Skeyelab Jul 10, 2026
cfc7cf7
tasks: ESP-010 -- web UI transport control (blocked on Ableton licens…
Skeyelab Jul 10, 2026
672fad3
tasks: ESP-011 -- web UI MIDI transport buttons (no licensing gate, u…
Skeyelab Jul 10, 2026
d665f20
tasks: ESP-011 -- quantized launch, START lands on the Link downbeat
Skeyelab Jul 10, 2026
11b2085
tasks: ESP-011 -- per-output transport (arm each cable on its own bar)
Skeyelab Jul 10, 2026
9cd47c7
tasks: P4-032 done -- Link Audio PoC proven on hardware
Skeyelab Jul 10, 2026
4b2fce3
test: fix wifi_conn_policy boundary (30s->45s) + stop stale binaries …
Skeyelab Jul 10, 2026
ed90964
Merge pull request #47 from ericdahl-dev/feat/link-audio-poc-and-p4-014
Skeyelab Jul 10, 2026
db2e881
docs: refresh READMEs -- LinkAudioPoC, Follow Beat, NVS versioning, C…
Skeyelab Jul 10, 2026
4e594b5
Merge pull request #48 from ericdahl-dev/docs/readme-refresh
Skeyelab Jul 10, 2026
b07401a
ESP-009: LED standby heartbeat -- connected-but-stopped no longer loo…
Skeyelab Jul 10, 2026
8867973
ESP-011: per-output transport from the web UI, quantized to the Link …
Skeyelab Jul 10, 2026
9011b5b
tasks: ESP-012 -- mDNS hostname (kitchensync.local)
Skeyelab Jul 10, 2026
232d15d
tasks: ESP-013 -- multi-network WiFi (roam office/home without SoftAP…
Skeyelab Jul 10, 2026
17634bc
Merge remote-tracking branch 'origin/master' into feat/esp-009-standb…
Skeyelab Jul 10, 2026
85c5c00
Merge pull request #49 from ericdahl-dev/feat/esp-009-standby-esp-011…
Skeyelab Jul 10, 2026
875a79b
tasks: close ESP-009, ESP-011 (shipped in #49) and LNK-033 (shipped e…
Skeyelab Jul 10, 2026
1bf03f2
ESP-013: multi-network WiFi -- try each saved network before SoftAP
Skeyelab Jul 10, 2026
cd29224
ESP-013: fix X32Link build -- connect_start_us renamed to slot_start_us
Skeyelab Jul 10, 2026
7b5dbf3
Merge pull request #50 from ericdahl-dev/chore/close-shipped-tickets
Skeyelab Jul 10, 2026
0a6d309
Merge remote-tracking branch 'origin/master' into feat/esp-013-multi-…
Skeyelab Jul 10, 2026
ca21296
Merge pull request #51 from ericdahl-dev/feat/esp-013-multi-network-wifi
Skeyelab Jul 10, 2026
040a07b
tasks: close ESP-013 -- multi-network WiFi shipped in #51
Skeyelab Jul 10, 2026
929ab86
Merge pull request #52 from ericdahl-dev/chore/close-esp-013
Skeyelab Jul 10, 2026
41e89b4
ESP-012: mDNS -- reach the board by name, not by DHCP lottery
Skeyelab Jul 10, 2026
c104a7c
Merge pull request #53 from ericdahl-dev/feat/esp-012-mdns
Skeyelab Jul 10, 2026
712d597
ARC-017: extract the shared web chrome into pure, host-tested ui_chro…
Skeyelab Jul 10, 2026
061edf6
Merge pull request #54 from ericdahl-dev/refactor/arc-017-ui-chrome
Skeyelab Jul 10, 2026
f97bf20
ESP-015: hardware MIDI OUT on GPIO -- DIN byte mirror + downbeat strobe
Skeyelab Jul 10, 2026
d4e6ea8
ESP-015: drop midi_uart_out from the AGENTS.md module table (CI fix)
Skeyelab Jul 10, 2026
fbb58ea
ESP-015: confirm PR1 pins against the P4-NANO pinout; fix analog cand…
Skeyelab Jul 10, 2026
45233d0
docs: analog sync output board — BOM + schematic (P4-021 / PR3 hardware)
Skeyelab Jul 10, 2026
ee14c76
ESP-015: ungate the DIN clock from usb_ready + measured results
Skeyelab Jul 10, 2026
a627a97
tasks: ESP-016 -- KitchenSync Touch (S3 + touch transport -> RC-505, …
Skeyelab Jul 10, 2026
5ece033
Merge pull request #55 from ericdahl-dev/feat/esp-015-midi-out-gpio
Skeyelab Jul 10, 2026
fe6b9b4
Merge remote-tracking branch 'origin/master' into chore/esp-016-kitch…
Skeyelab Jul 10, 2026
0758a86
Merge pull request #56 from ericdahl-dev/chore/esp-016-kitchensync-touch
Skeyelab Jul 10, 2026
c14c01b
tasks: close ESP-015 (DIN MIDI OUT shipped + measured in #55)
Skeyelab Jul 10, 2026
82766b5
Merge pull request #57 from ericdahl-dev/chore/close-esp-015
Skeyelab Jul 10, 2026
d73e299
tasks: ESP-016 -- lock DIN MIDI TX = GPIO11 on the S3-Touch board
Skeyelab Jul 10, 2026
50ca5a0
Merge pull request #58 from ericdahl-dev/chore/esp-016-pin-decision
Skeyelab Jul 10, 2026
123e889
ESP-016: DIN MIDI clock out on the S3 (KitchenSync Touch, increment 1)
Skeyelab Jul 10, 2026
8234e46
docs: KitchenSyncTouch dedicated-sketch design + ESP-016 decision
Skeyelab Jul 10, 2026
b05fa7e
ESP-016: KitchenSyncTouch sketch — increment 1a (WiFi + Link → BPM)
Skeyelab Jul 10, 2026
9ab76a1
ESP-016: KitchenSyncTouch increment 1b -- DIN+USB MIDI clock
Skeyelab Jul 10, 2026
f283aea
ESP-016: KitchenSyncTouch increment 1c -- tempo on the LCD
Skeyelab Jul 10, 2026
976371e
ESP-016: KitchenSyncTouch increment 2a -- transport hit-test (TDD)
Skeyelab Jul 10, 2026
dd2f706
Merge pull request #59 from ericdahl-dev/feat/esp-016-din-out
Skeyelab Jul 10, 2026
bb509e2
ci: fix arduino-cli cache staleness and share core cache across jobs
Skeyelab Jul 10, 2026
a3f53be
Merge branch 'master' into feat/kitchensynctouch
Skeyelab Jul 10, 2026
15f0f8e
ESP-016: KitchenSync Touch is DIN-only -- fixes the USB-CDC serial drop
Skeyelab Jul 10, 2026
098db71
ESP-016: KitchenSync Touch -- sync wheel back, mDNS, readable name
Skeyelab Jul 10, 2026
e715eca
ESP-016: KitchenSync Touch display -> landscape, bigger, name legible
Skeyelab Jul 10, 2026
e2876d3
ESP-016: KitchenSync Touch increment 2b -- transport (PLAY/STOP -> DIN)
Skeyelab Jul 10, 2026
6acb848
ESP-016: full-screen transport toggle + touch/release trigger setting
Skeyelab Jul 10, 2026
98581a6
ESP-016: KitchenSync Touch config layer (validate/set/NVS) -- Inc3a
Skeyelab Jul 10, 2026
69dcd2b
fix: restore build_opt.h to empty at HEAD
Skeyelab Jul 10, 2026
f574c7d
ESP-016: KitchenSync Touch web config (Inc3b) + AP fallback
Skeyelab Jul 10, 2026
80cc8af
ESP-016: align Touch web UI to the P4 gold standard (Inc3b)
Skeyelab Jul 11, 2026
82ff764
ESP-016: commit Touch live nudge + brightness config (deps for ktouch…
Skeyelab Jul 11, 2026
b88ee2e
Merge pull request #60 from ericdahl-dev/feat/kitchensynctouch
Skeyelab Jul 11, 2026
817f90c
P4: 16MB flash + 4MB OTA slots (app was 96% full) (#61)
Skeyelab Jul 11, 2026
92746b9
ESP-011: per-output transport master (follow_link) + honest transport…
Skeyelab Jul 11, 2026
8672794
P4-033 + P4-034: two clock-path bugs the logic analyzer found (#63)
Skeyelab Jul 11, 2026
5dec24c
ci: cache the ESP-IDF build and the arduino compiled core
Skeyelab Jul 11, 2026
21a0bb4
ci: fix IDF ccache — inject env via extra_docker_args
Skeyelab Jul 11, 2026
e72ad1a
Merge pull request #66 from ericdahl-dev/ci/improve-caching
Skeyelab Jul 11, 2026
af60675
ESP-016: extract touch-edge dispatch into a pure, host-tested ktouch_…
Skeyelab Jul 11, 2026
969d79b
ARC-018/019/020: deepening tickets from architecture review (#64)
Skeyelab Jul 11, 2026
73fa713
ARC-021 + ESP-016 note: file the Touch display render-side deepening
Skeyelab Jul 11, 2026
20a4590
Merge pull request #68 from ericdahl-dev/docs/esp016-note-arc021
Skeyelab Jul 11, 2026
def1414
ESP-018: the MIDI clock was out-ranked by the network stack (+ close …
Skeyelab Jul 11, 2026
f5720a1
ESP-016: KitchenSync Touch 16MB partition table (4MB dual-OTA slots) …
Skeyelab Jul 11, 2026
1f03dd0
CLK-001: the universal clock hub epic (#69)
Skeyelab Jul 11, 2026
7daf0f2
ESP-016: GitHub Pages web flasher — flash any board from the browser …
Skeyelab Jul 11, 2026
a6eb99a
P4-029: metronome VOICE dropdown always showed "Tone" (and silently r…
Skeyelab Jul 11, 2026
97763fd
ARC-022: live config edits are silently lost on reboot
Skeyelab Jul 11, 2026
3eca672
Backlog: file the six remaining un-filed items
Skeyelab Jul 11, 2026
3957cb7
ESP-022: Link LED flasher — classic-ESP32 target, OTA-flashable onto …
Skeyelab Jul 11, 2026
8db6c6f
ESP-021: MIDI OUT is a panel-mount 3.5mm TRS (Type A), not a captive …
Skeyelab Jul 11, 2026
a156bbf
Merge pull request #77 from ericdahl-dev/task/arc-022-persist-live-co…
Skeyelab Jul 11, 2026
ee65b4f
Merge branch 'master' into task/backlog-ship-gates
Skeyelab Jul 11, 2026
8916790
Merge branch 'master' into docs/esp022-link-led-flasher
Skeyelab Jul 11, 2026
60eceab
ESP-016: rewrite acceptance criteria — validated on a Korg ER-1, not …
Skeyelab Jul 11, 2026
02782b4
ARC-022: live config edits are silently lost on reboot — persist the …
Skeyelab Jul 11, 2026
1667982
ci: skip build/tests for docs-only PRs (without blocking them)
Skeyelab Jul 11, 2026
ef5aa5c
P4-031: wired Ethernet does NOT automatically mean low-jitter (risk f…
Skeyelab Jul 11, 2026
14849cc
Merge branch 'master' into ci/skip-build-for-docs
Skeyelab Jul 11, 2026
2aef249
ARC-024: instrument X32Link's MIDI writer — the firmware we never mea…
Skeyelab Jul 11, 2026
165e6f1
Merge branch 'master' into task/backlog-ship-gates
Skeyelab Jul 11, 2026
e794139
ARC-024: X32Link had ESP-018 all along — writer to priority 19, vTask…
Skeyelab Jul 11, 2026
8021c4a
Merge pull request #81 from ericdahl-dev/ci/skip-build-for-docs
Skeyelab Jul 11, 2026
fd57f5c
Merge branch 'master' into feat/arc-022-persist-live-config
Skeyelab Jul 11, 2026
250d41f
Merge branch 'master' into task/backlog-ship-gates
Skeyelab Jul 11, 2026
69ef981
P4-035: mio10 as a Midihub alternative — and the first real demo of 4…
Skeyelab Jul 11, 2026
50ae00a
Merge branch 'master' into docs/esp022-link-led-flasher
Skeyelab Jul 11, 2026
16d586d
Merge pull request #79 from ericdahl-dev/docs/esp022-link-led-flasher
Skeyelab Jul 11, 2026
5afb253
ESP-020: KitchenSync Touch gets OTA — the ship gate for Dan's unit
Skeyelab Jul 11, 2026
85b3925
Merge pull request #82 from ericdahl-dev/feat/arc-024-x32link-tick-probe
Skeyelab Jul 11, 2026
9c8b97c
Merge branch 'master' into feat/arc-022-persist-live-config
Skeyelab Jul 11, 2026
416e7f4
Merge branch 'master' into task/backlog-ship-gates
Skeyelab Jul 11, 2026
b02f81f
Merge pull request #78 from ericdahl-dev/task/backlog-ship-gates
Skeyelab Jul 11, 2026
cde9a0b
Merge branch 'master' into feat/arc-022-persist-live-config
Skeyelab Jul 11, 2026
9b4baa3
Backlog bookkeeping: file ESP-017/018/019, close P4-034 (#84)
Skeyelab Jul 11, 2026
2f913bc
Merge branch 'master' into feat/arc-022-persist-live-config
Skeyelab Jul 11, 2026
a6f4adf
Bookkeeping: ARC-022 and ARC-024 land with this PR — mark done
Skeyelab Jul 11, 2026
6fc40cd
Merge branch 'feat/arc-022-persist-live-config' into feat/esp-020-tou…
Skeyelab Jul 11, 2026
8d62f60
Bookkeeping: ESP-020 lands with this PR — mark done
Skeyelab Jul 11, 2026
2b0b370
Merge pull request #85 from ericdahl-dev/feat/esp-020-touch-ota
Skeyelab Jul 11, 2026
6783b6a
Triage: resolve the three needs-triage LNK items (#86)
Skeyelab Jul 11, 2026
44e749e
Merge branch 'master' into feat/arc-022-persist-live-config
Skeyelab Jul 11, 2026
ea0cebf
Merge pull request #80 from ericdahl-dev/feat/arc-022-persist-live-co…
Skeyelab Jul 11, 2026
02d6981
Triage: the four high-priority untriaged items (#87)
Skeyelab Jul 11, 2026
d60614a
LNK-028: owner defers the jack-hardware decision (#88)
Skeyelab Jul 11, 2026
82c34e5
ESP-006: owner keeps priority high, revisit planned (#89)
Skeyelab Jul 11, 2026
6f76412
Triage: batch the 23 remaining low/medium items (#90)
Skeyelab Jul 11, 2026
7ee837a
ARC-019: one clock-out derivation for all three firmwares (#91)
Skeyelab Jul 11, 2026
2a78014
ARC-020: persist Touch/X32 config as a versioned blob with a pure dec…
Skeyelab Jul 11, 2026
9c64bae
ARC-020: hardware-verify the migrator on the bench Touch board
Skeyelab Jul 11, 2026
6e0bf26
LNK-041/042: file the X32Link partition tickets
Skeyelab Jul 12, 2026
466606b
Merge branch 'master' into arc-020/config-blob-decode
Skeyelab Jul 12, 2026
8657f45
Merge pull request #93 from ericdahl-dev/lnk/partition-tickets
Skeyelab Jul 12, 2026
5d0a11e
Merge branch 'master' into arc-020/config-blob-decode
Skeyelab Jul 12, 2026
d35ae40
Merge pull request #92 from ericdahl-dev/arc-020/config-blob-decode
Skeyelab Jul 12, 2026
54af765
tools/linkcli: a Link peer for the bench — the firmware only listens,…
Skeyelab Jul 12, 2026
3fed890
ESP-024: every jitter number we have was measured on a 1 ms software …
Skeyelab Jul 12, 2026
d2d42a3
ESP-023: the Touch emitted MIDI Start AFTER the downbeat clock — ever…
Skeyelab Jul 13, 2026
8ca472a
P4-039/P4-040: KitchenSync stops lying when solo, can originate a clo…
Skeyelab Jul 13, 2026
678f712
ESP-025: a KitchenSync bench rig on the classic ESP32 — two lit butto…
Skeyelab Jul 13, 2026
778acb7
tools/reindex.sh: the ADRs and linkcli were invisible to the code gra…
Skeyelab Jul 13, 2026
415401f
ESP-027: the DIN clock went silent for 138 seconds and /status report…
Skeyelab Jul 13, 2026
e175cac
ESP-025: button telemetry in /status — and a latent link break on the…
Skeyelab Jul 13, 2026
157d9f8
P4-038: rescue the RTT filter — GhostXForm commits were throwing the …
Skeyelab Jul 13, 2026
4a4ddac
Rescue: the P4 has been starting every slave a tick late, and its clo…
Skeyelab Jul 13, 2026
75e01ce
CI: fan out the firmware compiles, and compile the bench rig at all
Skeyelab Jul 13, 2026
993bd97
build-bench.sh only ever worked on macOS — `sed -i ''` is BSD syntax
Skeyelab Jul 13, 2026
9de5ba7
CI: aggregate gate — the matrix rename orphaned a required status check
Skeyelab Jul 13, 2026
b4d6053
Merge pull request #104 from ericdahl-dev/ci/parallel-firmware-compiles
Skeyelab Jul 13, 2026
dc1072c
Rescue: the P4 web UI wedges after one laptop visit, and the counter …
Skeyelab Jul 13, 2026
c9f5b33
tickets: tell the truth about what shipped, and file the ESP-027 foll…
Skeyelab Jul 13, 2026
b757bc7
ESP-028: /status stops lying, and a dead session's origin stops being…
Skeyelab Jul 13, 2026
49c0d72
Rescue the last of the stranded branch: ESP-019 keyboard transport + …
Skeyelab Jul 13, 2026
686198c
ESP-026: KitchenSync now builds for esp32p4, esp32s3 AND esp32 — the …
Skeyelab Jul 13, 2026
3b6e3a1
Ordna audit + HANDOFF.md: the ticket record was lying in three places…
Skeyelab Jul 13, 2026
27c7e18
CI: wipe sdkconfig between KitchenSync targets
Skeyelab Jul 13, 2026
d29ee73
Merge branch 'master' into feat/esp-026-kitchensync-multi-target
Skeyelab Jul 13, 2026
4fb7bf3
tools/ci-local.sh: run what CI runs, before you push — and fix the CI…
Skeyelab Jul 13, 2026
d7d2fec
ESP-026: KitchenSync builds for esp32p4, esp32s3 AND esp32 — the hard…
Skeyelab Jul 13, 2026
ecd4cf5
Add iOS companion app planning doc
claude Jul 14, 2026
ddfbece
Merge pull request #112 from ericdahl-dev/claude/ios-kitchensync-app-…
Skeyelab Jul 14, 2026
ac3a47d
iOS app plan: correct Link licensing — LinkKit covers Phases 2-3 free
claude Jul 14, 2026
f0de5b2
Merge pull request #113 from ericdahl-dev/claude/ios-kitchensync-app-…
Skeyelab Jul 14, 2026
33c776c
P4-041: GET /config.json — read-side counterpart to /save and /live
claude Jul 14, 2026
31a766f
Merge pull request #114 from ericdahl-dev/claude/ios-kitchensync-app-…
Skeyelab Jul 14, 2026
e62144a
tasks: ESP-029/030/031 — Touch's web contract diverged; a client can'…
Skeyelab Jul 14, 2026
eaf0371
tasks: share the pure modules, don't reimplement them (+ ESP-032, the…
Skeyelab Jul 14, 2026
f8eecd9
tasks(ESP-033): BLE for WiFi provisioning — and for nothing else
Skeyelab Jul 14, 2026
97c5fa9
Merge branch 'master' into feat/esp-012-mdns-txt-record
Skeyelab Jul 14, 2026
d6cdee2
Merge pull request #115 from ericdahl-dev/feat/esp-012-mdns-txt-record
Skeyelab Jul 14, 2026
67d19ce
feat(ESP-029): Touch shares ks_status.c — one /status across the fleet
Skeyelab Jul 14, 2026
cde1887
tasks(ESP-030): converge the configs — and write the NVS migration FIRST
Skeyelab Jul 14, 2026
c679270
feat(ESP-030 pt1): Touch gains WiFi slots — migration first, and it f…
Skeyelab Jul 14, 2026
3701267
feat(ESP-030 pt2): /config.json on the Touch — declare capability, ne…
Skeyelab Jul 14, 2026
6dbcbf2
fix(touch): /live endpoint, all wifi slots on /save, real rate+swing …
Skeyelab Jul 14, 2026
e467aac
fix(touch): stop lying about link_owns; a partial /save must not swit…
Skeyelab Jul 14, 2026
af917ec
ESP-029: Touch shares ks_status.c — one /status across the fleet (#116)
Skeyelab Jul 14, 2026
7793ad9
tasks(ESP-034): verify link_owns and partial-/save on the P4 (#118)
Skeyelab Jul 14, 2026
772fd91
feat(x32link): join the fleet — mDNS, shared /status, /config.json (E…
Skeyelab Jul 14, 2026
10dd82b
fix(x32link): /status and /config.json buffers are STATIC, not stack
Skeyelab Jul 14, 2026
6496f2d
feat(kitchensync): mDNS TXT — publish identity and chip target (ESP-031)
Skeyelab Jul 14, 2026
86ff231
feat(touch): headless ESP32-S3 Super Mini variant (ESP-036)
Skeyelab Jul 15, 2026
681b800
feat(touch): settable free-run tempo (ESP-037, part 1 of fleet)
Skeyelab Jul 15, 2026
4363b1d
feat: settable tempo across the fleet -- shared config + P4 (ESP-037,…
Skeyelab Jul 15, 2026
0fad2e1
feat(kitchensync): ks_tick owns MIDI Start-before-Clock order (ESP-03…
Skeyelab Jul 15, 2026
d97b5b1
tasks(ESP-039/040/041): file the deepening candidates from the archit…
Skeyelab Jul 15, 2026
7066b65
feat(touch): remember Link's tempo across a power-cycle (ESP-037)
Skeyelab Jul 15, 2026
aa6968b
Merge remote-tracking branch 'origin/master' into feat/esp-037-settab…
Skeyelab Jul 15, 2026
fd10d22
ci+x32link: drop the QT Py variant; X32Link builds on the default par…
Skeyelab Jul 15, 2026
730e47a
Merge pull request #124 from ericdahl-dev/feat/esp-037-settable-tempo
Skeyelab Jul 15, 2026
95378e3
ci: X32Link compiles against min_spiffs (what it ships), not the 4MB …
Skeyelab Jul 15, 2026
a9d405d
Merge pull request #125 from ericdahl-dev/ci/x32link-min-spiffs
Skeyelab Jul 15, 2026
38f8d05
feat(p4): Link-mirror + fix /live dropping tempo (ESP-037 P4 parity)
Skeyelab Jul 15, 2026
bcd3d45
tasks(ESP-042): converge the Touch onto shared KsConfig, retire AppCo…
Skeyelab Jul 15, 2026
433b12e
Merge pull request #127 from ericdahl-dev/tasks/esp-042-config-conver…
Skeyelab Jul 15, 2026
826b863
fix(p4): /status reports the EFFECTIVE tempo, not link_proto_bpm (whi…
Skeyelab Jul 15, 2026
7cf8efd
Merge branch 'master' into feat/esp-037-p4-link-mirror
Skeyelab Jul 15, 2026
23d92c4
Merge pull request #128 from ericdahl-dev/fix/p4-status-effective-bpm
Skeyelab Jul 15, 2026
28692b2
feat(x32link): publish dev=x32link — its own product, not a KitchenSync
Skeyelab Jul 15, 2026
92da59c
Merge branch 'master' into feat/esp-037-p4-link-mirror
Skeyelab Jul 15, 2026
2053e53
Merge branch 'master' into feat/x32link-own-product-identity
Skeyelab Jul 15, 2026
57c8238
Merge pull request #129 from ericdahl-dev/feat/x32link-own-product-id…
Skeyelab Jul 15, 2026
3844bc3
Merge branch 'master' into feat/esp-037-p4-link-mirror
Skeyelab Jul 15, 2026
b787f00
Merge pull request #126 from ericdahl-dev/feat/esp-037-p4-link-mirror
Skeyelab Jul 15, 2026
060874b
feat(config): KsConfig becomes the fleet config — grow the Touch's fi…
Skeyelab Jul 15, 2026
f013986
feat(touch): the final AppConfig->KsConfig migration (ESP-042 pt2)
Skeyelab Jul 15, 2026
e754b65
feat(touch): store KsConfig, retire AppConfig — one fleet config (ESP…
Skeyelab Jul 15, 2026
a33aa9e
docs(esp-042): record pt1-3 progress; hardware smoke is the last item
Skeyelab Jul 15, 2026
10490e1
docs(esp-042): mark done — migration verified on bench Super Mini NVS
Skeyelab Jul 15, 2026
5f0364a
Merge pull request #130 from ericdahl-dev/feat/esp-042-touch-ksconfig
Skeyelab Jul 15, 2026
96e9a1b
docs: architecture initiative — platform overview, contract, ADRs 001…
Skeyelab Jul 15, 2026
9f967ca
Merge pull request #131 from ericdahl-dev/docs/architecture-initiative
Skeyelab Jul 15, 2026
a376d77
tasks: link ESP-026 to merged ADR-0009 + architecture docs (#132)
Skeyelab Jul 15, 2026
f1dd80c
chore(tasks): close ESP-030 — config convergence done (wire earlier +…
Skeyelab Jul 15, 2026
7eb6c7f
fix(x32link): partial /save no longer silently zeros legal-zero field…
Skeyelab Jul 15, 2026
77e8a46
Merge pull request #133 from ericdahl-dev/feat/esp-040-x32link-save-r…
Skeyelab Jul 16, 2026
bbf1c4c
feat(touch): onboard RGB as a status light on the headless Super Mini…
Skeyelab Jul 16, 2026
92767ab
fix(test): link test_status_rgb with -lm (floorf) — Linux CI needs it…
Skeyelab Jul 16, 2026
72ab965
Merge pull request #134 from ericdahl-dev/feat/esp-043-touch-status-rgb
Skeyelab Jul 16, 2026
9a3c7f9
docs(adr): ADR-0015 — extract ks-core in-repo out of X32Link/ (proposed)
Skeyelab Jul 16, 2026
a734498
docs(adr): ADR-0015 accepted — Option A (bundle ks-core move with ESP…
Skeyelab Jul 16, 2026
1cde8bf
Merge pull request #135 from ericdahl-dev/docs/adr-ks-core-extraction
Skeyelab Jul 16, 2026
6df5ab2
tasks(ESP-045): one physical transport button on the Mini — press=pla…
Skeyelab Jul 17, 2026
2056c79
fix(touch): force full TX power + no modem sleep on the setup SoftAP …
Skeyelab Jul 17, 2026
1b4cb5a
ESP-026: land the ESP-IDF display spike (verified on glass) (#138)
Skeyelab Jul 17, 2026
68458f3
feat(tick): TL_RESTART (realign) emits on the P4 writer — stop-then-s…
Skeyelab Jul 17, 2026
428ae94
feat(transport): pure single-button gesture decoder — TAP vs HOLD (ES…
Skeyelab Jul 17, 2026
3272980
feat(ESP-046): pure led_output dispatcher — brightness single-owner (…
Skeyelab Jul 19, 2026
7e3840a
feat(ESP-046): move P4 LED render+push off the 1 ms clock task (inc 2)
Skeyelab Jul 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
439 changes: 439 additions & 0 deletions .github/workflows/ci.yml

Large diffs are not rendered by default.

108 changes: 108 additions & 0 deletions .github/workflows/release-pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# GitHub Pages web flasher — build every board variant on a tag and publish a page that
# flashes them straight from Chrome/Edge over WebSerial. Design:
# docs/plans/2026-07-10-github-pages-web-flasher-design.md
#
# Why this exists at all: a partition table can ONLY be written over USB. It cannot be
# changed over OTA. So this is not merely a convenience over `arduino-cli` -- it is the
# only delivery path that can fix a device's partition layout, or recover one that will
# not boot. That is also why it must exist before hardware reaches a customer.
#
# Tag-triggered ONLY, deliberately: it can never fail or block the required checks on the
# protected master branch.
name: Release — web flasher (GitHub Pages)

on:
push:
tags: ['v*']
workflow_dispatch: # let a release be re-published without re-tagging

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: false

jobs:
build:
name: Build firmware + assemble site
runs-on: ubuntu-latest
env:
# X32Link's 4 variants: same FQBN, differing only by build_opt.h -- exactly as
# ci.yml already compiles them. min_spiffs so every flashed image lands on an
# OTA-capable table and can use /update afterwards without a second USB trip.
X32_FQBN: esp32:esp32:esp32s3:USBMode=hwcdc,CDCOnBoot=cdc,FlashSize=16M,PSRAM=opi,PartitionScheme=min_spiffs
# KitchenSync Touch ships its own partitions.csv (16MB, dual-OTA, 4MB app slots).
# PartitionScheme=custom is what makes the core USE that file -- without it the core
# silently falls back to its 4MB default table and the app slot is 1.25MB.
TOUCH_FQBN: esp32:esp32:esp32s3:USBMode=hwcdc,CDCOnBoot=cdc,FlashSize=16M,PSRAM=opi,PartitionScheme=custom
CORE_CACHE: ${{ github.workspace }}/.arduino-core-cache
steps:
- uses: actions/checkout@v4

- name: Cache arduino-cli data (ESP32 core + libraries)
uses: actions/cache@v4
with:
path: |
~/.arduino15
~/Arduino
key: arduino-esp32-${{ runner.os }}-x32link-v1
restore-keys: |
arduino-esp32-${{ runner.os }}-

- name: Cache arduino compiled core
uses: actions/cache@v4
with:
path: ${{ env.CORE_CACHE }}
key: arduino-core-${{ runner.os }}-x32link-v1
restore-keys: |
arduino-core-${{ runner.os }}-

- name: Install arduino-cli
run: curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh -s

- name: Add arduino-cli to PATH
run: echo "$GITHUB_WORKSPACE/bin" >> "$GITHUB_PATH"

- name: Install ESP32 core + LovyanGFX
run: |
arduino-cli config init --overwrite --additional-urls https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
arduino-cli core update-index
arduino-cli core install esp32:esp32
arduino-cli lib install LovyanGFX

# The version a release publishes is the TAG. One source of truth -- no second
# place to forget to bump.
- name: Resolve version
id: ver
run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"

- name: Build every variant
env:
VERSION: ${{ steps.ver.outputs.version }}
run: |
set -euo pipefail
bash tools/build-flasher-site.sh

# Catch a broken release BEFORE it is published, not after someone's device is
# halfway through a flash.
- name: Validate manifests
run: python3 tools/validate_manifests.py site/firmware

- uses: actions/configure-pages@v5
- uses: actions/upload-pages-artifact@v3
with:
path: site

deploy:
name: Deploy to GitHub Pages
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- id: deployment
uses: actions/deploy-pages@v4
31 changes: 25 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,9 +1,28 @@
# Arduino build output
**/build/

# Host unit-test binaries
test/test_app_config
test/test_bpm_tracker
test/test_link_protocol
test/test_osc_out
test/test_midi_bpm_calc
# Host unit-test binaries (test/test_foo executables; keep test_foo.c sources)
test/test_*
!test/test_*.c
test/*.dSYM/

# macOS / editor cruft
.DS_Store

# LoraLink WiFi credentials (copy lora_secrets.h.example -> lora_secrets.h)
LoraLink/lora_secrets.h

# ESP-IDF (KitchenSync)
sdkconfig
sdkconfig.old
managed_components/
dependencies.lock
.worktrees/
.gstack/
tests/test_x32_port
*.dSYM/
KitchenSyncTouch/secrets.h

# Web-flasher site: built by tools/build-flasher-site.sh, published by the release
# workflow. Firmware binaries are release artifacts, never repo contents.
site/
4 changes: 2 additions & 2 deletions .ordna/config.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Task prefixes in use: ESP (emulator), LNK (X32Link), MCK (MidiClock), TSV (ToastSaver-HW),
# FDR (X32FaderDisp), MUT (X32SafeMutes), ITT (MidiOscIttt)
# Task prefixes in use: LNK (X32Link), MCK (MidiClock, legacy), ESP (emulator),
# ARC (firmware architecture), P4 (ESP32-P4 hub tier)
tasksDir: tasks
idPrefix: ESP
zeroPaddedIds: 3
Expand Down
42 changes: 42 additions & 0 deletions .out-of-scope/behringer-wing-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Behringer Wing Support

This project does not target the Behringer Wing as a mixer for tempo/FX
control. Supported mixer targets are the X32 family (X32, XR18/X-Air).

## Why this is out of scope

The Wing is not an X32-family device. It speaks its own control protocol — an
OSC-style layer plus a text/`$`-style node command channel — with a different
address tree, a name-addressed node/param model instead of numeric
`/fx/N/par/MM` indices, and different value encodings. None of the X32-dialect
OSC layer (`osc_out`/`osc_in`, the model table mapping `MODEL_X32`/`MODEL_XR18`
to ports 10023/10024 and slot counts) carries over; Wing support means either
parameterizing that layer or writing a second dialect module behind the
tempo-source→OSC seam.

Two durable reasons to decline rather than defer:

1. **The project's scope is gear on the bench.** Every mixer feature shipped so
far was validated against a real XR18 with live OSC dumps. Nobody involved
owns a Wing, so the core research deliverables — real protocol dumps, FX
topology confirmation, tempo-param encodings — cannot be produced, only
transcribed from third-party docs and shipped unverified. That conflicts
with the project's measure-before-building discipline.
2. **A second protocol stack is a real architectural cost.** Carrying a Wing
dialect module means a second address model, second introspection path, and
second unit-conversion table to keep correct, for hardware no user of this
project has asked about since filing.

## What would change this

A Wing on the bench (or a collaborator supplying real control-channel dumps).
If that happens: delete this file and re-file the research ticket. The X32/XR18
FX research (LNK-029) is deliberately structured as the reusable template —
introspect FX type → map tempo param + encoding → fan out to N targets with
per-target note division — so the Wing track would re-answer those questions
rather than start from scratch.

## Prior requests

- LNK-030 — "Research: Behringer Wing support (different OSC protocol) for
tempo/FX control" (filed 2026-07-04, declined in triage 2026-07-11)
Loading