What's Changed
- New: end-to-end encryption.
moshi-hook e2ee enableseals everything this host sends through Moshi (inbox entries, approvals and questions, prompts, usage) so only your phones can read them; Moshi's servers relay ciphertext and can no longer approve anything for you. Phones fetch the key over SSH when they connect and decrypt notifications, Live Activities, widgets and the Watch themselves.e2ee rotate [--revoke],disableandstatusmanage it, andprobereports the policy. E2EE needs Moshi 4.1.0 for iOS and Android, which isn't out yet. Leave it off until your phones are on 4.1.0, because earlier versions can't read or approve anything it encrypts. - Easy Pair now puts this host's SSH key fingerprint in the QR code, so the Moshi app can confirm it's talking to this host from the very first connection.
moshi-hook host listandhost revokereadauthorized_keysdirectly, so the list shows exactly the phones that can log in. It used to keep its own record and kept listing keys as active after they were removed by hand.host revoke <host id>removes every phone paired to that host.moshi-hook notify --strictnow waits until Moshi confirms the push went out, and exits non-zero if it was dropped: no network, a dead proxy, or a rate limit. Before, it exited 0 once the local daemon had accepted it. The daemon log now names the source and event id for every push it delivers or drops.- Running the daemon as a Homebrew or systemd service no longer restarts it every 10 seconds while the Moshi app has started its own. The second
servewaits and takes over when the first one exits. Pass--exit-if-runningto get the old behaviour. - OpenCode errors now arrive as errors instead of "OpenCode blocked · Answer in terminal". Runs you stop yourself no longer send one.
- Fixed: OpenCode no longer fills the daemon log with "socket write error … broken pipe" warnings.
- Fixed: a Codex subagent no longer takes over its parent's session, and finishing it no longer marks the still-running parent idle.
- Fixed: a Claude viewer (
claude attach, the agents list) started through a wrapper script now shows as Claude in workspaces instead of a plain terminal. - Fixed: rewinding Claude in herdr no longer fails with "not in the rewind list" when the prompt is far up a long list.