Aug 2026 · 3 min read
Building VocoLiss: Text-to-Speech Reading With AI That Degrades Honestly Offline
I shipped VocoLiss — turn documents into speech and study aids. The hard part was race-safe TTS highlighting and AI that falls back offline without lying when the server actually errored.
- flutter
- tts
- accessibility
- ai
- reading
- offline-first
- productivity

I shipped VocoLiss — an AI text-to-speech and reading assistant. Anything with words (PDF, DOCX, EPUB, TXT, RTF, PPTX, images, camera OCR, clipboard, web URL) becomes spoken audio, with a reader that highlights as it goes, then optional AI study tools on top.
Design language is “aurora glass” — gradients, glass, code-drawn illustrations, micro-animations — but the engineering story is transport + trust.
Import is the product surface
People don’t start with a blank text field. They start with a file in Drive, a scan of a handout, or a URL. VocoLiss routes all of that through an import pipeline into a local document model. OCR uses ML Kit (multi-page, enhance, edit, listen). Guest session on launch — no login wall.
TTS that doesn’t race itself
Platform neural voices via flutter_tts, spoken sentence-by-sentence. Speed 0.25–4×, pitch, sleep timer, loop, listening queue, background audio (iOS audio mode).
The subtle bug class in TTS apps: pause, seek, or change voice mid-utterance and callbacks from the previous generation light up the wrong words. A generation counter invalidates stale callbacks. A TextMap splits the document into word/sentence spans with character offsets so progress events map back to highlight ranges. Tap-to-seek, auto-scroll, time estimates, focus mode, multiple fonts/themes.
Voice library groups platform voices with curated personas for browsing — still grounded in what the OS actually ships.
AI behind a proxy, fallback with rules
Cloud path: published Vocoliss Lovable /api/chat companion. LOVABLE_API_KEY stays server-side. Multi-turn chat, summaries (multiple styles), podcasts, flashcards, quizzes, translator, writing tools, mind map, timeline — free-tier gated per document.
Offline / network failure: on-device extractive engine.
Critical product rule in AiService: only use extractive “dummy” answers when the failure looks like a real outage (socket, DNS, timeout). 401 / 403 / 400 / 5xx / auth errors must not silently become offline summaries — that would hide a broken backend behind fake success.
Same honesty theme as FloorMind and SellSnap: degraded mode is allowed; lying about why is not.
Study, notes, accessibility
Pomodoro, daily goals, streaks, vocabulary, analytics. Notes include dictated voice notes via on-device speech-to-text. Biometric unlock + PIN. Dyslexia-friendly font, high contrast, large text, reduced motion (including system setting).
Persistence: JSON on device + SharedPreferences. Riverpod over an AppStore initialized before runApp.
What I’d still harden
Wire StoreKit / Play Billing for the modeled paywall plans. Optional real OAuth if cloud accounts matter. iOS simulator is unsupported on Apple Silicon for ML Kit — document that for contributors. Own the chat proxy long-term (keys, quotas, abuse).
Bet: listening apps win on transport correctness; AI wins when offline isn’t a costume for server bugs.
Tagged
- flutter
- tts
- accessibility
- ai
- reading
- offline-first
- productivity
Related work
Apps, packages, and projects this piece connects to.
More writing
Other notes from the archive.

Building Lexora: A Privacy-First Writing Keyboard That Works Offline
Lexora is an Android keyboard that helps people improve spelling, grammar, clarity, and tone wherever they write. Here is how I built its on-device writing engine, custom keyboard, and fast Android integration without sending text to a server.
Oct 2026 · 7 min read

Building iDraw: A Flutter Drawing App With Lessons, a Studio, and an AI Coach
iDraw is a Flutter app I’m building to help people learn to draw — guided lessons, a freehand studio, progress tracking, and an AI coach powered by Google Gemini. Here’s the product brief and the tech behind the strokes.
Sep 2026 · 5 min read

Building a scripting language for hardware panels
Rushabh's lab instruments speak in fixed-width serial strings, and every new panel meant another hardcoded Android screen. So I built a language instead: a lexer, a typed statement tree, an expression evaluator, and buttons you place on a photograph of the machine.
Aug 2026 · 7 min read
Discussion
Questions or notes. Comments live on GitHub Discussions.