• v0.7.0 6ff1060b2f

    ET Phone Home v0.7.0
    All checks were successful
    Claims ledger / Every README claim has a test (push) Successful in 9s
    Release / Build Linux Release (push) Successful in 2m6s
    Release / Build Windows Release (push) Successful in 1m44s
    Release / Build Android Release (push) Successful in 2m5s
    Release / Build Desktop GUI (Linux) (push) Successful in 4m2s
    Release / Publish Forgejo release (push) Successful in 14s
    Release / Sign the APK with the ETPH release key and attach it (push) Successful in 3s
    Release / Verify the published release (push) Successful in 0s
    Stable

    Ghost released this 2026-10-18 18:46:14 -07:00 | 115 commits to main since this release

    Changed

    • New app id and name: "Errant Solutions ETPH" (solutions.errant.etph). This is the name and id the app will have on Google Play (ETPH = ET Phone Home); the launcher icon is labelled "ETPH". Android treats a new app id as a different app, so 0.7.0 installs next to an older ET Phone Home (com.etphonehome) instead of updating it. While the old app is still installed, the new one says so on its main screen, with a button that opens the old app's App info page (Uninstall is there). Uninstall the old app afterwards, and re-pair WiFi/Bluetooth desktops with the token the new app shows (the tokens belong to the app, so they did not carry over). USB needs nothing new. Settings such as the connection mode start fresh too.
    • The APK on the releases page is signed with the ETPH release key (the key registered for solutions.errant.etph with Google's Android developer verification, SHA-256 01:11:AF:00:57:D7:E9:28:90:FB:CE:02:E9:92:7A:85:E5:EA:B2:AD:AC:2C:00:76:55:E1:7C:B0:CF:7F:68:40). Releases up to 0.6.1 carried a public debug key.
    • Google Play release pipeline: the Play bundle is built unsigned on a normal runner and signed with the upload key on a dedicated signer, then uploaded to the internal testing track (release-play-* tags; a manual run is a dry run that changes nothing in Play). Store listing text and the Data safety answers live in store/.

    Fixed

    • A connection that stalled mid-handshake locked every desktop out of the phone. The phone serves one desktop at a time, and once a connection had sent its first byte nothing timed out until the handshake finished. So a connection that sent one byte, or a TLS ClientHello, and then went quiet held the session slot indefinitely, before any token check. Anyone on the same WiFi, or any app on the phone for the USB port, could do this. The whole handshake now has to finish within 15 s, otherwise the connection is dropped.
    • A phone-side filter rule with an invalid IPv4 address triggered a DNS lookup. Rule addresses like 256.1.1.1 were handed to the system resolver as hostnames, which blocked the session while the lookup ran, and on networks whose DNS answers every name the rule ended up applying to an unrelated address. Rule addresses are now parsed as numeric IPv4/IPv6 literals only, and anything else drops the rule.
    • A phone-side filter rule naming one IPv6 host covered its whole /32. A rule address with no /prefix defaulted to /32 for IPv6 as well as IPv4, so blocking 2001:db8::1 blocked all of 2001:db8::/32, and in whitelist mode allowing it allowed the whole /32. A bare IPv6 address is now /128.
    • IPv6 packets could slip past the phone's protocol and port rules. The packet parser stopped walking IPv6 extension headers after 8, and didn't know the Authentication Header, so TCP behind 9+ extension headers or an AH header came out as "any protocol, no ports" and a rule like block tcp 443 didn't match it. The parser now walks the whole chain (always bounded by the packet length) and understands AH.
    Downloads