itsgoin/download-page.html
Scott Reimers 800388cda4 ItsGoin v0.3.2 — Decentralized social media network
No central server, user-owned data, reverse-chronological feed.
Rust core + Tauri desktop + Android app + plain HTML/CSS/JS frontend.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 20:23:09 -04:00

183 lines
13 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DistSoc — Download</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: 'Segoe UI', system-ui, sans-serif; background: #f9fafb; color: #1f2937; line-height: 1.6; padding: 2rem 1.5rem; }
.container { max-width: 600px; margin: 0 auto; }
h1 { font-size: 1.6rem; font-weight: 700; margin-bottom: 0.25rem; }
.subtitle { color: #6b7280; font-size: 0.9rem; margin-bottom: 0.5rem; }
.updated { color: #9ca3af; font-size: 0.8rem; margin-bottom: 2rem; }
.downloads { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 2rem; }
.download-btn {
display: inline-block;
color: white;
text-decoration: none;
padding: 0.85rem 2rem;
border-radius: 10px;
font-size: 1.1rem;
font-weight: 600;
transition: filter 0.2s;
}
.download-btn:hover { filter: brightness(0.9); }
.download-btn span { font-size: 0.85rem; font-weight: 400; opacity: 0.8; display: block; margin-top: 0.15rem; }
.btn-android { background: #2563eb; }
.btn-linux { background: #16a34a; }
h2 { font-size: 1.15rem; margin: 1.5rem 0 0.75rem; color: #111827; }
.platform { background: white; border: 1px solid #e5e7eb; border-radius: 10px; padding: 1.25rem 1.5rem; margin-bottom: 1.25rem; }
.platform-label { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 700; margin-bottom: 0.75rem; }
.label-android { color: #2563eb; }
.label-linux { color: #16a34a; }
.steps { list-style: none; padding: 0; counter-reset: step; }
.steps li {
counter-increment: step;
padding: 0.65rem 0 0.65rem 2.5rem;
position: relative;
border-bottom: 1px solid #f3f4f6;
font-size: 0.95rem;
}
.steps li:last-child { border-bottom: none; }
.steps li::before {
content: counter(step);
position: absolute;
left: 0;
top: 0.65rem;
width: 26px;
height: 26px;
border-radius: 50%;
color: white;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.8rem;
font-weight: 700;
}
.platform-android .steps li::before { background: #2563eb; }
.platform-linux .steps li::before { background: #16a34a; }
.steps li strong { color: #111827; }
code { background: #f3f4f6; padding: 0.15rem 0.4rem; border-radius: 4px; font-size: 0.88rem; }
.note {
background: #fef3c7;
border: 1px solid #fde68a;
border-radius: 8px;
padding: 0.75rem 1rem;
font-size: 0.88rem;
color: #92400e;
margin-top: 0.75rem;
}
.changelog {
background: white;
border: 1px solid #e5e7eb;
border-radius: 10px;
padding: 1.25rem 1.5rem;
margin-top: 2rem;
}
.changelog h2 { margin-top: 0; }
.changelog ul { padding-left: 1.25rem; margin-top: 0.5rem; }
.changelog li { margin-bottom: 0.4rem; font-size: 0.93rem; }
.changelog .date { font-size: 0.82rem; color: #6b7280; margin-bottom: 0.5rem; }
</style>
</head>
<body>
<div class="container">
<h1>DistSoc</h1>
<p class="subtitle">Available for Android and Linux</p>
<p class="updated">Last updated: March 10, 2026</p>
<div class="downloads">
<a href="distsoc.apk" class="download-btn btn-android">
Android APK
<span>distsoc.apk &mdash; 140 MB</span>
</a>
<a href="distsoc_0.1.0_amd64.AppImage" class="download-btn btn-linux">
Linux AppImage
<span>distsoc_0.1.0_amd64.AppImage &mdash; 85 MB</span>
</a>
</div>
<div class="platform platform-android">
<div class="platform-label label-android">Android</div>
<ol class="steps">
<li><strong>Download the APK</strong> &mdash; Tap the button above. Your browser may warn that this type of file can be harmful &mdash; tap <strong>Download anyway</strong>.</li>
<li><strong>Open the file</strong> &mdash; When the download finishes, tap the notification or find <code>distsoc.apk</code> in your Downloads folder and tap it.</li>
<li><strong>Allow installation</strong> &mdash; Android will ask you to allow installs from this source. Tap <strong>Settings</strong>, toggle <strong>"Allow from this source"</strong>, then go back and tap <strong>Install</strong>.</li>
<li><strong>Launch the app</strong> &mdash; Once installed, tap <strong>Open</strong> or find DistSoc in your app drawer.</li>
</ol>
<div class="note">
<strong>Note:</strong> If you don't see the "Allow from this source" prompt, go to <strong>Settings &rarr; Apps &rarr; Special access &rarr; Install unknown apps</strong> and enable it for your browser.
</div>
</div>
<div class="platform platform-linux">
<div class="platform-label label-linux">Linux (AppImage)</div>
<ol class="steps">
<li><strong>Download the AppImage</strong> &mdash; Click the button above to download.</li>
<li><strong>Make it executable</strong> &mdash; Open a terminal and run:<br><code>chmod +x distsoc_0.1.0_amd64.AppImage</code></li>
<li><strong>Run it</strong> &mdash; Double-click the file, or from the terminal:<br><code>./distsoc_0.1.0_amd64.AppImage</code></li>
</ol>
<div class="note">
<strong>Note:</strong> If it doesn't launch, you may need to install FUSE:<br><code>sudo apt install libfuse2</code> (Debian/Ubuntu) or <code>sudo dnf install fuse</code> (Fedora).
</div>
</div>
<div class="changelog">
<h2>Changelog</h2>
<div class="date">March 10, 2026 (v2)</div>
<ul>
<li><strong>Anchor advertised address</strong> &mdash; 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.</li>
<li><strong>Observed address notification</strong> &mdash; Every peer tells its new mesh partner "I see you at &lt;ip:port&gt;" during initial exchange &mdash; a lightweight STUN-like "who am I" on every connection.</li>
</ul>
<div class="date">March 10, 2026</div>
<ul>
<li><strong>UPnP port mapping</strong> &mdash; Devices behind NAT routers automatically request a port forward via UPnP, becoming directly reachable without manual configuration.</li>
<li><strong>Auto-anchor promotion</strong> &mdash; Devices with a successful UPnP mapping self-declare as anchors, improving bootstrap diversity for all peers.</li>
<li><strong>Hole punch fix</strong> &mdash; Target-side hole punch connections were silently discarded; now properly registered as sessions so both sides of a NAT punch succeed.</li>
</ul>
<div class="date">February 24, 2026 (v2)</div>
<ul>
<li><strong>Request Referrals button</strong> &mdash; 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.</li>
<li><strong>Docker bridge IP filtering</strong> &mdash; Relay introductions no longer leak Docker bridge IPs (172.17.x.x, 172.18.x.x), fixing connection failures through anchors running in Docker.</li>
<li><strong>Keepalive fix</strong> &mdash; Sender-side last_activity update prevents false zombie detection on connections where we send keepalives but the remote stops responding.</li>
<li><strong>Message threads</strong> &mdash; DM conversations grouped by partner with expandable thread view.</li>
<li><strong>Mesh/reach diagnostics</strong> &mdash; Peer cards show reach level badges (Mesh/N1/N2/N3) in diagnostics.</li>
</ul>
<div class="date">February 24, 2026</div>
<ul>
<li><strong>Audience request button</strong> &mdash; "Ask to join audience" button on followed peers in the People tab. Shows status badges (requested/approved) for existing requests.</li>
<li><strong>DMs filtered from feed</strong> &mdash; Direct messages no longer appear in the Feed tab; they show only in the Messages tab.</li>
<li><strong>Peer bios displayed</strong> &mdash; Bio text now shown below peer names in People tab (peers list and follows list).</li>
<li><strong>People tab auto-refresh</strong> &mdash; Follows, peers, and audience now refresh every 10 seconds, so display names update automatically after profile sync.</li>
<li><strong>Button feedback</strong> &mdash; Diagnostics Refresh button now shows loading state and toast confirmation on completion.</li>
</ul>
<div class="date">February 23, 2026</div>
<ul>
<li><strong>Fix connection lock contention</strong> &mdash; 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.</li>
<li><strong>Image attachments display</strong> &mdash; Fixed Content Security Policy blocking blob: URLs, so image attachments now render in post previews and feeds.</li>
<li><strong>Non-blocking startup</strong> &mdash; Referral peer connections now run in the background instead of blocking node startup.</li>
<li><strong>Connect timeout</strong> &mdash; 15-second cap on connection attempts during rebalance prevents prolonged lock holding.</li>
<li><strong>Android foreground service</strong> &mdash; Mesh connections stay alive when the app is in the background.</li>
</ul>
<div class="date">February 20, 2026</div>
<ul>
<li><strong>IPv4-mapped address fix</strong> &mdash; 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.</li>
<li><strong>Mesh keepalive</strong> &mdash; 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.</li>
<li><strong>Audience management</strong> &mdash; People tab now shows pending and approved audience members with Approve/Deny/Remove actions.</li>
<li><strong>Network diagnostics overhaul</strong> &mdash; 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.</li>
<li><strong>Manual rebalance</strong> &mdash; Trigger immediate mesh rebalancing from Settings for debugging.</li>
<li><strong>Reset all data</strong> &mdash; Danger Zone in Settings to clear all local data (posts, peers, blobs) while preserving identity key. Takes effect on restart.</li>
</ul>
<div class="date">February 19, 2026</div>
<ul>
<li><strong>Reactive mesh growth loop</strong> &mdash; 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.</li>
<li><strong>Anchor matchmaking only</strong> &mdash; Anchors now exclusively matchmake (introduce peers) and never proxy bytes. Clearer separation of relay vs. introduction roles.</li>
<li><strong>Parallel hole punching</strong> &mdash; 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.</li>
<li><strong>Relay-observed address injection</strong> &mdash; 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.</li>
<li><strong>Growth loop introduction fallback</strong> &mdash; 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.</li>
</ul>
</div>
</div>
</body>
</html>