Built solo by codebyaadi

A voice layer for everything you own.

Avni is a speech-first personal assistant. An Android app that listens only when it should, a Rust core that routes each request to the cheapest thing that works, and a cost cap that actually holds.

English first. Hinglish is planned. The source is private for now.

You say

…

Avni

…

  1. Hear
  2. Transcribe
  3. Decide
  4. Speak

A scripted demo of how a turn flows. The words are fixed and the pauses are not measurements.

16k
lines of Rust
gateway, providers, memory, cost ledger, CLI
10k
lines of Kotlin
app, VAD, intent matcher, wire client
22
decision records
every architecture choice written down
248
Rust tests
plus Android unit and screenshot tests

Counted from the repository in October 2026.

How a turn works

From your voice to a spoken answer, in five steps.

  1. 01
    Hear
    A small voice detector runs on the phone. It decides when you start and stop, so nothing is sent while you are quiet.
  2. 02
    Transcribe
    Your utterance goes to your own server, which asks a speech-to-text provider. Providers sit behind a trait with a fallback chain.
  3. 03
    Decide
    Simple commands (a timer, the torch, volume) are matched on the phone and done there. Everything else goes to a language model, with what you asked it to remember.
  4. 04
    Speak
    The reply is spoken clause by clause on the phone's own voice, so the first words start before the answer is finished.
  5. 05
    Account
    Every provider call lands in a cost ledger with a daily and monthly cap. Over the cap, paid providers are skipped.

What it does

Small, boring decisions, made carefully.

On-device
Local-first commands
Sixteen English commands run on the phone from a plain grammar file, with their risk tier taken from the grammar and never from model output.
In the app
Models you can switch
The server advertises what it has. The app picks the speech and language models per device. The choice goes first; the rest stay as fallback.
Measured
A budget that holds
Costs are whole micro-dollars in an append-only file rebuilt at start, so a restart cannot reset the cap. Metering adds 63 nanoseconds per streamed event.
Spoken
Memory you control
Say 'remember that my sister is Priya'. Facts live in SQLite with secure delete, and 'forget' really forgets. Export is one command.
Opt-in
Hands-free, honestly
A foreground microphone service and notification keep a session alive. 'Until I stop' leaves the mic open with the notice showing, never silently.
Plain
Private by construction
Access token on every connection, history only on the phone, an audit log that stores hashed arguments, and a privacy page that says what leaves the device.

The Android app

One orb, three tabs, nothing hidden.

The look follows one style guide across my products: warm paper and indigo ink, pills, frosted panels and Sora.

The Talk screen of the Avni app

Tap the orb and talk

The orb is the whole screen: it listens, thinks and speaks, and the last exchange sits under it. Setup happens inline the first time.

These are renders of the app's own Compose screens, made on a laptop by the test suite. They are not photos of a phone.

Engineering you can check

Contracts, not vibes.

  • Golden wire fixtures shared between Rust and Kotlin, so the two ends cannot drift apart silently.
  • The protocol is protobuf-first with buf lint and buf breaking in the gate.
  • The voice detector's outputs are checked against Silero's own per-frame probabilities, in both languages.
  • Every hot-path change ships with latency evidence, and nothing blocking joins the turn path unmeasured.

Measured so far

63 nscost metering per streamed event
15 µsmemory lookup per turn at 200 facts
~0.05 msto match a spoken command on the phone

These are small pieces, timed in isolation. The number that matters, end of speech to first sound with real providers, has not been measured yet. The target is a p50 under 1.2 seconds.

Where it stands

Honest status.

Built
Done
  • English voice loop: phone to core to providers and back
  • Tap-to-talk, automatic end of speech, barge-in, hands-free mode
  • Local commands, cost ledger and usage page, memory v0
  • Model choice, pairing by QR code, resumable sessions, redesigned app and orb
  • A tool-calling agent loop (opt-in) and an MCP client, with a calculator and a clock to start
  • Asking before it acts: a spoken readback and a clear yes, or a tap, and never on a locked phone by voice alone
Next
In progress
  • Deploy: tried locally, not yet on a real server
  • Real pairing with keys instead of a shared token
  • Guided permissions walkthrough, debug waterfall
  • Opus audio, echo and noise tuning
Later
Coming soon
  • Real tools through MCP: calendar, mail, search, reminders
  • Wake word and on-device speech recognition
  • Desktop node and a mesh of devices

Straight answers

Questions people ask.