0.13.0 — 2026-06-26
Release Notes
Mixed cycle. One deps swap (G1 toml_edit removal) takes another
chunk off the binary, and two UX gaps from v0.10 / v0.12 close
out (G2 preview Forwarding section, G3 doctor's
ProxyCommand %h/%p/%r substitution). README + README.ko
caught up to four pieces of v0.8-v0.12 surface that hadn't been
documented.
Added
-
Preview panel shows typed Forwarding summary + first entry
(G2). v0.10 G1 promoted the three*Forwarddirectives to
typed Vec; v0.12 R3 made them editable through a list
modal. The v0.6 preview pane never caught up — Forwarding
configuration was invisible until you opened the form. v0.13
G2 adds:Forward: L:2 R:1 D:0 8080 localhost:80Local / Remote / Dynamic counts on one row, first entry on
the next so the panel shows content, not just a count.
Section is omitted entirely when every Vec is empty
(no row, no blank line gap) — same shape as the existing
Extra handling. -
doctorsubstitutes%h/%p/%rin ProxyCommand
tokens before walking PATH (G3). v0.10 G4 surfaced
"ProxyCommand binary not on PATH" but skipped any token
containing%or$. The most common shape —
ProxyCommand nc %h %por
ProxyCommand corp-helper %h %p— fell exactly into that
skip, so the check passed silently when it should have
fired. v0.13 G3 narrows the skip:$still skips (shell variables — we don't shell out).%h/%p/%rget substituted from the host's typed
fields (with sensible fallbacks: alias for hostname,
"22" for port,$USER/$USERNAME/ "user" for user).
%%becomes a literal%.- After substitution, if any
%is still in the token
(anything we don't model —%C,%u,%L) we skip.
Modelling the full OpenSSH substitution set would creep
into anti-feature 5 (completeconfig(5)parser); the
three we cover are the ones that actually appear in real
ProxyCommand strings.
Changed
-
toml = "0.5"(dropstoml_edittransitive) (G1).
cargo bloat on v0.12.0 rankedtoml_editat 167 KiB of
.text— 11.7% of the binary — and v0.10 G1 / v0.12 R3
showed sshc never needs format-preservation (state.toml is
rewritten from scratch every save). Going back to
toml = "0.5"(pre-toml_editsplit) drops the whole
format-preserving layer.Measured impact on macOS arm64 release binary:
Phase Bytes Δ vs prior v0.12.0 (master) 2,729,456 — v0.13.0 (after toml swap) 2,470,688 −258,768 (−9.5%) cargo-dist artifact (per-platform .tar.xz / .zip) deltas
vs v0.12.0 land at tag-push time and are reported in the
GitHub Release notes.One internal schema reorder accompanied the swap:
MemorySection::sort_axis(scalar) moved BEFORE
recent: Vec<RecentEntry>(array of tables). toml 0.5
enforces the TOML spec's "scalar fields before tables"
rule; toml 0.8's format-preserving emitter had silently
reordered when v0.12 G3 appended sort_axis after recent.
#[serde(default)]on every field means existing v0.12
state.toml files load cleanly regardless of where their
keys land. -
README + README.ko: four gap fixes (R1).
- Windows ARM64 (
sshc-aarch64-pc-windows-msvc.zip) artifact
added to the Windows install section — it's been shipping
since v0.8 but was undocumented. - Hero / 소개 paragraph quotes the v0.12.0 measured release
sizes (macOS arm64 ~810 KB, Linux x64 ~1.16 MB, Windows
x64 ~1.10 MB) so the "small single binary" claim has
concrete numbers. - Form section splits IdentityFile multi-value into its own
paragraph and adds the in-modal keymap table covering
Shift+↑/↓ reorder + the IdentityFile candidate cycle
that lives in edit mode. vkeymap row rewritten to clarify it opens the
resolvedssh -G <alias>output for debugging
Include / Match ordering — the v0.6 wording sounded like
sshc was validating the alias itself.
- Windows ARM64 (
Internal
substitute_known(token, host) -> Option<String>helper
isolates the OpenSSH-style marker substitution. Returns
Noneon any unknown%xso the caller cancontinue
without branching on the string contents. Five new tests.- Two new preview tests (
renders_with_multi_forwarding_*/
renders_without_forwarding_omits_section) +
render_text(term)test-helper that walks the TestBackend
buffer into aStringfor substring assertions. - toml downgrade: a one-line Cargo.toml change. No
src/state/mod.rsAPI surface moved —from_strand
to_string_prettyare stable from 0.5 onwards.
Migration
- state.toml: no migration.
#[serde(default)]on every
field means missing keys (and reordered keys) load
cleanly. - v0.13 binaries running on a v0.12 state.toml file will
pick up the v0.12sort_axisvalue verbatim; the next
save reorders the keys so the file conforms to toml 0.5's
scalar-before-table requirement.
Out of scope (carried into v0.14+)
- nucleo_matcher → smaller fuzzy (69 KiB candidate).
- ureq surface trim (118 KiB candidate; v0.9 R7 already did
the rustls→native-tls win). - K/J as Shift+↑/↓ reorder alias.
- Help modal Shift+↑/↓ + S persistence note.
- doctor:
SSHC_NO_OSC52+ Wayland-no-display hint.
Install sshc 0.13.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/hang-in/sshc/releases/download/v0.13.0/sshc-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/hang-in/sshc/releases/download/v0.13.0/sshc-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install hang-in/tap/sshcDownload sshc 0.13.0
| File | Platform | Checksum |
|---|---|---|
| sshc-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sshc-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sshc-aarch64-pc-windows-msvc.zip | ARM64 Windows | checksum |
| sshc-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sshc-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sshc-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |