@jbaehova/onthego 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,14 +1,51 @@
1
- # ONTHEGO
2
-
3
- Move your unfinished work and your coding-agent conversations between your desktop, laptop, and VPS with one command.
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/peerproblem/onthego/main/assets/onthego-hero.png" alt="Start on your desktop. Finish on your laptop. onthego moves your uncommitted work and your Codex and Claude Code sessions to your other machine." width="100%">
3
+ </p>
4
+
5
+ <h3 align="center">Start on your desktop. Finish on your laptop.</h3>
6
+
7
+ <p align="center">
8
+ onthego copies your uncommitted work and your Codex and Claude Code sessions<br>
9
+ to your other machine. Then you pick up the same session there.
10
+ </p>
11
+
12
+ <p align="center">
13
+ <a href="https://www.npmjs.com/package/@jbaehova/onthego"><img alt="npm" src="https://img.shields.io/npm/v/%40jbaehova%2Fonthego?style=flat-square&color=1d1d1f&label=npm"></a>
14
+ <a href="https://github.com/peerproblem/onthego/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/peerproblem/onthego/ci.yml?branch=main&style=flat-square&label=ci"></a>
15
+ <img alt="macOS and Linux" src="https://img.shields.io/badge/macOS%20%2B%20Linux-1d1d1f?style=flat-square">
16
+ <img alt="No account, no server" src="https://img.shields.io/badge/no%20account%2C%20no%20server-0071e3?style=flat-square">
17
+ <a href="LICENSE"><img alt="MIT license" src="https://img.shields.io/badge/license-MIT-1d1d1f?style=flat-square"></a>
18
+ </p>
19
+
20
+ <p align="center">
21
+ <a href="https://peerproblem.github.io/onthego/"><b>Website</b></a>
22
+ &nbsp;&nbsp;/&nbsp;&nbsp;
23
+ <a href="#quick-start"><b>Quick start</b></a>
24
+ &nbsp;&nbsp;/&nbsp;&nbsp;
25
+ <a href="docs/tailscale.md"><b>Tailscale</b></a>
26
+ &nbsp;&nbsp;/&nbsp;&nbsp;
27
+ <a href="docs/releases/0.4.1.md"><b>What's new</b></a>
28
+ </p>
29
+
30
+ <br>
4
31
 
5
32
  ```sh
33
+ npm install -g @jbaehova/onthego
6
34
  onthego sync laptop
7
35
  ```
8
36
 
9
- ONTHEGO carries a Git project exactly as you left it: staged, unstaged, and untracked work, plus the project's Codex CLI and Claude Code sessions, so you can `codex resume` or `claude --resume` on the other device and keep going. Each device keeps its own Git settings, hooks, `node_modules`, caches, and agent logins.
37
+ That's the whole idea. Staged, unstaged, and untracked work arrives exactly as you left it, together with this project's agent sessions. On the other device, run `codex resume` or `claude --resume` and keep talking.
38
+
39
+ ## How it works
10
40
 
11
- It is a small open-source CLI (MIT). There is no account, no hosted service, and no AI feature. Your devices talk to each other directly over SSH, optionally through [Tailscale](#anywhere-with-tailscale).
41
+ | | |
42
+ | :-- | :-- |
43
+ | **Capture** | Staged, unstaged, and untracked files, plus this project's recent agent sessions. Your `.env` stays put. |
44
+ | **Encrypt** | Each handoff is encrypted for the receiving device and signed by the sender. |
45
+ | **Send** | Over your own SSH. Same Wi-Fi, Tailscale, or a VPS. No account, no relay. |
46
+ | **Resume** | Run `codex resume` or `claude --resume` on the other machine. Same conversation. |
47
+
48
+ Your Git history stays clean, with no "wip" commits. `node_modules`, caches, Git config, hooks, and agent logins stay on each machine.
12
49
 
13
50
  ## Install
14
51
 
@@ -16,98 +53,102 @@ It is a small open-source CLI (MIT). There is no account, no hosted service, and
16
53
  npm install -g @jbaehova/onthego
17
54
  ```
18
55
 
19
- The npm package ships native binaries for macOS and Linux (arm64 and amd64). Git and OpenSSH are required; Node.js is only needed for npm itself.
56
+ Ships native binaries for macOS and Linux (arm64 and amd64). Requires Git and OpenSSH.
57
+
58
+ <details>
59
+ <summary><b>Other ways to install</b></summary>
60
+ <br>
20
61
 
21
- On a server without Node.js:
62
+ **Without Node.js** (servers, minimal machines). Downloads the release binary, verifies its SHA-256 checksum, and installs to `~/.local/bin`:
22
63
 
23
64
  ```sh
24
65
  curl -fsSL https://raw.githubusercontent.com/peerproblem/onthego/main/install.sh | sh
25
66
  ```
26
67
 
27
- The script downloads the release binary for the machine, verifies its SHA-256 checksum, and installs it to `~/.local/bin`. Pass `-s -- --version 0.4.0` for a specific version.
28
-
29
- You usually do not need to install it on the other devices by hand: `onthego device add <name> --install` copies the exact same version over SSH.
30
-
31
- <details>
32
- <summary>Build from source</summary>
68
+ **From source** with Go 1.26 or newer:
33
69
 
34
70
  ```sh
35
- git clone https://github.com/peerproblem/onthego.git
36
- cd onthego
37
- make build # Go 1.26 or newer
38
- install -m 755 dist/onthego ~/.local/bin/onthego
71
+ git clone https://github.com/peerproblem/onthego.git && cd onthego
72
+ make build && install -m 755 dist/onthego ~/.local/bin/onthego
39
73
  ```
40
74
 
41
75
  </details>
42
76
 
77
+ You only install it once by hand. `onthego device add <name> --install` copies the exact same version to your other devices over SSH.
78
+
43
79
  ## Quick start
44
80
 
45
- On your desktop, inside a Git project:
81
+ **1. On your desktop**, inside a Git project:
46
82
 
47
83
  ```sh
48
- onthego init # once per project; commit .onthego.yaml
84
+ onthego init # once per project; commit .onthego.yaml
49
85
  onthego device add laptop --host me@laptop.local --install
50
86
  onthego sync laptop
51
87
  ```
52
88
 
53
- Then on the laptop:
89
+ **2. On the laptop**, continue where you stopped. The handoff prints the exact commands:
54
90
 
55
91
  ```sh
56
- cd ~/projects/my-app # the same home-relative path by default
57
- codex resume <session-id> # or: claude --resume <session-id>
92
+ cd ~/projects/my-app
93
+ codex resume <session-id> # or: claude --resume <session-id>
58
94
  ```
59
95
 
60
- The handoff prints the exact `cd` and resume commands. When you are back at the desktop, run `onthego sync laptop` again: the desktop knows it handed the work off, so it pulls the laptop's changes back.
96
+ **3. Back at the desktop**, bring the work home:
61
97
 
62
- `sync` picks the direction for you:
98
+ ```sh
99
+ onthego sync laptop
100
+ ```
63
101
 
64
- | Situation | What `sync` does |
65
- | --- | --- |
66
- | The project is not on the other device yet | push |
67
- | Only this device changed since the last handoff | push |
68
- | Only the other device changed | pull |
69
- | You handed the work off and have not touched it since | pull (take it back) |
70
- | Nothing changed | nothing |
71
- | Both sides changed | stops, and tells you to choose `push --replace` or `pull --replace` |
102
+ > [!TIP]
103
+ > Run every command from the device that can reach the other one. A laptop that can reach a VPS can both send work to it and bring work back, so the VPS never needs to reach the laptop.
72
104
 
73
- Nothing is ever merged silently. Whenever a handoff replaces work, the replaced state is kept as a Git backup that `onthego undo` restores. Use `onthego sync laptop --dry-run` to see the decision first, or `push` and `pull` to choose the direction yourself.
105
+ ## How `sync` decides
74
106
 
75
- ## Connecting your devices
107
+ <p align="center">
108
+ <img src="https://raw.githubusercontent.com/peerproblem/onthego/main/assets/onthego-sync-decision.png" alt="sync pushes when only this side changed, pulls when only the other side changed, and stops when both changed" width="100%">
109
+ </p>
76
110
 
77
- ONTHEGO uses your normal SSH setup (`~/.ssh/config`, keys, `known_hosts`). The only requirement is that one device can `ssh` into the other without a password prompt. **Run every command from the device that can reach the other one.** A laptop that can reach a VPS can both push to it and pull from it, so the VPS never needs to reach the laptop.
111
+ `sync` compares both sides with their last handoff and only moves work away from the side that has not changed.
78
112
 
79
- `onthego doctor laptop` checks the whole chain: SSH, the remote onthego version, and the pinned identity.
113
+ | Situation | `sync` does |
114
+ | :-- | :-- |
115
+ | The project is not on the other device yet | **push** |
116
+ | Only this device changed | **push** |
117
+ | Only the other device changed | **pull** |
118
+ | You handed the work off and have not touched it since | **pull**, to take it back |
119
+ | Nothing changed | nothing |
120
+ | Both sides changed | **stops** and asks you to pick `push --replace` or `pull --replace` |
80
121
 
81
- ### Same network
122
+ Nothing is merged behind your back. Whenever work is replaced, the previous state is kept as a Git backup that `onthego undo` restores. Preview any decision with `onthego sync laptop --dry-run`, or choose the direction yourself with `push` and `pull`.
82
123
 
83
- 1. Enable SSH on the receiving device.
84
- - macOS: System Settings > General > Sharing > Remote Login.
85
- - Linux: `sudo systemctl enable --now ssh`
86
- 2. From the device you type on, install your key and accept the host key once:
124
+ ## Connect your devices
87
125
 
88
- ```sh
89
- ssh-copy-id me@laptop.local
90
- ssh me@laptop.local true
91
- ```
126
+ onthego uses your normal SSH setup: `~/.ssh/config`, keys, and `known_hosts`. All it needs is one device that can `ssh` into the other without a password prompt. `onthego doctor <device>` checks the whole chain.
92
127
 
93
- 3. Pair it: `onthego device add laptop --host me@laptop.local --install`
128
+ ### Same network
94
129
 
95
- An alias from `~/.ssh/config` works as the host too (`--host laptop`). `--port` and `--identity-file` are available; private keys are never copied.
130
+ ```sh
131
+ # On the laptop: turn on SSH
132
+ # macOS: System Settings > General > Sharing > Remote Login
133
+ # Linux: sudo systemctl enable --now ssh
96
134
 
97
- ### Anywhere with Tailscale
135
+ # On the desktop:
136
+ ssh-copy-id me@laptop.local
137
+ onthego device add laptop --host me@laptop.local --install
138
+ ```
98
139
 
99
- Use Tailscale when your devices are not on the same network, for example a laptop on the road and a desktop at home. Tailscale gives every device a stable name; ONTHEGO looks it up for you.
140
+ An alias from `~/.ssh/config` also works (`--host laptop`), as do `--port` and `--identity-file`. Private keys are never copied.
100
141
 
101
- 1. Install Tailscale on each device and sign in with the same account ([download](https://tailscale.com/download); on Linux: `curl -fsSL https://tailscale.com/install.sh | sh && sudo tailscale up`).
102
- 2. Enable SSH on each device you pair to, as above. On Linux you can instead turn on Tailscale SSH with `sudo tailscale set --ssh`.
103
- 3. List your tailnet and pair by name:
142
+ ### Anywhere, with Tailscale
104
143
 
105
- ```sh
106
- onthego tailscale
107
- onthego device add laptop --tailscale me@laptop --install
108
- ```
144
+ When your devices are on different networks, Tailscale gives each one a stable name and onthego looks it up for you.
109
145
 
110
- `onthego tailscale` shows which devices are online, which are already paired, and what is missing. ONTHEGO only reads `tailscale status`; it never changes Tailscale settings. See the [Tailscale guide](docs/tailscale.md) for MagicDNS, Tailscale SSH "check" mode, and troubleshooting.
146
+ ```sh
147
+ onthego tailscale # checks Tailscale, lists your devices
148
+ onthego device add laptop --tailscale me@laptop --install
149
+ ```
150
+
151
+ Install Tailscale on each device and sign in with the same account. Each device you pair to still needs SSH turned on (or Tailscale SSH on Linux). onthego only reads `tailscale status` and never changes your settings. See the [Tailscale guide](docs/tailscale.md) for MagicDNS, Tailscale SSH, and troubleshooting.
111
152
 
112
153
  ### A VPS
113
154
 
@@ -116,61 +157,62 @@ onthego device add vps --host me@vps.example.com --install
116
157
  onthego sync vps
117
158
  ```
118
159
 
119
- `--install` detects the server's OS and CPU and copies the matching binary to `~/.local/bin/onthego` there. No Node.js or internet access is needed on the server. After you upgrade onthego locally, run `onthego device install vps` to upgrade the server to the same version.
120
-
121
- Work on the VPS over SSH or in a terminal multiplexer as usual. When you come back, run `onthego sync vps` from your laptop or desktop.
160
+ `--install` detects the server's OS and CPU and copies the matching binary to `~/.local/bin/onthego`. The server needs neither Node.js nor internet access. After upgrading locally, `onthego device install vps` brings the server to the same version.
122
161
 
123
- ### Where the project lives on each device
162
+ ### Where the project lands
124
163
 
125
- By default the project goes to the same path relative to the home directory (`~/projects/my-app` on macOS becomes `/home/me/projects/my-app` on Linux). Agent session paths are remapped to match. To choose another location:
164
+ By default, the same path relative to your home directory: `~/projects/my-app` on macOS becomes `/home/me/projects/my-app` on Linux, and agent session paths are remapped to match.
126
165
 
127
166
  ```sh
128
- onthego device path laptop /Users/me/code/my-app
129
- onthego device list # shows each device and this project's path there
167
+ onthego device path laptop /Users/me/code/my-app # choose another location
168
+ onthego device list # devices and this project's path on each
130
169
  ```
131
170
 
132
- For the first transfer, the destination directory should not exist yet. To adopt an existing copy, use `push --replace` once (a Git backup of the destination is kept).
171
+ The first destination directory should not exist yet. To adopt an existing copy, use `push --replace` once; a Git backup of the destination is kept.
133
172
 
134
173
  ## What moves
135
174
 
136
- | Data | Behavior |
137
- | --- | --- |
138
- | Git history | Only missing objects travel, in an incremental bundle. No Git hosting needed. |
139
- | Staged and unstaged work | Preserved separately, including binary files and executable bits. |
140
- | Untracked files | Included, subject to `exclude` rules and the secret policy. |
141
- | Ignored files | Only when you add them with `--include` or project policy. |
142
- | Secret candidates such as `.env`, `.npmrc` | Excluded and reported. `--include-secret` carries a file encrypted, outside Git objects. |
143
- | Codex and Claude sessions | Sessions for this project active in the last 7 days. Paths are remapped; conversation content is not rewritten. |
144
- | Destination Git config, hooks, remotes, stashes | Left as they are. |
145
- | `node_modules`, caches, build output | Left as they are on each device. |
146
- | Agent logins, global databases, running processes | Never transferred. Sign in to the agent on each device. |
175
+ | | |
176
+ | :-- | :-- |
177
+ | **Git history** | Only the objects the other side is missing. No Git hosting needed. |
178
+ | **Staged and unstaged work** | Kept separate, including binary files and executable bits. |
179
+ | **Untracked files** | Included, subject to `exclude` rules and the secret policy. |
180
+ | **Ignored files** | Only when you add them with `--include` or project policy. |
181
+ | **Agent sessions** | This project's Codex and Claude sessions from the last 7 days. Paths are remapped; content is not rewritten. |
182
+ | **Secrets** such as `.env`, `.npmrc` | Excluded and reported. `--include-secret` carries a file encrypted, outside Git objects. |
183
+ | **Stays on each device** | `node_modules`, caches, build output, Git config, hooks, remotes, stashes, agent logins, and running processes. |
147
184
 
148
- Everything travels in one package that is encrypted for the receiving device (age) and signed by the sender (Ed25519). Pairing pins both identities, so a device that changes keys is rejected.
185
+ Each handoff is one package, encrypted for the receiving device with [age](https://age-encryption.org) and signed by the sender with Ed25519. Pairing pins both identities, so a device whose keys change is rejected.
149
186
 
150
- Stop agents and other processes that write to the project before a handoff, so they cannot race with it. Agent transcripts can contain sensitive prompts or tool output; they are encrypted in transit and stored as the agent would store them. Anything already committed to Git travels as recorded, including secrets in history.
187
+ > [!NOTE]
188
+ > Stop agents and other processes that write to the project before a handoff. Agent transcripts can contain sensitive prompts or tool output; they are encrypted in transit and stored as the agent would store them. Anything already committed to Git travels as recorded.
151
189
 
152
- ## Day to day
190
+ ## Everyday commands
153
191
 
154
192
  ```sh
155
- onthego status # did anything change since the last handoff? who has the work?
156
- onthego status laptop # the same, for the laptop's copy
157
- onthego push laptop --dry-run # preview files and sessions without sending
158
- onthego push laptop --session-days 2
159
- onthego push laptop --session <id> # or --all-sessions, --no-sessions
193
+ onthego status # changed since the last handoff? which device has the work?
194
+ onthego status laptop # the same, for the laptop's copy
195
+ onthego sync laptop --dry-run # show the decision without moving anything
196
+ onthego push laptop --dry-run # preview files and sessions
197
+ onthego push laptop --session-days 2 # or --session <id>, --all-sessions, --no-sessions
160
198
  onthego push laptop --include scratch/notes.txt --include-secret .env
161
199
  ```
162
200
 
163
- After a push, `status` on the sending device reminds you that the work was handed to the other device. Pull (or `sync`) before editing there again.
201
+ ### When something goes wrong
164
202
 
165
- ### Conflicts and recovery
203
+ - **Both devices changed.** `sync`, `push`, and `pull` stop with exit code 6. `--replace` overwrites the other side after saving a Git backup there.
204
+ - **Undo a handoff.** `onthego backups list` shows backups and `onthego undo` restores the latest. The newest five are kept automatically; `onthego backups prune --keep 3` trims them.
205
+ - **Diverged agent session.** The destination keeps its copy and the incoming one is saved under `~/.onthego/conflicts/`. Change this with `--session-conflict keep-both|theirs|skip`.
206
+ - **Sessions could not be written.** The workspace still arrives, the sessions are kept privately, and `status` tells you. Fix the cause and run `onthego sessions recover`.
207
+ - **SSH trouble.** Errors name the problem and the fix: a missing key, an unknown host key, a refused or unreachable host, or onthego missing on the device.
166
208
 
167
- - **Workspace.** When both devices changed, `sync`, `push`, and `pull` stop with exit code 6. `--replace` overwrites the other side after saving a Git backup there. `onthego backups list` shows backups, `onthego undo` restores the latest one, and `onthego backups prune --keep 3` trims them. The newest five are kept automatically.
168
- - **Agent sessions.** Identical sessions are skipped and a longer incoming history updates an older one. A diverged session keeps the destination's copy and saves the incoming one under `~/.onthego/conflicts/`. Change this with `--session-conflict keep-both|theirs|skip`.
169
- - **Partial delivery.** If the workspace arrives but an agent home cannot be written, the sessions are kept privately and `status` says so. Run `onthego sessions recover` once the problem is fixed; later workspace edits are preserved.
209
+ ## Reference
170
210
 
171
- ## Configuration
211
+ <details>
212
+ <summary><b>Configuration</b></summary>
213
+ <br>
172
214
 
173
- `onthego init` writes `.onthego.yaml`. Commit it so every device uses the same project ID:
215
+ `onthego init` writes `.onthego.yaml`. Commit it so every device shares the same project ID.
174
216
 
175
217
  ```yaml
176
218
  schema_version: 2
@@ -191,48 +233,62 @@ agent: auto # auto, codex, claude, or none (workspace only)
191
233
 
192
234
  Paths passed with `--include` or `--include-secret` stay managed in later handoffs, including deletions. Adding a managed file to `exclude` stops sending it and leaves the receiving copy in place with a warning.
193
235
 
194
- Private state lives in `~/.onthego` (or `$ONTHEGO_HOME`), with `0700` directories and `0600` files: paired devices in `config.yaml`, keys in `identity/`, and per-project paths under `projects/`. ONTHEGO never loads `.env` files.
236
+ Private state lives in `~/.onthego` (or `$ONTHEGO_HOME`) with `0700` directories and `0600` files: paired devices in `config.yaml`, keys in `identity/`, and per-project paths under `projects/`. onthego never loads `.env` files.
195
237
 
196
238
  Shell completion, including device names:
197
239
 
198
240
  ```sh
199
- onthego completion zsh > "${fpath[1]}/_onthego" # also: bash, fish
241
+ onthego completion zsh > "${fpath[1]}/_onthego" # also: bash, fish
200
242
  ```
201
243
 
202
- ## Offline handoff
244
+ </details>
245
+
246
+ <details>
247
+ <summary><b>Offline handoff</b></summary>
248
+ <br>
203
249
 
204
- Without a network path, hand off through an encrypted file on a USB drive or any other channel:
250
+ Without a network path, hand off through an encrypted file on a USB drive or any other channel.
205
251
 
206
252
  ```sh
207
- onthego identity # on the receiving device: prints its public keys
253
+ onthego identity # on the receiving device: prints its public keys
208
254
  onthego snapshot pack --output /tmp/my-app.otg --recipient age1...
209
255
 
210
256
  # On the receiving device:
211
257
  onthego snapshot restore /tmp/my-app.otg --output ~/projects/my-app --signing-public <sender-signing-key>
212
258
  ```
213
259
 
214
- ## Commands
260
+ </details>
261
+
262
+ <details>
263
+ <summary><b>All commands</b></summary>
264
+ <br>
215
265
 
216
266
  | Command | Purpose |
217
- | --- | --- |
267
+ | :-- | :-- |
218
268
  | `sync <device>` | Push or pull, whichever brings both devices up to date. |
219
269
  | `push <device>`, `pull <device>` | Hand off in an explicit direction. |
220
- | `status [device]` | Show changes since the last handoff and who has the work. |
270
+ | `status [device]` | Changes since the last handoff, and which device has the work. |
221
271
  | `inspect` | Preview selected files, excluded secrets, and sessions. |
222
272
  | `init` | Set up the current Git project. |
223
- | `device add/list/path/install/remove` | Pair devices, map project paths, install or upgrade onthego on them. |
273
+ | `device add / list / path / install / remove` | Pair devices, map project paths, install or upgrade onthego on them. |
224
274
  | `tailscale` | Check Tailscale and list tailnet devices to pair. |
225
275
  | `doctor [device]` | Check Git, SSH, Tailscale, agents, and a device connection. |
226
- | `undo`, `backups list/prune` | Restore or manage workspace backups. |
276
+ | `undo`, `backups list / prune` | Restore or manage workspace backups. |
227
277
  | `sessions recover` | Retry an agent session import after a partial handoff. |
228
- | `snapshot pack/restore` | Offline handoff through an encrypted file. |
278
+ | `snapshot pack / restore` | Offline handoff through an encrypted file. |
229
279
  | `identity`, `config path`, `completion`, `version` | Keys, settings location, shell completion, build info. |
230
280
 
231
- `--json` prints structured results and errors, `--verbose` prints transfer phases on stderr.
281
+ Every command accepts `--json` for structured output and errors, and `--verbose` for transfer phases on stderr.
232
282
 
233
- | Exit status | Meaning |
234
- | --- | --- |
235
- | 0 | Success (including a delivered workspace with pending session recovery) |
283
+ </details>
284
+
285
+ <details>
286
+ <summary><b>Exit codes</b></summary>
287
+ <br>
288
+
289
+ | Exit | Meaning |
290
+ | :-: | :-- |
291
+ | 0 | Success, including a delivered workspace with pending session recovery |
236
292
  | 1 | `E_INTERNAL` |
237
293
  | 2 | `E_INPUT` |
238
294
  | 3 | `E_PRECONDITION`, `E_UNSUPPORTED_GIT`, `E_SECRET_POLICY`, `E_SESSION_FORMAT` |
@@ -241,18 +297,29 @@ onthego snapshot restore /tmp/my-app.otg --output ~/projects/my-app --signing-pu
241
297
  | 6 | `E_GENERATION_CONFLICT`, `E_SOURCE_CHANGED` |
242
298
  | 130 | `E_CANCELED` |
243
299
 
300
+ </details>
301
+
244
302
  ## Upgrading
245
303
 
246
- 0.4 keeps the 0.3.1 wire protocol and file formats, so a 0.4 device can hand off with a 0.3.1 device. Keeping every device on the same version is still the simplest: after `npm update -g @jbaehova/onthego`, run `onthego device install <name>` for each SSH device. `onthego remote set` still works but is replaced by `onthego device path`. See the [release notes](docs/releases/0.4.0.md) and [migration notes](docs/migration.md).
304
+ 0.4 keeps the 0.3.1 wire protocol and file formats, so 0.4 and 0.3.1 devices can hand off to each other. Keeping every device on one version is still simplest:
305
+
306
+ ```sh
307
+ npm update -g @jbaehova/onthego
308
+ onthego device install laptop # repeat for each SSH device
309
+ ```
310
+
311
+ `onthego remote set` still works but is replaced by `onthego device path`. See the [0.4.0 release notes](docs/releases/0.4.0.md) and the [migration notes](docs/migration.md).
247
312
 
248
- ## More
313
+ ## Documentation
249
314
 
250
- - [Tailscale guide](docs/tailscale.md)
251
- - [Agent compatibility](docs/agent-compatibility.md): tested Codex and Claude Code versions and how resume is verified.
252
- - [Architecture](docs/architecture.md): how capture, encryption, in-place application, and receipts work.
253
- - [Development](docs/development.md): tests, demos, end-to-end checks, and benchmarks.
315
+ | | |
316
+ | :-- | :-- |
317
+ | [Tailscale guide](docs/tailscale.md) | Pairing across networks, Tailscale SSH, troubleshooting. |
318
+ | [Agent compatibility](docs/agent-compatibility.md) | Tested Codex and Claude Code versions, and how resume is verified. |
319
+ | [Architecture](docs/architecture.md) | Capture, encryption, in-place application, and receipts. |
320
+ | [Development](docs/development.md) | Tests, demos, end-to-end checks, benchmarks, and releasing. |
254
321
 
255
- Continuous background synchronization is intentionally out of scope: handoffs are explicit, so you always know which device has the work.
322
+ Handoffs are explicit on purpose: you always know which device has the work. Continuous background synchronization is out of scope.
256
323
 
257
324
  ## License
258
325
 
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbaehova/onthego",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Open-source workspace and coding-agent session handoffs between your own devices",
5
5
  "license": "MIT",
6
6
  "repository": {