too long; didn't hear
Voice notes are too long. Your time is not. tl;dh is an Android Share Target that turns WhatsApp voice notes into a concise, copy-ready brief — locally, offline-first, session-only, and with a manual in-app update check.
Status:
v0.3.0local transcription spike. Share Target, audio ingest, duration guardrails, one-APK updater and the first device-level local transcription path are implemented. Nativewhisper.cpphardening is next.
WhatsApp voice notes are often long, unstructured, and time-expensive. tl;dh lets you share an audio file into the app and receive:
- TL;DR
- key points
- tags
- category
- reply suggestions
- copy-ready output
The current spike attempts local device transcription first. If the Android on-device file recognizer is unavailable or unreliable, tl;dh falls back to the validated audio-ingest/guardrail output instead of pretending a transcript exists.
WhatsApp audio → Android Sharesheet → tl;dh → local inspect → duration gate → local transcription spike → compact output → copy result → session wipe
| Source | Status | Notes |
|---|---|---|
WhatsApp .opus voice notes |
Primary | Main target |
Telegram .ogg audio |
Secondary | Supported if the same Ogg/Opus path works cleanly |
| Out of scope | No useful external audio share flow | |
| Facebook Messenger | Out of scope | No useful external audio share flow |
Core behavior:
- no cloud speech-to-text
- no cloud summarization
- no analytics
- no telemetry
- no account
- no database in the MVP
- no persistent audio/transcript/result storage
- session files wiped on start and explicit close
tl;dh is a single APK. The app is fully usable offline. Internet is only used when the user manually taps the in-app update check.
Important: Android does not guarantee every lifecycle callback after a hard process kill. tl;dh therefore wipes orphaned session files at next startup. Clipboard content is controlled by Android after you copy text.
There are no split offline/updater release variants anymore.
The release asset is exactly one APK:
tldh-<version>.apk
Example:
tldh-0.3.0.apk
This one app includes:
- offline-capable Share Target and audio ingest
- duration guardrails for long voice notes
- first local transcription spike when device support is available
- manual stable in-app update check
- APK download with SHA256 verification
- Android installer handoff after explicit user confirmation
No background update polling. No silent installs. No notification-based stale updater UI.
- Kotlin
2.4.0 - Android Gradle Plugin
9.2.1 - Jetpack Compose BOM
2026.04.01 compileSdk = 36targetSdk = 36minSdk = 28- primary ABI:
arm64-v8a - package:
dev.bitsbots.tldh
This repository includes scripts/gradle.sh, which uses an existing Gradle installation or bootstraps Gradle locally.
bash scripts/gradle.sh lintDebug testDebugUnitTest assembleDebugBuild the signed release APK in CI with:
bash scripts/gradle.sh assembleReleaseFor real signed releases, configure:
ANDROID_KEYSTORE_FILE
ANDROID_KEYSTORE_PASSWORD
ANDROID_KEY_ALIAS
ANDROID_KEY_PASSWORD
- SemVer tags:
v0.3.0,v0.3.1, ... versionNamefollows SemVerversionCodeis monotonically increasing- release APKs are signed with the same key for update compatibility
- GitHub Releases include one APK, SHA256 sums, and
release-manifest.json
The in-app updater does not blindly install latest.
A release is eligible only if:
- not draft
- not prerelease
- valid SemVer tag
- exact APK asset
tldh-<version>.apkexists - SHA256 exists and verifies
- not yanked
- stable release manifest validates
| Version | Goal |
|---|---|
0.1.0 |
Share Target MVP + fake summarizer |
0.2.0 |
Audio ingest + Ogg/Opus detection hardening |
0.2.1 |
Manual stable updater MVP |
0.2.2 |
Single APK release model with in-app updater |
0.2.4 |
Duration probing and long-audio guardrails |
0.2.5 |
Brand refresh, app icon/banner update, bottom breathing room and guarded update downloads |
0.3.0 |
Local transcription spike with Android on-device file recognition and PCM preparation |
0.3.1 |
Native whisper.cpp hardening and bundled local model strategy |
0.4.0 |
Session wipe + privacy hardening |
0.5.0 |
TL;DR + key points |
0.6.0 |
Tags + categories |
0.7.0 |
Reply suggestions |
0.9.0 |
Testing, benchmarking, RC |
1.0.0 |
Public stable release |
tl;dh uses a dark, local-first visual system with deep magenta #a50b5e gradients, compressed voice-wave motifs and extra mobile bottom breathing room. Brand assets live in docs/brand.
MIT. See LICENSE.
Duration warnings are now shown directly below the TL;DR and included in the copied Share protocol output, so longer WhatsApp voice notes visibly carry their local-processing warning.
- README banner and app logo are updated to the new
Long story, short.brand direction. - Primary accent shifts toward
#a50b5e. - App UI receives more bottom breathing room for large scrollable result cards.
- Manual APK update downloads now keep the device awake during the foreground download and show clearer interruption guidance instead of collapsing into a generic GitHub/network error.
- The v0.3.0 transcription spike is planned from the validated 4:45 min WhatsApp OGG_OPUS Share protocol in
docs/planning/v0.3.0-whisper-spike.md.
- Result cards are shorter: TL;DR, optional transcript, guardrails, short points, tags.
- Technical ingest details moved behind a details toggle to reduce text walls.
- The TL;DR card has higher contrast against the dark
#a50b5eUI direction. - Shared audio is decoded through Android's media stack and converted to 16 kHz mono PCM for the local recognizer path.
- The spike uses Android's on-device file recognition when the device supports it. If not, the app clearly reports that fallback state and keeps the previous validated ingest/guardrail behavior.
- Native
whisper.cppremains the next hardening step after proving the local file-transcription path on the Magic V2.
