Skip to content

feat(desktop): save a transfer as a profile, from the app - #24

Merged
ralyodio merged 1 commit into
mainfrom
feat/transfer-profiles
Aug 30, 2026
Merged

feat(desktop): save a transfer as a profile, from the app#24
ralyodio merged 1 commit into
mainfrom
feat/transfer-profiles

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

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.

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

  • Loading a profile sets Mirror to whatever it 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 × 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 CLI lists it ---
  NAME          SOURCE            DESTINATION       PRESET     MODE
  from-the-app  .../prof-src/     .../prof-dst/     fast-sync  sync

--- the CLI runs it ---
  destination now holds: ["one.txt"]

PASS: saved in the app, run from the CLI

The strip itself was screenshotted, including the mirror mark on the delete-enabled profile.

507 tests, typecheck and pnpm smoke:desktop green.

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

`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
@ralyodio
ralyodio merged commit 19dc75b into main Aug 30, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant