BCR Headless is a call recorder module for rooted Android devices. Recording, configuration, diagnostics, and optional offline transcription are managed from the module WebUI; no visible companion app is installed.
This project is based on the original BCR project by Andrew Gunnerson
(chenxiaolong) and its contributors.
- Original project: https://github.com/chenxiaolong/BCR
- Original author: Andrew Gunnerson
- Original contributors: see the upstream repository history and contributors list
- Interface icons: Lucide, distributed under its ISC/MIT license terms
This rebuild replaces the original system-app interface with a module-owned runtime and WebUI:
- the helper APK is installed under
tools/bcr-headless.apk - configuration and runtime state are stored inside the module
- KernelSU module configuration is updated when that interface is available
- the WebUI is the primary control surface
- Whisper.cpp transcription is optional and runs entirely on the device
- headless boot-time recorder daemon
- Magisk and KernelSU module packaging
- stereo
VOICE_CALLcapture when supported, with mono fallback WAV/PCM,OGG/Opus, andM4A/AACrecording formats- configurable output directory and minimum recording duration
- optional module recording history
- compact, searchable, paginated recording library
- persistent multi-selection and transcript availability filters
- manual offline transcription queue with pause, resume, stop, retry, reorder, and removal controls
- timestamped
TXT,DOCX,SRT,VTT, andJSONtranscripts - configurable local and remote speaker names
- stereo channel separation and best-effort mono TinyDiarize labeling
- temporary PCM normalization for compressed recordings
- component preparation matched to stereo or mono-fallback operation
- on-demand diagnostics with debug tracking disabled by default
- in-place update preservation for configuration, history, queue state, logs, downloaded components, recordings, and transcripts
- atomic transcript publication so interrupted work cannot replace a valid file
- transcription and speaker labeling remain experimental
- mono speaker labeling requires a TinyDiarize-capable model
- stereo labeling is optimized for the common two-side call case
- different people sharing one channel may not always be distinguished
- auto-record rules, contacts integration, and filename templates from the original BCR app are not part of this headless rebuild
- Build or download the module ZIP.
- Install it through Magisk or KernelSU.
- Reboot.
- Open the module WebUI and review the Recorder settings.
- To use transcription, enable it and select
Prepare Components.
The default recording directory is /sdcard/Recordings/BCRHeadless. The
default transcript directory is /sdcard/Recordings/BCRHeadless/transcripts.
Existing configured paths and user media are preserved during module updates.
The Recorder view presents daemon health, active recording state, detected capture support, output health, free space, and the latest recording before its editable settings.
The Library provides fast server-side search, transcript filtering, sorting, paging, persistent selection, recording actions, inline queue actions, and transcript preview.
Transcription is deliberately manual. Adding recordings does not start the
worker; select Start Queue when processing should begin. The active job and
queue show stage, progress, elapsed time, ETA, timestamps, output target, and
recoverable errors. Component details expand only while preparing or
troubleshooting.
Diagnostics keeps troubleshooting controls and raw details out of the primary workflow. Debug tracking is off by default; probe and log output appears only when requested.
Prepare Components offers two sets:
Stereo: the device-matched Whisper.cpp CLI and selected Whisper modelMono fallback: the device-matched Whisper.cpp CLI and selected TinyDiarize-capable model
The repository-owned Transcriber tools workflow builds Android CLI packages
for supported ABIs. Its pinned Whisper.cpp source and build matrix are stored in
scripts/transcriber-tools.env. Preparation reads the release manifest,
selects the matching package, verifies available checksums, and installs only
the chosen model set. Component sources are curated by the module.
su -c sh /data/adb/modules/bcr.headless/action.sh ui-snapshot recorder
su -c sh /data/adb/modules/bcr.headless/action.sh status
su -c sh /data/adb/modules/bcr.headless/action.sh output-health transcripts
su -c sh /data/adb/modules/bcr.headless/action.sh config list
su -c sh /data/adb/modules/bcr.headless/action.sh restart
su -c sh /data/adb/modules/bcr.headless/action.sh probe
su -c sh /data/adb/modules/bcr.headless/action.sh logs
su -c sh /data/adb/modules/bcr.headless/action.sh transcriber status
su -c sh /data/adb/modules/bcr.headless/action.sh transcriber library 0 40 '' all newest all
su -c sh /data/adb/modules/bcr.headless/action.sh transcriber enqueue skip /sdcard/Recordings/BCRHeadless/example.wav
su -c sh /data/adb/modules/bcr.headless/action.sh transcriber start-workerRun the action script without arguments to display the complete command list.
recording.enabledoutput.dirrecording.min_durationrecording.log_enabledrecording.stereorecording.formatrecording.available_formatsdebug.enabledtranscriber.enabledtranscriber.output_dirtranscriber.languagetranscriber.output_formattranscriber.speaker_self_nametranscriber.speaker_remote_nametranscriber.whisper_pathtranscriber.model_pathtranscriber.tinydiarize_model_pathtranscriber.whisper_manifest_urltranscriber.model_urltranscriber.tinydiarize_model_url
This rebuild uses its own version line and does not inherit the original BCR release numbering.
1.0.0is the first standalone headless release1.1.2is the previous public release1.3.0is the current public release
Use JDK 21 and an Android SDK, then run:
./gradlew --no-daemon build zipRelease
node scripts/test-webui.mjsOpen app/magisk/webroot/index.html?mock=1 through a local HTTP server to use
the browser mock adapter without a rooted device. The release ZIP is written to
app/build/distributions/release/.
Optional Gradle properties:
-PprojectUrl=https://github.com/<you>/<repo>-PreleaseMetadataBranch=main
This project remains GPLv3. See LICENSE.



