Cyrano
A 100%-on-device ambient curiosity companion. Cyrano listens to live conversation and whispers a single surprising fact — a deep origin story, a counterintuitive “wait what,” or a tangent bridging two things the speakers just said — directly into your earpiece. No cloud. No servers. No data leaves the device.
Problem
Good conversations get interesting when someone surfaces the unexpected — the etymology, the rare fact, the tangent between two domains. Most AI tools that try to help are either intrusive (chat windows, take-this-action) or surveillance-by-default (record everything, ship to a server). Neither belongs in the room you’re already in.
Insight
The phone in your pocket can now do this entirely on its own. Whisper for transcription, Gemma 3 2B for inference, a local audio pipeline for capture and playback — all small enough to run real-time, gated by an energy-VAD so it’s only listening when someone’s speaking. No cloud. No audio leaves the device. That changes both the privacy story and the product shape: it can be ambient, generous, and not for sale to anyone but you.
Solution
An app that listens, classifies the context (social · conflict · negotiation · interview · celebration · creative · educational · technical), and at the right moment whispers one fact — [DEEP], [WEIRD], or [TANGENT] — through your earpiece or headphones. A double-thump pocket gesture delivers the next nudge without unlocking. Haptic ticks signal quality so you can judge a fact by feel.
The whisper, by category
Every nudge is one fact in one of three styles, tagged on the last line so the system can score, learn, and prefer the kinds you respond to.
The pipeline, in one diagram
Every link runs on the phone. No round-trip to a server.
Mic → 80 ms amplitude polling for energy-based VAD (gate at −38 / −42 dBFS, 1.5 s silence to close a segment).
STT → Whisper base running in its own isolate (whisper_flutter_new). A rolling 40-chunk window keeps the transcript fresh without unbounded memory growth.
Context detection → a ContextDetector labels the transcript window (social, conflict, negotiation, interview, celebration, creative, educational, technical) and a rolling sentiment EMA seeds a tone hint.
Prompt assembly → PersonaService composes the system prompt from four sections: Core Tone, a context-specific Dynamic Strategy, a Sentiment Hint, and a fixed Guardrails block. Sentiment is never visible in the UI.
LLM → Gemma 3 2B IT (GPU INT8 via MediaPipe, flutter_gemma 0.9), max 128 tokens. Streamed tokens drive optional haptic ticks in stealth mode.
Output parsing → the model writes the style tag and a 1–3 quality tag on the last line. The phone uses both to decide when (and how loudly) to whisper.
TTS → flutter_tts with audio_session routing: Bluetooth > wired headphones > earpiece. Earpiece is muted by default.
Two surfaces, one product
The phone is the stealth surface — pocketable, gesture-driven, mostly silent. The tablet is the “studio” surface — same logic, more room to show what’s happening under the hood.
Phone · Stealth Overlay
Full-bleed dark substrate. A stack of nudge cards slides in from the bottom; each one is one fact, one style tag, one quality tag. A minimal bottom bar shows pipeline status. A double-thump pocket gesture queues the next nudge to the earpiece without unlocking the phone.
Tablet · Command Center
A three-pane layout: live transcript on the left, nudge stack in the middle, session history + the LOCAL BRAIN dashboard on the right. The LOCAL BRAIN panel surfaces tokens/sec, parse-failure rate, and thermal state — the kind of thing you only want when you’re tuning the model, not when you’re using the app.
What I designed
The Neubrutalist palette. Hard-offset shadows, 1.5 px borders, 4 px radius, electric lime #C8F135 accent, IBM Plex Mono throughout. The visual language tells you Cyrano is a tool — closer to a thermostat or a CB radio than to a chat app.
Quality-tier haptics. The model writes a [QUALITY:1]–[QUALITY:3] tag on every nudge. In stealth mode this drives haptic feedback so the user can judge a fact by feel, without looking at the screen. A short tap for 1, a double-tick for 2, a felt thud for 3.
Pipeline status as a status bar, not a setup screen. Every step of the pipeline (VAD, STT, context, LLM, TTS) reports up to a small bar at the bottom of the stealth screen. If the phone is throttling thermally, the bar dims and one step pauses. The user can always tell what the device is doing without being trained on it.
The free-tier rhythm. A daily free-minute budget runs inside the listen loop. When it’s spent, the pipeline transitions to paywalled and the phone surfaces a sheet — but the design choice was that nothing about the listen experience changes until the budget runs out. No upsell while you’re using it.
The first-launch model download as a screen. ~1.5 GB of models has to land before anything else works; the onboarding screen reframes that as an event, not a wait state — naming what’s downloading, why, and what privacy property each one earns.
Why on-device matters
Most “AI companion” products work by shipping your audio to a server and giving the server a memory of you. Cyrano refuses both. There’s no account, no telemetry, no audio export, no cloud inference, no shared embedding. Whisper and Gemma both download to the device once and stay there — and there’s a visible Local-only badge in the UI so you don’t have to take it on faith. The product is the position.
In development.
Pipeline is end-to-end working on physical hardware (the GPU delegate won’t run on simulator). Billing keys, Android release signing, and the native thermal handlers are the next set of pre-launch milestones. TestFlight and Play Internal Testing to follow.