Verbally is a local-first floating dictation app for Android 14+. It shows a small dictation bubble beside editable text fields, records only when the user taps it, transcribes speech through a user-selected provider, optionally cleans up the text, and inserts the result at the active cursor.
Traditional Chinese documentation is available in README.zh-TW.md.
Verbally is preparing for its first public release on Google Play and F-Droid. The
current app version is 0.1.0 (versionCode = 1). Expect rapid iteration before
the first stable release.
- Floating dictation bubble for Android text fields.
- Tap-to-record flow; audio is sent only after the user confirms.
- Speech-to-text providers: OpenAI, Soniox, Groq, and Deepgram.
- Text cleanup providers: OpenAI and Gemini.
- Bring-your-own-key provider setup; API keys are stored locally with Android encrypted storage.
- Direct cursor insertion through Android Accessibility IME support, with clipboard fallback only when direct insertion cannot be verified.
- Local dictation history with latest-100, 24-hour auto-delete, or no-history modes.
- Local dictionary and snippets for preferred terms and deterministic expansions.
- Interface localization across supported languages, with Traditional Chinese as the primary product language.
Verbally has no backend, account system, analytics SDK, advertising SDK, crash reporting SDK, or cloud sync. Audio is temporary and is deleted after success, failure, or cancellation. Dictation history stays on the device according to the user's retention setting.
Verbally does use third-party AI network services selected by the user. Temporary audio, transcript text, cleanup text, and the matching user-provided API key are sent to the selected providers only for transcription and cleanup. See PRIVACY.md.
Verbally uses Android's AccessibilityService API to detect editable fields, show
the floating dictation bubble, and insert or verify dictated text at the cursor. It
is not declared as an accessibility tool because its primary purpose is general
dictation, not disability-specific assistive access.
Before opening Android Accessibility settings, the app shows an in-app disclosure and requires affirmative consent. Sensitive fields such as passwords, numeric-only fields, phone fields, and known financial apps are excluded from bubble display.
The app is built with Kotlin, Jetpack Compose, Android Gradle Plugin 9.0.1, and Gradle wrapper 9.1.0.
Local requirements:
- JDK compatible with the Android Gradle Plugin.
- Android SDK. On this maintainer machine,
local.propertiespoints to/opt/homebrew/share/android-commandlinetools.
Run unit tests:
./gradlew testDebugUnitTest
Build a debug APK:
./gradlew assembleDebug
Build a release app bundle for Play Console upload:
./gradlew bundleRelease
The debug APK is generated at:
app/build/outputs/apk/debug/app-debug.apk
RECORD_AUDIOSYSTEM_ALERT_WINDOW- Accessibility service:
Verbally Floating Dictation
Sideloaded/debug APKs may show Accessibility as controlled by restricted settings. Open Verbally's Android App info, use the top-right menu, choose "Allow restricted settings", then return to Accessibility settings and enable the service.
The upstream Fastlane/F-Droid metadata lives under:
fastlane/metadata/android/
Release and store-preparation docs live under:
docs/release.md
docs/store/
F-Droid official repository submission should declare the NonFreeNet anti-feature
because the core dictation workflow depends on user-selected proprietary AI network
services.
Verbally uses OpenSpec for product behavior specs.
Validate specs:
openspec validate --all --strict
Completed release-preparation change:
openspec/changes/archive/2026-06-04-prepare-store-open-source-release/
Issues and pull requests are welcome after the repository is made public. Please read CONTRIBUTING.md, CODE_OF_CONDUCT.md, and SECURITY.md before contributing.
Verbally is licensed under the Apache License, Version 2.0. See LICENSE and NOTICE.