Files
echolot/echolot-app
mrambossekandClaude Opus 5 9ee7d554a6
server-release / image (push) Successful in 14s
server-release / release (push) Successful in 31s
app: listen to what the segment says unprompted
Four passive collectors join long mode: SSDP (passive NOTIFY plus paced
M-SEARCH from the capture socket, so unicast replies land in the same
capture), LLMNR, NetBIOS-NS and WS-Discovery. All are periodic and sparse
by nature, which is exactly why they belong to a window rather than a
probe - a thirty-second run mostly hears silence and would report an
empty network as confidently as a quiet one.

NetBIOS reports unsupported on the app tier and says why: UDP 137 is
privileged. The decoder and evidence shape are tested and waiting for the
Shizuku tier; a recorded reason beats a missing test.

Silence without a multicast lock or a group join is PARTIAL, never OK -
that case is a fact about this app, not about the network. Hostnames,
banners and device UUIDs are classified in core-privacy so the anonymizer
treats them like every other identifier rather than letting a neighbour's
device model ride out in an upload.

No active WSD Probe and no NBSTAT sweep: the app listens to what a
network broadcasts, it does not announce itself to strangers or
interrogate its neighbours.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 14:58:41 +02:00
..

Echolot app

The production Android client (spec). Native Kotlin + Jetpack Compose. Multi-module; built bottom-up from a verifiable protocol spine.

Modules

Module Type Status
core-protocol pure Kotlin/JVM done — client half of probe-protocol.md, verified live against the server
core-measurement pure Kotlin/JVM planned — measurement-schema.md types
core-probe Android lib planned — app-tier probes, ported from echolot-prober
core-shizuku Android lib planned — dual-path executor (UserService + newProcess fallback)
app Android app planned — Compose UI

core-protocol is deliberately Android-free so it builds and unit-tests on any JDK (no Android SDK) and can run integration tests against a live server.

core-protocol

Implements the control plane (SPKI-pinned enrollment/profile/sessions via HttpsURLConnection — Android-API-1 compatible, hostname verification off because trust is the pin), the HKDF-SHA256 session-key schedule, and the binary ELT1 UDP data plane (HMAC gate, ECHO + observation block, MTU probe) — byte-compatible with the Go server.

./gradlew :core-protocol:test              # unit tests (crypto vectors, wire round-trip)
scripts/test-fmr.sh                         # live end-to-end test against the deployed server

test-fmr.sh mints an enrollment token over SSH, enrolls via the public control plane, computes the SPKI pin from the served cert, and runs LiveServerTest — proving the client speaks the wire protocol to the real server (enroll → profile → session → echo+observation → MTU → observations). The live test self-skips when ECHOLOT_LIVE_* env vars are absent, so unit runs and CI stay green offline.