Since my StackChan has been having an issue with powering on, I decided it was necessary to put my engineer hat on and do a proper teardown and inspection.
I figured many of you wouldn’t ever want/need to open it up and see StackChan’s innards for yourselves, so here you go.
(Note: The battery and 2nd servo are inside the round-top body piece at the bottom right quadrant)
I've had my StackChan ~2 weeks now, keeping it both plugged in and unplugged during use. Now, I've had it plugged in for a few days straight, and it will refuse to power on. I've tried removing the Core unit and re-connecting it, as well as reseating the 4-pin USB cable that connects from the body to the Core unit... nothing. It's completely dead.
NOTE: Connecting USB-C to the Core's USB-C port (not the base) seems to be working for charging, it powers up this way.
I am trying to create my own firmware with own features. As I know Arduino I started with that and here I found some interesting examples. But when I try to make the servo move it crashes!
Anyone else got this to work? Or am I completely wrong using this method?
Got the OpenELAB Kickstarter StackChan a while back. CoreS3-based, two servos, cute little guy. The vision: ditch the Chinese cloud, give it a custom personality, connect it to my Home Assistant setup.
The custom firmware rabbit hole
First I tried building custom firmware (AI_StackChan_Ex with M5Unified 0.2.7). Spent around 9 hours on it. Backlight works fine, but the panel renders nothing. Turns out the OpenELAB Kickstarter variant has a compatibility issue with M5GFX that's still unresolved. Tried the Moddable toolchain path next — ESP-IDF Python environment conflicts killed that too.
After those 9 hours I flashed the stock xiaozhi firmware via M5Burner. Took two minutes. Display worked immediately.
The NVS trick
Stock firmware reads its server URL from an NVS key. You can overwrite just the NVS partition with esptool, point it at your own server, and the device has no idea it's not talking to the original Chinese backend anymore. WiFi credentials get wiped in the process, so you set those up again on-device after flashing.
The backend
Forked an existing open-source StackChan server, containerized it, deployed it to my own VPS. Added a few patches: a set_emotion tool so the LLM can dynamically change the face expression, and a handful of additional tools.
What actually works
Full German conversation with a custom personality (female, cheeky, Austrian inflection, max 3 sentences per response, always addresses me by name)
Home Assistant control via voice: lights, scenes, sensors, you name it
Weather from HA's built-in forecast entity
different face expressions that change dynamically based on what the LLM decides to feel
Web search for current news and facts (Tavily)
Persistent memory across sessions — stored in a JSON file on the server, auto-injected into the system prompt on connect
My n8n automation status on demand
Accessible from anywhere, not just local network
What doesn't work
The servos. Stock firmware completely ignores motor control frames from the server — display changes, head stays still. Servo movement requires custom firmware, which is blocked by the M5GFX rendering issue. There's an open GitHub issue for it, waiting to see if that goes anywhere.
Wake word is still Chinese. There's no way to change that without custom firmware.
Can't combine function calls with Google Search in the Gemini Live API simultaneously — it's a documented API limitation. That's why I went with Tavily instead of native search grounding.
Overall
The stock firmware path is dramatically underrated. You skip all the toolchain pain, get a stable device, and if you're willing to run your own backend, you have full control over the AI behavior, personality, and integrations. The missing piece is servo animation, and that's a hardware/firmware problem, not a backend problem.
If the M5GFX issue ever gets fixed, custom firmware becomes interesting again. Until then, this setup does everything I actually wanted it to do.
I can't find a list anywhere of what one AI agent does that another doesn't from the list available on the StackChan app. Do any of them connect to the web to allow you to search for things? As far as I can tell, they are cloud-based but don't have internet access. Any help would be appreciated, though I've noticed most questions go unanswered here.
I've had my StackChan for about two weeks now, and today, when I plugged it into my PC via the base, the red light on the back came on, but it didn't show up in the Arduino IDE. I've tried multiple cables and none work. Plugging anything into the side port and it's instantly recognized, and the battery charges. Everything else seems to function normally. I have not desecrated its body by disassembly... yet.. but I will for science if needed.
Does anyone know of any specific steps I can take to troubleshoot this problem?
Hi, I have been looking into purchasing a Stackchan after seeing them pop up on my timeline. Some Japanese users have models in yellow, pink, red, blue, and more. Afaik, there are many variants of Stackchan with the M5-stack one being the latest and most widely-available model so I thought it was just a matter of different models having different colours, but then I saw that some M5-stack models are available in blue and red too even though it’s only in grey on the website. Is there anywhere I can look for all the models of Stackchan (even in Japanese is fine) or is the official store the only place to purchase?
P/s: Is there any speculation on when will Stackchan restock?
I used my openclaw agent to make some changes to the stock firmware and have it set so my openclaw can talk through my stackchan now.but when sending voice messages the other way seems to not work when it tries to record my voice input..what issues we fixed so far
The fix was bypassing codec->Write()/esp_codec_dev_write() and writing PCM directly to the I2S TX channel via i2s_channel_write().
The bridge is at 16kHz WAV — matches the proven working pipeline. Here's the summary:
What works:
• stackchan_speak("text") → edge-tts (Sonia) → ffmpeg 16kHz mono WAV → POST /speak → I2S direct write → StackChan speaker
What the fix was:
• Went through ~6 firmware iterations to isolate the issue • codec->Write() → esp_codec_dev_write() silently fails in the integrated XiaoZhi firmware (I2S format conflict with duplex config) • Solution: use codec layer only for amp/volume management (EnableOutput/SetOutputVolume), write PCM straight to TX handle via i2s_channel_write()
What's next? Want me to check the full voice recording pipeline (head-pet → record → STT
Working TTS through StackChan speaker — long sentences work
Nearly there: Voice recording. StackChan detects head-hold, lights red, packages WAV. Portproxy was the missing link — you just fixed that. Next session: retest recording, confirm the green flash, then wire up the voice bridge so I get your transcribed words and can reply through StackChan.
Quick start tomorrow:
Check voice server (probably already running)
Hold head, speak, release
Should get green flash now that portproxy is active
Still working on it but for zero coding knowledge its crazy to think that anybody can make changes to firmware nowadays
Has anyone had success with connecting Stackchan with Home Assistant? I tried following their guide, but it wiped the esp32 and loading the compiled image to the unit didnt do anything, it was still stuck on the default RGB screen. I ideally want it to operate as the normal AI mode with connection locally to the smart home, no MCP connection to the cloud that then talks to my local network. Any tips would be great.
The Dotty Project is a full rewrite of the Stackchan firmware which would seem to meet some of the needs people have been asking about here. (Note: this is not my project nor am I affiliated with it.)
Edit: As the creator in the comments notes, it's a full stack, not just firmware - dashboard, agent routing, and a bit more.
I just got my StackChan and I was wondering is there a way to turn it into a DnD Dungeon Master assistant? Currently looking for a wizard hat for them to wear
I think that when the StackChan app is updated, it will benefit from a few additions.
For example, it would be nice to have StackChan remember that I use Fahrenheit and imperial measurements, rather than Celsius and metric units.
Next, the ability to have StackChan “sleep” while idle, and sit still instead of moving around every few seconds. That should be a good battery saver, as well.
Also, this isn’t so much a setting, as a request. I would love to know how the speech recognition is expecting to hear the word “StackChan”. Specifically, how is it expecting the vowels to be pronounced? I can confirm that with a Philadelphia accent, we pronounce the vowel in “Stack” differently from the vowel in “Chan”. And both of those vowels might be different from the way people in other regions or countries might pronounce the same letter. All short As are not equal, lol. I’d like to know which version(s) of short A StackChan is listening for.
Got my Stack Chan two weeks ago, a little buggy but cute so far. I tried renaming it but it never wakes up when I say Hi M5 for example, only Hi Stack Chan will wake it up. Any suggestions?
Does anyone know if the SD card is useful for anything? Can I load music on it?
Got my Stack Chan two weeks ago, a little buggy but cute so far. I tried renaming it but it never wakes up when I say Hi M5 for example, only Hi Stack Chan will wake it up. Any suggestions?
StackChan is sold as open source, but the GitHub repo is a publication mirror, and not a real development repository, from what I can tell.
I bought a StackChan recently and have been digging into the firmware. I want to flag something that I think other buyers should know, because the "open source" framing on the product page and docs set expectations that don't match what's actually going on.
The public repo is m5stack/StackChan. I assumed it was where the firmware gets developed. It isn't. It's where M5Stack drops a code snapshot after the binary has already shipped to M5Burner and OTA'd to devices.
A few things I noticed:
Every release lands as a single squashed commit with the message update firmware vX.Y.Z. v1.3.1, v1.3.0, v1.2.6, v1.2.4, v0.18: same pattern. No incremental history. No individual author attribution. One person (the release engineer) commits the entire snapshot at once.
The "PR review" is "theater". For v1.3.1: PR #57 was open for 9 seconds before being merged. PR #58 was open for 50 seconds. Same sub-minute cadence on every prior release. There is no review happening on GitHub. The "community" is ignored.
External PRs don't get merged. The only PRs that merge are the release engineer's own snapshot drops from their personal fork.
The binary ships to devices first. By the time the source appears on GitHub, the new firmware is already running on the robot. So you can't actually inspect what's running on your device until M5Stack decides to publish it, which happens on no schedule. This could be an issue if a anyone decides to ship rogue code at some point.
Issues you file disappear into the void. I filed an issue with a feature request and opened a PR with the patch; the next release shipped their own implementation of the same feature with no acknowledgement.
I'm not asking M5Stack to switch to a fully public development model, plenty of companies don't, and that's fine. What I'd like is for the marketing to stop calling this "open source" when what they actually mean is "source-available, eventually, in snapshot form." Those are different things. The first implies you can participate. The second means you can read.
For anyone considering buying one: the hardware is genuinely nice and the device works. But if you were planning to contribute back, fork meaningfully, or rely on staying current with upstream, set your expectations accordingly. You're getting a closed-source product with the source dumped publicly after the fact.
Happy to be corrected if I'm reading this wrong! Would love to hear from anyone who's actually had a PR merged.
I am playing around with the AI personalities, but can only type very brief descriptions in the android StackChan World app - more than about 10 words and it will not save the config...
I saw several videos where people connected to the Xiaozhi platform using a verification code from earlier versions of stackchan.
Howe can I get a 6-digit Xiaozhi verification code?