Skip to content

Connect to ssh_config hosts, and a logo you can actually see - #11

Merged
ralyodio merged 2 commits into
mainfrom
worktree-fix-ssh-config-connections
Aug 30, 2026
Merged

Connect to ssh_config hosts, and a logo you can actually see#11
ralyodio merged 2 commits into
mainfrom
worktree-fix-ssh-config-connections

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

The remote pane never worked

Reported as: the app opens, but the right pane won't connect to any server — "could not read this directory", "that connection no longer exists".

The server picker offers two kinds of host: saved connections, and hosts read from ~/.ssh/config. The latter are deliberately never persisted (sshConfigConnections() mints them with an ssh-config:<alias> id). But every remote operation resolved that id with db.findConnection(), which only ever sees saved rows — so selecting an ssh_config host threw That connection no longer exists. and the pane fell back to "Could not read this directory".

On a machine with no saved connections, that is every server in the list, which is exactly what it looked like from the outside.

Six call sites were affected: fs:listRemote, fs:mkdirRemote, fs:renameRemote, fs:deleteRemote, connections:test, and transfers (endpoint resolution, shell options, and the source connection's rsyncPath).

The fix

A single resolveConnection() in electron/main/services/connections.ts: database first, falling back to the ssh_config list for an ssh-config: id. Saved rows still win, so importing a host and then editing it is not undone by the file it came from.

Verified end to end against a real ssh_config host, over the same SshSessionSftpBrowser path the pane uses: ssh-config:dev resolves and lists 219 entries. Five new unit tests cover ssh_config-only resolution, saved-row precedence, saved ids, a deleted id, and a host that has since left the file.

Logo at 150px

The desktop lockup was 22px tall (~66px wide). It is now 150px wide, with the header growing 52px → 72px so the 3:1 lockup has room above and below. The site's came down from 240px to the same 150px so the two surfaces match.

Verified in a headless render of the real export under the app's real CSP, both themes: header 72px, logo 150×50, 11px clear top and bottom, no CSP refusals.

Checks

  • pnpm test — 271 passed, 26 files
  • pnpm typecheck — clean across every package and app
  • pnpm build:renderer and the web next build both succeed

🤖 Generated with Claude Code

https://claude.ai/code/session_01GTQ3RzTAey9nT6r1kbGBCd

ralyodio and others added 2 commits August 30, 2026 06:48
The server picker offers saved connections *and* hosts read from
~/.ssh/config, which are deliberately never persisted. But every remote
operation resolved its id with db.findConnection(), which only ever sees
saved rows — so selecting an ssh_config host threw "That connection no
longer exists." and the pane rendered "Could not read this directory".

On a machine with no saved connections that was every server in the list,
which is exactly what it looked like from the outside: the remote pane
simply did not work.

Both lookups now go through resolveConnection(), which falls back to the
ssh_config list for an `ssh-config:` id. Saved rows still win, so
importing a host and then editing it is not undone by the file it came
from. Fixes browsing, mkdir, rename, delete, test and transfers alike.

Verified end to end against a real ssh_config host: `ssh-config:dev`
resolves and lists its home directory over the same SFTP path the pane
uses.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTQ3RzTAey9nT6r1kbGBCd
The desktop lockup was 22px tall, about 66px wide — small enough to read
as a favicon rather than a brand. It is now 150px wide, and the header
grows from 52px to 72px so the 3:1 lockup sits in it with room above and
below rather than touching the border.

The site's was 240px (w-60); it comes down to the same 150px so the two
surfaces match.

Verified in a headless render of the real export, under the app's real
CSP, in both themes: header 72px, logo 150x50, 11px clear top and bottom,
no CSP refusals. The site's build emits width:150px.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTQ3RzTAey9nT6r1kbGBCd
@ralyodio
ralyodio merged commit 0f5b439 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