Carry

Getting started

Two paths. The first needs nothing on the host except omp. The second adds the carry daemon. Install the app first (see Download), then open it and tap + Pair a machine.

Path A — omp collab (no daemon)

On the machine running the session you want to reach, inside the running omp TUI:

/collab

That shows a link and a QR code for the session. Or, from a shell, list every host that is already sharing and mint a link:

omp collab list                         # instanceId / pid / cwd / model
omp collab link <pid|instanceId>        # control link
omp collab link <pid> --view            # read-only link

In the app: + Pair a machine → omp session → Scan QR code, or paste the link and tap Join session.

To make every future interactive session share itself:

omp config set collab.autoStart control
omp config get collab.autoStart         # prints: control

A control link is a bearer credential for that session. Treat it like a password.

Path B — the carry daemon

1. Install and start it

The carry binary comes from whoever shared it; put it on the host’s PATH.

install -m 0755 carry ~/.local/bin/carry

carry start       # backgrounds the daemon, prints node id + pairing code
carry status
carry stop
carry restart

carry start returns once the daemon is up. A start that fails says so and shows the last lines of the daemon’s own output. State lives in ~/.carry (or CARRY_HOME).

To keep it running across logins, install it as a user service. The unit sets PATH deliberately: a service does not inherit your login shell’s PATH, and the daemon shells out to omp to find shared sessions.

systemctl --user enable --now carry
loginctl enable-linger "$USER"    # keep it up after you log out

2. Pair the phone

carry start prints the iroh node id and a 6-digit pairing code, valid for 10 minutes and single use. Typing a 64-character id is the worst part, so scan instead:

carry pair-qr                 # QR of node id + current code
carry pair-qr --regenerate    # mint a fresh code first
carry pair-qr --invert        # for a light terminal
carry pair-code --regenerate  # just a new code

In the app: + Pair a machine → carry terminal, and scan. Pairings survive a daemon restart; the node id does not change.

3. Attach to a session

The machine screen lists the omp sessions the host is sharing (tap to join), projects, recent omp sessions to resume, and the daemon’s own terminal sessions. You can also create and drive sessions from the host shell:

carry session new --cmd omp          # or --cwd /path --cmd bash
carry session ls
carry session send-keys ses_XXXX $'echo hi\n'
carry session attach ses_XXXX        # Ctrl+C detaches; the PTY keeps running
carry session stop ses_XXXX

If it does not work

“omp is not installed on this machine (not on PATH)”

The daemon shells out to omp for discovery and spawning. A systemd service does not inherit your login shell’s PATH; the shipped unit sets one deliberately, so edit its PATH line to include wherever omp lives, then systemctl --user restart carry. Pairing and plain terminal sessions still work without it.

A session shows no title

omp writes an empty title until it has one, so a brand-new session can show a blank title until omp names it. It is not a connection problem. If the session list is empty rather than untitled, the session was never shared: run /collab or set collab.autoStart.

The phone cannot reach the host

The pattern behind all four: something is not where the other side expects it. Check the host first, then the phone.