Bogen

Devices

Bogen on two of your machines, say a desktop and a laptop, can hold the same files and merge what you change on either, also while one of them is asleep or offline. They talk over Tailscale only. There is no Bogen cloud in between.

What syncs

Agents and their runs stay on the device where they run. Home screen folders, branch lists and code project links are per device too.

When both sides changed the same value while apart, Bogen keeps one and writes a conflict note. The Sync section of the Agents tab shows both values, with Use the other and Dismiss. When a file changed while nobody had it open, a banner says once what changed.

What you need

Pair two devices

On the first device:

bogen peer pair --name Desktop

This turns on the Tailscale listener, saves that, and prints a command:

On the other device, run:
  bogen peer add http://100.x.y.z:29990 --token <token> --name 'Desktop'

Run that line on the second device. One command pairs both ways. To keep the token off the command line, put it in BOGEN_PEER_TOKEN and leave out --token.

The listener binds only to the address from tailscale ip -4, and everything on it needs the device's token. If Tailscale comes up after Bogen, the listener follows. Files sync through their own link there; the HTTP routes that start agent runs or post comments, and those for brands, libraries, live site mode and code projects, are closed on it.

Manage paired devices

CommandWhat it does
bogen peer listPaired devices, with their ids.
bogen peer statusThis device, the tailnet address, and per device: state, last sync, pending changes, bytes in and out, the last error, its version, and who has a file open there.
bogen peer remove <id>Stop syncing with a device. Run it on that device too. When no devices are left, this one gets a new token.
bogen peer tailnet on|offTurn the Tailscale listener on or off, and save that.

--json gives the output of list, status and pair as JSON.

bogen serve --tailnet also listens on the Tailscale address, for that run. On Omarchy, integrations/omarchy/install.sh --tailnet (or bogen omarchy install --tailnet) makes the user service do so.

Firewall and tailnet policy

Two things can stand between your devices, and both need the owner of the machine or the tailnet:

  1. The firewall. Omarchy's ufw refuses everything incoming. On each device:

``sh sudo ufw allow in on tailscale0 to any port 29990 proto tcp comment bogen-sync ``

The Omarchy installer with --tailnet offers to do this.

  1. Your Tailscale policy. A tailnet with its own access rules has to allow TCP port 29990 between the devices, in the access controls of the Tailscale admin console.

bogen doctor tells these apart where it can: a device that answers Tailscale ping but not TCP on 29990 has a firewall or a policy in the way; one that refuses the connection has nothing listening. ufw's rules can only be read as root, so without passwordless sudo it prints the rule instead.

Update another device

From a checkout on one Omarchy machine:

bogen peer deploy my-laptop --dry-run   # says what it would do, changes nothing
bogen peer deploy my-laptop

Over ssh, this copies the current build and the Omarchy integration to ~/.local/share/bogen-app there, finds Node (through mise, and installs it with mise only if there is none), runs the installer with --tailnet, restarts the service, and reports the version that answers. It is safe to run again, and it does not touch your designs. integrations/omarchy/deploy.sh is the same script.

It has updated a real second device, the MacBook Air described under Limits. The tests run it against stand-ins for ssh and systemd.

A Mac

integrations/macos has an installer, an uninstaller and a deploy script for a Mac: a LaunchAgent that runs bogen serve --tailnet, a Bogen.app that opens the window and .bogen files, and a bogen wrapper. From a Linux checkout, integrations/macos/deploy.sh <ssh-host> --name MacBook builds, copies, installs and pairs in one go. See integrations/macos/README.md.

None of it has run on a real Mac yet. The scripts pass their checks on Linux against stand-ins for the macOS commands; expect to fix something small the first time.

iPhone and iPad

Your phone does not run Bogen. It opens the Bogen on your computer, through Tailscale, as an app on its Home Screen. Files you open there are also stored on the phone, so you can look at them and edit them without the computer. The edits merge when it is back.

What you need

Set it up

  1. On the computer:

``sh bogen phone on ``

This starts a listener on 127.0.0.1:29991, saves that so it comes back after a restart, and runs tailscale serve --bg --https=29443 http://127.0.0.1:29991. It touches no other port of tailscale serve. It prints the address, such as https://omarchy.tail1234.ts.net:29443/, with a QR code.

  1. Let the phone through your tailnet policy. A tailnet with its own access rules has to allow TCP port 29443 from your phone to the computer. Only you can change that, in the access controls of the Tailscale admin console. bogen phone on prints a rule to add, for example:

``json {"src": ["[email protected]"], "dst": ["100.x.y.z"], "ip": ["tcp:29443"]} ``

If a rule already lets your phone reach the computer on other ports, add tcp:29443 to it. bogen doctor reads the rules Tailscale gives the computer and says, per phone, whether it gets in.

  1. Pair the phone:

``sh bogen phone pair ``

or, in the editor on the computer, open the Agents tab and choose Pair a phone under Phone. You get a code like K7QM-3XTP and a QR code.

  1. On the phone, scan the QR code with the camera and open the link in Safari. Tap Share, then Add to Home Screen, then Add.
  1. Open Bogen from the Home Screen and type the code. The code works once, for ten minutes.

The app on the Home Screen keeps its own storage, apart from Safari, which is why the code is typed there and not in Safari. To use Bogen in Safari instead, choose Use Bogen in Safari instead on the page the QR code opens.

Who gets in

Three things have to hold for every request:

A paired phone counts as you in person: it can start agents, comment for them, and accept or discard their proposals. It cannot reach the computer itself: no files on its disk, no linking of code projects, no live site mode, no captures of addresses on its local network, no MCP, and no settings of devices or phones.

On the phone

On a phone, Bogen has three tabs:

Tapping a file opens it in a screen made for touch:

An iPad, or any touch screen that comes through the phone listener, gets the same screen, with the sheets as a panel at the side. The desktop editor, made for a mouse and a large screen, is still there under The desktop editor at the bottom of the page list, behind a warning.

Fields are 16 px or more, so iOS does not zoom into them, and the page itself can still be zoomed. While the keyboard is up, the field of a sheet stays right above it.

What works offline

Nothing that needs the computer works offline: agents, comments to agents, exports, captures, history and thumbnails.

Turn it off

bogen phone off

This stops the listener and takes port 29443 out of tailscale serve. Paired phones keep their pairing for when you turn it on again; remove them with bogen phone remove <id>.

Limits