feat(backup): offer Mutable follow recovery when no backup exists - #641
Open
dmnyc wants to merge 5 commits into
Open
feat(backup): offer Mutable follow recovery when no backup exists#641dmnyc wants to merge 5 commits into
dmnyc wants to merge 5 commits into
Conversation
This was referenced Aug 20, 2026
Collaborator
Author
|
Pushed a round of layout/copy refinements from review feedback:
Not visually verified — the browser tooling in my environment kept attaching to unrelated tabs, so the last few rounds are markup-level only. Worth a glance before merge at: the strip on a narrow viewport (button wraps below the text), and whether the 12px logo still reads clearly. If it looks weak, |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The gap
In Settings → Nostr Backup, "Restore" is gated on a backup existing:
disabled={!status.exists || !canEncrypt || restoring[type]}So the case where someone most needs help — follows wiped, no zap.cooking backup — is exactly the case where Settings offers nothing. The card just says "No backup found" and stops.
Meanwhile the app already has the answer: Mutable's follow-list recovery (
FollowListRecoveryModal+$lib/followRecovery) scans relay history for earlierkind:3events and needs no backup at all. It was only reachable from a profile page, which isn't where anyone looks after losing their follows.The change
The Follows card gains a third action, "Recover from relays", alongside Backup Now / Restore.
It is deliberately not gated on
status.exists— it works from relay history, so it's available precisely when Restore isn't. The only guard is being signed in.When no follows backup exists, the card also explains the option rather than dead-ending:
Both the button and the hint are scoped to
type === 'follows'; the Mute List and Profile cards are unchanged, since Mutable's recovery is follow-list specific.The modal is mounted from this component behind an
{#if $userPublickey}guard, and is the same component the profile page uses — no duplicated recovery logic.Verification
pnpm check— 1 error / 152 warnings, identical tomain(pre-existingdelete-operator error)pnpm test— 1267 passedNot verified
The recovery flow itself (scan → pick a candidate → restore) runs behind auth, so I could only confirm the entry point renders and is correctly ungated. The modal and
followRecoverylogic are unchanged — this PR only adds a second way in — but a signed-in pass through the scan is worth doing.