Nostr Vault — everything new in 2.6.0
🚀 Headline features
• NIP-77 negentropy sync — efficient, diff-only cross-device sync (all kinds). Your relay now reconciles with external relays by exchanging only the difference — what you’re missing — instead of re-downloading everything. It covers all your event kinds: your DMs (/inbox + /chat), your own notes (/outbox), and your follows’ recent notes (a new local /feed store synced from your blastr + seed relays). Persistent tombstones mean events you’ve intentionally rejected are never re-fetched, and every local relay now serves NIP-77 so other clients can sync from you the same efficient way.
• Local-first feed — the feed opens instantly. The app reads from the on-device /feed cache first (millisecond-fast), then tops up from external relays in the background — no blank-screen wait.
• Fully on-device notifications (no push server). Every notification — mentions, replies, DMs, zaps, reactions, reposts — is generated on-device from your own relay’s event stream. Nothing about your notification activity is ever visible to us, Apple, or anyone. Correct per-account attribution on multi-account setups, and a single “N new notifications” summary after catching up instead of one buzz per event.
• Picture-in-Picture video. Full-screen video keeps playing in a system PiP window when you swipe home or tap PiP, with a unified control rail (play/pause, scrubber, elapsed/duration, mute, PiP) that auto-hides after 3s.
✨ Added
• Mac Relay Sync status widgets in the Dashboard + Settings: last-sync time, with Sync Now / Full Resync / Reset controls.
• Catch-up notification summary when returning after being away (batched, one summary).
• Pull-to-refresh triggers a real relay sync round (RequestRelaySyncC); feed snapshot persisted every 60s.
🔧 Changed / improved
• Vault tab: full vs. incremental refresh. Reuses live sockets with a since-bounded top-up instead of tearing down and reconnecting on every entry — much less churn and faster updates.
• Catch-up sync runs on a sane interval (default 15 min, hard minimum), and on-demand rounds are throttled so pull-to-refresh storms can’t dial a fresh connection per relay.
• One version number across platforms — iOS now reports 2.6.0 (14) (was 1.1.1), matching macOS and Android.
• relay.damus.io dropped from the defaults (it began refusing sync queries and rate-limiting); two dead default Blossom mirrors are stripped from saved config on load. Your own relays/mirrors are untouched.
• “Push Notifications” → “Notifications” throughout (no push server involved anymore).
• Message composer recipient chip now visibly shows the selected recipient when you tap a search result.
🔒 Security
• Zap totals can no longer be faked. A kind-9735 receipt is an ordinary event, and the app used to count every one it saw. Receipts are now validated against the recipient’s LNURL provider (the publishing pubkey must be the one that provider authorizes); validation fails open only when it genuinely can’t be determined, so real zaps always count.
🐛 Fixed
• The “Catching up” notification firing on ordinary background resyncs (feed reconnects, thread pull-to-refresh, vault load) instead of only when actually returning after being away.
• Posting with media failed on the first try — mirrors are now warmed when the composer opens and the upload retries once; dead default mirrors removed.
• Stale Web of Trust cache could get stuck for days and silently reject real replies/reactions as “not in WoT” — the root cause of vanishing engagement. It now refreshes on age at boot.
• Missing notifications from Mac Relay Sync — events that reached the phone only via catch-up were imported silently; they now run the same notification path as live events.
• Mac Relay Sync could take down the local relay (no minimum gap between rounds) — now throttled; and it now authenticates before /private and /chat catch-up (which previously timed out silently).
• Profile notes fetched from the wrong relays — now queries the author’s write relays, so profiles aren’t falsely empty (+ a guard so a stale relay list can’t overwrite a fresher one).
• Reposting long-form articles used kind 6 (which most clients ignore) — now kind 16 naming the original kind.
• Short replies vanishing in threads of 7+ people (tripping the mention-spam filter) — including your own.
• Blocking someone didn’t reach the relay until restart, so it kept importing/notifying about them all session.
• Notifications + activity dot firing for old backlog (and for non-notify-worthy events like replying to your own note).
• Multi-account corruption: background publishing briefly flipped the active account, which the app read as a real switch and wiped loaded events.
• Multi-relay bunker:// signer connections kept only the first relay, leaving reconnects with no fallback.
• Silent video failures — a failed video showed a black rectangle with no retry; it now falls back to the thumbnail and “Try Again” works.
• Scroll hitch on cached video — integrity-hashing up to 64 MB moved off the main thread.
• Audio interrupted during Picture-in-Picture when scrolling the feed past another video.
• A video stuck streaming from the network for the rest of the session after one bad cached copy.
• A single malformed relay-setting could prevent startup (20 settings qualified, including the port) — bad values now fall back to defaults and log which one was at fault.
• Xcode incremental builds could ship a stale Go relay (build phase skipped rebuilds) — fixed so a Go-side change always makes it into the binary.
Login to reply