An offline Android app that demonstrates covert data transmission — hiding data in sound and images — alongside the detection techniques that can catch it.
nightjar pairs four data-hiding techniques with their detection/steganalysis counterparts, all running locally on-device:
- Acoustic data-over-sound modem — sends data phone-to-phone, speaker to microphone, room-local, using FSK/PSK/MFSK encoding.
- Image steganography — least-significant-bit (LSB) encoding of data inside images, plus a steganalysis screen for detecting it.
- Audio steganography — four techniques (phase inversion, spectrogram-LSB, MFSK, and true phase-coding) for hiding data inside an audio clip.
- Passive acoustic detector — a real-time listener that can flag the modem's own signal, demonstrating that "covert" acoustic channels aren't necessarily undetectable.
The default UI is "Night Jar," a disguise-themed front end where every decoded payload appears as a firefly. The underlying technical module screens (modem, image stego, audio stego, detector) are reachable via a long-press reveal gesture from the jar screen.
Real screenshots from a Pixel 6a. The app opens as Night Jar — a calm, disguise-themed front end where every hidden payload shows up as a "firefly." A long-press on the jar reveals the technical Workshop underneath.
Grab the latest signed APK from the Releases page
and install it directly — no Play Store needed. On your phone: download the
.apk, open it, and allow "install unknown apps" for your browser or file
manager if prompted.
Prefer to track updates automatically? Obtainium
can watch this GitHub repo and notify you of new releases — add
herakles-dev/nightjar as a GitHub source.
- Android 12+ (minSdk 31), target/compileSdk 35
- A single permission:
RECORD_AUDIO(used by the acoustic modem and detector to capture microphone input) - Android SDK + JDK 17 to build
./gradlew assembleDebug # build debug APK (output: app-debug.apk)
./gradlew test # run the JVM unit test suiteDebug builds use Android Gradle Plugin's default auto-generated debug
keystore — no signing setup required. If you don't already have
local.properties pointing at an Android SDK, create one at the repo root
with:
sdk.dir=<path-to-your-android-sdk>
Kotlin + Jetpack Compose + Room, built with AGP 8.7.3 / Kotlin 2.0.21. Each
technique lives behind a shared CovertModule interface, with its
transmit/embed logic in a *Carrier class and its detection logic in a
matching *Detector/*Steganalysis class:
modules/fireflyjar Default disguise-themed UI (jar shelf, firefly log, player)
modules/acoustic Acoustic FSK/PSK modem screen
modules/audiostego Audio steganography screen (embed/extract)
modules/imagestego Image LSB steganography screen
modules/detector Passive acoustic detector screen
picker Technical module-picker home screen
trail Onboarding "riddle trail" walkthrough
share Outbound sharing (FileProvider-based)
incoming Unified incoming-payload pipeline: sniff, route, decode
Root-level classes (AcousticCarrier, AudioStegoCarrier, ImageStegoCarrier,
SturdyImageCarrier, AcousticDetector, AudioStegDetector,
ImageSteganalysis, Fft, Spectrogram, WavFile, MicCapture, …)
implement the signal-processing and steganalysis logic that the module
screens share.
nightjar is a research and educational demonstration of steganography and covert-channel techniques, and of the detection methods used against them. It is meant for learning, teaching, and experimentation in controlled settings — not for evading lawful monitoring or transmitting data without the consent of everyone involved. Please use it responsibly and lawfully.
nightjar's techniques are directly inspired by, and in some cases adapt, the published work of others — most notably Benn Jordan's acoustic data-hiding projects (Wavest, BUM16, AlphaSteg) and Georgi Gerganov's ggwave, along with foundational steganography and audio-watermarking research. See CREDITS.md for full acknowledgments.
MIT — see LICENSE. Third-party components (ggwave, the Silkscreen font) are used under their own licenses; see NOTICE for details.
Issues and pull requests are welcome.








