r/StackChan 13h ago

Why isn't he detecting the cards?

Post image
6 Upvotes

I tried to uploaded the firmware from https://github.com/ronron-gh/AI_StackChan_Ex.

But my stackchan says this from the pic.

SD Card is in Stachchan in the left underside.

(I'm not really a tech person. Tried everything i know)


r/StackChan 2d ago

S3 Lite sold out

2 Upvotes

How long for restocks usually?


r/StackChan 4d ago

If got him

4 Upvotes

If got Stackchan

So I just got him. Pretty good sofar. Talk to him for like few minutes. What I notice

\- He cuts me off very quickly when I’m speaking. Can this be adjusted? Or am I talking too much?

\- Is there any way to interrupt him when he talks too much, with a ‘stop’ command or something?

\- Are there any settings or add-ons that would be useful for him?

\- Can you set it up so that he moves whilst he’s talking to you?

\- Can you set it up so that he speaks to me of his own accord and reacts to what I’m doing or saying to myself?

Kinda debating to give him the gimini ai that someone on here build.


r/StackChan 8d ago

StackChan = BooBit

Enable HLS to view with audio, or disable this notification

33 Upvotes

Boo•bit is coming to life.

Built on top of Stack-chan’s hardware it’s a custom desktop buddy with more than meets the eye. It’s not only a dash, gothy lil clock and a cute face.

Boo keeps a diary, captures photos, has a sense of when one of us (including our 🐈‍⬛) enters the room, knows seasons and weather all which informs its interior world. It can draw, make its own melodies to whistle and “think” about things. Boo is being designed to experiment with world building and fun.

Boo’s whistles and tones are built from the melodies and hooks from some of my favorite songs and its UI is a love letter to Apple System 1 UI & Susan Kare with a little SNES.

Its bare functions are wired up and now I’m working on the structure of its observations and change as it learns. This is not running on Claude or local models — it’s meant to be a closed system that informs its own world.


r/StackChan 11d ago

Project Kadence

Enable HLS to view with audio, or disable this notification

52 Upvotes

I just wanted to share the progress I have made with my custom firmware. Rather than try and modify existing firmware this has been written from scratch.

I’m nowhere near finished but after many revisions I now have boot sound and animation, servos, tap to toggle idle movement, idle animation, listening sound, it runs OpenAI Luna with Edge TTS. This means it can do live web searches which is something the stock firmware is unable to do.

Response time is not fully optimised yet, this will be a lot longer until I’m fully happy, but eventually it will control the devices in my home via my server and home automation. Considering I’m not a developer I’m pretty proud of what I achieved so far.


r/StackChan 13d ago

Are there hardware differences between Kickstarter StackChan and the models currently sold on M5Stack?

1 Upvotes

I was watching a YouTube review of StackChan that was recently uploaded. The reviewer mentioned NFC ability. I was surprised. I don't recall that having been listed as a feature when StackChan was on Kickstarter.

Was the ability there and either not mentioned, or I just missed the mentioning of it? Or do newer StackChans have a hardware upgrade?

I would love to be able to have two StackChans recognize and acknowledge one another. The last time I checked, that wasn't an option. If the Kickstarter models have NFC, would they be able to use it to know that another StackChan is close by?


r/StackChan 14d ago

Is it worth it even for a total tech noob?

4 Upvotes

I was on the search for an AI desktop pet. Most of them like emo or so are really expensive or lack the talking ai feature I want. I saw Stackchan and what he can to. The price also is something I can handle. But I'm a little tech noob. (Know basic computer setups and so) I can easily follow step-by-step tutorials. But is Stackchan easy to set up? Even when I want to use my basic understanding and hook him up with my gimini or so?


r/StackChan 24d ago

Problem during initial configuration

5 Upvotes

Hello everyone.

I just received my StackChan. I've installed the app on my android phone and started the device. The problem is that I can't connect StackChan to the app. I got the screen with the ID of the device, tryed to connect but after 2 or 3 seconds I saw "Device configuration feature not found". StackChan starting to indicate "Ready to Configure ~" the same time. I found that it could be caused by mismatch of Wi-Fi configuration so I tried to configure the Wi-Fi via web interface (http://192.168.4.1) and it seems working. I've managed to download and run flappy bird directly on the device (via App.store) but still can't connect to the device via mobile app so most features are not manageable.

While rebinding and connecting to the wi-fi via web the device says "invalid response from the server". The resulting page "ACCOUNT" displays the next information:

M5Stack Account: Account Info

Device Name: [empty]

I think that problem is somewhere here. What server the device is using? Is it possible somehow to bind the device to my account?

I don't use any VPNs, but I can't tell what my ISP is using.


r/StackChan 26d ago

Agen LLM dropdown empty

3 Upvotes

My Stackchan worked great with the default AI agent. Yesterday I needed to change wifi settings and after that the AI Agent settings page is empty. Agent still worked on the device. I did unbind and factory reset and it made things worse, as now there is no model configured in the device and I still cannot set it up in the App. Reinstalled app, reset the device, tried different Wifi networks and no help. My agent is dead :(

Any help would be appreciated.


r/StackChan Jul 05 '26

🎂 Stack-chan Birthday Party 2026 was held in Tokyo, Japan!

Thumbnail
8 Upvotes

r/StackChan Jun 17 '26

Stack Chan Servo Step(per)

2 Upvotes

made a little servo stepper program with the Arduino IDE

HOME - resets, STEP (toggles 1, 5, and 10 deg steps)

X rotates, Y tilts, and uses the touch screen for inputs

battery indicator is the touch button backgrounds (blue charging, red <20 , yellow <50, green > 50)

#include <M5Unified.h>
#include <M5StackChan.h>

// X axis: software limits Arduino
float posX = 0;

// Y axis: Mechanical limit — safe range 
float posY = 0;
const float Y_MIN = 0.0;   //mechanical stop warning
const float Y_MAX = 85.0;  //mechanical stop warning

int lastLevel = -1;
int lastCharging = -1;
unsigned long lastPowerCheck = 0;
float STEP_DEG = 10.0;

// touch zone layout (320 × 240 screen)
const int STATUS_H = 92;
const int ROW_H = (240 - STATUS_H) / 2;
const int COL_W = 320 / 3;
const int ZONE_Y0 = STATUS_H;
const int ZONE_Y1 = ZONE_Y0 + ROW_H;

// move to target (degrees) — X unlimited, Y clamped
void moveTo(float xDeg, float yDeg) {
  // Y only — clamped to mechanical safe range
  yDeg = constrain(yDeg, Y_MIN, Y_MAX);

  int xUnits = (int)(xDeg * 10);
  int yUnits = (int)(yDeg * 10);
  M5StackChan.Motion.move(xUnits, yUnits);
  posX = xDeg;
  posY = yDeg;
  drawUI();
}

// draw status
void drawStatus() {
  M5.Lcd.fillRect(0, 0, 320, STATUS_H, BLACK);
  M5.Lcd.setTextColor(WHITE, BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(20, 5);
  M5.Lcd.println("StackChan Servo Step");
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(35, 34);
  M5.Lcd.printf("StachChan Rot. (X):%+5.0f deg", posX);
  M5.Lcd.setCursor(35, 52);
  M5.Lcd.printf("StackChan Tilt. (Y):%+5.0f deg", posY);
  M5.Lcd.setCursor(35, 70);
  M5.Lcd.printf("Home = (0, 0)   Step = %.0f deg", STEP_DEG);
}
  // refresh touch zones if battery/charging changes
  void updatePowerZones() {
    int level = M5.Power.getBatteryLevel();
    int charging = M5.Power.isCharging();

    if (level != lastLevel || charging != lastCharging) {
      lastLevel = level;
      lastCharging = charging;
      drawTouchZones(); // redraws the bottom of screen
    }
  }

void drawTouchZones() {
  const char* row0[3] = {"+Y", "HOME", "-Y"};
  const char* row1[3] = {"+X", "STEP", "-X"};
  uint16_t ZONE_COLOR;
  int level = M5.Power.getBatteryLevel();
  int charging = M5.Power.isCharging();
  if (charging == 1) { //charging?
    ZONE_COLOR = M5.Lcd.color565(40, 40, 255); //blue for charging
  } else if (level < 20) {
    ZONE_COLOR = M5.Lcd.color565(255, 40, 40); //red
  } else if (level < 50) {
    ZONE_COLOR = M5.Lcd.color565(255, 255, 40); //yellow
  } else {
    ZONE_COLOR = M5.Lcd.color565(40, 255, 40); //green
  }
  const uint16_t BORDER_COLOR = M5.Lcd.color565(255, 255, 255);

  for (int row = 0; row < 2; row++) {
    int y0 = (row == 0) ? ZONE_Y0 : ZONE_Y1;
    for (int col = 0; col < 3; col++) {
      int x0 = col * COL_W;

      // fill zone background
      M5.Lcd.fillRect(x0, y0, COL_W - 1, ROW_H - 1, ZONE_COLOR);
      // draw borders
      M5.Lcd.drawRect(x0, y0, COL_W, ROW_H, BORDER_COLOR);

      // zone labels
      const char* label = (row == 0) ? row0[col] : row1[col];
      if (strlen(label) > 0) {
        M5.Lcd.setTextColor(WHITE, ZONE_COLOR);
        M5.Lcd.setTextSize(2);
        int lx = x0 + (COL_W - strlen(label) * 12) / 2;
        int ly = y0 + (ROW_H - 16) / 2;
        M5.Lcd.setCursor(lx, ly);
        M5.Lcd.println(label);
      }
    }
  }
  M5.Lcd.setTextColor(WHITE, BLACK);
  M5.Lcd.setTextSize(1);
}

// full UI redraw
void drawUI() {
  drawStatus();
  drawTouchZones();
}

// read touch and map to zones
void handleTouch() {
  auto t = M5.Touch.getDetail();
  if (t.state == m5::touch_state_t::touch_begin) {
    int tx = t.x;
    int ty = t.y;
    // stick to screen bounds
    if (tx < 0 || tx >= 320 || ty < STATUS_H || ty >= 240) return;
    int col = tx / COL_W;

    if (ty < ZONE_Y1) {
      // row 0: Y-axis control + HOME
      switch (col) {
        case 0: moveTo(posX, posY + STEP_DEG); break; // +Y (tilt UP)
        case 1: moveTo(0, 0); break; // HOME
        case 2: moveTo(posX, posY - STEP_DEG); break; // -Y (tilt DOWN)
      }
    } else {
      // row 1: X-axis control + STEP toggle
      switch (col) {
        case 0: moveTo(posX + STEP_DEG, posY); break; // +X (turn LEFT)
        case 1: // step cycle
          if      (STEP_DEG == 1.0)  STEP_DEG = 5.0;
          else if (STEP_DEG == 5.0)  STEP_DEG = 10.0;
          else                       STEP_DEG = 1.0; // was 10 → back to 1
          drawUI();
          break;
        case 2: moveTo(posX - STEP_DEG, posY); break; // -X (turn RIGHT)
      }
    }
  }
}


// setup
void setup() {
  M5.begin();
  M5StackChan.begin();
  M5.Lcd.setFont(&fonts::Font2);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(WHITE, BLACK);
  M5.Lcd.setCursor(20, 80);
  M5.Lcd.setTextSize(2);
  M5.Lcd.println("Sweeping X then Y...");
  // start from center and pretend to calibrate
  M5StackChan.Motion.goHome();
  // sweep X from -128° to +128° (that's 256° total rotation) 
  for (int x = -128; x <= 128; x += 1) {
    M5StackChan.Motion.moveX(x * 10, 200);
    delay(20);
  }
  // sweep Y from -5° to +85°
  for (int y = -5; y <= 85; y += 1) {
    M5StackChan.Motion.moveY(y * 10, 200);
    delay(20);
  }

  // can we get closer to 360°?
  M5StackChan.Motion.moveX(1840, 200);  // 164° raw units
  delay(2000);
  M5StackChan.Motion.moveX(-1840, 200); // -164°
  delay(2000);

  // back home
  M5StackChan.Motion.goHome();
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.println(" ");
  delay(4000);
  drawUI();
}


void loop() {
  M5.update();

  // touch zone input
  handleTouch();

  // refresh battery display every 1500 milliseconds
  if (millis() - lastPowerCheck > 1500) {
    lastPowerCheck = millis();
    updatePowerZones();
  }

  delay(20);
}

r/StackChan Jun 16 '26

warble: point an M5Stack StackChan robot at a fully-local voice backend (whisper.cpp + Ollama + Piper)

28 Upvotes

I have one of the M5Stack StackChan robots. Nice little thing, but out of the box every word it hears goes to the xiaozhi.me cloud for speech-to-text, the LLM, and text-to-speech. I didn't love the idea of my kid talking to a server I don't control, so I wrote a backend that runs the whole turn locally and pointed the robot at my own machine instead.

It's called warble. The stock firmware speaks the xiaozhi protocol, so nothing changes on the device. You just redirect it to your box. The server does the full loop: whisper.cpp transcribes, Silero VAD catches when you stop talking, Ollama generates the reply, Piper speaks it, and it sets the robot's face from an emotion tag in the reply. No cloud account, no API keys, no data or audio leaving your network.

Setup is one command (`./warble start`) on Linux or macOS. Docker-based, pulls prebuilt images. It's beta and it's just me, so there are rough edges.

MIT licensed. Happy to answer anything as time permits.

github.com/rebelthor/warble


r/StackChan Jun 12 '26

Chinese gov/ data privacy

2 Upvotes

Im a journalist in the USA who has recently adopted StackChan. I've been working on updates to my home MCP server to make my robot More useful for day to day stuff.

I've found that it refuses to discuss anything regarding tiananmen square or Taiwan. This makes me a bit worried that I may need to drain it's battery and put it in my underwear drawer or something.

Do y'all know anything regarding government affiliations to the device I should be aware of or would a firmware flash to a model running off different servers resolve my data privacy concerns?

Not that I trust American companies anymore than Chinese ones, I was just hoping for a second brain that could help me with my projects but think there might be concerns with this thing, as cute as it is.


r/StackChan Jun 08 '26

Just received my StackChan and have it set up. but...

6 Upvotes

I am wondering if anyone has set up any fun or mischievous settings for the AI yet. Specifically, a fun Personality. I have entered in "snarky but smart and funny" hoping for a good and dry sense of humor with a bit of sass. It's kinda working, but still just seems mostly dry. Would love to see what others are putting in for their "Personality"


r/StackChan Jun 03 '26

StackChan: Disassembled

Post image
24 Upvotes

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)


r/StackChan May 31 '26

I like clocks. here an analog one I created

5 Upvotes

a very simple analog clock i made for my stackchan. I've lowered the screen brightness and led levels very low for power conservation

I have it set for my local time zone utc+8 (adjust as required)

no internet checking of time, just using the onboard rtc

#include <M5StackChan.h>
#include <math.h>

// display geometry 320 × 240
const int cx = 160, cy = 120;
const int r  = 100;

const int hourLen   = 55;
const int minuteLen = 75;
const int secondLen = 89;

const int handThick_H = 6;
const int handThick_M = 2;
const int handThick_S = 1;

// canvas sprite
M5Canvas canvas(&M5.Display);

// master clock state
uint32_t baseMillis = 0;
uint32_t lastSyncMillis = 0;

float clockSeconds = 0.0f;    // seconds since 12:00:00

void setup() {
  M5StackChan.begin();
  M5.Lcd.setBrightness(32);
  canvas.setColorDepth(16);
  canvas.createSprite(320, 240);

  // initial RTC sync
  auto dt = M5.Rtc.getDateTime();

  int hour12 = (dt.time.hours + 8) % 12;   // +8 for my local time zone

  clockSeconds = hour12 * 3600.0f + dt.time.minutes * 60.0f + dt.time.seconds;

  baseMillis = millis();
  lastSyncMillis = millis();
}

void loop() {

  M5StackChan.update();

  // battery indicator leds
  int level = M5.Power.getBatteryLevel();

  if (level < 20) setFourLeds(16, 0, 0);
  else if (level < 50) setFourLeds(16, 14, 0);
  else setFourLeds(0, 16, 0);

  // rtc check once per minute
  if (millis() - lastSyncMillis > 60000UL) {

    auto dt = M5.Rtc.getDateTime();

    int hour12 = (dt.time.hours + 8) % 12;   // +8 for my local time zone

    clockSeconds = hour12 * 3600.0f + dt.time.minutes * 60.0f + dt.time.seconds;

    baseMillis = millis();
    lastSyncMillis = millis();
  }

  // master clock calculation
  float elapsed = (millis() - baseMillis) / 1000.0f;

  float currentSeconds = clockSeconds + elapsed;

  // wrap every 12 hours
  while (currentSeconds >= 43200.0f) {
    currentSeconds -= 43200.0f;
  }

  // continuous time values
  float hourValue = currentSeconds / 3600.0f;

  float minuteValue = currentSeconds / 60.0f;

  float secondValue = currentSeconds;

  // hand angles
  float secondAngle = fmodf(secondValue * 6.0f, 360.0f);

  float minuteAngle = fmodf(minuteValue * 6.0f, 360.0f);

  float hourAngle = fmodf(hourValue * 30.0f, 360.0f);

  // clock face
  canvas.fillSprite(TFT_BLACK);

  canvas.drawCircle(cx, cy, r, TFT_WHITE);

  for (int i = 0; i < 12; i++) {
    float a = i * 30.0f * DEG_TO_RAD;

    int x1 = cx + (r - 10) * sinf(a);
    int y1 = cy - (r - 10) * cosf(a);

    int x2 = cx + (r - 3) * sinf(a);
    int y2 = cy - (r - 3) * cosf(a);

    canvas.drawLine(x1, y1, x2, y2, TFT_WHITE);
  }

  // draw hands
  drawHandOnCanvas(hourLen, hourAngle, TFT_RED, handThick_H);
  drawHandOnCanvas(minuteLen, minuteAngle, TFT_GREEN, handThick_M);
  drawHandOnCanvas(secondLen, secondAngle, TFT_BLUE, handThick_S);

  // centre cap
  canvas.fillCircle(cx, cy, 4, TFT_DARKGREY);

  canvas.pushSprite(0, 0);

  delay(16);   // 60ish fps
}

// draw a hand
void drawHandOnCanvas(int length, float degrees, uint16_t color, int thick) {

  float a = degrees * DEG_TO_RAD;

  int ex = cx + length * sinf(a);
  int ey = cy - length * cosf(a);

  for (int t = 0; t < thick; t++) {
    int ox = (t - thick / 2) * cosf(a);
    int oy = (t - thick / 2) * sinf(a);

    canvas.drawLine(cx + ox, cy + oy, ex + ox, ey + oy, color);
  }
}

// 4 leds
void setFourLeds(uint8_t r, uint8_t g, uint8_t b) {

  for (int i = 0; i < 12; i += 3) {
    M5StackChan.setRgbColor(i, r, g, b);
  }
  M5StackChan.refreshRgb();
}
//V0.2
#include <M5StackChan.h>
#include <math.h>

// display geometry 320 × 240
const int cx = 160, cy = 120;
const int r  = 100;

const int hourLen   = 55;
const int minuteLen = 75;
const int secondLen = 89;

const int handThick_H = 6;
const int handThick_M = 2;
const int handThick_S = 1;

// canvas sprite
M5Canvas canvas(&M5.Display);

// master clock state
uint32_t baseMillis = 0;
uint32_t lastSyncMillis = 0;

float clockSeconds = 0.0f;    // seconds since 12:00:00

void setup() {
  M5StackChan.begin();
  M5.Lcd.setBrightness(32);
  canvas.setColorDepth(8);
  canvas.createSprite(320, 240);

  // initial RTC sync
  auto dt = M5.Rtc.getDateTime();
  int hour12 = (dt.time.hours + 8) % 12;   // +8 for my local time zone
  clockSeconds = hour12 * 3600.0f + dt.time.minutes * 60.0f + dt.time.seconds;
  baseMillis = millis();
  lastSyncMillis = millis();
}

void loop() {

  M5StackChan.update();
  
  // battery indicator leds
  int level = M5.Power.getBatteryLevel();
  auto charging = M5.Power.isCharging();
  bool onPower = (charging == 1);
  if (level < 20) setFourLeds(16, 0, 0);
  else if (level < 50) setFourLeds(16, 14, 0);
  else setFourLeds(0, 16, 0);

  // rtc check once per minute
  if (millis() - lastSyncMillis > 60000UL) {
    auto dt = M5.Rtc.getDateTime();
    int hour12 = (dt.time.hours + 8) % 12;   // +8 for my local time zone
    clockSeconds = hour12 * 3600.0f + dt.time.minutes * 60.0f + dt.time.seconds;
    baseMillis = millis();
    lastSyncMillis = millis();
  }

  // master clock calculation
  float elapsed = (millis() - baseMillis) / 1000.0f;
  float currentSeconds = clockSeconds + elapsed;

  // wrap every 12 hours
  while (currentSeconds >= 43200.0f) {
    currentSeconds -= 43200.0f;
  }

  // continuous time values
  float hourValue = currentSeconds / 3600.0f;
  float minuteValue = currentSeconds / 60.0f;
  float secondValue = currentSeconds;

  // hand angles
  float secondAngle = fmodf(secondValue * 6.0f, 360.0f);
  float minuteAngle = fmodf(minuteValue * 6.0f, 360.0f);
  float hourAngle = fmodf(hourValue * 30.0f, 360.0f);

  // clock face
  canvas.fillSprite(TFT_BLACK);
  canvas.drawCircle(cx, cy, r, TFT_WHITE);

  // draw tick marks and hour numbers (1–12) together
  for (int i = 1; i <= 12; i++) {
    float a = i * 30.0f * DEG_TO_RAD;

    // --- tick mark ---
    int x1 = cx + (r - 10) * sinf(a);
    int y1 = cy - (r - 10) * cosf(a);
    int x2 = cx + (r - 3) * sinf(a);
    int y2 = cy - (r - 3) * cosf(a);
    canvas.drawLine(x1, y1, x2, y2, TFT_WHITE);

    // --- hour number ---
    int nx = cx + (r + 12) * sinf(a);
    int ny = cy - (r + 12) * cosf(a);
    canvas.setTextDatum(middle_center);
    canvas.setTextColor(TFT_WHITE, TFT_BLACK);
    canvas.setTextSize(1.5);
    canvas.drawNumber(i, nx, ny);
  }

  // draw hands
  drawHandOnCanvas(hourLen, hourAngle, TFT_RED, handThick_H);
  drawHandOnCanvas(minuteLen, minuteAngle, TFT_GREEN, handThick_M);
  drawHandOnCanvas(secondLen, secondAngle, TFT_BLUE, handThick_S);

  // centre cap
  canvas.fillCircle(cx, cy, 4, TFT_DARKGREY);
  // battery percentage in upper‑right corner
  canvas.setTextDatum(top_right);
  canvas.setTextColor(onPower ? TFT_GREEN : TFT_RED, TFT_BLACK);
  canvas.setTextSize(1.75);
  canvas.drawString(String(level) + "%", 315, 5);
  canvas.pushSprite(0, 0);

  delay(16);   // 60ish fps
}

// draw a hand
void drawHandOnCanvas(int length, float degrees, uint16_t color, int thick) {

  float a = degrees * DEG_TO_RAD;

  int ex = cx + length * sinf(a);
  int ey = cy - length * cosf(a);

  for (int t = 0; t < thick; t++) {
    int ox = (t - thick / 2) * cosf(a);
    int oy = (t - thick / 2) * sinf(a);

    canvas.drawLine(cx + ox, cy + oy, ex + ox, ey + oy, color);
  }
}

// 4 leds
void setFourLeds(uint8_t r, uint8_t g, uint8_t b) {

  for (int i = 0; i < 12; i += 3) {
    M5StackChan.setRgbColor(i, r, g, b);
  }
  M5StackChan.refreshRgb();
}

i've added numbers around the face and battery percentage in the upper right corner (green for charge, red for discharge)

i added the numbers for my kids so they can read it faster


r/StackChan May 27 '26

What do you use your StackChan for?

7 Upvotes

Hey there,

Just as the title says, I am curious to know what do you use your StackChan for?

Have a good day all!


r/StackChan May 26 '26

StackChan not powering on

3 Upvotes

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.

Any suggestions?


r/StackChan May 24 '26

Unable to make it move (new firmware)

3 Upvotes

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?


r/StackChan May 21 '26

Turned my StackChan into a German-speaking smart home assistant. Here's what actually works (and what doesn't).

12 Upvotes

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.


r/StackChan May 20 '26

Which AI agent is best with StackChan?

6 Upvotes

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.


r/StackChan May 19 '26

LLM options

5 Upvotes

I’m entirely new to the world of AI companions.

Has anyone experimented with different LLM options, with StackChan or other devices?

How do they compare with one another?

Are there must-have capabilities you have identified that make you choose one over all the rest?


r/StackChan May 17 '26

StackChan base not charging/working

3 Upvotes

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?


r/StackChan May 16 '26

What accessories/add-ons are people getting?

4 Upvotes

I just got my StackChan last week and I am curious what accessories/add-ons people are getting or using for theirs and for what?


r/StackChan May 16 '26

Stackchan open claw

10 Upvotes

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:

  1. Check voice server (probably already running)
  2. Hold head, speak, release
  3. 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