Matrix bridge for Inline, built with mautrix-go bridgev2 for Beeper and self-hosted Matrix deployments.
The bridge lets Matrix users log in with an existing Inline account, sync Inline chats into Matrix rooms, and send messages between Matrix/Beeper and Inline.
- Login with Inline email or SMS verification code
- Session resume after bridge restart
- Startup chat sync
- Recent history sync and bridgev2 backfill
- Text messages
- Normal message replies
- Message edits
- Message deletes/redactions
- Reactions
- Read receipts and marked-unread state
- Permanent per-room mute/unmute
- Typing notifications
- Images, videos, files, audio, and voice/audio files
- Inline member list sync for bridged rooms
- Matrix ghosts with Inline display names and avatars when available
- Configurable bridge bot and network profile metadata
- DM creation with a numeric Inline user ID
- Basic group/thread creation from Matrix
- Add/remove Inline thread participants from Matrix membership changes
- Rename Inline threads from Matrix
- Explicit Inline thread deletion from Beeper/Matrix
- Management commands for status and reconnect
- New Inline account signup or invite-code onboarding
- Matrix-native thread UI for Inline reply-thread chats
- Contact search for DM creation
- Formatted text, rich entities, and Matrix mention mapping
- Pins and Inline link-preview projection
- Room avatars
- Room topic/description editing
- Presence and richer workspace/space representation
- Timed mute expiration (permanent mute is supported)
- Calls
- An existing Inline account
- A Matrix homeserver or Beeper bridge deployment
- Docker and Docker Compose, or Go 1.25 plus Rust 1.96 for native builds
- A published container image from
ghcr.io/inline-chat/matrix-inline
Source builds require a local checkout of inline-chat/inline-public next to this repo
because the bridge builds against the Rust Inline client crates:
inline-chat/
inline-public/
matrix-inline/
For agent-assisted deployment, use PROMPT.md as a concise handoff that points back to the current setup docs.
Create a data directory:
mkdir -p dataPull the published image:
docker compose pullPublished images are built for linux/amd64 and linux/arm64.
Generate a bridgev2 config with the bridge type assigned by your Beeper deployment:
bbctl c --type bridgev2 <inline-bridge-type> > data/config.yamlStart the bridge:
docker compose up -dThe container uses the Beeper-issued appservice tokens from data/config.yaml
and writes data/registration.yaml on first start.
Start once to generate data/config.yaml:
docker compose upEdit data/config.yaml and set at least:
homeserver.addresshomeserver.domainappservice.addressbridge.permissions
Start again to generate data/registration.yaml:
docker compose upRegister data/registration.yaml with your homeserver, restart the homeserver,
then run the bridge detached:
docker compose up -dWhen the homeserver and bridge are on the same Docker network,
appservice.address usually looks like:
http://matrix-inline:29343
The URL must be reachable by the homeserver container or host.
Use the build override when developing or testing unreleased code:
docker compose -f docker-compose.yml -f docker-compose.build.yml up --buildBuild the Rust adapter:
cargo build --release -p matrix-inline-adapterBuild the Go bridge:
go build -tags goolm -o ./matrix-inline ./cmd/matrix-inlineFor systemd installation, see deploy/systemd.
Use Beeper Desktop settings or the Matrix bridge bot to add an Inline account. The login flow asks for your Inline email address or phone number, then asks for the verification code sent by Inline.
Bridge bot commands:
login
inline-status
inline-reconnect
inline-settings
inline-hidden-chats <exclude|include|default>
logout <login ID>
Aliases:
istatus
ireconnect
isettings
ihidden
Hidden Inline dialogs are excluded from Matrix by default. These are dialogs
whose Inline state has showInChatList: false; excluding them prevents new
portal creation, history fill, and inbound event projection. Users can change
the behavior for their account with inline-hidden-chats, while operators can
set the default in the network configuration:
network:
hidden_dialogs: exclude # exclude or includeChanging the policy does not delete Matrix rooms that were already created.
The Docker entrypoint stores bridge state in /data:
/data/config.yaml
/data/registration.yaml
/data/matrix-inline.db
/data/inline-client/inline-client.sqlite3
/data/inline-client/accounts/<session-namespace>.sqlite3
Useful environment variables:
MATRIX_INLINE_IMAGE=ghcr.io/inline-chat/matrix-inline:latest
INLINE_SIDECAR_BIND=127.0.0.1:29342
INLINE_SIDECAR_URL=http://127.0.0.1:29342
INLINE_CLIENT_STORE=/data/inline-client/inline-client.sqlite3
INLINE_CLIENT_ACCOUNT_STORE_DIR=/data/inline-client/accounts
MATRIX_INLINE_DB_URI=file:/data/matrix-inline.db?_txlock=immediate
MATRIX_INLINE_HOMESERVER_ADDRESS=http://synapse:8008
MATRIX_INLINE_HOMESERVER_DOMAIN=example.com
MATRIX_INLINE_APPSERVICE_ADDRESS=http://matrix-inline:29343
MATRIX_INLINE_APPSERVICE_HOSTNAME=0.0.0.0
MATRIX_INLINE_NETWORK_DISPLAYNAME=Inline
MATRIX_INLINE_NETWORK_URL=https://inline.chat
MATRIX_INLINE_NETWORK_ICON=mxc://matrix.org/ITxccqHQkLCnPQDouWfsPhqs
MATRIX_INLINE_BOT_DISPLAYNAME=Inline bridge bot
MATRIX_INLINE_BOT_AVATAR=
INLINE_API_BASE_URL=https://api.inline.chat/v1
INLINE_REALTIME_URL=wss://api.inline.chat/realtime
RUST_LOG=info
The Inline client store contains session credentials. Keep it private and back it up with the bridge database.
Upgrades from the initial bridge release are in-place. Keep both the bridge database and the existing Inline client store: the adapter imports the legacy session into the per-account store, starts the new durable bucket sync from a safe lookback, and the bridge runs a checkpointed dialog/state reconciliation in bounded, rate-limited passes. Recent history is repaired first and older history continues from per-room Matrix delivery checkpoints. Users should not need to log in again or delete old rooms to recover, and an interrupted recovery continues from its last completed chat.
matrix-inline ships with the official Inline display name, URL, and bridge icon. Docker deployments also apply the same icon to the appservice bot profile by default.
appservice:
bot:
displayname: Inline bridge bot
avatar: mxc://matrix.org/ITxccqHQkLCnPQDouWfsPhqs
network:
displayname: Inline
network_url: https://inline.chat
network_icon: mxc://matrix.org/ITxccqHQkLCnPQDouWfsPhqsFor custom branding, set MATRIX_INLINE_NETWORK_ICON. Use
MATRIX_INLINE_BOT_AVATAR only when the bot avatar should be different from the
bridge icon.
Run local checks:
scripts/check.shRun a local adapter smoke test:
scripts/smoke-local.sh --start-adapterRun the local Matrix/appservice E2E smoke harness:
scripts/e2e-local.sh smokeLocal Go commands use -tags goolm so development builds do not require system
libolm headers.
Apache-2.0. See LICENSE.