SMS+MMS chat client using GTK+ and Rust
actions: factor out target parsing
chat_log.rs: rustfmt
state.rs: rustfmt (mostly)


browse  log 



You can also use your local clone with git send-email.


vgtk-based SMS+MMS client

vgmms screenshot


The existing messaging stacks for linux are lacking in support for MMS, from unimplemented features to antiquated frameworks.

vgmms exists to do only SMS+MMS and to have feature parity with messaging clients for Android and iOS.


  • sending/receiving MMS and SMS works
    • both group chats and media attachments work
  • logs are persisted to disk (in $XDG_DATA_HOME/vgmms/vgmms.db)
  • supports both oFono and ModemManager, and upstream MMSd (with oFono) as well as mmsd-tng (with either modem daemon)
  • lots of work to do still (see below)
  • contributions welcome!


  1. install a modem daemon and MMS daemon
    • option 1 (preferred): ModemManager and mmsd-tng
    • option 2 (legacy): oFono and MMSd
      • your best bet with this stack is to use the following patched versions:
        • patched ofono fixes dual-stack IPv6 connectivity (needed for MMS at least with T-Mobile)
        • patched MMSd fixes MMS parsing. whether you need this depends on your network's MMS implementation (again, at least T-Mobile seems to need this)
      • alternatively, install them from upstream or your package manager and please report if SMS and MMS work!
  2. make sure you have a Rust compilation toolchain, e.g. pacman -S rust or curl https://sh.rustup.rs -sSf | sh
  3. download the source: git clone https://git.sr.ht/~anteater/vgmms
  4. cd vgmms
  5. cargo build --release
    • the gtk and lalrpop crates take a lot of RAM to build. if you run out of RAM on a PinePhone or other RAM-limited system, try the following:
      • enable zram and/or swap
      • pass -j 1 to cargo build


  1. run modemmanager or ofonod as root and mmsd-tng or mmsd (as your user). be able to watch their logs for error messages (e.g. run with -n -d).
  2. while the services are running, run vgmms
  3. if you have trouble (or don't), please submit a bug (or success) report!

#DBus interface

vgmms exposes a GtkAction DBus interface, which can communicate with a running instance:

  • list available operations
    $ gdbus call -e -d org.vgmms -o /org/vgmms -m org.gtk.Actions.List
  • send a message
    $ gdbus call -e -d org.vgmms -o /org/vgmms -m org.gtk.Actions.Activate \
    send-message '[<(["12345"], "hi friend", @aay [])>]' []
  • send a message (to a group chat, with attachments)
    $ gdbus call -e -d org.vgmms -o /org/vgmms -m org.gtk.Actions.Activate \
    send-message '[<(["12345", "54321"], "hi everyone", @aay [b"/tmp/horse.png", b"/tmp/info.pdf"])>]' []
  • open the new tab dialog
    $ gdbus call -e -d org.vgmms -o /org/vgmms -m org.gtk.Actions.Activate new-tab [] []
  • open a chat with a given list of numbers
    $ gdbus call -e -d org.vgmms -o /org/vgmms -m org.gtk.Actions.Activate open-chat '[<(["12345", "54321"],)>]' []
  • close the current tab
    $ gdbus call -e -d org.vgmms -o /org/vgmms -m org.gtk.Actions.Activate close-tab [] []
  • exit vgmms
    $ gdbus call -e -d org.vgmms -o /org/vgmms -m org.gtk.Actions.Activate exit [] []
  • save an attachment given its (vgmms internal) id
    $ gdbus call -e -d org.vgmms -o /org/vgmms -m org.gtk.Actions.Activate save-attachment-dialog '[<uint64 1>]' []

#known bugs

  • lots, since things are still in-development
  • see the bug tracker