Skip to content

Releases: kisaragi-mochi/stackchan-mcp

v0.17.0

Choose a tag to compare

@kisaragi-mochi kisaragi-mochi released this 12 Jul 11:57
8e8f370

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 existing listen wire 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 listen capture 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

Choose a tag to compare

@github-actions github-actions released this 12 Jul 11:55
8e8f370

Highlights

  • Raw microphone capture profile (#349, #351): the inbound listen
    wire message accepts an optional "profile": "voice" | "raw" field.
    The default voice profile behaves exactly as before (speech-tuned
    AFE path for STT). The new raw profile 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 offset 0x20000 (preserves NVS:
    Wi-Fi credentials, gateway URL settings, avatar assets)
  • merged-binary.bin — full clean install at 0x0 (resets NVS)
  • v2.2.6_stackchan.zip — full artifact set

License

Distributed under MIT (canonical build, MIT end-to-end).

Notes

  • Unknown or missing profile values fall back to voice; 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

Choose a tag to compare

@kisaragi-mochi kisaragi-mochi released this 11 Jul 03:48
abbffc0

Gateway

  • Added a color_order option (grb default, rgb) for Port B/C WS2812
    gateway tools and stackchan_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 / continuous color 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_c as a
    stackchan_follow_led_stream target. (#340)

firmware-v1.15.0

Choose a tag to compare

@github-actions github-actions released this 11 Jul 03:47
abbffc0

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.init is 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 to 0x20000 (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

Choose a tag to compare

@kisaragi-mochi kisaragi-mochi released this 09 Jul 03:02
8d34b62

Gateway

  • Re-dispatch the emoji-selected avatar face after successful speech playback,
    so emoji+text say calls 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

Choose a tag to compare

@github-actions github-actions released this 09 Jul 02:54
8d34b62

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 at 0x0, resets NVS / WiFi settings)
  • xiaozhi.bin — app-only update (flash at 0x20000, preserves NVS / WiFi settings)
  • v2.2.6_stackchan.zip — full build output

firmware-v1.13.1

Choose a tag to compare

@github-actions github-actions released this 05 Jul 15:42
0ca8449

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-side listen() 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 at 0x0, resets NVS / WiFi settings)
  • xiaozhi.bin — app-only update (flash at 0x20000, preserves NVS / WiFi settings)
  • v2.2.6_stackchan.zip — full build output

v0.14.0 — gateway

Choose a tag to compare

@kisaragi-mochi kisaragi-mochi released this 03 Jul 10:15
7216aa0

Gateway

  • Auto-render the idle avatar after a new ESP32 device session finishes
    initialization and tool discovery, unless set_avatar was already sent
    on that connection. (#77)
  • Fail in-flight load_avatar_set calls with disconnected immediately
    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-global owner.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 named owner-8765.lock) and a duplicate
    start on the same port is still rejected; --check reads the per-port
    lock. (#320)
  • Fixed /capture rejecting photo uploads with HTTP 413 on aiohttp >= 3.14.
    The capture app raised the per-request body cap with client_max_size=0
    (so /pcm can stream long PCM), but aiohttp's multipart reader treats 0
    as a zero-byte limit — unlike request.read()/.post() — so every upload
    carrying a non-empty question field was rejected with 413. Use a large
    finite client_max_size instead; /capture's real limit stays the explicit
    per-route byte cap.
  • Hardened /capture to tolerate a non-UTF-8 question field (decode with
    errors="replace") instead of failing the upload with HTTP 500.

v0.13.0

Choose a tag to compare

@kisaragi-mochi kisaragi-mochi released this 02 Jul 02:52
2b7a0f0

BREAKING: stackchan_follow_pose_stream.downsample_hz schema 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.toml support for gateway-side
    MCP argument defaults, starting with stackchan_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_enabled and get_touch_sensor_enabled MCP
    wrappers for the firmware head-touch enable flag. (#312)
  • stackchan_follow_pose_stream now exposes smoothing_window as 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_hz schema maximum
    from 60 to 20 to match the SCS0009 servo's observed sustained
    WritePos rate. 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-tts TTS engine — a subprocess-based engine using
    Microsoft's Edge TTS CLI and ffmpeg, registered as edge-tts.
    Provides natural English and multilingual voices (voicevox is
    Japanese-only by default). Setup: install edge-tts CLI on PATH
    (e.g. pip install edge-tts) plus ffmpeg. 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 from speaker_id integer and the voice
    engine selector) or globally via the STACKCHAN_EDGE_TTS_DEFAULT_VOICE
    env var. (#317)
  • Exposed the optional Port A I2C scl_speed_hz argument in the gateway
    schemas for i2c_read, i2c_write, and i2c_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

Choose a tag to compare

@github-actions github-actions released this 02 Jul 02:49
2b7a0f0

Highlights

  • User-configurable touch sensor disable (#312): new NVS-backed touch.enabled field with self.robot.set_touch_sensor_enabled / self.robot.get_touch_sensor_enabled MCP tools. Disabling stops both local touch reactions and stackchan/event emission, 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 optional scl_speed_hz property (default 400000, range 1000001000000), so slow Units — e.g. the RCWL-9620 ultrasonic ranger, which fails transfers with ESP_ERR_INVALID_STATE at 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 at 0x0, resets NVS / WiFi settings)
  • xiaozhi.bin — app-only update (flash at 0x20000, preserves NVS / WiFi settings)
  • v2.2.6_stackchan.zip — full build output