What runs on your server
Holdwire by Jiji Labs · PT JIJI LABS DIGITAL · facts for helper version 0.4.0
The short version:
- One small program,
holdwired, in~/.holdwirein your home folder. Nothing else is installed. - It runs as your own user. No root, no
sudo, no service. - It opens no port. It listens on a local socket that only you can use.
- It makes no outbound network connection, unless you turn on agent alerts in the app.
- You can remove it with three commands. Its source will be published under FSL-1.1-ALv2, a source-available licence (see below).
What holdwired is
holdwired is the session keeper behind Holdwire. Your shell runs inside it, so the shell keeps running when your iPhone sleeps, loses signal or closes the app. It remembers the most recent output (up to 1 MB per session, in memory) and replays what you missed when the app reconnects over your normal SSH login. It is one static program for Linux, macOS and Windows (Intel and ARM builds). The first time you connect, the app offers to copy it to your server over that SSH login; you can turn this off per server with “Keep sessions alive”.
How it runs
- Each time the app connects, it starts one short-lived
holdwired attachover SSH. It copies bytes between the SSH channel and a local socket and exits when the SSH connection ends. - Each session has one background process,
holdwired serve, started by the first attach in its own process session so it outlives your SSH login. It owns a terminal and your login shell. - Everything runs as your user. It needs no root,
sudo, setuid bit, cron job, systemd unit or launchd entry, and it does not create any.
Where it keeps files
Only under ~/.holdwire (Windows: %USERPROFILE%\.holdwire):
| Path | What it is |
|---|---|
bin/holdwired | the program itself |
run/<session>.sock, .lock, .json | for each live session: a socket, a lock, and a small JSON file (session id, process id, start time) |
alerts.json | only if you turn on agent alerts: the relay address, a route id and secret, the encryption key and your alert preferences (mode 0600) |
If your home path is very long, the run folder moves to $TMPDIR/holdwire-<uid> (mode 0700). Session output is held in memory only; the helper never writes it to disk. Your shell keeps its own history file as usual.
Network
- No open port. The session process listens on a Unix socket only (
~/.holdwire/run/<session>.sock; folder mode 0700, socket mode 0600, owned by you). On Windows it is an AF_UNIX socket in your profile. Nothing listens on TCP or UDP. - No outbound connection by default. No update check, no telemetry, no crash reports, no analytics.
- Only if you turn on agent alerts in the app does
alerts.jsonexist. Then, and only then, the helper may send HTTPS requests to the one relay address in that file, with an end-to-end encrypted payload that only your phone can read. Without that file, or for any other host, the code refuses. Turning alerts off deletes the file. See the Privacy Policy for what the relay sees. - The source includes tests that check these rules: the helper’s dependencies contain no HTTP or TLS client except in the alert sender, and a running session holds no internet socket.
What it does not do
- It never sees your SSH keys or passwords; they stay on your phone.
- It runs the commands you type and nothing else.
- It watches your sessions for a terminal bell, a desktop-notification code, a finished command or a program waiting for input, so the app can tell you. It reads only terminal settings and process names, never command lines or output beyond those signals.
Who can reach a session
| Who | Can they reach it? |
|---|---|
| Another user on the same machine | No. The run folder and socket are private to you and checked to be owned by you. |
| Someone on the network | No. There is no network listener. They would first need your SSH login. |
| Root on the machine | Yes, as always. Holdwire does not defend against the machine’s own administrator. |
| Anyone holding your SSH credentials | Yes. They could start a shell anyway, so protect your keys. |
| A malicious program running as you | Yes. It could connect to your socket. That is the same trust boundary as your own shell. |
When sessions end
A session ends when its shell exits, when you stop it, when the server restarts, or after 30 days with no client attached. Output kept for resuming lives in memory until the session ends.
Remove it completely
Linux and macOS:
~/.holdwire/bin/holdwired list
~/.holdwire/bin/holdwired kill --session ID
rm -rf ~/.holdwireRun list to see sessions still running, kill once for each of them, then delete the folder. Windows (PowerShell):
.\.holdwire\bin\holdwired.exe list
.\.holdwire\bin\holdwired.exe kill --session ID
Remove-Item -Recurse -Force $env:USERPROFILE\.holdwireRun these from your home folder. Nothing else on the machine was changed, so there is nothing more to undo. If you edited an agent’s settings through a Holdwire alert hook, remove that hook first with holdwired remove-hook.
Licence and source
The helper is licensed under the Functional Source License 1.1 with an Apache 2.0 future licence (FSL-1.1-ALv2), copyright PT JIJI LABS DIGITAL. That is a source-available licence, not an open-source one at first: you may use, modify and redistribute it for any purpose except offering a competing product or service, and each version becomes plain Apache-2.0 two years after it is released. The Holdwire app itself is not under this licence. Its dependencies and their notices ship with the source.
Source repository: coming with the 1.0 release. There is no public link yet.
SHA-256 of the helper builds
These are the hashes of helper 0.4.0 built from the current source. Build it yourself with helper/build.sh once the repository is public and compare. We have not verified that every machine and Go version produces identical bytes, so a mismatch on another setup does not by itself mean something is wrong. Signed releases are not available yet.
These are the SHA-256 hashes of helper version 0.4.0, built from source with helper/build.sh (Go, -trimpath, no cgo).
| File | SHA-256 |
|---|---|
holdwired-darwin-amd64 | 981ef753e03098ed2b8a8ef0945c6b9ed21161b462b423b9a0d007c7c695f689 |
holdwired-darwin-arm64 | 51ec216e58083baf59a774564b4760247960b29d2a8d3ed75faa8340fce61e2f |
holdwired-linux-amd64 | 3d5e3cd740d353aacd0e8b206a4abad9c1557a54e5b9b2d5972fe2353d0fbcbd |
holdwired-linux-arm64 | ad15577bbcea4d322e8ddf97f4f40cc4b82c32a6148e78d672eda48b48031f26 |
holdwired-windows-amd64.exe | 7adf25d0bbb749b409aefe4fdec913681e8ca44394ac806942883565fa6cf4b0 |
holdwired-windows-arm64.exe | c01c3f4aeff69ddc76f34cf80e9fc5434df469d153ef91fc2d94ed21a1d36d33 |
Questions
Write to support@jijilabsdigital.com.