Available for Android, Linux, and Windows. Free and open source.
Bandwidth + bootstrap hardening on top of v0.7.2. Wire-compatible with v0.7.0/v0.7.1/v0.7.2.
endpoint.connect() as its probe primitive; iroh accumulates every connect target into its per-endpoint path store and probes them all in the background under QUIC NAT-traversal. A 5-min scan inserted ~30k paths; iroh then probed all of them — observed at 22MB/s outbound from a single client. DoS-grade at any scale. Disabled until we replace per-probe connect() with raw UDP sends. The scanner source is preserved as edm_port_scan_disabled_v0_7_3 to refactor against.last_seen_ms is more than 3 days old, the entry is deleted from known_anchors immediately. Recoverable anchors (failed once, succeeded recently) are preserved. Users with old data dirs whose discovered anchors point to keypairs that rotated months ago no longer carry stale baggage forward.NodeService.stopFromNative() via JNI before exiting the Activity, so the foreground service actually stops — previously the button ended the UI but networking kept running.⏻ — Android webview fonts that lack U+23FB previously rendered the button as a missing-image tofu box.Network & reachability improvements, plus a relay-privacy fix.
portmapper crate (also used by iroh internally). All three protocols run in parallel; the first router-response wins. PCP adds IPv6 firewall pinholes and works on iOS without a multicast entitlement. Auto-renewal runs in a background task — no more lease-expiry surprises.WifiManager.MulticastLock acquired for the lifetime of the mapping. Cellular is gated off (no UPnP/PCP gateway on carrier nets, so we skip the discovery cost). Reachability for phones-on-home-WiFi should improve noticeably./p/<post> directly for browser fetches. No mode switch — this just works when the network allows it.itsgoin.net/p/<post>. The anchor handles holder lookup itself, so URLs stay stable as the holder set changes. Older URLs with the author hex appended continue to work.v0.7.2 is wire-compatible with v0.7.0 and v0.7.1. No protocol changes; all network & UX improvements are local.
UI polish + bug-fix pass on top of v0.7.0's FoF gating. Default post visibility is now Extended Friends (FoF). New Friend button combines follow + vouch in one click. Network Identity renamed to Device Address (you almost never need to touch it). Settings clearly separates personas from device address with an export/import "Move to another device" flow. Plus three fixes: profile display name now updates everywhere when changed; redundancy panel reads from the correct author set so it no longer shows 0 for all posts; My Posts tab no longer horizontally overflows and breaks the sticky header/tabs.
v0.7.1 is wire-compatible with v0.7.0. UI/UX only.
Friend-of-Friend gating is live. Posts can be public to readers but FoF-gated for comments (Mode 2), or fully FoF-gated for body + comments (Mode 1, FoFClosed). The CDN verifies comment signatures before propagating, killing the bandwidth-DoS attack a single admitted FoF member could otherwise mount. Vouches distribute via HPKE-sealed wrappers in your bio post — no DMs, no recipient IDs on the wire.
FoFClosed posts. Body itself encrypted under the FoF gating. Non-members propagate the ciphertext but cannot read it.v0.7.0 is a wire-additive release: new PostVisibility::FoFClosed variant, new BlobHeaderDiffOp::FoF{Revocation,AccessGrant,KeyBurn}, new fields on InlineComment and ProfilePostContent. Old clients don't understand FoF gating; upgrade for FoF features. See design.html section 20a for the full architecture.
Every remaining persona-signed direct push is off the wire. Deletes, visibility changes, profile updates, and group-key distribution now travel as encrypted / signed posts through the CDN. Groups are a first-class primitive. Plus two pre-release fixes — an admin-forgery check on group keys and a cap on concurrent port-scan hole punches that explains the 10 Mbps upload storm some users saw on VPNs.
v0.6.2 was the last release before FoF gating. v0.7.0 is wire-additive; v0.6.2 clients won't understand FoF posts but otherwise interop.
Network identity is now fully separated from posting identity on every install. Plus: Android auto-backup disabled by default, Reset actually resets, import preserves your personas, and display name is optional.
See the Identity Architecture section of the design doc for details. Rotating DM identities (from the original plan) are deferred — they need more work on the connection model.
chmod +x itsgoin_*.AppImage./itsgoin_*.AppImagesudo apt install libfuse2 (Debian/Ubuntu) or sudo dnf install fuse (Fedora).
chmod +x itsgoin-cli-*./itsgoin-cli-* /path/to/data --daemon./itsgoin-cli-* /path/to/data --bind 0.0.0.0:4433 --daemon --web 8080--help for all options.
VisibilityIntent::Control post type carries a signed DeletePost / UpdateVisibility operation. Receivers verify the ed25519 signature against the target post's author, then apply. DeleteRecord and VisibilityUpdate wire pushes are removed.VisibilityIntent::Profile; authored by the posting identity, propagates via the CDN. The ProfileUpdate wire message keeps only routing fields (anchors, recent_peers, preferred_peers).InlineComment gains an optional ref_post_id; when set, content is a short preview and the full body (long text, attachments) lives in the referenced post. Signature binds the reference so a peer can't strip or swap it.canonical_root_post_id field on the group-key record; groups reuse the same encryption machinery.GroupKeyDistribute (0xA0) wire push is retired. Admins publish an encrypted post carrying the seed; members decrypt with their posting secret. Removes the last persona-signed direct push.AudienceRequest/AudienceResponse wire messages, no more SocialRelation::Audience/Mutual. Comment permission AudienceOnly renamed to FollowersOnly.BlobDeleteNotice also retired — orphan blobs on remote holders evict via LRU.admin field doesn't match the post's author are rejected before storage. Prevents an attacker who knows a victim's posting id and the target group_id from overwriting the victim's legitimate group-key record.PendingConnectGuard prevents auto-reconnect, rebalance-slots, and relay-introduction from racing to connect to the same peer. Same-peer only — different peers connect independently; inbound connections are unaffected.v0.6.2 is a wire-breaking fork from v0.6.1. Retired message types (0x42 PostNotification, 0x43 PostPush, 0x44 AudienceRequest, 0x45 AudienceResponse, 0x95 BlobDeleteNotice, 0xA0 GroupKeyDistribute) are not optional — upgrade both ends.
allowBackup=true, which silently uploaded identity.key (your root secret — full access to all private content) to Google Drive for any user with cloud backup enabled. That's published-to-a-third-party without asking. Now off by default, plus data_extraction_rules for Android 12+ cloud and device-transfer paths. Users who want off-device backup use Settings → Export (explicit ZIP under their control).identity.key, WAL/SHM, and all identity subdirs — truly fresh on next launch.OPEN_DOCUMENT; picked file is staged in the app's private cache for the existing importer.display_name / bio / avatar are no longer sent on the wire. Peers render author names as hex until v0.6.2 adds persona-signed profile posts.PostPush for encrypted posts is removed; encrypted DMs look identical on the wire to any other encrypted post.clear_address_lookup() + mDNS only; no implicit DNS publishing.post_upstream, post_downstream, blob_upstream, blob_downstream); replaced with file_holders. One-way migration seeds the new table from the old ones on first launch. Also adds post_recipients index for merged pull, and posting_identities table for multi-persona.deleted_at timestamp) instead of hard-deleted. Tombstones propagate through pull sync, ensuring deletes reach peers that missed the real-time diff.seen_engagement and seen_messages tables. Only notifies on genuinely unseen content. Survives app restarts.encrypt_bytes_with_cek, decrypt_bytes_with_cek, unwrap_cek_for_recipient, unwrap_group_cek. Foundation for encrypted blob storage and future chunk-level encryption.intentKind) rather than encryption state.0.0.0.0. Fixes share link video/image serving for IPv6-reachable nodes.preload="auto"). Previously only the first frame loaded.PRAGMA user_version. Future upgrades can run data migrations automatically. Databases too old to migrate are reset cleanly.post_upstream table records which peer each post was received from, enabling engagement to flow back toward the author hop-by-hop through the CDN tree.0.0.0.0 — unroutable addresses are now skipped, falling through to QUIC proxy correctly.post_downstream table gives every post (including text-only) a propagation tree. Engagement diffs flow through the file layer via BlobHeaderDiff (0xD0), never mesh.--bind (explicit server) skips STUN.--bind or UPnP now advertise their public IPv6 address, so peers save them in known_anchors for preferential reconnection.This project is open source and could use your help. Whether you're a developer, tester, or just have ideas — jump in.