feat(desktop): save a transfer as a profile, from the app - #24
Merged
Conversation
`sync_profiles` has existed since the first migration, the CLI has driven it
since the first release, and `IPC.profilesSave` has been in the contract the
whole time — with **no handler behind it**, and nothing in the window calling
it. The app could list profiles and delete them but could never make one, so
the feature was invisible from the only surface most people use.
The strip above the two panes holds them now: click one to restore its source,
destination and options, "Save this pair" stores what is on screen, and the x
deletes it.
Details worth knowing:
- Loading a profile sets Mirror to whatever the profile stored, rather than
leaving it as it found it. A profile that did something different
depending on what you had toggled last would not be a profile.
- A profile with deletes enabled carries a red "mirror" mark on its chip.
Loading something that turns Mirror on is not a thing to discover from the
footer afterwards.
- `trustDeletes` is never set from the app. It is the one way a mirror runs
without a human seeing the delete list first, so it stays a deliberate,
out-of-band choice.
- The renderer sends the same endpoint references a transfer takes, so a
profile can name a saved connection but never a host of its own. The main
process resolves them, which is what makes the stored profile the same
shape the CLI writes.
The strip is deliberately the same shape as the Fleet view's command strip:
chips to restore, an x to delete, one control to save. Two lists of saved
things that behaved differently would be two things to learn.
Verified rather than asserted: saved a profile through the store exactly as
the IPC handler builds it, then listed and **ran** it from the CLI, and
confirmed the file landed. Saved in the app, run from the terminal, one store.
The strip itself was screenshotted, including the mirror mark.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UeSWg1Czsb2Lwxj8vHUnA4
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.
sync_profileshas existed since the first migration, the CLI has driven it since the first release, andIPC.profilesSavehas been in the contract the whole time — with no handler behind it, and nothing in the window calling it.So the app could list profiles and delete them but could never make one. The feature was effectively invisible from the surface most people use.
Now
The strip above the two panes holds them: click one to restore its source, destination and options, Save this pair stores what is on screen, and the × deletes it.
Details worth reviewing
mirrormark on its chip. Loading something that turns Mirror on is not a thing to discover from the footer afterwards.trustDeletesis never set from the app. It is the one way a mirror runs without a human seeing the delete list first, so it stays a deliberate, out-of-band choice.The strip is deliberately the same shape as the Fleet view's command strip — chips to restore, an × to delete, one control to save. Two lists of saved things that behaved differently would be two things to learn.
Verified, not asserted
Saved a profile through the store exactly as the IPC handler builds it, then listed and ran it from the CLI, and confirmed the file landed:
The strip itself was screenshotted, including the mirror mark on the delete-enabled profile.
507 tests, typecheck and
pnpm smoke:desktopgreen.Pairs with #23 (saved fleet commands). Both are the same ask — "should be like connections in FileZilla, we can save them" — one for Fleet, one for rsync.
🤖 Generated with Claude Code
https://claude.ai/code/session_01UeSWg1Czsb2Lwxj8vHUnA4