Roadmap#
Priorities informed by a July 2026 survey of the SSH-manager landscape (Termius, XPipe, Tabby, sshs/wishlist, CtrlOps, Termix and the MCP-SSH ecosystem). Ordered by expected impact.
- ~~Published packages — PyPI release~~ Done (0.2.0):
pipx install hoploomis live on PyPI, and the Trusted-Publishing workflow (.github/workflows/publish.yml) automates future releases. Homebrew is published as a tap:brew install xiayh0107/tap/hoploom(xiayh0107/homebrew-tap), with the formula rendered byscripts/prepare_packagingfrom the sdist PyPI serves and built bybrew test-boton macOS and Linux (docs/packaging.md). winget is not planned: it installs a Windows installer, not a Python package, so a manifest would promise an install path nothing in this repo builds. - ~~Host-bound Agent Skills~~ Done (0.6.0): the local registry attaches one Skill to one or many saved hosts and resolves only the guidance in scope for the target hosts. The first version is deliberately local and explicit: it discovers installed Skills but never downloads or installs them.
- ~~Remote file workspace and transfer helpers~~ Done (0.7.0):
hoploom cp/get/putmove single files over the same SFTP path and vault credentials, the web browser gained explicit download and upload actions, and per-host saved working directories (hoploom path) let people and agents recall where the work happens. Also shipped:hoploom mountfor sshfs, gated behind adoctorcapability check because the FUSE layer cannot be installed for the user. Recursive transfer of a whole tree landed later as--recursive(0.10.0). - ~~Port forwarding profiles~~ Done (0.10.0): saved
-L/-R/-Dtunnels per server (hoploom tunnel add/open/close/status), opened as detached background ssh processes with status and teardown. Runtime state lives in the private runtime directory, not the database. - ~~Audit log~~ Done (0.10.0):
hoploom audit list [--json]appends one JSON object per event to a mode-600audit.logunder the private data directory:execandexec_result,revealandreveal_denied,connect,tunnel_openandtunnel_close. Credentials in a recorded command line are masked and a reveal is recorded by label, never by value. The log rotates itself (5 MiB, three segments, and reads span every segment). - ~~Git-friendly export~~ Done (0.10.0):
hoploom exportwrites a deterministic JSON document of hosts, saved directories and forwarding profiles (never secrets or credential ids; a host carries its credential label), andhoploom importpreviews by default, applies with--apply, and merges rather than replaces. - ~~Optional MCP wrapper~~ Done (0.10.0):
hoploom mcp servespeaks MCP over stdio with read-only inventory tools by default;test_hostneeds--allow-remoteandrun_commandneeds--allow-execplus one--allow-commandglob per shape. No reveal tool, argv-only commands, and acting calls are audited. The Skill remains the recommended path. - ~~Session logging for
connect~~ Done (0.10.0):hoploom connect ALIAS --logrecords a mode-600 transcript through a pty proxy, stripping control sequences and masking credential-shaped values. Only the display stream is recorded, so a password typed at a no-echo prompt never reaches the file. POSIX only. - ~~Mosh support~~ Done (0.10.0):
hoploom doctorreports amoshcapability row andhoploom connect ALIAS --moshruns a session that bootstraps over the managed config with host-key verification intact. The 0.9.0 Hosts details already render managed and externalProxyJumphops from the backend route. - ~~Local GeoIP~~ Done (0.10.0):
hoploom geo resolvefills a host's location from a local range file (SSM_GEOIP_CSV) or a local.mmdbwhen the optionalgeoip2package is installed — no web service, and never a lookup on a read path. A manual override is kept unless--overwrite. Desktop shell: not planned. The six-page Web UI already runs on loopback and can be wrapped by any browser or launcher, so a bundled Electron/Tauri shell would add a second toolchain and a second update path to reach the same page. That stays a non-goal, recorded here so the item is closed rather than forever pending.
Decisions (owner, 2026-10-21)#
Recorded so these stay decisions with a date and an owner, rather than an inherited default. Earlier revisions of this file listed the first two as "not planned" on the maintainer's engineering judgement; the owner has since decided otherwise and they are now in scope.
- Web UI for ports and audit — done (0.10.0). Read-only first: both views are GET-only, so a browser cannot start a trace or rewrite history. The budget concern that motivated the earlier "not planned" note did not hold: the pages are lazy chunks and cost 2.2 and 2.6 KiB gzip.
- MCP over HTTP — done (0.10.0). The stdio server stays the default; the
HTTP listener (
mcp serve --http) is for agents that cannot spawn a process. It is loopback-only, requires a bearer token, refuses browser origins, and applies the same allowlist policy and audit trail as stdio. - winget — not planned. winget installs a Windows installer, not a Python
package; a manifest would promise an install path nothing in this repo builds.
The supported Windows install is
install.ps1orpipx. - A bundled desktop shell — not planned. The six-page UI already runs on loopback and any browser can wrap it; a second toolchain would exist only to reach the same page. (Electron remains a non-goal.)
After 0.10#
Every numbered item above has shipped. Work since then, driven by issues:
- Safe password rotation — done (unreleased, issue #3).
hoploom credential rotate ALIASsaves a host's new login password only after a fresh password-only login with it succeeds; the server-side change stays the human's, andcredential edit --replace-secretis documented as the local-only edit it is. The first half of #3, managed port forwarding, shipped in 0.10.0 ashoploom tunnel. A Web UI flow for rotation is not built yet: the CLI holds the new password in one process from prompt to save, and a browser version would need a design that keeps that property across requests. - Several machines (issue #15). Answered by
export/import, which already moves hosts, saved directories and tunnels; import now says which credentials to create first. Secrets are not synced and will not be: they stay in each machine's OS keychain (see the non-goals).
Non-goals: cloud sync of secrets, telemetry, subscriptions, Electron.