While the rest of the developer ecosystem was coordinating its 1.0 release wave,
Echo was focused on a distinct mobile and on-device milestone. Between July 3
and July 6, two major epics reached done—Echo-E7 (the Mini ADP Planning Loop)
and Echo-E8 (Mobile App Implementation)—culminating in the v0.9.0-pre-ship
release candidate tag.
The technical challenge for Echo was bridging native C++ machine learning
libraries with Android platform lifecycle constraints. The application relies
on on-device Whisper models running through native NDK binaries for local speech
recognition. PRs and commits early in the window sorted out brittle build seams,
such as injecting the missing WHISPER_VERSION macro (1d03135) so CMake would
compile cleanly across all target architectures.
More critical was real-time performance on device. Early iterations performed
voice activity detection (VAD) and Whisper model execution too close to the
microphone recording loop, causing audio buffer dropouts and lag. Commit
b5a3f8b restructured the pipeline into non-blocking JNI workers with dynamic
VAD thresholding and connection hysteresis preloading, keeping audio capture
smooth while inference runs asynchronously in the background.
Operating system permissions created another subtle failure mode. On modern
Android versions, promoting an audio recording service to a Foreground Service
(FGS) without verified microphone permissions causes an immediate fatal
SecurityException. Commit e038002 established strict runtime permission
checks before triggering the foreground service promotion.
With audio capture and inference stable, the higher-level agent loops fell into
place. The on-device wake-word gate (‘echo’) was connected to the full voice
flow (c7b4c3b), routing speech-to-text into task extraction models and dual-gate
sync (1d2dc2c). In the UI, the planning domain models and task review screens
landed (fe733eb, a499a32), allowing an engineer to review and approve plan
steps derived from voice input.
With authentication and sync hardened against the 1.0 platform contracts
(97f12ae), Echo cut v0.9.0-pre-ship. It proved that the autonomous planning
loop could live outside a desktop browser on real hardware.
Lessons learned
- Runtime permissions must precede Android Foreground Service activation.
Starting a Foreground Service with the
microphonetype requires that the app has already been granted runtimeRECORD_AUDIOpermissions; invokingstartForegroundwhile permission is pending immediately crashes the process. - Native audio inference through JNI must never share execution threads with audio capture. Running model inference on or directly blocking the audio recording callback guarantees buffer underruns. Offloading audio slices onto dedicated worker queues with hysteresis buffers keeps recording seamless.
- Decouple speech transcription from state-mutating planning operations. Voice transcriptions are inherently speculative until confirmed. Separating raw speech-to-text extraction from the domain planning mutations via dual client confirmation gates keeps bad transcriptions from corrupting server state.