A tool people run against every host they touch earns the obvious questions up front. This is the threat model: what hi does and deliberately doesn’t, what runs where, what it leaves behind, where the trust boundaries sit, and how to report what slipped through.
hi only execs the transports you
already use (ssh, docker exec, podman exec, nomad alloc exec,
kubectl exec) against a target you named. No telemetry, no update
checks, no curl/wget anywhere in the shipped tree.curl | bash. Installing is git clone plus
scripts/install.sh, or a distro package (deb/rpm/apk, AUR, Homebrew)
built from that same script. hi --update is git pull in a checkout
you can read.$_HI_PAYLOAD at the top of hi.sh (common misc shells load.sh) -
docs, tests, CI and editor config never leave the client. Your overlay
(settings.sh, colors, packages from ~/.config/hi.d/) is a
second, smaller allow list.hi.sh runs on the client: it parses arguments, picks the backend, tars
and armors the payload, and pipes it over the transport. On the target, a
single sh unpacks it into a temp directory and chainloads load.sh,
which prints the header, grafts hi’s marker-delimited blocks onto the
host’s rc files, and hands off to the best shell available. Everything
the target executes was generated on the client.
mktemp -d directory (mode 0700, named
<user>.hi.XXXXXX); the ssh bootstrap directory is created with
mkdir -m 700.trap 'rm -rf $_HI_CLEANUP' exit, and load.sh’s own on-exit hook.
tests/targets/ssh_disconnect_test.sh verifies cleanup fires on an
abrupt disconnect, not just a clean exit.# hi-config-start and # hi-config-end
markers and are stripped back out by that same on-exit hook.~/hi.d (you ran scripts/install.sh
there) is used in place and nothing is deleted; the rc grafts are
still cleaned on exit. That permanent tree never needs to be writable
by you - root-owned, package-manager-installed copies work, because
your config lives in ~/.config/hi.d/.install.sh validates your existing rc files with each
shell’s own syntax checker before touching them, and --uninstall
removes exactly what install wrote.settings.sh, colors,
packages) as public to every host you visit. Nothing a target sends
back is ever executed on the client - the one string hi reads back
(the probe for an existing ~/hi.d) is only interpolated into the
script sent back to that same target. Escape sequences in session
output remain possible, exactly as with plain ssh.~/.ssh/config and your
docker/podman/nomad/kubectl CLIs - the same ones you already
run by hand.There is no tagged release yet: the supported version is the tip of
main. Once v1.0 is tagged, this section becomes a version table, with
the latest release supported.
Please don’t open a public issue for anything exploitable. Instead, either: