VoFlow is an Android voice-to-text app built around fast, system-wide dictation.
It combines a floating microphone control, Android's microphone foreground-service APIs, an accessibility service for text injection, and Google's Gemini API for AI-powered transcription.
- System-wide voice dictation from a floating microphone button.
- AI transcription through Gemini models.
- Smart dictation mode that cleans up filler words, false starts, punctuation, and obvious transcription mistakes while preserving the speaker's intent.
- Verbatim transcription mode when the original wording should be preserved.
- Automatic injection of transcribed text into supported focused text fields.
- Clipboard fallback when direct text injection is unavailable.
- Configurable Gemini model selection.
- Secure local storage for sensitive preferences and API credentials.
- Technical diagnostics and transcription/error logging.
- Shake-to-restore support for the floating microphone control.
- Minimal, local-first architecture with no analytics or telemetry.
- The user starts a recording from the floating microphone control.
- VoFlow captures audio as an AAC/M4A recording.
- The recording is sent to the selected Gemini transcription model.
- Gemini returns the transcription.
- VoFlow injects the result into the currently focused text field when possible.
- If direct injection is unavailable, the text can fall back to the clipboard.
The app keeps the recording pipeline intentionally small: audio capture is handled by Android's MediaRecorder, while network communication uses OkHttp.
- Android 7.0 (API 24) or newer.
- Microphone permission.
- Display-over-other-apps permission for the floating microphone.
- Accessibility-service permission for system-wide text targeting and injection.
- Notification permission where required by the Android version.
- A Gemini API key for AI transcription.
VoFlow requests the following Android capabilities:
| Permission | Purpose |
|---|---|
RECORD_AUDIO |
Capture voice input |
SYSTEM_ALERT_WINDOW |
Display the floating microphone control |
FOREGROUND_SERVICE |
Keep the recording service running correctly |
FOREGROUND_SERVICE_MICROPHONE |
Declare microphone foreground-service use |
BIND_ACCESSIBILITY_SERVICE |
Detect focused text fields and inject transcription |
INTERNET |
Communicate with Gemini |
ACCESS_NETWORK_STATE |
Check network state |
VIBRATE |
Haptic feedback |
POST_NOTIFICATIONS |
Foreground-service notifications on supported Android versions |
- Kotlin
- Jetpack Compose
- Material 3
- AndroidX
- Kotlin Coroutines
- OkHttp
- Android MediaRecorder
- Android Accessibility Service
- Android foreground services
- Gemini API
The project intentionally avoids unnecessary frameworks and dependencies.
app/
└── src/main/
├── java/com/example/
│ ├── data/
│ │ ├── GeminiApiClient.kt
│ │ ├── DiagnosticLog.kt
│ │ └── ...
│ ├── audio/
│ │ └── AudioCaptureEngine.kt
│ ├── service/
│ │ ├── OverlayService.kt
│ │ └── AuraAccessibilityService.kt
│ └── ...
├── res/
└── AndroidManifest.xml
The source namespace remains com.example for compatibility with the current project structure. The installed application ID is com.jbuilds.voflow.
Open the project in Android Studio with a recent Android SDK and JDK 17 installation.
The project currently uses:
- Android Gradle Plugin 9.1.1
- Kotlin 2.2.10
- Compile SDK 36.1
- Target SDK 36
- Minimum SDK 24
- Java 17
For a local debug build:
./gradlew assembleDebugFor a release build:
./gradlew assembleReleaseRelease builds use R8 code shrinking and resource shrinking and produce ABI-specific APKs for:
- arm64-v8a
- armeabi-v7a
- x86_64
A universal APK is also configured.
Release signing is configured through environment variables rather than storing signing credentials in the repository.
Expected variables:
KEYSTORE_PATH
STORE_PASSWORD
KEY_PASSWORD
The release key alias is upload.
Do not commit keystores, passwords, API keys, or other credentials.
VoFlow is designed to keep application data local wherever possible.
- API credentials are stored using Android secure preferences.
- Diagnostic logs are kept locally in memory.
- API keys, audio recordings, transcripts, and request bodies are not written to the diagnostic log.
- No analytics or tracking system is included.
- Audio is captured locally and sent to Gemini only when transcription is requested.
Because VoFlow uses Gemini for AI transcription, recorded audio is transmitted to the configured Gemini API endpoint when a transcription request is made. Review Google's applicable Gemini API terms and privacy documentation before deploying the app for sensitive workloads.
VoFlow includes a Technical Logs section for troubleshooting transcription and application behavior.
Current diagnostics include events such as:
- Transcription start.
- Selected Gemini model.
- Quota/cooldown conditions.
- Empty/no-speech results.
- Transcription failures.
- Runtime exceptions.
The diagnostic system is intentionally designed to avoid logging sensitive content.
The project follows a few simple rules:
- Prefer Android and browser-native/system APIs over additional dependencies.
- Keep the recording path lightweight.
- Keep network work off the main thread.
- Store sensitive configuration securely.
- Request only permissions required for core functionality.
- Avoid telemetry and unnecessary network activity.
- Make changes surgical and preserve existing behavior.
Version: 1.0.0
Application ID: com.jbuilds.voflow
VoFlow is under active development.
VoFlow is licensed under the MIT License.
See LICENSE for the full license text.
Note
The core logic and application code were generated with AI under my supervision and direction.