# Changelog ## v3.0.0 (2026-07-08) ### Added - Structured JSON logging with daily rotation (7-day retention, 10MB limit) - Config hot-reload — reads openclaw.json every 5s, no restart needed - Request tracing via `crypto.randomUUID()` and `X-Request-ID` header - Health endpoint: uptime, current voice config, RouterAI connectivity probe, request stats - Graceful shutdown on SIGTERM/SIGINT with in-flight request draining - Upstream request timeout (30s) on all RouterAI calls - Body size limit (50MB) to prevent DoS ### Fixed - **CRITICAL:** Binary-safe multipart parser — no longer corrupts non-ASCII audio bytes - Replace deprecated `url.parse()` with WHATWG `new URL()` API - `response_format` removal now logged as WARN (was silently mutating) - Whisper stderr captured and logged (was silently discarded) - Error responses sanitized — no raw upstream errors leaked to client - Root path (`/`) redirects to `/health` (was shadowing health endpoint) ### Changed - Refactored into modular handler functions (`handleModels`, `handleSpeech`, `handleTranscriptions`, `handleHealth`) - Config now has safe defaults; survives missing/broken `openclaw.json` - `/v1/models` returns the configured TTS model from config, not hardcoded - All file operations in `~/openclaw/logs/` directory ### Removed - v2 monolithic request handler