Skip to content

Releases: nvkudva/WaveKey

WaveKey v1.0-beta.3

WaveKey v1.0-beta.3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 13 Sep 11:44

What you need

  • arm64 phones only. Almost every phone sold since ~2016 is arm64; a 32-bit device cannot install this.
  • Dictation needs a 482 MB model download on first run, from Settings. Until it finishes, the mic key falls back to your system recognizer where the platform has one.
  • About 1.0 GB of storage if you also install the optional refiner.

fix(ci): a comment is not a safe place for ${{ }}

Actions evaluates expressions inside run blocks too, so an empty one in a
shell comment made the whole workflow file unparseable. GitHub then names the
workflow by its path, fails every push in 0s, and — the part that mattered —
silently ran nothing at all for the v1.0-beta.3 tag.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

WaveKey v1.0-beta (test build)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 13 Sep 09:16

Read this before installing

  • This build is signed with Android's public debug key. Anyone can build an APK that Android will accept as an update to it. Install it to try the keyboard, not to rely on it.
  • It installs as a separate app id (com.supervoiceboard.app.debug). A future signed build cannot upgrade over it — you will have to uninstall this one and lose your keyboard settings.
  • This build ships without main_ro.dict, the main English dictionary. Word suggestions while typing will be worse than a real build. Dictation is unaffected.
  • The APK is debuggable. Anyone with USB debugging access to your phone can read the keyboard's data.

What you need

  • arm64 phones only. Almost every phone sold since ~2016 is arm64; a 32-bit device cannot install this.
  • Dictation needs a 482 MB model download on first run, from Settings. Until it finishes, the mic key falls back to your system recognizer where the platform has one.
  • About 1.0 GB of storage if you also install the optional refiner.

fix(settings): a row that looks unavailable should behave that way, and a chip should have a name

Dimmed() lowered a row to 38% alpha and left it fully interactive, with nothing
saying why it was dim. That is the worst of both: unavailable to the eye,
available to the thumb, and silent to TalkBack. It now swallows the gesture,
marks itself disabled in semantics, and states the reason under the row — which
is the only thing that makes a dimmed row better than a missing one, and the
reason these rows are deliberately kept mounted.

Three call sites get their reason: key hint scale needs hints on, key gap needs
borders, the split spacer needs split.

The toolbar key chips are pictures with no label beside them, so their
description is the only name they have — and it was ToolbarKey.name, the enum.
TalkBack read "SELECT_WORD" where the row above says "Select word". They use the
same string the row does now, which already existed.

From the settings-wide UX audit; the two findings in this fork's own code that
it rated High.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

Built from 0a20d9b. Unsigned debug build.

SuperVoiceBoard v0.9.0 (test build)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 09 Sep 07:07
da52652

Read this before installing

  • This build is signed with Android's public debug key. Anyone can build an APK that Android will accept as an update to it. Install it to try the keyboard, not to rely on it.
  • It installs as a separate app id (com.supervoiceboard.app.debug). A future signed build cannot upgrade over it — you will have to uninstall this one and lose your keyboard settings.
  • This build ships without main_ro.dict, the main English dictionary. Word suggestions while typing will be worse than a real build. Dictation is unaffected.
  • The APK is debuggable. Anyone with USB debugging access to your phone can read the keyboard's data.

What you need

  • arm64 phones only. Almost every phone sold since ~2016 is arm64; a 32-bit device cannot install this.
  • Dictation needs a 482 MB model download on first run, from Settings. Until it finishes, the mic key falls back to your system recognizer where the platform has one.
  • About 1.0 GB of storage if you also install the optional refiner.

Fix -Pabi: an ABI cannot be named in both abiFilters and the splits

AGP rejects the pair outright — "Conflicting configuration : 'arm64-v8a' in
ndk abiFilters cannot be present when splits abi filters are set" — so the
phone build failed in configuration and produced no APK. The narrowed build
now leaves abiFilters empty and lets the split decide what is built, which
also keeps the arm64-v8a suffix the workflow globs for. The unnarrowed
default is untouched, because it was already working.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_014YbxfdiHpZ617p2ifDKMF9

Built from da52652. Based on HeliBoard 4.1 (versionCode 4101) — the 4.1 in the manifest is the upstream base, not this release.

v0.7.0-w7 — spoken formats and opt-in measurement

Choose a tag to compare

@nvkudva nvkudva released this 31 Aug 15:20

Wave 7, the last one in the plan.

Spoken formats (W7.2) — money, clock times and spoken addresses become what you would have typed: "five dollars fifty" → $5.50, "three thirty p m" → 3:30 PM, "john dot smith at gmail dot com" → john.smith@gmail.com. It runs on the raw transcript before anything else touches it, and every rule refuses unless the trigger is unambiguous — "three thirty" with no meridiem, "a pound of flour" and "connect the dots" are left exactly as spoken.

Opt-in measurement (W7.3) — off by default. When on, it counts how often dictated text is sent without editing and how long that takes. It cannot hold text (there is nowhere in the type to put it), it keeps aggregates only, and nothing is transmitted — there is no endpoint and no file. The switch's own summary shows what it measured.

Two-model confidence (W7.1) is not shipped, on purpose. The plan gates it on measured disagreement precision against a hand-labeled 200+ utterance corpus, published either way. That corpus does not exist and could not be produced here, so the gate is unmet and nothing marks a word in the UI. The foundation it would need — transcript normalization, word-level alignment, per-word agreement — is built and tested in :core and wired to nothing. Whoever picks it up needs the corpus, not more code.

:core is 843 tests, 0 failures, 0 ignored.

Download SuperVoiceBoard_4.1-release-arm64-v8a.apk for a modern phone. Voice models are still not bundled, so the mic reports "Voice models aren't downloaded yet" — verified on an emulator, along with the strip, the AI fix key and the settings.

v0.6.0-w6 — AI fix key, hold-to-talk, and a working APK

Choose a tag to compare

@nvkudva nvkudva released this 31 Aug 15:11

Waves 5 and 6. This is the first release with a working APK — see the note at the bottom.

W5 — AI fix

  • The AI fix is a real HeliBoard toolbar key (AI_FIX), enabled and pinned to the strip by default, reorderable and removable like any other toolbar key.
  • Long-press it to see what the model reworded, as "before" → "after" lines. Mechanical edits — casing, spacing, a doubled word — are deliberately not listed.

W6 — audit, budget, hold-to-talk

  • Privacy audit: our own code never logged content, but ten inherited HeliBoard log lines did — the committed word, its ngram context, contact and app names, dictionary words. All now log a length or nothing. HeliBoard's log buffer is exportable from the about screen, so a debug-gated word is still a word that leaves the device.
  • Measured: 40.1 MB PSS in the keyboard process while typing, against the 60 MB budget. Release APKs are now split per ABI — arm64-v8a is 37 MB, universal is 88 MB — because the ASR and LLM runtimes add ~31 MB of native code per architecture.
  • Hold-to-talk: hold the mic past ~350ms and release to send, alongside the existing tap-to-toggle. Hold past ~1.2s and that session becomes raw dictation — no cleanup, no refinement, no setting changed.
  • While the key is held, a silence pause no longer ends the utterance: the finger is the endpoint.

Download SuperVoiceBoard_4.1-release-arm64-v8a.apk for a modern phone.


The APKs attached to v0.2.0-w2, v0.3.0-w3 and v0.4.0-w4 were stale — assembleRelease was failing at lint and R8 while the release job reported success, so the W0 baseline got uploaded three times. Those assets have been removed and the underlying build failures are fixed here.

v0.4.0-w4 — dictated-text pipeline

Choose a tag to compare

@nvkudva nvkudva released this 31 Aug 14:46

Wave 4: what happens to dictated text between the recognizer and the field.

  • Dictated text is shielded by ContentGuard around the cleanup pass, so a recognizer writing $5.99, 3.14 or an email address does not get it mangled by a tokenizer built for prose — and an utterance ending in a URL no longer gets a period stapled on.
  • Draft rescue: an utterance whose input connection dies before the final pass is held in memory and replayed into the next editor of the same app, within 30 seconds, only if that field still accepts voice. It is never written to disk and never follows you into another app.
  • A touch on the editor now ends the utterance immediately: what was said lands, and the mic does not stay open while you do something else.
  • Decided and documented: HeliBoard's native decoder stays the only suggestion engine, for typing and dictation alike (PLAN.md R15).

Voice models are still not bundled, so dictation itself reports "Voice models aren't downloaded yet".


The APK originally attached to this release has been removed. It was a stale build: assembleRelease was failing at R8 and lint while the release job reported success, so the uploaded file was the W0 baseline rather than this wave. The code at this tag is correct; use the newest release for an installable APK.

v0.3.0-w3 — voice in the strip

Choose a tag to compare

@nvkudva nvkudva released this 31 Aug 14:41

Wave 3: the voice UI. The mic now sits at the right-hand end of the suggestion strip and drives on-device dictation instead of handing off to the system voice IME.

  • The strip row becomes the voice row while dictating — back, status with a level meter, minimize-keyboard, done — with the keyboard fully visible and live underneath, which is what Gboard does (screenshots recorded in docs/reference/).
  • Session lifecycle attached to LatinIME: a field that must not be dictated into ends the session, and an editor going away finalizes rather than discards what was said.
  • TalkBack: descriptions on every control, state announcements, partial transcripts deliberately not announced.

Voice models are not bundled, so tapping the mic in this build reports "Voice models aren't downloaded yet" — the download UI arrives with the model screens. Everything up to that point is exercised.


The APK originally attached to this release has been removed. It was a stale build: assembleRelease was failing at R8 and lint while the release job reported success, so the uploaded file was the W0 baseline rather than this wave. The code at this tag is correct; use the newest release for an installable APK.

v0.2.0-w2 — voice layer ported

Choose a tag to compare

@nvkudva nvkudva released this 31 Aug 14:32

Waves 1 and 2. The voice layer is in the app but not yet wired to any UI — the mic key still hands off to the system voice IME. Nothing user-visible changes except a new Voice typing screen in settings.

W1 — VBoard's core/ ported as a :core module: 795 tests, 0 failures, 0 ignored. Two clipboard-classifier defects closed with regression tests (which found a third: U+2212 MINUS SIGN grouping evaded the Luhn check), and the last VB-QA-05 idempotency breaker fixed.

W2:voice (ASR engines, session controller, model download/storage) and :llm (the out-of-process refiner, AIDL boundary intact). Three-process split on HeliBoard's manifest: keyboard, :ui for downloads, :llm for the refiner.

Permissions: this build requests RECORD_AUDIO and INTERNET. HeliBoard requests neither — see PLAN.md §3.3. Every network-touching component runs in :ui; a test asserts the IME process is not one of them.

APK is signed — unlike v0.1.0-w0's, which was not installable.


The APK originally attached to this release has been removed. It was a stale build: assembleRelease was failing at R8 and lint while the release job reported success, so the uploaded file was the W0 baseline rather than this wave. The code at this tag is correct; use the newest release for an installable APK.

v0.1.0-w0 — fork baseline

Choose a tag to compare

@nvkudva nvkudva released this 31 Aug 13:49

Fork baseline (Wave 0). No voice functionality yet — this is HeliBoard's typing engine, rebranded, with the fork's scaffolding in place.

Base: HeliBoard 4.1 @ 9f5bb63.

What's in it

  • Rebrand only: applicationId com.supervoiceboard.app, app label, launcher icon, provider authorities. The helium314.keyboard package namespace is deliberately unchanged so upstream fixes stay mergeable.
  • Attribution to HeliBoard / OpenBoard / AOSP in the README and the about screen; all upstream LICENSE files kept. GPL-3.0-only.
  • CI workflow for the fork (build + unit tests + lint + a placeholder permission audit).

Verified on an API 35 emulator: typing, suggestions, toolbar expand, clipboard panel, emoji panel. Glide typing is not verified — it needs the closed-source gesture library, which is not part of this build.

APKs: the release APK is unsigned; the debugNoMinify APK is debug-signed and installable.