Skip to content

Labushuya/tldh

Repository files navigation

tl;dh — too long; didn't hear

tl;dh

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.0 local transcription spike. Share Target, audio ingest, duration guardrails, one-APK updater and the first device-level local transcription path are implemented. Native whisper.cpp hardening is next.

CI Android Kotlin Privacy License

What it solves

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.

MVP flow

WhatsApp audio → Android Sharesheet → tl;dh → local inspect → duration gate → local transcription spike → compact output → copy result → session wipe

Supported sources

Source Status Notes
WhatsApp .opus voice notes Primary Main target
Telegram .ogg audio Secondary Supported if the same Ogg/Opus path works cleanly
Instagram Out of scope No useful external audio share flow
Facebook Messenger Out of scope No useful external audio share flow

Privacy model

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.

Single APK release model

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.

Technical baseline

  • Kotlin 2.4.0
  • Android Gradle Plugin 9.2.1
  • Jetpack Compose BOM 2026.04.01
  • compileSdk = 36
  • targetSdk = 36
  • minSdk = 28
  • primary ABI: arm64-v8a
  • package: dev.bitsbots.tldh

Local build

This repository includes scripts/gradle.sh, which uses an existing Gradle installation or bootstraps Gradle locally.

bash scripts/gradle.sh lintDebug testDebugUnitTest assembleDebug

Build the signed release APK in CI with:

bash scripts/gradle.sh assembleRelease

For real signed releases, configure:

ANDROID_KEYSTORE_FILE
ANDROID_KEYSTORE_PASSWORD
ANDROID_KEY_ALIAS
ANDROID_KEY_PASSWORD

Release discipline

  • SemVer tags: v0.3.0, v0.3.1, ...
  • versionName follows SemVer
  • versionCode is monotonically increasing
  • release APKs are signed with the same key for update compatibility
  • GitHub Releases include one APK, SHA256 sums, and release-manifest.json

Stable updater rule

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>.apk exists
  • SHA256 exists and verifies
  • not yanked
  • stable release manifest validates

Roadmap

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

Brand

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.

License

MIT. See LICENSE.

v0.2.4 UX guardrail fix

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.

v0.2.5 Brand + updater hardening

  • 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.

v0.3.0 Local transcription spike

  • 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 #a50b5e UI 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.cpp remains the next hardening step after proving the local file-transcription path on the Magic V2.

About

Share voice note. Get the point. Stay offline.

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages