Releases: kisaragi-mochi/stackchan-mcp
Release list
v0.17.0
Gateway
- Added runtime-adjustable beat-mode onset sensitivity for venue tuning; the
default maps to the real-device verified 0.004 RMS floor, and metadata
snapshots report both the selected sensitivity and effective floor. (#301) - Added gateway-only beat mode MCP tools for continuous ambient audio capture
through the existinglistenwire path, dependency-free BPM estimation,
beat-synced head sway/base-ring LED flashes, polling metadata snapshots, and
WAV clip export from a bounded rolling buffer. (#301) - Beat mode now requests the raw
listencapture profile so ambient music
reaches the gateway without device-side speech AFE suppression. (#349) - Lowered the beat tracker's minimum onset RMS floor (0.025 → 0.004 full
scale) to match real-device microphone levels; onset detection now works
against actual ambient music (verified on device). The adaptive threshold
continues to prevent false onsets in quiet rooms. (#301)
firmware-v1.16.0
Highlights
- Raw microphone capture profile (#349, #351): the inbound
listen
wire message accepts an optional"profile": "voice" | "raw"field.
The defaultvoiceprofile behaves exactly as before (speech-tuned
AFE path for STT). The newrawprofile streams pre-AFE microphone
PCM through the existing Opus audio path, so ambient music reaches
the gateway at natural levels — this is what enables the gateway-side
beat mode (gateway v0.17.0) to detect BPM from live music and drive
beat-synced head sway and LED expression.
Pair release with gateway v0.17.0
(pipx install --force stackchan-mcp or uv tool upgrade stackchan-mcp),
which adds the beat-mode MCP tools that use this profile.
Flashing
xiaozhi.bin— app-only update at offset0x20000(preserves NVS:
Wi-Fi credentials, gateway URL settings, avatar assets)merged-binary.bin— full clean install at0x0(resets NVS)v2.2.6_stackchan.zip— full artifact set
License
Distributed under MIT (canonical build, MIT end-to-end).
Notes
- Unknown or missing
profilevalues fall back tovoice; older
gateways that never send the field see unchanged behavior. - Verified on device: beat mode over the raw profile detected
76.7 BPM at 0.77 confidence from ambient music at ordinary indoor
volume, driving motion and LED commands.
v0.16.0 — gateway
Gateway
- Added a
color_orderoption (grbdefault,rgb) for Port B/C WS2812
gateway tools andstackchan_follow_led_stream, allowing RGB-wired LEDs to
render correct colors by swapping R/G in the gateway before relay. (#343) - Added
stackchan_follow_led_stream, a gateway-side WebSocket LED-frame
subscriber for driving the base ring or a Port B WS2812 strip from external
event/continuouscolor frames. (#335) - Log ESP32 WebSocket disconnect close codes, reasons, close class, last-frame
age, and connection lifetime, and make the gateway keepalive policy explicit.
(#338) - Exposed the Port C WS2812 device tools and added
port_cas a
stackchan_follow_led_streamtarget. (#340)
firmware-v1.15.0
Highlights
- Port C (GPIO 17) WS2812 support — the second rear Grove port can now drive a WS2812-compatible LED strip via five new MCP tools
self.port_c.ws2812.{init,set_pixel,set_strip,refresh,clear}, mirroring the existing Port B set (#340, #341). Both ports can run strips simultaneously on separate RMT channels. - Fully opt-in: nothing touches GPIO 17 until
self.port_c.ws2812.initis explicitly called; existing setups using Port C for other purposes are unaffected.
Pairs with gateway v0.16.0, which exposes the Port C tools, adds a port_c target to stackchan_follow_led_stream, and adds a color_order option for RGB-wired NeoPixels (e.g. 8 mm through-hole units).
Files
merged-binary.bin— clean install (flashes everything, resets NVS)xiaozhi.bin— app-only update to0x20000(preserves NVS / Wi-Fi settings)v2.2.6_stackchan.zip— full artifact set
License
Distributed under MIT (canonical build path; the optional GPL-3.0 SCServo fallback remains opt-in only, see CONTRIBUTING.md).
v0.15.0 — gateway
Gateway
- Re-dispatch the emoji-selected avatar face after successful speech playback,
so emoji+textsaycalls keep the expression visible after lip-sync stops.
(#296)
Pairing
Pairs with firmware-v1.14.0 (released the same day), which adds an on-screen
listening indicator on the stack-chan LCD during STT capture (#332). The two
changes are independent — this gateway version also works with earlier firmware
unchanged.
firmware-v1.14.0
Highlights
- On-screen listening indicator (#332): the stack-chan LCD now shows a small pulsing red dot while STT capture is active, so it is visible at a glance that the device is listening. Previously a listen window gave no visual cue on the device itself. The avatar render path (face / blink / lip-sync) is untouched. Verified on hardware (details on PR #333).
Pairing
Pairs with Gateway v0.15.0 (released the same day), which re-dispatches the emoji-selected avatar face after successful speech playback so emoji+text say calls keep the expression visible after lip-sync stops (#296). The two changes are independent — earlier gateway versions continue to work with this firmware unchanged.
License
Firmware binaries in this release are distributed under MIT (canonical build; the optional GPL servo-library fallback remains opt-in and is not part of these artifacts).
Assets
merged-binary.bin— clean install (flash at0x0, resets NVS / WiFi settings)xiaozhi.bin— app-only update (flash at0x20000, preserves NVS / WiFi settings)v2.2.6_stackchan.zip— full build output
firmware-v1.13.1
Highlights
- Server-driven
listen()no longer drops the connection (#328): requesting listening mode on an already connected WebSocket now arms the logical audio session in place instead of tearing down and rebuilding the socket. Previously, any gateway-sidelisten()call issued while the device sat idle caused an immediate disconnect/reconnect and returned zero audio frames; the same rebuild also affected touch and wake-word activations from the idle state. Verified on hardware: repeated listen windows over a single uninterrupted connection, with audio frames flowing end to end (details on PR #330).
Pairing
No paired gateway release — this is a firmware-only patch. Recent gateway versions work unchanged (verified against gateway v0.14.0).
License
Firmware binaries in this release are distributed under MIT (canonical build; the optional GPL servo-library fallback remains opt-in and is not part of these artifacts).
Assets
merged-binary.bin— clean install (flash at0x0, resets NVS / WiFi settings)xiaozhi.bin— app-only update (flash at0x20000, preserves NVS / WiFi settings)v2.2.6_stackchan.zip— full build output
v0.14.0 — gateway
Gateway
- Auto-render the idle avatar after a new ESP32 device session finishes
initialization and tool discovery, unlessset_avatarwas already sent
on that connection. (#77) - Fail in-flight
load_avatar_setcalls withdisconnectedimmediately
when the ESP32 connection drops, instead of waiting for the avatar
load timeout. (#228) - Scoped the gateway ownership lock per WS port (
owner-<ws_port>.lock
instead of the machine-globalowner.lock), so one gateway per device
can run on separate WS ports on the same host without the second
gateway being rejected at startup. Single-instance use is unaffected
(the default lock is simply namedowner-8765.lock) and a duplicate
start on the same port is still rejected;--checkreads the per-port
lock. (#320) - Fixed
/capturerejecting photo uploads with HTTP 413 on aiohttp >= 3.14.
The capture app raised the per-request body cap withclient_max_size=0
(so/pcmcan stream long PCM), but aiohttp's multipart reader treats0
as a zero-byte limit — unlikerequest.read()/.post()— so every upload
carrying a non-emptyquestionfield was rejected with 413. Use a large
finiteclient_max_sizeinstead;/capture's real limit stays the explicit
per-route byte cap. - Hardened
/captureto tolerate a non-UTF-8questionfield (decode with
errors="replace") instead of failing the upload with HTTP 500.
v0.13.0
BREAKING:
stackchan_follow_pose_stream.downsample_hzschema maximum is now 20 (was 60). Callers that previously set values above 20 will be rejected with "downsample_hz must be a number in (0, 20]". The schema default (20) is unchanged, so calls that omit the argument behave the same. Rationale in the entry below. (#315)
Gateway
- Added optional user-local
user-defaults.tomlsupport for gateway-side
MCP argument defaults, starting withstackchan_follow_pose_stream. Explicit
MCP call arguments still take precedence, while absent, empty, or invalid
config files fall back to schema defaults. (#311) - Added
set_touch_sensor_enabledandget_touch_sensor_enabledMCP
wrappers for the firmware head-touch enable flag. (#312) stackchan_follow_pose_streamnow exposessmoothing_windowas an
MCP tool argument (integer, default 5, range 1..20; 1 = passthrough).
Callers whose upstream pose source already applies smoothing can
disable the redundant gateway-side moving average. Omitting the
argument preserves the previous behaviour. (#309)- Lowered
stackchan_follow_pose_stream.downsample_hzschema maximum
from 60 to 20 to match the SCS0009 servo's observed sustained
WritePosrate. Continuous command rates above ~20 Hz triggered
UART hangs during real-device dogfood. BREAKING: callers that
previously set values above 20 will now be rejected with
"downsample_hz must be a number in (0, 20]". The schema default
(20) is unchanged, so calls that omit the argument behave the
same. (#315) - Added
edge-ttsTTS engine — a subprocess-based engine using
Microsoft's Edge TTS CLI and ffmpeg, registered asedge-tts.
Provides natural English and multilingual voices (voicevoxis
Japanese-only by default). Setup: installedge-ttsCLI on PATH
(e.g.pip install edge-tts) plusffmpeg. Default voice is
en-GB-SoniaNeural, overridable per-call via the new
say(speaker_name=...)argument (added to the say() schema as a
string field, distinct fromspeaker_idinteger and thevoice
engine selector) or globally via theSTACKCHAN_EDGE_TTS_DEFAULT_VOICE
env var. (#317) - Exposed the optional Port A I2C
scl_speed_hzargument in the gateway
schemas fori2c_read,i2c_write, andi2c_write_read, matching the
firmware-side 100000..1000000 Hz range so schema-driven MCP clients can
discover slower per-transaction I2C clocks. Behaviour is unchanged when
omitted. (#321)
Pairs with firmware-v1.13.0 (released the same day) for the firmware-side touch sensor disable (#312) and Port A I2C scl_speed_hz (#319).
Install / upgrade: pipx install --force stackchan-mcp
firmware-v1.13.0
Highlights
- User-configurable touch sensor disable (#312): new NVS-backed
touch.enabledfield withself.robot.set_touch_sensor_enabled/self.robot.get_touch_sensor_enabledMCP tools. Disabling stops both local touch reactions andstackchan/eventemission, and the setting persists across reboots. - Per-transaction I2C clock control (#319): the Port A I2C tools (
self.i2c.read/self.i2c.write/self.i2c.write_read) accept an optionalscl_speed_hzproperty (default400000, range100000–1000000), so slow Units — e.g. the RCWL-9620 ultrasonic ranger, which fails transfers withESP_ERR_INVALID_STATEat 400 kHz — can be driven without recompiling the firmware. Behaviour is unchanged when the property is omitted.
Pairing
Pairs with Gateway v0.13.0 (released the same day), which exposes the set_touch_sensor_enabled / get_touch_sensor_enabled wrappers and declares scl_speed_hz on the gateway-side I2C tool schemas so schema-driven MCP clients can discover it. Earlier gateway versions continue to work; the I2C clock argument still passes through, it just is not advertised in their schemas.
License
Firmware binaries in this release are distributed under MIT (canonical build; the optional GPL servo-library fallback remains opt-in and is not part of these artifacts).
Assets
merged-binary.bin— clean install (flash at0x0, resets NVS / WiFi settings)xiaozhi.bin— app-only update (flash at0x20000, preserves NVS / WiFi settings)v2.2.6_stackchan.zip— full build output