{
  "latest": "v0.6.14",
  "channels": {
    "stable": "v0.6.14"
  },
  "versions": {
    "v0.6.13": {
      "date": "2026-06-02T11:34:00Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.13/zippytal-v0.6.13-darwin-arm64",
          "sha256": "3ed03219c885dc6d9ef1f9bc5c8d910d1e051e0bf2193b6badde16240fa202c6",
          "size": 34225602
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.13/zippytal-v0.6.13-darwin-amd64",
          "sha256": "ff50af0b2393cfee4dd1f5504ec796b1be8209576577694ff1aebe95720b53c3",
          "size": 36315936
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.13/zippytal-v0.6.13-linux-arm64",
          "sha256": "7952d888cfb635b0fb2484fb726d909c0f0dd5893be1979472d2a2d0d0abcc1a",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.13/zippytal-v0.6.13-linux-amd64",
          "sha256": "24da78b48e231d069c9a92394ac36be12b167f117fb2e237aec55d0cbeed0019",
          "size": 35446946
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.13/zippytal-v0.6.13-windows-amd64.exe",
          "sha256": "034cad665a201a82f7cfe0761a3e1f10526921154e0ce9f844c416d9ebcb6c23",
          "size": 36057600
        }
      },
      "notes": "Group-call SFU reliability — fixes asymmetric media on join and stale 'ghost' members.\n\n• Fanout reconcile: a joiner now reliably receives every existing participant's audio AND video, even when video is published a beat after audio — the existing-tracks catch-up sweep re-runs for a few seconds after join so a late/staggered track always reaches every subscriber. Fixes the 'I see them, they don't see/hear me' join asymmetry.\n• Evict stale sessions on rejoin: joining (or reconnecting) now evicts your previous session for the SAME identity — closing it, tearing down its forwarded tracks (RemoveTrack + track-removed) and broadcasting peer-left — so you never appear as a 'ghost + real' duplicate tile.\n• Active teardown on leave: a leaver's forwarded camera/screen tracks are RemoveTrack'd from every subscriber and a track-removed is broadcast, so tiles + media clear immediately instead of freezing on the last frame.\n\nApplies to BOTH chat group calls and meet (shared SFU). Pairs with the matching chat web app update. Recommended for all nodes."
    },
    "v0.6.12": {
      "date": "2026-06-01T09:54:55Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.12/zippytal-v0.6.12-darwin-arm64",
          "sha256": "3dbed2b089de711d7b58d9ea0441895af710669b3b592975401ce960983d621c",
          "size": 34209010
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.12/zippytal-v0.6.12-darwin-amd64",
          "sha256": "d1fc7ec842fed52e80aa619e6d5770114b59a82404bb1dee9ef1e9657496c3d5",
          "size": 36311760
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.12/zippytal-v0.6.12-linux-arm64",
          "sha256": "940afc5e69ef5373e3885e1ee619710931693b0a3d8802efe319f920ccc03b6f",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.12/zippytal-v0.6.12-linux-amd64",
          "sha256": "54a04a6c2889b8a20903308d83c6134e60dc7131b9d1a6f16770cf19730432f4",
          "size": 35438754
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.12/zippytal-v0.6.12-windows-amd64.exe",
          "sha256": "cd02c49dd21f874ea6d9b3c69874d00de3cd57f68652e8f443d301512fc760eb",
          "size": 36050944
        }
      },
      "notes": "Chat reliability + onboarding fixes.\n\n• Reconnect message backfill (browser): an open conversation now pulls the messages it missed during a network drop the moment the data channel reconnects, instead of only on a manual refresh.\n• Onboarding PIN setup: a brand-new node (or newly-added operator) can now set their encryption PIN even while the node is still provisioning — central no longer round-trips to a degraded node to fetch a blob for a user who has none, which used to surface as 'Couldn't verify your account state.'\n• Operators get a chat home: being added as an operator now assigns a default chat node, so an operator can actually use chat on that node.\n• Chat hot-mounts on heartbeat: if the per-node chat secret first arrives on a heartbeat (not the register response) or rotates, chat now goes degraded→running without a daemon restart.\n• `zippytal init` fails loudly if it can't persist config after registering, instead of leaving a 'registered but won't start' node.\n\nPairs with the matching chat web app build (reconnect backfill + encryption-gate resilience) and a central-server update (chat-key + operator onboarding). Builds on v0.6.11 (DC keepalive routing) etc. Recommended for all nodes."
    },
    "v0.6.11": {
      "date": "2026-06-01T08:47:11Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.11/zippytal-v0.6.11-darwin-arm64",
          "sha256": "0cb3de83c8dd2b999082af2df46b85edd5cadd790e0958176ae9487e80314908",
          "size": 34209010
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.11/zippytal-v0.6.11-darwin-amd64",
          "sha256": "81aa2f569d048ef6b1f239724c6453851149552b68bcd1839f40c2eca2e542d2",
          "size": 36311760
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.11/zippytal-v0.6.11-linux-arm64",
          "sha256": "394e2759decd39f9a2fee3c941055a18f68b48450f3cd943cf65a62e25587199",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.11/zippytal-v0.6.11-linux-amd64",
          "sha256": "f4933c96a7a055b2f3bab16ec79d747bd9ecc621c73f5f72501efe9337f8f968",
          "size": 35438754
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.11/zippytal-v0.6.11-windows-amd64.exe",
          "sha256": "65c6dbb1fdc67722233a6daca92852eed6eb4104fc6f7815ea1bb9c743b1143d",
          "size": 36050432
        }
      },
      "notes": "Chat data channel stays up — fixes the ~25s disconnect loop and makes ICE restart work.\n\n• WS keepalive routing fix: the node was sending the WS-level keepalive pong over the data channel once the DC was open, so the browser's WS keepalive never saw its pong, zombie-closed the WS, and the node then tore down the PeerConnection — the DC died ~25–35s after opening, every time. The WS pong (and ping) now stay on the WebSocket where they belong. Both keepalives — WS {type:ping/pong} on the WS, DC {t:ping/pong} on the data channel — now work independently.\n• In-place ICE restart: a browser ICE-restart offer (iceRestart) is now applied to the EXISTING PeerConnection (same DTLS fingerprint, SCTP intact) instead of recreating it. Recreating produced a new fingerprint the browser rejected, so every restart used to fail; now the DC stays open through an ICE restart for genuine network-path changes.\n• Added [dc-wire] debug logging on both ends to trace exactly what crosses the data channel.\n\nServer-side; no schema/protocol changes (adds an optional iceRestart field to the node-rtc-offer the browser already sends). Builds on v0.6.10 (chat default-on), v0.6.9 (DC keepalive echo), v0.6.8 (WS keepalive). Strongly recommended for any node serving chat."
    },
    "v0.6.10": {
      "date": "2026-05-31T13:36:00Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.10/zippytal-v0.6.10-darwin-arm64",
          "sha256": "1c20c9602fa5f8eae463a05dd930324a1250e32a44321b1b2e3fe3ddec650646",
          "size": 34208994
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.10/zippytal-v0.6.10-darwin-amd64",
          "sha256": "39c3247a719c0b72f02fbb394a9600a99dc1b6b018c76145c68521d367764965",
          "size": 36307632
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.10/zippytal-v0.6.10-linux-arm64",
          "sha256": "a0074ddbabc6d610c1140193263315112ce4c3fab41176cd78374a6e547c782b",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.10/zippytal-v0.6.10-linux-amd64",
          "sha256": "390a5513e765220ab3b03a3e97e7e78d70df62ed59207e46c0b0cac178aac25c",
          "size": 35438754
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.10/zippytal-v0.6.10-windows-amd64.exe",
          "sha256": "2b654e43695dd6d39bf7a1c2a267942d3f837d4630aa881f234bb0aa5f5174fb",
          "size": 36047872
        }
      },
      "notes": "Chat is now default-on for every node, like meet — including existing nodes that predate the chat default.\n\n• Default-on services: rooms and chat are enabled by default on any node, even a config that doesn't list chat in services.enabled (e.g. provisioned before chat existed). Such nodes now pick up chat on upgrade with no manual step — the daemon mounts it and advertises the capability to central automatically.\n• Still opt-out-able: a new services.disabled list is the explicit opt-out. `zippytal services disable chat` writes chat there so the choice persists across restarts and upgrades; rooms remains always-on. So default-on is a default, not a forced override.\n• Capability reporting (init output, status banner, central registration) now reflects the effective service set, so a migrated node correctly reports chat.\n\nNo schema/protocol changes. Builds on v0.6.9 (DC keepalive pong echo + ICE candidate hygiene) and v0.6.8 (WS keepalive). Recommended for all nodes."
    },
    "v0.6.9": {
      "date": "2026-05-31T10:56:22Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.9/zippytal-v0.6.9-darwin-arm64",
          "sha256": "907adb6db2488950ea60d4900b60a9829c7670c526af5285c37953dea114d7b7",
          "size": 34192450
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.9/zippytal-v0.6.9-darwin-amd64",
          "sha256": "52559989cc5736aeea8116ec39077dfabad4a37b90984c02c195d793931055b3",
          "size": 36307616
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.9/zippytal-v0.6.9-linux-arm64",
          "sha256": "608d93c6f0d962dac322bbb9baadd38fb65c48b6650f92fb0f9e0cc5be98fa56",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.9/zippytal-v0.6.9-linux-amd64",
          "sha256": "869666113fd23145d0361ed21e2f7a76e9449d81cfbac8b1393a944f90ab3f00",
          "size": 35438754
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.9/zippytal-v0.6.9-windows-amd64.exe",
          "sha256": "42ef5f2f900a9ef2f28e388a5d1a6dd95495801ceb80ff7d20bba63148d05977",
          "size": 36046336
        }
      },
      "notes": "Browser↔node WebRTC data-channel reliability: the chat DC now stays up instead of churning.\n\n• DC keepalive responder: the home node now answers the browser's data-channel keepalive. The browser pings `{\"t\":\"ping\",\"n\":N}` over the chat-envelope channel every 15s and tears the channel down if it gets no `{\"t\":\"pong\"}` within 10s. Earlier builds received the ping but decoded it as an (empty-type) chat frame and silently ignored it, so the browser declared a perfectly healthy channel dead every ~25s — endless `likely-dead (pong-timeout)` → recovery. The node now echoes the pong (verified end-to-end against a real Pion handshake).\n• ICE-candidate hygiene: the node's Pion ICE gathering now drops docker/bridge/veth/loopback/link-local interfaces (SettingEngine interface + IP filter), so it stops advertising unroutable host candidates that wasted the browser's connectivity-check budget and crowded out the public srflx.\n\nServer-side only; no schema/protocol changes. Pairs with the chat web app's outbound-ICE-candidate buffering fix (candidates gathered before the signaling WS opened were being dropped, leaving the node with an offer and no candidates). Strongly recommended for any node serving chat."
    },
    "v0.6.8": {
      "date": "2026-05-30T09:41:10Z",
      "deprecated": true,
      "deprecationReason": "Chat data channel churns: the node has no responder for the browser's DC keepalive ping, so the browser tears down a healthy channel every ~25s (likely-dead pong-timeout) and chat falls back to the slower WS lane. Also advertises docker/bridge ICE candidates that slow DC setup. v0.6.9 fixes both.",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.8/zippytal-v0.6.8-darwin-arm64",
          "sha256": "a8edaa99a2955fc399c03b43f01b2ae8e53d808e6b38f556d127c1ce08d8edae",
          "size": 34192290
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.8/zippytal-v0.6.8-darwin-amd64",
          "sha256": "078d49345a1db71d55d419e53c4ad196ebb857a66578dbe68873b4c02ba6dd6b",
          "size": 36303392
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.8/zippytal-v0.6.8-linux-arm64",
          "sha256": "2d3064c80c30e9a0f005530e756a1e84ae66a1119eac9af9cc1d2babe5a0d1ed",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.8/zippytal-v0.6.8-linux-amd64",
          "sha256": "b2b4c21b8b38b5875798f8dc0d38d77ebfe20df859ba6cd56e9e7ede4af5c067",
          "size": 35434658
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.8/zippytal-v0.6.8-windows-amd64.exe",
          "sha256": "9d18fb388b3bfc83dfac41ec71f27fc8b49cc5c2b1fcd58d4900ca490082bf23",
          "size": 36042752
        }
      },
      "notes": "Chat WebSocket keepalive fix — eliminates the home-node reconnect / ICE-restart loop.\n\n• The home-node chat WS now answers the browser's app-level {type:\"ping\"} keepalive with {type:\"pong\"}. Previously the node had no handler for the ping frame and replied with `error: unknown frame: ping`, so the browser never saw a pong, declared the socket a half-open zombie after ~10s, and closed it roughly every 35s. Because the WebRTC data-channel signaling (node-rtc-offer / node-rtc-answer / node-rtc-ice) rides that same WebSocket, the churn cascaded into endless `ice-disconnected → ICE restart → pc-failed` recovery loops and dropped queued chat frames ('DC died with N frame(s) queued — dropping').\n• Typeless / malformed frames are now ignored instead of being bounced back as an error frame, and unrecognized frames are logged server-side rather than echoed to the client — so a stray frame can never trip the browser's onError path again.\n\nServer-side only; the browser already speaks ping/pong correctly. No schema, protocol, or HTTP-route changes. Upgrade recommended for every node serving chat — the relay through central is transparent, so the node at the end of the tunnel is what must answer the ping."
    },
    "v0.6.7": {
      "date": "2026-05-14T01:50:27Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.7/zippytal-v0.6.7-darwin-arm64",
          "sha256": "7b82b878e7668d41764ece0108e26e1d88d627a8d706d83c61496c393907a76e",
          "size": 34192258
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.7/zippytal-v0.6.7-darwin-amd64",
          "sha256": "e298b1880ac1fd91c327ba214d7cfc9857d0e2cb3b3526dc15c2d4621e291683",
          "size": 36299264
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.7/zippytal-v0.6.7-linux-arm64",
          "sha256": "3f528f437822afde87b2b7496515e4ecf3c87990e18274a5c6e6cf2c8ad060b6",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.7/zippytal-v0.6.7-linux-amd64",
          "sha256": "9cbbaf22af90a21f60024d45e2c53d475a8c92d38302874cc35ca9413ef20e91",
          "size": 35434658
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.7/zippytal-v0.6.7-windows-amd64.exe",
          "sha256": "091637c7f29ca17b23750fcaed9e69642722ae4cb06c9a238773131d807fb142",
          "size": 36041728
        }
      },
      "notes": "Group-call screen-share cleanup fix.\n\n• When a publisher stops sharing their screen, every other participant's tile now clears within ~500 ms instead of freezing on the last frame indefinitely. Root cause: when the publisher's transceiver flipped to inactive via renegotiation, Pion's TrackRemote did NOT reliably return EOF on the SFU side, so the deferred `cleanupFanoutTrack` inside the RTP forwarding goroutine never fired and `track-removed` peer-messages never went out.\n• New `track-stop` top-level signal: the publisher browser sends `{type:\"track-stop\", extra:{trackId, source:\"screen\"}}` BEFORE removing the screen sender. The SFU's signaling reader matches the publisher's published tracks (by Track.ID() OR streamID `<pid>:screen` fallback) and proactively calls `cleanupFanoutTrack` — which broadcasts `track-removed` to every subscriber within milliseconds. Strictly additive: older browsers without this signal still fall through to the (slow / unreliable) EOF path; older SFUs ignore the unknown signal.\n• Multi-presenter cleanup is now correct as a free consequence: each publisher's stop independently triggers ONLY their own `track-removed`, so Alice stopping leaves Bob's still-live screen tile unaffected.\n• Browser-side defense-in-depth: incoming screen-share video tracks now also fire `remoteTrackEnded` after 3 s of sustained mute, catching the edge case where the publisher's tab hard-crashes without sending `track-stop` (and ICE timeout is still ~10 s away).\n\nNo schema migrations, no protocol bumps, no new HTTP routes. Backwards-compatible with older browsers AND older SFUs.",
      "deprecated": true,
      "deprecationReason": "Chat WS reconnect loop: the home-node chat WebSocket had no handler for the browser's {type:\"ping\"} keepalive and replied `unknown frame: ping`, so the socket was zombie-closed roughly every 35s and took the WebRTC data-channel signaling down with it (ice-disconnected → ICE restart → pc-failed). v0.6.8 makes the node answer with {type:\"pong\"}."
    },
    "v0.6.6": {
      "date": "2026-05-13T04:09:00Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.6/zippytal-v0.6.6-darwin-arm64",
          "sha256": "ed63eb391924fc67728ea9ab6668b926097478a736a996e1a2fac223987a9f41",
          "size": 34192002
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.6/zippytal-v0.6.6-darwin-amd64",
          "sha256": "20fb3399fb4e331a09f33acf00b79eece3b76605b9fa6f02a4deb83c22b0db6f",
          "size": 36286720
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.6/zippytal-v0.6.6-linux-arm64",
          "sha256": "e7b6285f792a6501d86c0005871db0bc7c29b6ca557f577858ff4011af064d4d",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.6/zippytal-v0.6.6-linux-amd64",
          "sha256": "03bd928da08922b51367968bd8274ba01c0c1857f7e28a5abda963587976eeca",
          "size": 35418274
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.6/zippytal-v0.6.6-windows-amd64.exe",
          "sha256": "53979355c81fca0637d8270a5cc8aa90c874651fbfa1861d0031c310808b58d2",
          "size": 36028416
        }
      },
      "notes": "Streaming chunked AEAD for chat file transfers (v:2 protocol) + JWT-secret bootstrap fix.\n\n• Chat attachments: new v:2 wire protocol on `file-up:*` / `file-dn:*` data channels. The sender encrypts the file in 60 KB plaintext chunks (~60 KB + 16-byte AES-GCM tag per wire frame, comfortably under the 65 535-byte RTCDataChannel ceiling). Each chunk is its own AEAD frame with a per-chunk IV derived from `ivPrefix || u32BE(chunkIndex)`, so the receiver can decrypt one chunk at a time without ever holding the full ciphertext in memory. Fixes the ~7 MB browser-tab crash that the old monolithic-encrypt path produced on memory-constrained clients.\n• v:2 metadata persists as a `<diskPath>.meta.json` sidecar alongside the ciphertext file — no schema migration. v:1 attachments have no sidecar and continue to download via the legacy stream path; the node serves whichever shape the on-disk state declares.\n• Cross-node proxy downloads: the libp2p `attachfetch` protocol's ack now carries an optional `chunkPlan` (json.RawMessage) so a co-host node serving a download for a file that lives on a peer node forwards the v:2 chunk plan transparently. Old peers leave the field empty — backwards-compatible on the protocol level; no version bump.\n• Daemon chat-init ordering fix: `resolveChatJWTSecret` now defers when the backend client hasn't been constructed yet. The previous behaviour mounted chat with the env JWT_SECRET in the first `tryInitChat()` call, locking the chat subsystem to the wrong secret before `SetChatSecretPath` had a chance to load the per-node cache from disk. Fixed deployments where `JWT_SECRET` was set in the environment for other services and silently shadowed the per-node chat secret.\n\nRequires the matching browser build for v:2. Browsers built before this release continue to use v:1 unchanged; nodes built before this release reject v:2 uploads with `bad header shape` and must be upgraded before chat clients start emitting v:2."
    },
    "v0.6.5": {
      "date": "2026-05-12T09:29:14Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.5/zippytal-v0.6.5-darwin-arm64",
          "sha256": "c9e8c0c06d1aad1a56dfcf5370eab704d143dc2547bd774da10dd7661dcb4de7",
          "size": 34175266
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.5/zippytal-v0.6.5-darwin-amd64",
          "sha256": "3cf6ec438f474b8f3fffb8d4fb684bc01d8a6e74d4f58c854054eeb166f27903",
          "size": 36282400
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.5/zippytal-v0.6.5-linux-arm64",
          "sha256": "b3681292625df7076c7a35b203a96fa0660475cb9b48f5980c9bc4253212c518",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.5/zippytal-v0.6.5-linux-amd64",
          "sha256": "ca56a31360f9308b5fbb74776db06e80c8f6b28e5303f6b180e4c2bd588398e2",
          "size": 35410082
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.5/zippytal-v0.6.5-windows-amd64.exe",
          "sha256": "553954d13534d7fcd0dbe1004d3560de3a926a36784b5801fcba5d0454a5b25e",
          "size": 36020224
        }
      },
      "notes": "File-transfer throughput optimization on both directions.\n\n• FileChunkBytes bumped 32 KB → 60 KB. ~Half the dc.Send calls per file,\n  half the SCTP framing overhead per byte. 61 441 wire bytes per chunk\n  stays safely under the universal 65 535-byte RTCDataChannel max-message\n  limit — no SDP negotiation required.\n• waitForBufferLow window widened from 1 MB / 256 KB to 8 MB / 4 MB\n  with the drain deadline extended 5 s → 10 s. Node can now keep ~133\n  messages in SCTP flight before backpressuring (was ~4) — this was\n  the dominant bottleneck on healthy links.\n\nPairs with browser-side changes: matching chunk size, matching buffer\nwindow, and ~30 Hz throttling on the onProgress callback so big\nuploads/downloads no longer storm React with state updates.\n\nRequires the matching browser build — old node + new browser would fail\nthe chunkCount integrity check on downloads."
    },
    "v0.6.4": {
      "date": "2026-05-12T08:54:05Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.4/zippytal-v0.6.4-darwin-arm64",
          "sha256": "fed50e281094497910a9b3a5cd46dfb6e5de1aa18da7c84ff69db8eddced2ba5",
          "size": 34175266
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.4/zippytal-v0.6.4-darwin-amd64",
          "sha256": "f20198f091ffcbf6923e8891f995946e8ebc36e15bfe0f7fa9b9f5d9116ecb36",
          "size": 36282400
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.4/zippytal-v0.6.4-linux-arm64",
          "sha256": "685f835d56b5aa2aa4d1acc07fe519d8b0134fd92369233ead6a307270fa7171",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.4/zippytal-v0.6.4-linux-amd64",
          "sha256": "1f78c79e4b06c80ab921ba57cfc0b0de7cd03af85c849e79b968984d497f8c7e",
          "size": 35410082
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.4/zippytal-v0.6.4-windows-amd64.exe",
          "sha256": "92e2199c979096874e791a7f1c3bb285763af211789aa13bfeafaf0a50bd407a",
          "size": 36020224
        }
      },
      "notes": "File-transfer reliability hardening on the node side.\n\n• Upload + download handlers now have a hard 10-minute total-transfer\n  ceiling. Previously a slow trickle (one chunk every 25s) reset the\n  per-frame stall timer forever; the goroutine + AttachmentStore slot\n  could linger indefinitely.\n• Fixed a time.After goroutine leak in the download negotiation loop —\n  the old code spawned a new timer on every non-JSON frame, leaking\n  goroutines AND letting a chatty client extend the 8s budget forever.\n  Replaced with a single time.NewTimer outside the loop.\n• Added a per-read stall watchdog (45s) around the streaming proxy\n  path. A wedged libp2p stream from a source node used to block\n  io.ReadFull forever — the existing non-blocking done check couldn't\n  fire while the read was stuck. Now the read goroutine fails fast and\n  the deferred rc.Close unblocks it.\n• ctx.Done now preempts the stream loop, so the total-transfer timer\n  can interrupt a stuck send/read symmetrically.\n\nPairs with v0.6.4 browser-side changes (stall + PC-state watchdog,\nauto-retry on transient failures, friendly error copy with a retry\nbutton on the failed attachment pill).",
      "deprecated": true,
      "deprecationReason": "Conservative 32 KB chunk size + 1 MB SCTP buffer window throttled file transfers to ~4 messages in flight — the dominant bottleneck on fast links. v0.6.5 ships 60 KB chunks + an 8 MB window for 2-3× throughput in both directions."
    },
    "v0.6.3": {
      "date": "2026-05-12T07:50:05Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.3/zippytal-v0.6.3-darwin-arm64",
          "sha256": "1e23d16dcf9109facee81bd952b0510b92bf6d23381e6c347002f830989d6477",
          "size": 34175106
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.3/zippytal-v0.6.3-darwin-amd64",
          "sha256": "051cd41c50e1b220b5f2daf16f41d4be384215dff9d3f8d55ad05fe3a86d9f7e",
          "size": 36274048
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.3/zippytal-v0.6.3-linux-arm64",
          "sha256": "402e7324b7e0b4a60d294bc1b1e3ec98917e4ca171dbb892fac54c03e74cab06",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.3/zippytal-v0.6.3-linux-amd64",
          "sha256": "904f88537278473dc9a3a87512f4b0357f3d7369b6b45a6fda654d012f016651",
          "size": 35410082
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.3/zippytal-v0.6.3-windows-amd64.exe",
          "sha256": "4e72e6472b75dbfd0df88c6746f1befd189a4249104fd15f2ede42eb9bcc9636",
          "size": 36016128
        }
      },
      "notes": "Hotfix on top of v0.6.2 — chat now actually mounts on boot.\n\n• Daemon boot order: tryInitChat() ran before backend.SetChatSecretPath()\n  loaded the cached secret, so even with a valid chat-jwt-secret file on\n  disk chat stayed degraded forever. Now retries the mount after the\n  backend client is constructed.\n\nExisting v0.6.1/v0.6.2 installs should upgrade and restart the daemon\n(no need to re-run init — the secret file already exists).",
      "deprecated": true,
      "deprecationReason": "File transfers could hang indefinitely on a slow/wedged source: no total-transfer ceiling, a time.After leak in the download negotiation loop, and no per-read stall watchdog on the proxy path. v0.6.5 fixes all three."
    },
    "v0.6.2": {
      "date": "2026-05-12T07:37:34Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.2/zippytal-v0.6.2-darwin-arm64",
          "sha256": "d30f3e253e75deb5c6f8ea3e8674f91b961517ed0a6ccbc8c8be4a37c1fea66f",
          "size": 34175106
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.2/zippytal-v0.6.2-darwin-amd64",
          "sha256": "c7d9ca782f43c1cd74b7f623716898d57bfadbc4d19089898684e169a0efca5c",
          "size": 36274048
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.2/zippytal-v0.6.2-linux-arm64",
          "sha256": "675de7480ebf95aebafd44079bf2d3c21c3f2f75538b7f9fb92e376f20129bd6",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.2/zippytal-v0.6.2-linux-amd64",
          "sha256": "c18ad90b3a6287a9d8386d597ecf986ad6b6af4ac30d52a03722574b03b1e7f9",
          "size": 35410082
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.2/zippytal-v0.6.2-windows-amd64.exe",
          "sha256": "0465865c0f83636d75b4a7fbe98d8f6654f2cee553c34f53ba42409d0e6edb53",
          "size": 36016128
        }
      },
      "notes": "Hotfix on top of v0.6.1.\n\n• Account-API register path now provisions per-node chat-jwt-secret\n  (v0.6.1 only wired this through the legacy /api/nodes/register flow\n  — most deployments use the account-API path so chat stayed degraded).\n• `zippytal init` is now idempotent: the admin-API bearer token is no\n  longer regenerated when re-running init against an already-running\n  daemon, so CLI calls don't 401 until the next restart.\n• `zippytal init` no longer prints the stale JWT_SECRET-required\n  warning; copy reflects that central provisions the secret.\n\nExisting v0.6.1 installs should upgrade to v0.6.2 and re-run\n`zippytal init` so central can hand them the chat secret over the\naccount API. After that, restart the daemon — chat will mount.",
      "deprecated": true,
      "deprecationReason": "Daemon boot order skipped reading the cached chat-jwt-secret file, so chat stayed in 'degraded' state even after a successful init. v0.6.5 fixes this."
    },
    "v0.4.5": {
      "date": "2026-05-02T20:12:55Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.4.5/zippytal-v0.4.5-darwin-arm64",
          "sha256": "5b6f449214df9ad38e484d875286db4af75fefeab1a0f6d7ab387b525c036e00",
          "size": 29846050
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.4.5/zippytal-v0.4.5-darwin-amd64",
          "sha256": "12cbf17369a0205e872254ce0a3a2f03aa91a8851b795b97c6033b0ce4479514",
          "size": 31831424
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.4.5/zippytal-v0.4.5-linux-arm64",
          "sha256": "67cda46289f216c50ee824e0718261b4e1a2ec4df65cde17ca8c673720afc04b",
          "size": 28901538
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.4.5/zippytal-v0.4.5-linux-amd64",
          "sha256": "d7705515a03051f700e2e6ec6fe75bd62c0c502c2ae5d4e3eba39535ec3f2cfe",
          "size": 31060130
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.4.5/zippytal-v0.4.5-windows-amd64.exe",
          "sha256": "618f3cac7ead6159d05dc4510dda25e0c5cc8e19fc505e41166f2d801307b028",
          "size": 31644160
        }
      },
      "deprecated": true,
      "deprecationReason": "Incompatible with the per-node chat JWT secret protocol introduced in v0.6.1. Chat-token verification fails because central no longer uses the system-wide JWT_SECRET to sign these tokens. Meet (rooms) still works, but chat does not. Upgrade to v0.6.5+."
    },
    "v0.6.0": {
      "date": "2026-05-12T05:01:13Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.0/zippytal-v0.6.0-darwin-arm64",
          "sha256": "b07516b8da25b68c09cfe35d21730bfbff1e836cc8c0dc238e3d9fe02cbcdabc",
          "size": 34175026
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.0/zippytal-v0.6.0-darwin-amd64",
          "sha256": "f019eb5e787a89d92db74c5bd75ccecbc4229aba31f55656df9bf17a32caa6f0",
          "size": 36269872
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.0/zippytal-v0.6.0-linux-arm64",
          "sha256": "314e4e4448c23d89b4b2ea1c14acbf229c15cbc5eca1160997d74f942ad7f4eb",
          "size": 33095842
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.0/zippytal-v0.6.0-linux-amd64",
          "sha256": "587f7514028fbd8e87cfb215073c7debe36f964adabd5e1ef49e935f3ede03b2",
          "size": 35401890
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.0/zippytal-v0.6.0-windows-amd64.exe",
          "sha256": "fc198c24018b30f7d2945a4863a6b831c431775bb986352f5f676a8dc55339a2",
          "size": 36011008
        }
      },
      "deprecated": true,
      "deprecationReason": "Incompatible with the per-node chat JWT secret protocol introduced in v0.6.1. Chat-token verification fails because central no longer uses the system-wide JWT_SECRET to sign these tokens. Meet (rooms) still works, but chat does not. Upgrade to v0.6.5+."
    },
    "v0.6.1": {
      "date": "2026-05-12T07:02:59Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.1/zippytal-v0.6.1-darwin-arm64",
          "sha256": "987ecb5bd631322593079df1a978f07f615ba6bc44c61f8a9fcbde4096718aab",
          "size": 34175106
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.1/zippytal-v0.6.1-darwin-amd64",
          "sha256": "fcb1b43b98d15761da4185c48ce2ddebcf5221800759c7a9dc7d9bb741560282",
          "size": 36269952
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.1/zippytal-v0.6.1-linux-arm64",
          "sha256": "413681576bfa261c06bb11563278ac22f3a3eac132565630dcf02e7ff6d47140",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.1/zippytal-v0.6.1-linux-amd64",
          "sha256": "356a0d598d2bf7e66396daaa8c81b5a162eda2f2f9f12ee5dc884cbe53830718",
          "size": 35405986
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.1/zippytal-v0.6.1-windows-amd64.exe",
          "sha256": "847a9bebb0ca18f77b95c75382f1cc2ecac049796f37c4d87c31621c0019714d",
          "size": 36015104
        }
      },
      "notes": "Hotfix on top of v0.6.0. Per-node chat JWT secret: central provisions a unique HS256 secret per node on /api/nodes/register and refreshes it on every heartbeat. End users no longer need to set JWT_SECRET — the secret arrives over the wire and is cached locally at <config>/chat-jwt-secret. Chat hot-mounts after the first register without a daemon restart.\nEarlier versions (v0.6.0 and below) are incompatible with the new per-node-secret central protocol and will fail to verify chat tokens. Upgrade is required for chat; meet (rooms) keeps working on legacy versions but no chat capability.",
      "deprecated": true,
      "deprecationReason": "Provisions the per-node chat-jwt-secret only via the legacy /api/nodes/register path; deployments using the account-API register flow (the common case) never receive it, so chat stays in 'degraded' state. v0.6.2 fixes this."
    },
    "v0.6.14": {
      "date": "2026-06-02T17:25:00Z",
      "platforms": {
        "darwin/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.14/zippytal-v0.6.14-darwin-arm64",
          "sha256": "c63fbaa051deefa2eb2fb4cdc278209d7bd5cb2c88f5b7d249765e431b718201",
          "size": 34242242
        },
        "darwin/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.14/zippytal-v0.6.14-darwin-amd64",
          "sha256": "4d6e05dc9ead41aaaae6938f17f0a95c9b2b4f955d6b8cab65b1f4d46b6dbb52",
          "size": 36324256
        },
        "linux/arm64": {
          "url": "https://node.zippytal.com/dist/v0.6.14/zippytal-v0.6.14-linux-arm64",
          "sha256": "9be0b883421125832bdd62cd1e8c0b5499d76f0da15cb1eb54e396abfa6ce6c5",
          "size": 33161378
        },
        "linux/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.14/zippytal-v0.6.14-linux-amd64",
          "sha256": "9542d6359b448934c2e9d2f8ed0b9db91ec4a813b07276c00543ae1dd127942e",
          "size": 35455138
        },
        "windows/amd64": {
          "url": "https://node.zippytal.com/dist/v0.6.14/zippytal-v0.6.14-windows-amd64.exe",
          "sha256": "109fbd56991a381c34a6220fe553739d9ac089ed3cbdf89cc42c2e2493c7761b",
          "size": 36066304
        }
      },
      "notes": "Group-call ghost-member fixes + join resilience.\n\n• Authoritative roster: the SFU now broadcasts the full participant list on every join/leave/evict and as a periodic heartbeat. Clients reconcile against it — instantly surfacing peers they'd otherwise miss and pruning 'ghost' tiles whose peer-left was lost or never sent. Fixes 'ghosts already there when I join' and 'they left but stay on screen'.\n• Prompt reaping of dead participants: a participant whose transport fails/closes — or stays disconnected past a short grace — is removed within seconds (closing its session, tearing down forwarded tracks, broadcasting peer-left + roster) instead of lingering up to the 45s WebSocket pong timeout and ghosting onto the next joiner.\n• Backstops a dropped peer-left and survives ungraceful disconnects (tab close, network drop).\n\nApplies to BOTH chat group calls and meet (shared SFU). Pairs with the matching chat web app update. Recommended for all nodes."
    }
  }
}
