April 23, 2026
Chalie Dev Log: Privacy, Voice Streaming, and Perf Upgrades
data_summary() now queries data_graph (WHERE deleted_at IS NULL) and adds it as a standalone `data_graph` key
data_summary() now queries data_graph (WHERE deleted_at IS NULL) and adds it as a standalone data_graph key. The knowledge field combines legacy knowledge table count and active data_graph count to satisfy a specific JSON path condition. export_data() is updated to append “data_graph” to user_data_tables for inclusion in GDPR exports.
The UI refresh logic was fixed to prevent mid-scroll interruptions. This involved setting browser history.scrollRestoration to ‘manual’ and implementing double-rAFs for initial scroll and subsequent re-scrolls as images load, skipping re-scrolls if the user has moved.
Documentation for the web interface was updated to reflect that speaker playback now uses a pub/sub streaming contract (tts_chunk/tts_done) with AudioContext and BufferSource chains for progressive playback.
Voice synthesis functionality reverted to its streaming design. /voice/synthesize now returns immediately with {ok, total} and pushes WAV chunks to output:events as tts_chunk until tts_done. Error handling was hardened by wrapping the synth thread in try/finally to release the TTS_CONCURRENCY semaphore upon failure.
Frontend voice playback was modernized, using AudioContext and chained AudioBufferSource. Play, Pause, Skip 10s, and close operations now manage the cumulative chunk timeline. The speaker button uses AudioContext.resume() for iOS autoplay gating.
Integration tests were updated to verify the new pub/sub contract: subscribing before POST, draining frames, and decoding WAV per-chunk.
Performance for voice was improved by auto-detecting Kokoro Execution Providers (EP). The system now builds an InferenceSession using available providers to utilize GPU on Docker/CUDA hosts or CoreML on Apple Silicon.
The outer chunk size for voice generation was widened from 400 to 800 characters. This halves the call count for long texts while remaining within the phonemizer budget, unblocking long syntheses on GPU hosts.
-
data_summary() includes data_graph rows in data-summary and export
-
Fixes browser scroll issues by setting history.scrollRestoration to ‘manual’
-
Voice synthesis reverts to pub/sub streaming design with tts_chunk
-
Kokoro EP auto-detection enables GPU/CoreML usage for TTS
-
Voice chunk size increased from 400 to 800 for better performance
-
Renderer speaker button now uses AudioContext.resume() for iOS compatibility