# DistSoc

Available for Android and Linux

Last updated: March 10, 2026

Android APK distsoc.apk — 140 MB Linux AppImage distsoc_0.1.0_amd64.AppImage — 85 MB
Android

1. Download the APK — Tap the button above. Your browser may warn that this type of file can be harmful — tap Download anyway.
2. Open the file — When the download finishes, tap the notification or find `distsoc.apk` in your Downloads folder and tap it.
3. Allow installation — Android will ask you to allow installs from this source. Tap Settings, toggle "Allow from this source", then go back and tap Install.
4. Launch the app — Once installed, tap Open or find DistSoc in your app drawer.

Note: If you don't see the "Allow from this source" prompt, go to Settings → Apps → Special access → Install unknown apps and enable it for your browser.
Linux (AppImage)

1. Download the AppImage — Click the button above to download.
2. Make it executable — Open a terminal and run:
   `chmod +x distsoc_0.1.0_amd64.AppImage`
3. Run it — Double-click the file, or from the terminal:
   `./distsoc_0.1.0_amd64.AppImage`

Note: If it doesn't launch, you may need to install FUSE:
`sudo apt install libfuse2` (Debian/Ubuntu) or `sudo dnf install fuse` (Fedora).

## Changelog

March 10, 2026 (v2)

- Anchor advertised address — Anchors now advertise their stable bind address in the initial exchange, so peers always store the correct reconnection address instead of stale iroh-discovered IPs.
- Observed address notification — Every peer tells its new mesh partner "I see you at <ip:port>" during initial exchange — a lightweight STUN-like "who am I" on every connection.

March 10, 2026

- UPnP port mapping — Devices behind NAT routers automatically request a port forward via UPnP, becoming directly reachable without manual configuration.
- Auto-anchor promotion — Devices with a successful UPnP mapping self-declare as anchors, improving bootstrap diversity for all peers.
- Hole punch fix — Target-side hole punch connections were silently discarded; now properly registered as sessions so both sides of a NAT punch succeed.

February 24, 2026 (v2)

- Request Referrals button — On-demand anchor referral requesting in Network Diagnostics. Helps cycle out stale peers and discover current ones without waiting for the 10-minute automatic cycle.
- Docker bridge IP filtering — Relay introductions no longer leak Docker bridge IPs (172.17.x.x, 172.18.x.x), fixing connection failures through anchors running in Docker.
- Keepalive fix — Sender-side last_activity update prevents false zombie detection on connections where we send keepalives but the remote stops responding.
- Message threads — DM conversations grouped by partner with expandable thread view.
- Mesh/reach diagnostics — Peer cards show reach level badges (Mesh/N1/N2/N3) in diagnostics.

February 24, 2026

- Audience request button — "Ask to join audience" button on followed peers in the People tab. Shows status badges (requested/approved) for existing requests.
- DMs filtered from feed — Direct messages no longer appear in the Feed tab; they show only in the Messages tab.
- Peer bios displayed — Bio text now shown below peer names in People tab (peers list and follows list).
- People tab auto-refresh — Follows, peers, and audience now refresh every 10 seconds, so display names update automatically after profile sync.
- Button feedback — Diagnostics Refresh button now shows loading state and toast confirmation on completion.

February 23, 2026

- Fix connection lock contention — QUIC connect attempts no longer block all other tasks (diff cycle, accept loop, keepalive, rebalance). Previously one unreachable peer could freeze the entire node for 60+ seconds.
- Image attachments display — Fixed Content Security Policy blocking blob: URLs, so image attachments now render in post previews and feeds.
- Non-blocking startup — Referral peer connections now run in the background instead of blocking node startup.
- Connect timeout — 15-second cap on connection attempts during rebalance prevents prolonged lock holding.
- Android foreground service — Mesh connections stay alive when the app is in the background.

February 20, 2026

- IPv4-mapped address fix — Anchor's dual-stack socket reported peer addresses as IPv4-mapped IPv6 (e.g. [::ffff:1.2.3.4]) which IPv4-only clients couldn't reach. Now normalized to plain IPv4, fixing hole punching through NAT.
- Mesh keepalive — 30-second lightweight pings on mesh connections prevent zombie detection from killing idle connections and keep NAT UDP mappings alive. Zombie timeout raised from 2 to 10 minutes.
- Audience management — People tab now shows pending and approved audience members with Approve/Deny/Remove actions.
- Network diagnostics overhaul — Summary grid showing connection breakdown (Preferred/Local/Wide) and N2/N3 reach counts. Mesh connections list with slot badges. Peer cards replace flat list. 10-second auto-refresh while open.
- Manual rebalance — Trigger immediate mesh rebalancing from Settings for debugging.
- Reset all data — Danger Zone in Settings to clear all local data (posts, peers, blobs) while preserving identity key. Takes effect on restart.

February 19, 2026

- Reactive mesh growth loop — New peers connect within seconds instead of waiting up to 10 minutes. After each new connection, the node immediately seeks the most diverse next peer using N2 candidate scoring.
- Anchor matchmaking only — Anchors now exclusively matchmake (introduce peers) and never proxy bytes. Clearer separation of relay vs. introduction roles.
- Parallel hole punching — NAT traversal now tries all known addresses simultaneously, retrying every 2 seconds for a 30-second window. Both sides begin attempting to reach each other from the moment of introduction.
- Relay-observed address injection — Anchor now injects each peer's real public address (as seen from the QUIC connection) into introductions. Fixes NAT-to-NAT hole punching where peers only knew each other's private LAN addresses.
- Growth loop introduction fallback — When the growth loop's direct connect to an N2 peer fails (NAT), it now requests an introduction through the reporting peer for bilateral hole punching.