You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Hey! I did a thorough review of the codebase and README. Here's a structured list of issues, improvements and test ideas that could help strengthen the project. Feel free to pick and choose — they're roughly ordered by priority within each category.
🐛 Bugs / Edge Cases
No maximum recording duration — There's protection for recordings that are too short (<1s), but nothing stops a recording from running indefinitely. At 16kHz mono PCM (~1.9MB/min), a forgotten recording could exhaust storage or exceed the Groq API upload limit. Suggestion: add a configurable max duration (e.g. 2 minutes) with auto-stop and a warning.
No graceful handling of invalid/expired API key — If the Groq API returns 401/403, what does the user see? Ideally the status text should show a clear error message with a link/button to open settings, rather than a generic failure.
Race condition on rapid mic button taps — Quickly double/triple-tapping the mic button could cause the state machine to enter an inconsistent state (recording → stopping → recording simultaneously). The recording lifecycle should be guarded against this.
Silent clipboard fallback without user feedback — When direct text insertion fails (e.g. in Claude app, WebView-based fields), text silently goes to clipboard. The user should get a brief toast or status message like "Copied to clipboard — paste manually" so they know what happened.
Hint text filtering could match real user input — Signal/WhatsApp hint text is filtered out, but if a user types something that matches the hint pattern (e.g. "Type a message"), it might get incorrectly removed when the bubble inserts text.
🧪 Testing
Unit tests for AudioRecorder WAV generation — The WAV header (RIFF, sample rate, bit depth, data chunk size) must be byte-perfect or Whisper will reject/misinterpret the file. Test scenarios: 0 samples, 1 sample, large files, correct byte order and chunk sizes.
Unit tests for GroqApiClient error handling — Mock OkHttp responses for: 200 with transcription, 200 with empty text, 401 unauthorized, 429 rate limited, 500 server error, network timeout, malformed JSON. Verify each case is handled gracefully.
Tests for word replacement regex — Special characters in replacement patterns (dots, parentheses, backslashes, asterisks) can break regex. Also test: overlapping replacements, case sensitivity, Unicode words (Dutch/Arabic/Japanese characters).
Multi-language stress test — Test auto-detect with mixed-language audio (e.g. Dutch + English in one sentence). Test with background music containing lyrics in a different language. Document accuracy per language.
Memory leak test for repeated record/stop cycles — AudioRecorder buffers, WAV files, and OkHttp connections need proper cleanup. Automate 100+ record→stop→transcribe cycles and monitor memory via Android Profiler.
✨ Enhancements
Retry mechanism for API failures — Network hiccups, rate limiting (429), and server errors (5xx) currently cause immediate failure. Exponential backoff with max 3 retries would improve reliability significantly.
Better visual feedback during upload/transcription — The mic turns orange "while processing" but there's no progress indication. For longer recordings or slow connections, show something like "Transcribing... (3s audio)" or a progress animation.
Offline queue for recordings — Instead of discarding recordings when there's no internet (metro, train), save the WAV locally and auto-transcribe when connectivity returns.
Configurable API endpoint for self-hosted Whisper — Privacy-conscious users may want to run their own Whisper instance (whisper.cpp, faster-whisper). A configurable endpoint URL in settings (instead of hardcoded Groq) would enable this.
Export/import for custom dictionary and word replacements — These are only stored locally. A reinstall or new device means losing everything. Simple JSON export/import would solve this.
TalkBack/accessibility audit for the keyboard — Custom keyboard buttons (MIC, LANG, punctuation, settings) need proper contentDescription labels for screen readers. A voice-input app should be especially accessible for visually impaired users.
🏗️ Code Quality
Split GroqIME.kt — too many responsibilities — It currently handles UI rendering, state management, audio recording lifecycle, API calls, text insertion, language selection, and settings navigation. This is a "God class". Consider splitting into KeyboardView, RecordingController, TranscriptionManager, etc.
Add dependency injection — The 6 source files in a flat package are likely tightly coupled (GroqApiClient instantiated directly in GroqIME and TranscriptionOverlayService). This makes unit testing difficult since you can't mock dependencies. Hilt or Koin would improve testability.
Add ProGuard/R8 rules for release builds — The build instructions show assembleRelease but no ProGuard rules are mentioned. OkHttp and EncryptedSharedPreferences need specific keep rules, or the release APK may crash due to code shrinking.
CI/CD pipeline with GitHub Actions — Currently no automated checks. A basic workflow that builds, lints, and runs tests on every push would prevent regressions.
📝 Documentation
Add CONTRIBUTING.md — The project is open source but has no contribution guidelines (PR format, code style, testing requirements, branch naming).
Document Groq API rate limits and free tier quotas — README says "generous free tier" but gives no specifics. Users need to know: requests/minute, max audio duration per request, daily limits. Prevents confusion when things suddenly stop working.
Device compatibility matrix — README already mentions issues with Xiaomi/MIUI, Samsung/One UI, and "some devices". A community-maintained table (Android version × manufacturer × feature support) would help a lot.
🔒 Security
Clean up WAV files after transcription — AudioRecorder writes a WAV file to disk. If it's not deleted after successful transcription, voice recordings persist on the device — a privacy risk on shared or stolen devices. Verify files in the app's cache/files directory are cleaned up.
Consider certificate pinning for API requests — EncryptedSharedPreferences protects the API key at rest, but it's sent in plain text in the HTTP Authorization header. Without certificate pinning, a MITM attack (corporate proxy, rooted device with Charles Proxy) could intercept the key. OkHttp supports CertificatePinner.
Thanks for building this — it's a really useful app! Happy to discuss any of these or help with PRs. 🎙️
Hey! I did a thorough review of the codebase and README. Here's a structured list of issues, improvements and test ideas that could help strengthen the project. Feel free to pick and choose — they're roughly ordered by priority within each category.
🐛 Bugs / Edge Cases
No maximum recording duration — There's protection for recordings that are too short (<1s), but nothing stops a recording from running indefinitely. At 16kHz mono PCM (~1.9MB/min), a forgotten recording could exhaust storage or exceed the Groq API upload limit. Suggestion: add a configurable max duration (e.g. 2 minutes) with auto-stop and a warning.
No graceful handling of invalid/expired API key — If the Groq API returns 401/403, what does the user see? Ideally the status text should show a clear error message with a link/button to open settings, rather than a generic failure.
Race condition on rapid mic button taps — Quickly double/triple-tapping the mic button could cause the state machine to enter an inconsistent state (recording → stopping → recording simultaneously). The recording lifecycle should be guarded against this.
Silent clipboard fallback without user feedback — When direct text insertion fails (e.g. in Claude app, WebView-based fields), text silently goes to clipboard. The user should get a brief toast or status message like "Copied to clipboard — paste manually" so they know what happened.
Hint text filtering could match real user input — Signal/WhatsApp hint text is filtered out, but if a user types something that matches the hint pattern (e.g. "Type a message"), it might get incorrectly removed when the bubble inserts text.
🧪 Testing
Unit tests for AudioRecorder WAV generation — The WAV header (RIFF, sample rate, bit depth, data chunk size) must be byte-perfect or Whisper will reject/misinterpret the file. Test scenarios: 0 samples, 1 sample, large files, correct byte order and chunk sizes.
Unit tests for GroqApiClient error handling — Mock OkHttp responses for: 200 with transcription, 200 with empty text, 401 unauthorized, 429 rate limited, 500 server error, network timeout, malformed JSON. Verify each case is handled gracefully.
Tests for word replacement regex — Special characters in replacement patterns (dots, parentheses, backslashes, asterisks) can break regex. Also test: overlapping replacements, case sensitivity, Unicode words (Dutch/Arabic/Japanese characters).
Multi-language stress test — Test auto-detect with mixed-language audio (e.g. Dutch + English in one sentence). Test with background music containing lyrics in a different language. Document accuracy per language.
Memory leak test for repeated record/stop cycles — AudioRecorder buffers, WAV files, and OkHttp connections need proper cleanup. Automate 100+ record→stop→transcribe cycles and monitor memory via Android Profiler.
✨ Enhancements
Retry mechanism for API failures — Network hiccups, rate limiting (429), and server errors (5xx) currently cause immediate failure. Exponential backoff with max 3 retries would improve reliability significantly.
Better visual feedback during upload/transcription — The mic turns orange "while processing" but there's no progress indication. For longer recordings or slow connections, show something like "Transcribing... (3s audio)" or a progress animation.
Offline queue for recordings — Instead of discarding recordings when there's no internet (metro, train), save the WAV locally and auto-transcribe when connectivity returns.
Configurable API endpoint for self-hosted Whisper — Privacy-conscious users may want to run their own Whisper instance (whisper.cpp, faster-whisper). A configurable endpoint URL in settings (instead of hardcoded Groq) would enable this.
Export/import for custom dictionary and word replacements — These are only stored locally. A reinstall or new device means losing everything. Simple JSON export/import would solve this.
TalkBack/accessibility audit for the keyboard — Custom keyboard buttons (MIC, LANG, punctuation, settings) need proper
contentDescriptionlabels for screen readers. A voice-input app should be especially accessible for visually impaired users.🏗️ Code Quality
Split GroqIME.kt — too many responsibilities — It currently handles UI rendering, state management, audio recording lifecycle, API calls, text insertion, language selection, and settings navigation. This is a "God class". Consider splitting into KeyboardView, RecordingController, TranscriptionManager, etc.
Add dependency injection — The 6 source files in a flat package are likely tightly coupled (GroqApiClient instantiated directly in GroqIME and TranscriptionOverlayService). This makes unit testing difficult since you can't mock dependencies. Hilt or Koin would improve testability.
Add ProGuard/R8 rules for release builds — The build instructions show
assembleReleasebut no ProGuard rules are mentioned. OkHttp and EncryptedSharedPreferences need specific keep rules, or the release APK may crash due to code shrinking.CI/CD pipeline with GitHub Actions — Currently no automated checks. A basic workflow that builds, lints, and runs tests on every push would prevent regressions.
📝 Documentation
Add CONTRIBUTING.md — The project is open source but has no contribution guidelines (PR format, code style, testing requirements, branch naming).
Document Groq API rate limits and free tier quotas — README says "generous free tier" but gives no specifics. Users need to know: requests/minute, max audio duration per request, daily limits. Prevents confusion when things suddenly stop working.
Device compatibility matrix — README already mentions issues with Xiaomi/MIUI, Samsung/One UI, and "some devices". A community-maintained table (Android version × manufacturer × feature support) would help a lot.
🔒 Security
Clean up WAV files after transcription — AudioRecorder writes a WAV file to disk. If it's not deleted after successful transcription, voice recordings persist on the device — a privacy risk on shared or stolen devices. Verify files in the app's cache/files directory are cleaned up.
Consider certificate pinning for API requests — EncryptedSharedPreferences protects the API key at rest, but it's sent in plain text in the HTTP Authorization header. Without certificate pinning, a MITM attack (corporate proxy, rooted device with Charles Proxy) could intercept the key. OkHttp supports
CertificatePinner.Thanks for building this — it's a really useful app! Happy to discuss any of these or help with PRs. 🎙️