CoreS3 voice chat rebuilt on action=async: filler on job_id, 0.7s polls, gapless sentence chunks, 8.3s to first reply, plus a Key unit (U144) talk button with port auto-detect.
Tested on a CoreS3: talk into the mic, get a spoken reply. 44-byte RIFF header on the PCM buffer, HTTPClient multipart POST built in PSRAM, 12.4–13.8s sync round trips.
Tap-to-record 5s at 48kHz into PSRAM, instant playback on CoreS3. The mic/speaker swap on the shared I2S bus worked with 200ms waits; the freeze was the serial monitor's DTR/RTS reset.
3 face PNGs embedded in flash decode to sprites in 87ms. CoreS3 touch stops at y=239 so Core2-style BtnA/B/C never fire; tap, hold and flick gestures instead.
ESP32 can't join Tailscale, so a VPS PHP relay feeds the CoreS3. Chunked WAV via writeToStream, SD mounts broken by any pre-mount LCD draw, NVS volume.
CoreS3 voice chat spec check before firmware: playWav needs linear PCM 8-16bit up to 2ch (any rate), mic/speaker share one I2S bus, 128x128 sprite lip sync fits in RAM.
Wired M5Stack's CO2L Unit (SCD41) to a CoreS3 over Grove and put CO2/temp/humidity on screen. The factory-fresh sensor read +30% high against a SwitchBot NDIR meter, so I ran FRC over a serial command to pull it in line.
A brand-new CoreS3 failed with 'SD Card initialization failed!' on the stock firmware. Tested two LAZOS cards: the 16GB never mounts at any SPI clock, the 32GB mounts but only writes at 10MHz, and a soft reset wedges the card until power-off.
Flicker and ghosting on 74HC595-based seven-segment displays often come from latch boundary placement rather than power issues. A look at how QUAD7SHIFT's 16-bit atomic update avoids the problem.