
imsg talks directly to a paired iPhone over the standard Bluetooth MAP (Message Access
Profile) and PBAP (Phone Book Access Profile) protocols. No iCloud credentials, no Apple
Silicon, no macOS bridge.
Requirements
- Linux with BlueZ (
bluetoothdrunning)
📎 That's it!
Install
CLI
|
Or via cargo:
Shell completions
Interactively, no download needed (bash/zsh/fish only; installs to the shell's conventional completion directory after a confirmation prompt):
Or print the script and redirect it yourself (works for every shell, including elvish/powershell):
Or fetch the prebuilt static file straight from the latest release:
# bash: requires the `bash-completion` package
# zsh: add `fpath+=(~/.zfunc)` before `compinit` in ~/.zshrc if not already
# fish: auto-loaded, no rc edit needed
Desktop app
Prebuilt .deb, .rpm, and .AppImage bundles are available at latest release;
Quick start
[!NOTE] Both the GUI and CLI handle device setup automatically, no separate setup step needed. If automatic setup fails, you can manually set the device address and channels via
imsg config set-device.
Desktop app
Launch it. The first run walks you through picking your paired device; channel resolution and daemon startup happen automatically, no separate setup step.
CLI
Lists your paired devices, prompts you to pick one, resolves its MAP/PBAP RFCOMM channels over SDP, and persists the address and both channels together.
For a specific address, or if a device has no discoverable service record, set fields individually instead:
then edit the channel numbers by hand in ~/.config/imsg/imsg.toml if they differ from the
defaults (map=2, pbap=13):
[]
= "A1:B2:C3:D4:E5:F6"
= 2
= 13
Read and send messages
CLI reference
See docs/cli.md for the full command-line reference, or run imsg <command> --help for command-specific flags.
Hub / spoke (remote Bluetooth adapter)
If your iPhone is paired to a different machine (a Raspberry Pi, a server, a desktop in
another room), you can run imsg from any machine on the internet without re-pairing.
On the machine with the paired phone:
# prints: node key: <KEY>
On your laptop (or anywhere else):
The hub and spoke connect over QUIC via iroh. No port forwarding or VPN required.
The desktop app picks up the same hub.node_key from config once you've run imsg spoke add,
no separate setup.
Daemon (background sync)
imsg daemon start runs the persistent background broker that keeps the MAP session connected
to your paired phone and the local store fresh. Optional for the CLI, which only needs it running explicitly for persistent
sync (imsg sync) or hub/spoke routing (--hub).
Run under a process supervisor (e.g. systemd) with --foreground instead, or let imsg
register one for you:
Configuration
Config is layered in ascending priority:
compiled-in defaults
/etc/imsg.toml
~/.config/imsg/imsg.toml
./imsg.toml
--config <path>
IMSG_ environment variables (e.g. IMSG_DEVICE__MAP_CHANNEL=15)
Full key reference:
[]
= "A1:B2:C3:D4:E5:F6" # required; set via `imsg config set-device`
= 2 # RFCOMM channel for MAP MAS [1–30], default 2
= 13 # RFCOMM channel for PBAP PSE [1–30], default 13
[]
= "..." # set via `imsg spoke add <KEY>`; absent until then
Building from source
CLI
See CONTRIBUTING.md for the full development workflow.
Desktop app
Needs the GTK/WebKit dev headers Tauri builds against, plus Node for the frontend:
Bundles land under target/release/bundle/{deb,rpm,appimage}/.
License
MIT. See LICENSE.