A native Android DNS explorer built around the same Rust library as mhost 0.11.3. It runs the equivalent of:
mhost -p l --all -w <domain>
The app queries mhost's predefined public resolvers across UDP, TCP, TLS, and HTTPS for all 25 supported record types, aggregates the responses, and enriches discovered IP addresses with WHOIS/network information. Its navigation follows the useful parts of nslookup.io: domain search, overall results, resolver switching, record-type sections, and focused detail screens.
The interface is built with Jetpack Compose and Material 3 Expressive. It uses dynamic color on Android 12+, the expressive motion scheme and loading indicator, large mobile touch targets, asymmetric shapes, and preserved scroll position across record and WHOIS detail screens.
Address-bearing records include compact infrastructure context inspired by full
DNS lookup tools: country flags, locations, network prefixes, and autonomous
system numbers. For NS and MX records, HostLookup resolves each unique
nameserver or mail exchanger and enriches those addresses alongside direct A
and AAAA answers.
Requirements:
- OpenJDK 17+ (no proprietary IDE is required)
- Android SDK 37 (target SDK remains 36)
- Android Gradle Plugin 9.1.1 / Gradle 9.3.1
- Android NDK
28.2.13676358 - Rust 1.95.0 (tested), with targets
aarch64-linux-androidandx86_64-linux-android
# Set JAVA_HOME to your OpenJDK installation if it is not already on PATH.
export ANDROID_SDK_ROOT=/home/user/Android/Sdk
./gradlew assembleDebugThe APK is written to app/build/outputs/apk/debug/app-debug.apk.
DNS record queries are sent directly from the phone to mhost's predefined public resolvers. Nameserver and mail-server address enrichment uses the phone's configured DNS resolver. WHOIS, prefix, and ASN data come from RIPEstat. Location uses RIPEstat's MaxMind and geoloc datasets, then DB-IP and ipwho.is when RIPEstat has no country. Lookups keep running if you leave the app, and DNS records are shown while network details are still loading. No HostLookup-owned server or analytics service is used.
The JVM half of mhost's HTTPS certificate verifier is compiled from the pinned
Kotlin source in third_party/rustls-platform-verifier-android. RIPEstat
requests use Android's system trust decisions.
Public DNS queries use UDP, TCP, DNS-over-TLS, and DNS-over-HTTPS. UDP and TCP queries are unencrypted. DNS providers, RIPEstat, and any location fallback (DB-IP or ipwho.is) receive your public IP address and the addresses being looked up. The resolver list and these endpoints cannot currently be changed in settings. Certificate validation may also contact certificate authorities for revocation information.
The packaging recipe is in docs/fdroid/de.obsp.hostlookup.yml.
Store text is maintained in fastlane/metadata/android. Build an unsigned release with
./gradlew assembleRelease; the APK is written to
app/build/outputs/apk/release/app-release-unsigned.apk. GitHub releases must be
16 KiB-aligned and signed with the HostLookup release key before upload:
export CARGO_HOME=/home/vagrant/.cargo
./gradlew assembleRelease
scripts/sign-release.shF-Droid's builder uses HOME=/home/vagrant, so panic paths inside
libhostlookup.so are /home/vagrant/.cargo/registry/.... Release builds
must use that same CARGO_HOME or the native library will not match.
scripts/sign-release.sh reads ~/.config/hostlookup/keystore.properties and
writes app/build/outputs/apk/release/HostLookup-<version>.apk.
HostLookup is licensed under the Apache License 2.0. Third-party attributions and license information are listed in THIRD_PARTY_NOTICES.md.
I VIBE-CODED THIS. COMPLETELY. EVERY SINGLE LINE OF THIS PROJECT IS WRITTEN BY GPT 5.6 SOL AND OPENCLAW (EXCLUDING THIS ONE). This is no longer true, but it still involved a lot of LLM-generated codes. I reviewed most of them but not all. USE IT AT YOUR OWN RISK!

