Files
echolot/echolot-app
mrambossekandClaude Opus 5 97515f7090 app: put the relay switch where it is looked for, and fix why it found nothing
The relay was buried at the bottom of settings. It is now a switch on the
home screen - not a third chip beside Quick and Long, because those choose
how the next run measures while this starts a service that outlives it and
produces no document at all. Debug builds only: it publishes where this
device can be reached over adb, which is scaffolding for driving a test
device and a footgun in a release build.

And it never worked. localIp() read WifiManager.connectionInfo.ipAddress,
deprecated and returning 0 to ordinary apps on current Android, so the
own-device check compared every advertisement against null and rejected
all of them - the service ran, reported healthy, and relayed nothing. Now
read from LinkProperties, and when this device genuinely cannot say what
its own address is the endpoint is relayed anyway, labelled unverified:
silence was the worse answer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 15:21:45 +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.