Skip to content

Releases: mirivlad/sshkeeper

sshkeeper v0.3.2

Choose a tag to compare

@github-actions github-actions released this 18 Aug 11:18

Release automation and reproducible packaging. sshkeeper itself behaves exactly
as in v0.3.1 — no functional changes to the TUI or the CLI.

This is also the first release published by GitHub Actions rather than by hand.

In this release

Archives are now reproducible. Rebuilding a tag on a different machine used
to produce different checksums even when every packaged file was byte-identical,
because three host properties leaked into the archives:

Leak Effect
File modes followed the builder's umask umask 002 packaged 664/775, umask 022 packaged 644/755
sort orders entries by locale a ru_RU.UTF-8 host emitted docs/ before LICENSE, a C locale the reverse
zip stores DOS local time with no zone the same commit embedded 19:06 at UTC+08 and 11:06 at UTC

All three are pinned now. A build on ubuntu-latest and one on a workstation
with a different umask, locale and timezone produce identical checksums for all
five archives. The binaries were always reproducible; only the packaging varied.

CI. The repository previously had no automation. It now runs gofmt,
go vet and go test on Linux and macOS for every push and pull request,
plus a cross-build of all five release targets. macOS is a stated release
target that until now was only ever cross-compiled, never tested.

Releases are automated. Pushing a v* tag runs the release checks, builds
through the same release.sh used locally, and publishes. Nightly builds from
main are published as a separate nightly prerelease, so the Latest badge
always points at a real release.


Everything since v0.2.0

Breaking change: full help moved off F1

Ctrl+H opens full help. F1 no longer has any binding. ? still opens
contextual quick help outside text editors. This landed in v0.3.0.

Ctrl+H is the BS control character (0x08). xterm and most modern emulators
send DEL (0x7F) for Backspace, so help and text editing do not collide. A
terminal configured to send BS for Backspace cannot tell them apart; switch it
to DEL (in xterm, backarrowKey: false).

Nothing else requires action when upgrading. Vaults, server profiles and stored
port forwards are unchanged, and no migration runs.

The TUI was rebuilt around one shell (v0.3.0)

In v0.2.0 only the server dashboard had a real layout. Other screens rendered
free-form strings or the default Bubbles list frame, so they had no shared
width budget, no borders, and footers that floated wherever the content ended.

Every full-screen state now shares one contract: a header with breadcrumb and
truthful vault status, a separator, framed content panels, and a contextual
footer anchored to the last terminal row.

  • Actions, search, tag input, confirmations and both help screens render inside
    the shell.
  • The port forward manager and editor use framed, width-budgeted layouts. Column
    widths derive from the panel's inner width, so no row consumes the terminal's
    last column.
  • Tag, command template, template picker/mode/results and tunnel managers use
    framed lists with a > selection marker, so selection never depends on colour
    alone.
  • Server and template editors use a framed form panel with the title moved into
    the breadcrumb. Required markers, validation and dirty-state confirmation are
    unchanged.

Responsive layouts. The supported floor is 60x16. Wide (100+ columns)
shows two panels, medium (70–99) stacks them, narrow (60–69) keeps a single
compact panel. Below the floor only the minimum-size message renders. Long
ASCII, Cyrillic, CJK, combining and emoji content truncates by display cells
rather than byte count.

Safety. Destructive actions confirm with Cancel selected first and name the
exact target and its consequence. Status and help context stay truthful to
actual vault and connection state. Form validation prevents silent loss of
edits.

forward add was completely broken (fixed in v0.3.1)

sshkeeper forward add could never succeed in v0.2.0 or v0.3.0. The command
read --local-port and marked it required, but the flag was never registered,
so cobra rejected it as unknown and the value fell back to 0:

$ sshkeeper forward add web --type local --local-port 15432 \
    --remote-addr 127.0.0.1 --remote-port 5432
unknown flag: --local-port

No combination of arguments worked. Both documented forms work now:

$ sshkeeper forward add web --name "Local PostgreSQL" --type local \
    --local-port 15432 --remote-addr db01.internal.example.com --remote-port 5432
✓ Forward added [1]

$ sshkeeper forward add web --name "SOCKS proxy" --type dynamic --local-port 1080
✓ Forward added [2]

Omitting the flag now reports required flag(s) "local-port" not set instead of
a misleading port-range error. The TUI (Ctrl+W) was never affected.

The command's tests had constructed their own throwaway cobra command and
registered the flags by hand, so the real command's registration was never
exercised and the suite passed against a broken command. Coverage now parses
argv into the actual command. An audit of every other command found no further
flag that is read but never registered.

Also fixed since v0.2.0

  • Port forward fields accept digits correctly (10bcc07).
  • Platform and repository status are stated accurately in the docs: Linux and
    macOS are primary release targets, Windows is experimental.

Release-by-release

Version Contents
v0.3.0 Unified TUI shell, responsive layouts, F1Ctrl+H
v0.3.1 forward add fix
v0.3.2 Reproducible packaging, CI, automated releases

Install

tar -xzf sshkeeper_v0.3.2_linux_amd64.tar.gz
sudo install -m 0755 sshkeeper_v0.3.2_linux_amd64/sshkeeper /usr/local/bin/sshkeeper

Verify downloads against checksums.txt. Linux and macOS are the primary
release targets; the Windows build is experimental and needs OpenSSH Client
available as ssh.exe on PATH.

To verify a build yourself, check out the tag and run ./release.sh v0.3.2
the checksums should match this release exactly, given the same Go version.

sshkeeper v0.3.1

Choose a tag to compare

@mirivlad mirivlad released this 18 Aug 10:47

Bug-fix release. No TUI or behaviour changes beyond the fix below.

Fixed: forward add was unusable from the CLI

sshkeeper forward add could never succeed. The command read --local-port
and marked it required, but the flag was never registered, so cobra rejected it
as an unknown option and the value fell back to 0:

$ sshkeeper forward add web --name "Local PostgreSQL" --type local \
    --local-port 15432 --remote-addr 127.0.0.1 --remote-port 5432
unknown flag: --local-port

$ sshkeeper forward add web --name "Local PostgreSQL" --type local \
    --remote-addr 127.0.0.1 --remote-port 5432
invalid local port 0: must be 1-65535

No combination of arguments worked. Both forms now behave as documented:

$ sshkeeper forward add web --name "Local PostgreSQL" --type local \
    --local-port 15432 --remote-addr db01.internal.example.com --remote-port 5432
✓ Forward added [1]

$ sshkeeper forward add web --name "SOCKS proxy" --type dynamic --local-port 1080
✓ Forward added [2]

Omitting the flag now produces required flag(s) "local-port" not set instead
of the misleading port-range error.

This affects v0.2.0 and v0.3.0. If you script port forwards, upgrade. The
TUI (Ctrl+W) was never affected, and stored forwards are untouched — this is
purely a CLI argument-parsing fix, so no migration is needed.

Why it went unnoticed

The command's tests constructed their own throwaway cobra command, registered
the flags on it by hand, and passed that to the real RunE. The actual
command's flag registration was therefore never exercised, and the tests passed
against a completely broken command. This release adds coverage that parses
argv into the real command's own flag set, plus a check pinning the required
annotation; both fail against the unfixed code with unknown flag: --local-port. An audit of the remaining commands found no other flag that is
read but never registered.

Install

tar -xzf sshkeeper_v0.3.1_linux_amd64.tar.gz
sudo install -m 0755 sshkeeper_v0.3.1_linux_amd64/sshkeeper /usr/local/bin/sshkeeper

Verify downloads against checksums.txt. Linux and macOS are the primary
release targets; Windows is experimental.

sshkeeper v0.3.0

Choose a tag to compare

@mirivlad mirivlad released this 18 Aug 10:37

sshkeeper v0.3.0 brings every TUI screen up to the standard of the server
dashboard, and moves full help off F1.

Changed key binding

Ctrl+H now opens full help. F1 no longer has any binding. ? still
opens contextual quick help outside text editors.

Ctrl+H is the BS control character (0x08). xterm and most modern emulators
send DEL (0x7F) for Backspace, so help and text editing do not collide. A
terminal configured to send BS for Backspace cannot tell the two apart; switch
it to DEL (in xterm, backarrowKey: false).

Unified screen shell

Every full-screen state now shares one vertical contract: a header with
breadcrumb and truthful vault status, a separator, framed content panels, and a
contextual footer anchored to the last terminal row. Screens no longer render
free-form strings or the default Bubbles list frame.

  • Actions, help, search, tag input and confirmations render inside the shell.
  • Port forward manager and editor use framed, width-budgeted layouts; column
    widths derive from panel inner width, so no row consumes the last column.
  • Tag, command template, template picker/mode/results and tunnel managers use
    framed lists with a > selection marker that does not rely on colour alone.
  • Server and template editors use a framed form panel with the title moved into
    the breadcrumb; required markers, validation and dirty-state confirmation are
    unchanged.

Responsive layouts

Supported floor is 60x16. Wide (100+ columns) shows two panels, medium
(70-99) stacks them, narrow (60-69) keeps a single compact panel. Below the
floor only the minimum-size message renders. Long ASCII, Cyrillic, CJK,
combining and emoji content truncates by display cells.

Safety and correctness

  • Destructive actions confirm with Cancel selected first, naming the exact
    target and its consequence.
  • Status and help context stay truthful to actual vault and connection state.
  • Port forward fields accept digits correctly.
  • Form validation and edit protection prevent silent loss of changes.

Verification

go test ./... and go vet ./... pass. Layout coverage renders every value of
the screen enum at 120x40, 80x24 and 60x16 and asserts ANSI-aware display
width, exact height, border presence and bottom-anchored footer. Runtime checks
in a real xterm confirm Ctrl+H opens help while Backspace still edits text.

Install

tar -xzf sshkeeper_v0.3.0_linux_amd64.tar.gz
sudo install -m 0755 sshkeeper_v0.3.0_linux_amd64/sshkeeper /usr/local/bin/sshkeeper

Verify downloads against checksums.txt. Linux and macOS are the primary
release targets; Windows is experimental.

Known issue

sshkeeper forward add cannot be used from the CLI: the --local-port option
was never registered on the command, so every invocation fails with
invalid local port 0. This also affects v0.2.0. Port forwards can be managed
from the TUI (Ctrl+W) in the meantime.

sshkeeper v0.2.0

Choose a tag to compare

@mirivlad mirivlad released this 06 Jun 03:02

sshkeeper v0.2.0

Release artifacts:

  • Linux: linux/amd64 and linux/arm64 tar.gz
  • macOS: darwin/amd64 and darwin/arm64 tar.gz
  • Windows: windows/amd64 zip, experimental

Platform status:

  • Primary target: Linux
  • macOS builds require the system ssh client
  • Windows build is experimental and requires OpenSSH Client available as ssh.exe in PATH

Verify downloads with:
sha256sum -c checksums.txt