A calm yet expressive voice recorder for Android — record, transcribe, and keep everything on your device.
- One-tap recording with an animated-shape record button, live waveform, and pause/resume on a continuous timeline
- Two sources — microphone, or system sound (music, videos, app audio) via AudioPlaybackCapture on Android 10+
- Live notification with running timer plus Pause/Resume and Save actions, so recording survives the screen turning off
- Offline transcription — Vosk turns saved recordings into text on-device; downloadable language models, copy/share/edit, transcripts are searchable
- Noise reduction — live AGC and noise suppression while recording (toggle in Settings)
- Clean audio — one-tap offline enhancement (hush + leveling) with Light/Balanced/Strong strength, keep or replace the original
- Playback with waveform scrubber, 0.5x–2x speed pills, 5 s / 10 s skips, and a floating mini-player
- Library — inline rename, tags, favorites, full-text search, soft delete with Undo, auto-purging Trash
- Onboarding tour on first launch, replayable anytime from Settings → About
- Shortcuts & automation — long-press the launcher icon for Start / Pause, or fire recording actions from Key Mapper, Tasker, and other automation apps entirely headlessly
- Self-updates — Settings checks the beta rolling preview (by build number) or stable releases (by version), downloads and installs in-app with auto-cleanup; optional launch-time check pings you once per version via notification + snackbar
- Material 3 Expressive throughout — dynamic Material You color, tonal surfaces instead of shadows, morphing shapes, bouncy spring motion, edge-to-edge layout
| Home | Recording | Playback |
|---|---|---|
![]() |
![]() |
![]() |
| Settings | About | Trash |
|---|---|---|
![]() |
![]() |
![]() |
Grab the APK matching your device from the latest beta pre-release (rolling 1.7.3-dev(#N) build, old assets are pruned automatically) or a versioned entry on the releases page:
| File suffix | Architecture | Most devices |
|---|---|---|
*-universal.apk |
All ABIs | Recommended — works on any Android device |
*-arm64.apk |
arm64-v8a | Most phones from ~2017 on |
*-armv7.apk |
armeabi-v7a | Older 32-bit devices |
Note
Enable Install unknown apps for your browser when sideloading. Release builds are signed with the project keystore, so updates install cleanly over previous ones.
git clone https://github.com/MoHamed-B-M/flambo.git
cd flambo
git checkout dev # active development happens here
./gradlew :app:assembleReleaseDebug keystore fallback means assembleRelease works locally with no secrets configured. Per-ABI APKs land in app/build/outputs/apk/release/.
build.yaml builds every push to dev and main:
dev→ signed dev build1.7.3-dev(#N)(universal + arm64 + armv7) published to the rollingbeta-latestpre-release. Previous assets are wiped first, so the page always holds exactly one build. Artifacts expire after 7 days.main→ versioned stable releaseFlambo-x.y.z-{arm64,armv7}.apkwith changelog, checksums, and full notes. Artifacts kept 30 days.
Pushes touching only README.md or screenshots/ skip CI entirely (no code changed, nothing to build).
| Secret | Purpose |
|---|---|
KEYSTORE_BASE64 |
Release keystore, base64-encoded |
KEYSTORE_PASSWORD |
Keystore password |
KEY_ALIAS |
Key alias |
KEY_PASSWORD |
Key password |
Without them CI falls back to an ephemeral keystore (fine for previews, not for Play Store continuity).
This app follows a modified Semantic Versioning: MAJOR.MINOR.PATCH+BUILD
| Number | Meaning | When to increase |
|---|---|---|
| MAJOR | Big update | Breaking changes, redesigns, major architecture |
| MINOR | New feature | Adding features without breaking existing ones |
| PATCH | Fix / small update | Bug fixes, tweaks, performance improvements |
| BUILD | Build number | Every new build/compile (always increments) |
Format examples:
1.0.0+1→ first stable release, first build1.1.0+15→ added pause/resume recording (15th build overall)1.1.1+16→ fixed timer showing wrong value2.0.0+120→ complete UI redesign + new audio engine2.0.1+121→ rebuilt with updated libraries
Beta builds follow the stable line with a dev tag: 1.7.3-dev(#N), where N is the CI run number (e.g. 1.7.3-dev(#42)). When stable moves to 1.7.4, beta becomes 1.7.4-dev(#N) automatically — only BASE_VERSION in the workflow changes.
Beta version codes sit 100000 above the run number, so installing a beta over a stable release always counts as an update for Android (which requires the code to increase).
app/src/main/java/com/flambo/recorder/
├── ui/
│ ├── home/ # Library, search, recording panel, mini-player
│ ├── detail/ # Playback, waveform scrubber, transcribe sheet, transcript card
│ ├── settings/ # Segmented preference groups, Vosk model manager, updates, about
│ ├── onboarding/ # First-launch expressive pager tour
│ ├── components/ # Waveform, cards, segmented list, mini-player
│ └── theme/ # M3 Expressive color / type / shape / motion tokens
├── record/ # MediaRecorder + system-audio (AudioRecord) engines, foreground service
├── audio/ # Offline DSP enhancer (gate, normalize, WAV writer)
├── stt/ # Vosk offline transcription, model downloads, PCM decoding
├── playback/ # ExoPlayer controller with persistent mini-player state
├── update/ # Release checker, in-app APK installer, update notifier
└── data/ # Room database, repository, DataStore preferences
MVVM throughout: ViewModel + StateFlow UI state, repository pattern, thin platform wrappers.
| Permission | Why |
|---|---|
RECORD_AUDIO |
Microphone recording — also required by Android for system-sound capture (prompted at first launch and when needed) |
| System-capture consent | One-time system dialog for system-sound recording, like a screen recorder |
FOREGROUND_SERVICE_* |
Keeps recording alive with the screen off (mic / playback / projection types, narrowed per take) |
POST_NOTIFICATIONS |
Recording timer + update-ready notifications (Android 13+) |
INTERNET |
Only for Vosk model downloads and the update checker — audio never leaves the device |
Important
When enabling system-sound capture, Android shows a screen-recording consent dialog. Flambo only captures audio — no pixels are ever read (the codebase contains no virtual display; the MediaProjection token feeds AudioPlaybackCaptureConfiguration exclusively).
Recording is reachable without opening the app:
- Launcher shortcuts — long-press the Flambo icon for Start recording and Pause / Resume.
- Key Mapper / Tasker — pick Flambo from an automation app's "launch app shortcut" list and choose one of five discrete actions: Record, Pause, Stop, Toggle record/pause, or Toggle record/stop. They run headlessly — no activity is foregrounded, even from the lock screen.
- Broadcasts — apps that send intents can target the exported
RecordingReceiverwithcom.flambo.recorder.ACTION_START,com.flambo.recorder.ACTION_STOP, orcom.flambo.recorder.ACTION_TOGGLE.
Kotlin 2.3.10 · Compose (BOM 2026.08) · Material3 1.5.0-alpha26 (Expressive) · Navigation Compose · Room 2.8.5 (KSP) · DataStore · Media3 ExoPlayer · Vosk 0.3.75 · AGP 9.3.2, JDK 21.
Daily contributions · commit activity · pulse






