🤖 Groki Settings

Configure Wi-Fi and API keys over Web Bluetooth

ℹ️ Click Connect over Bluetooth to connect to the device with Web Bluetooth, change settings in the tabs, then click Save and restart to confirm (only needed for settings that require a restart). LED and face DSL changes take effect immediately.

Firmware—
Hardware—
Model—
Manufacturer—
Software—
Battery—

Operating mode

Choose how Groki behaves from three main modes. "Conversation" talks through OpenAI, Gemini or XiaoZhi, "Idle chatter" only speaks while idle, and "Mic lip sync" only moves the mouth with the microphone input. Takes effect after a restart.

Leave blank to keep the current value

Device name (BLE / mDNS)

Used as the base for the BLE advertising name and the mDNS host name. Leave blank to generate one automatically (Stackchan-XXXXXX). mDNS keeps only letters, digits and hyphens. Takes effect after a restart.

Password protection

When set, both this BLE settings page and the Wi-Fi settings page require the password. BLE mixes a hash of the password into the encryption key, so with a wrong password every channel fails to decrypt. HTTP uses Basic Auth. Clearing it goes back to no password (compatible with the current behavior). Takes effect after a restart.

Face tuning (sliders with live preview)

The preview below follows the sliders. While connected, the robot's face also changes live (no restart needed). To keep the current settings, click "Save and restart" (the device restarts to confirm).

Loading preview…

8.0
0
0
0
0
0
0
50
90
4
60
10.0
0
0

Face drawing DSL (replaces the whole face structure)

Write the avatar face's drawing logic in a Lua-like DSL. The browser compiles it to bytecode and sends it over BLE, where it takes effect immediately. It is saved to NVS and survives restarts. Syntax guide / Default face source

DSL compiler not started

Speaker volume

Applies to all output: built-in speaker, Module Audio and Atomic Echo Base. Moving the slider takes effect immediately and is saved automatically (no restart needed). 100% is each board's factory default; 200% is a boost (the internal master volume is doubled, capped at 255).

jtts test speech

Type hiragana or katakana and click "Speak" to hear it through jtts. Kanji and English are not converted, so write the text in kana. Useful for checking the volume and the audio output.

Audio output

Choose where audio plays. "Auto" uses an installed M5 Module Audio first and falls back to the built-in speaker. "Built-in speaker" and "Module Audio" force the choice (choosing Module Audio without one installed falls back to the built-in speaker). Takes effect after a restart.

Wi-Fi RTP audio receiver

Receives RTP audio over Wi-Fi (L16/μ-law = udp/6970, AAC = udp/6972). Turned off automatically while conversation is on

Idle speech (jtts)

Mic lip sync tuning (used in Mic lip sync mode)

Opens and closes the mouth with the microphone level. The CoreS3 microphone is not very sensitive, so a higher input gain looks better. Moving a slider takes effect immediately and is saved automatically.

Tracks the background noise so the mouth reacts to speech in both quiet rooms and noisy places. When off, a fixed threshold is used (it does not adapt, but it is more predictable). Takes effect after a restart.

jtts voice

Fields left blank or unchanged keep their current values when you click "Save".

HMM voices (.htsvoice) and unit-concatenation voice libraries (.jvox) can be uploaded on the Wi-Fi settings page.

Attribution for the speech engine (hts_engine, Modified BSD) and the bundled voices: Licenses / attribution

For a softer voice try: open quotient 0.65–0.75 / tilt 6–12 dB / bandwidth 1.2–1.5 (plus breathiness 0.1–0.25). All of these apply to the v2 method (bandwidth also applies to the classic method).

Format: display text | reading. The part right of | (the reading) must be hiragana or katakana (kanji are skipped when speaking). Without | the display text is also used as the reading. Example: display text | hiragana reading

Play an audio file (BLE streaming)

Choose a local audio file (.mp3 / .wav / .m4a / .aac, etc.) and click "Play". The browser re-encodes it to 24 kHz mono AAC-LC and streams it over BLE. Groki decodes and plays the AAC as it arrives and moves its mouth with the volume.

Not started

Audio pipeline diagnostics

Audio pipeline statistics for the most recent conversation turn (same as BLE chr 0x1f / HTTP GET /api/metrics/audio). The firmware (conv-task: log_playback_metrics) updates them at the end of each turn; click "Read" below to see the latest values.

Metric avg min max
Not read yet

—

LT timer

Start or stop it from the "LT" tab on the robot. Set the default length and the announcements here (changes apply immediately and are kept after Save and restart). Write readings in hiragana (jtts cannot read kanji)

Conversation provider and API keys

Chooses which conversation backend to use. Keys and settings for each one can be saved in the fields below.

Touch controls

While a reply is playing, tapping the avatar screen (the head) interrupts the AI reply. The touch sensor is sensitive and easily triggered by accident, so this is off by default. Petting (touching front → middle → back in sequence) is not affected by this switch and is always on. Takes effect after a restart.

Device features on/off

Shows a battery gauge in the top-left corner of the avatar screen (takes effect after a restart)

Whether to play C5–E5–G5 (a speaker self-test tone) after startup. When off, the device starts silently (takes effect after a restart)

When off, the servos get no power and the servo task does not start (takes effect after a restart). This is not the same as the torque off/on switch on the control screen: this setting is saved to NVS.

Servo origin and range of motion (for custom bases such as the Takao base)

Servo mounting direction and range of motion differ between bases. Set the origin (0..1023) and the range (degrees), then click "Save and restart" to apply. The defaults are the M5 base values.

Range setting mode turns the servo torque off so you can move the head by hand and capture positions. In order: at the center click "Capture Yaw origin", at the left end "Capture Yaw min", at the right end "Capture Yaw max". Captured values fill the fields above. Finally click "Save and restart" to confirm.

Yaw: -- (--°) Pitch: -- (--°)

Cat-ear LEDs

Sets the mode, color and brightness of the cat-ear NeoPixels (GPIO9 / 18 LEDs). Changes apply immediately, are saved to NVS automatically and come back after a restart. Rainbow (gradient) mode ignores the color.

The LEDs react when the avatar opens its mouth (works for conversation playback, jtts speech and mic lip sync). When off, they stay at the set brightness. Takes effect after a restart.

Chooses how the LEDs follow the mouth when this is on. "Brightness" is the original behavior: the wider the mouth, the brighter all LEDs. "Level meter" lights the cat-ear triangle (LED1 along the base, LED5 at the tip) as a 5-step bar graph. Takes effect after a restart.

Claude Code Channel (MCP): token

When set, the /mcp/* HTTP API is enabled (a Channel adapter can connect to it). When cleared, /mcp/* returns 404. Takes effect after a restart

Firmware update (OTA)

Pick a GitHub release or a local build/stackchan_idf.bin and click "Write". The new firmware is written to the other partition over encrypted BLE and the device restarts. The browser's BLE connection drops afterwards; reconnect manually.

Not started

Works in Chrome / Edge (desktop) 133 or later, including over file://. Firefox and Safari do not support Web Bluetooth.
Each connection is encrypted with X25519 + AES-256-GCM (no system pairing needed).