Getting Started with MimicLaw

Prerequisites

  • Hardware: ESP32-S3 board with 16MB Flash + 8MB PSRAM (e.g., Xiaozhi AI Board ~$10)
  • Software: ESP-IDF v5.5+ or esptool.py (for pre-built firmware)
  • Accounts: Anthropic API key, Telegram Bot Token (via @BotFather)
  • Optional: Brave Search API key (for web_search tool), HTTP proxy (for restricted networks)

Option A: Flash pre-built firmware

Download the latest release from GitHub Releases:

# Download merged firmware (all-in-one binary)
# Flash to ESP32-S3
esptool.py --chip esp32s3 -b 460800 write_flash 0x0 mimiclaw-full-v0.1.0.bin

Then configure via serial CLI (see Configuration below).

Option B: Build from source

# Clone the release
git clone --branch v0.1.0 https://github.com/memovai/mimiclaw.git
cd mimiclaw

# Create secrets file
cp main/mimi_secrets.h.example main/mimi_secrets.h
# Edit main/mimi_secrets.h with your credentials

# Build
idf.py set-target esp32s3
idf.py build

# Flash + monitor
idf.py -p /dev/ttyACM0 flash monitor

Build-time secrets (mimi_secrets.h)

#define MIMI_SECRET_WIFI_SSID       "MyNetwork"
#define MIMI_SECRET_WIFI_PASS       "MyPassword"
#define MIMI_SECRET_TG_TOKEN        "123456:ABC-DEF..."
#define MIMI_SECRET_API_KEY         "sk-ant-api03-xxxxx"
#define MIMI_SECRET_MODEL           "claude-sonnet-4-5"

// Optional
#define MIMI_SECRET_PROXY_HOST      ""
#define MIMI_SECRET_PROXY_PORT      ""
#define MIMI_SECRET_SEARCH_KEY      ""

Configuration

After flashing, connect to the serial CLI (115200 baud):

screen /dev/ttyACM0 115200
# or
minicom -D /dev/ttyACM0 -b 115200

Essential commands

mimi> wifi_set MySSID MyPassword     # WiFi credentials
mimi> set_tg_token 123456:ABC...     # Telegram bot token
mimi> set_api_key sk-ant-api03-...   # Anthropic API key
mimi> set_model claude-sonnet-4-5    # LLM model
mimi> restart                        # Apply changes

Optional commands

mimi> set_proxy 192.168.1.83 7897    # HTTP proxy (for restricted networks)
mimi> clear_proxy                    # Remove proxy
mimi> set_search_key BSA...          # Brave Search API key

Diagnostics

mimi> config_show                    # Show all config (with masking)
mimi> wifi_status                    # Connection status + IP address
mimi> heap_info                      # Free memory (internal + PSRAM)
mimi> session_list                   # List all session files
mimi> session_clear <chat_id>        # Delete a session
mimi> memory_read                    # Print MEMORY.md contents

Two-layer configuration

MimicLaw uses a two-layer config system:

  1. Build-time (mimi_secrets.h): Compiled into firmware. Convenient for personal builds.
  2. Runtime NVS (via CLI): Stored in flash, survives reboots. Overrides build-time values.

The config_show command indicates the source of each value:

=== Current Configuration ===
  WiFi SSID     : MySSID  [NVS]
  WiFi Pass     : MyPa****  [NVS]
  TG Token      : 1234****  [build]
  API Key       : sk-a****  [build]
  Model         : claude-sonnet-4-5  [build]
  Proxy Host    : (empty)  [not set]
=============================

First conversation

  1. Open Telegram and find your bot (the one you created via @BotFather)
  2. Send any message
  3. The device serial output shows the agent processing
  4. Response appears in Telegram

You can also connect via WebSocket on ws://<device-ip>:18789:

{"type": "message", "content": "Hello", "chat_id": "my_client"}

Memory and personality

MimicLaw loads three files from SPIFFS flash at startup:

FilePurposeEditable via
/spiffs/config/SOUL.mdAI personality and behaviorwrite_file tool or CLI
/spiffs/config/USER.mdUser profile informationwrite_file tool or CLI
/spiffs/memory/MEMORY.mdLong-term persistent memoryAgent writes automatically

The agent is instructed to proactively save important information to MEMORY.md and daily notes (/spiffs/memory/daily/YYYY-MM-DD.md) using its file tools. You don't need to ask it to remember — it does so autonomously.

Firmware updates (OTA)

MimicLaw uses dual OTA partitions (ota_0 + ota_1). The ota_manager module wraps ESP-IDF's esp_https_ota() for over-the-air updates from a URL. The device automatically reboots after a successful update.

Troubleshooting

SymptomCauseFix
No WiFi connectionWrong credentialswifi_set <ssid> <pass> then restart
Telegram not respondingBot token invalidset_tg_token <token> then restart
API errors (401)Invalid API keyset_api_key <key> then restart
Slow responsesLarge contextClear old sessions with session_clear
SPIFFS fullToo many sessions/notesDelete old files via CLI
Can't reach APINetwork restrictedConfigure proxy: set_proxy <host> <port>