github knoop7/Ava-Pro 0.7.8
365

one hour ago
Ava Pro 0 7 8 Game Banner

Ava 0.7.8 · One year

I started writing Ava in October 2025. Back then it was just an idea: that an old tablet or a spare phone at home could understand a sentence and answer back. This October makes it a full 365 days.

Most of that year was me alone in front of a screen. Writing line by line, testing again and again, tearing things down and starting over more times than I can count, and losing more than a few nights of sleep. Many late nights were spent just so it would stutter a little less, or mishear one sentence fewer, in someone else's living room.

Little by little, it stopped being only mine. People patiently described what was going wrong on their own devices in issues, translated it into their languages, wrote reminders for their washers and dryers, and sent in fixes along the way. @popy2k14, @CarlosTohe, @ds2000, @gilcu2, and everyone in the Home Assistant and voice satellite community who tried it and reported back: part of this release is yours.

So this week I made the source public. It was not about beating anyone to it. I felt that the people who helped it grow deserved to see what it really looks like. Ava was always written for the home, and one year in, it has found a small family of its own. The code is in the android directory of knoop7/Ava-Pro.

The source is licensed under CC BY-NC-ND 4.0. You may copy and share it, as long as you credit me and link to the license. You may not use it commercially, and you may not distribute modified builds. The parts that come from brownard/Ava remain under Apache 2.0. Mods can be developed and sold separately; see PLUGIN-EXCEPTION.md. That exception does not cover a modified Ava.

For now, I am keeping the C++ part to myself. Echo cancellation, noise suppression, wake-word features, and voiceprint took nearly half a year of writing and testing, and that part is not public for the time being. Without those files, the native library cannot be built. Holding it back is not about hiding anything; I simply do not want it deliberately copied or turned into a commercial product. Ava is not only a Home Assistant companion for one home. It belongs to everyone who uses it. It will always be free, and it will never be drawn into any commercial competition.

Here is what I did this week: side-by-side overlays first, then Super intelligent, and the fixes at the end.

Side-by-side overlays

New: Floating layer control, off by default.

When it is on, opening a second full-screen overlay places it beside the current one at a set ratio. Landscape splits left and right, 5:5 by default, and the ratio you choose is saved. Portrait splits top and bottom. The outer edges of both panes meet the screen edges. A third overlay still opens full screen. The screensaver always stays on top and is never part of a split. The collapsed music button and the draggable floating mini window are not part of a split either. On a cold start, Ava remembers the first overlay and inserts the second one into the split when it opens.

The layers that can be split are the same ones Home Assistant can control: browser, weather, simple clock, Dream Clock, quick entities, voice messages, and the expanded media player. When Home Assistant opens a second layer, this device gives it half the screen at the saved ratio. System bars are on the same page and can be shown in Home Assistant. The split switch can only be turned on from this device.

Path: Ava Settings -> App style -> Floating layer control

Super intelligent

New end condition: Super intelligent, for real-time interruption in continuous conversation.

If you speak while a reply is playing or while a request is still being processed, what you say is folded into the current turn right away. You don't have to wait for the reply to finish, or say stop and start over. The LLM decides whether the turn is over.

The option appears only when an LLM language engine is selected and continuous conversation is on. Without an LLM, the end condition stays as hot-word detection, and question-mark follow-up still works. Turns started with the button in Button or Hybrid mode do not use Super intelligent, and stay separate from the continuous conversation that follows a wake word.

Thinking stays within the current turn for later tool calls and is never spoken. On the LLM page, a new Think toggle sits to the right of SSE and is on by default.

Path: Ava Settings -> Voice Config -> Continuous Conversation -> Super intelligent

Path: Ava Settings -> Voice Config -> Text to understanding -> LLM language engine

Other additions

System bars. The navigation bar can now stay visible for Back, Home, and volume. Suggested by @popy2k14 in #236, on an Allnet PrimeTwo. There are four levels. The default still hides the navigation bar; swipe in from the edge to bring it up, and it hides again on its own. You can also hide only the status bar, or hide both the status bar and the navigation bar. Overlays follow the same level. Turn on Show in Home Assistant to switch it from Home Assistant.

Path: Ava Settings -> App style -> System bars

Sidebar Home. A Home entry is now at the bottom of the sidebar, on the same card as Settings. The two can swap places. On by default. Suggested by @popy2k14 in #239. The top-right button defaults to Settings and can be changed to the master service; tapping it then toggles the service. The top bar can be hidden as a whole, including the menu title and the service status. A long title scrolls horizontally on a single line. Hold the title to drag.

Path: Ava Settings -> Sidebar

Pause other media. Pauses whatever another app is playing, such as Netflix or Emby. It does not affect this device's own player. Suggested by @popy2k14 in #242. Off by default. When both the main switch and Show in Home Assistant are on, the pause_media button and the media_key service are published. The button always sends pause. The service accepts pause, play, play_pause, stop, next, and previous.

Path: Ava Settings -> Android Intent Executor -> Pause other media

Voice button. Moving your finger while holding only repositions the button and does not end the turn. A hold lasts until you let go, up to 2 minutes. If Home Assistant's 15-second recognition window ends while your finger is still down, the next window starts automatically. A short pause in speech does not end the turn.

Square screens and older Android. When the short side of the screen is under 680 dp, pulled-out pages fill the screen, and the handle itself does not stretch. On square screens, the music player uses the portrait layout. Android 5 through 8: long-press an overlay to show Back; on the vinyl layer, Back is collapsed into a round button. For encrypted pairing with the new Music Assistant, see Fixes below.

Alarms and scenes. "5 more minutes" now counts 5 minutes from the moment you tap it. When only one alarm is left, Close keeps it and stops the ringing. The reset scene is replaced by timer_done (#240). New scenes: washing started, washing finished, dryer started, dryer finished, and hot-water warning, in German, English, and Chinese (#243). Contributed by @popy2k14.

Show after screen on. Off by default. When on, the screensaver appears when the screen turns on, and the page underneath stays as it was. If the screen is woken by touch or by the proximity sensor, the current page stays. Suggested by @popy2k14 in #231.

Path: Ava Settings -> Screensaver -> Behavior & Wake -> Show after screen on

Silent self-update. With Shizuku, root, or device owner, self-updates install without a confirmation dialog. With device admin only, you still confirm once. Suggested by @popy2k14 in #232.

Fixes

This device now reports ESPHome version 2026.11.1 to Home Assistant (0.7.3 reported 2026.10.1). After you reconnect this device in Home Assistant, the device info shows the new version.

Fixes without a separate issue:

  • New Music Assistant pairing (encrypted): The new Music Assistant uses a Noise handshake (client/init, suite 25519_ChaChaPoly_SHA256) and no longer accepts a plaintext client/hello. After pairing, the player is registered in Music Assistant under its X25519 identity instead of the old ANDROID_ID. With the wrong identity, the cover, title, and progress stay stuck on the previous track.
    • Android 5 through 7.1: The system base64url inserts line breaks or rejects - and _, so the handshake frame never gets through client/init. This release uses its own encoder instead. Android 7's JSON writes / as \/, so the handshake is computed over the bytes actually sent. If a Noise handshake frame is not accepted, the next attempt still sends client/init and does not fall back to a plaintext hello. Older Music Assistant versions that close the connection can still use the plaintext hello.
    • Android 7 and 8: The system has no usable ChaCha20-Poly1305, or it can be obtained by name but fails verification. These versions use the built-in RFC 8439 implementation for encryption. Android 9 and above use the system implementation.
  • Speech replaying: /api/tts_proxy/ provides no duration. After a read timeout, the player requested the address again from byte 0, so the same reply played again until the address expired. Now, once any audio has been received, a retry counts as the end of the clip and nothing is replayed. A sudden jump backward in progress also counts as the end. Announcements and timer chimes follow the same rule.
  • Media player in a split: The logo is hidden in both left-right and top-bottom splits. Landscape splits add 20 dp of padding on all sides, and portrait splits use the same padding. The cover no longer suddenly enlarges, and no longer overlaps the logo.
  • Dream Clock in a split: Rounded corners are removed when it is one side of a split, and kept in full screen.
  • Opening Home or Settings from a split: Tapping Home or Settings in the browser sidebar now also closes the other overlays opened alongside the browser, so the other pane no longer expands over Home or Settings. The split switch keeps its setting.
  • Settings columns: Square and portrait screens no longer use the two-column layout. In landscape, the left list is no longer squeezed into a narrow strip, and its padding is no longer applied twice. The left list is shifted 10 dp to the right.
  • Real-time interruption: The playback reference signal is fed into echo cancellation, so the spoken reply is no longer mistaken for the user interrupting. After an interruption, continuous conversation continues and the model waits for the next sentence.
  • Model failover: Ava switches to the next slot only after the current model fails three times in a row. A 401, 403, 404, 400, or an unparseable reply now counts toward those three instead of switching immediately, with a short wait before each retry.
  • Caption line breaks: The last line of a three-line caption no longer ends up with only one to three characters, or a lone period.
  • Pull to refresh: You need to pause at the top of the page before pulling down to refresh. A quick swipe past the top still just scrolls the page.
  • Voice button position: The button can dock to the top, bottom, left, or right edge. On a cold start the caption layers start off screen, so pressing the button no longer causes a flash.
  • Voice button appearance: While waiting to connect, the microphone icon on the D-shaped handle sits higher. The caption area is wider, and the backing behind the text is darker.
  • Cold-start flash: When no overlay is open, the screen no longer flashes once from raising a layer.
  • Media player entity: Tracks play from their original address, duration and progress update correctly, and playback no longer loops from the start when it ends. Speech and media playback are kept separate. Reconnect this device in Home Assistant for this to take effect.
  • LLM toolbar: On small screens, the model slots, SSE, and Think shrink to fit the width. The leading 1+ is inset from the left edge.
  • Thinking: It is never spoken, and stays within the current turn for tool calls.
  • Square-screen cover: The cover shown while waiting for media is scaled to the remaining space and centered. On square screens, the extensions page uses the portrait layout.
  • Playback underrun on Android 7 and below: After an underrun, playback pauses, flushes, and then plays again. Android 8 and above simply play again.
  • Spanish: The interface is now available in Spanish. OK, Cancel, and Close stay in English. Thanks to @CarlosTohe (#234).

Fixes tracked in an issue:

  • #233: The interface stays usable during a self-update; downloading and waiting to install happen in the background. Thanks to @popy2k14.
  • #235: On the Android 10 Portal, when freeform windows are already allowed by the system, a thin untouchable window is kept in a corner so the microphone stays available. Thanks to @engfabiodario.
  • #238: launch_intent no longer depends on the diagnostic sensor master switch. It is published as soon as Android Intent Executor and Show in Home Assistant are both on. Thanks to @popy2k14.
  • #241: A disabled mod no longer recreates its manager, and any manager created while disabling is destroyed immediately. Thanks to @scenix222.
  • #245: The voice indicator now turns off after a proactive announcement or a delayed reply. This kind of playback has no RUN_START, so the end of playback marks the end of the turn. Thanks to @koshisan.
  • #244: Long replies that only start synthesizing once the address is opened are no longer cut off at 25 seconds; they now end based on playback progress. Thanks to @Quadrapole.

What's Changed

New Contributors

Full Changelog: 0.7.7...0.7.8

Don't miss a new Ava-Pro release

NewReleases is sending notifications on new releases.