meshchat 0.3.5

A cross platform Iced Gui application for chatting on the Meshtastic LoRa MESH via connected Bluetooth LE radios
# ![MeshChat Logo]assets/images/small_icon.png MeshChat

[![codecov](https://codecov.io/gh/andrewdavidmackenzie/meshchat/branch/main/graph/badge.svg?token=VYddKXC8mh)](https://codecov.io/gh/andrewdavidmackenzie/meshchat)

Meshchat is an Iced cross-platform GUI application to interact with Meshtastic LoRa radios:

- find Bluetooth Low Energy attached meshtastic devices
- connect to one
- use it to chat with others using the available channels or direct messages to Nodes
- it saves the last device connected to (and channel if applicable), and on re-start it will try to
  automatically reconnect to that and continue chatting

## Screenshots

On the left, the Device view, once you have connected to a BLE Radio, shows configured channels, a list of nodes
found and nodes you have marked as a favorite.

On the right, the Channel view, Once you have clicked on a channel or a node, shows you the ongoing chat messages with
it,
with your messages on the right and others on the left.

<!--suppress ALL -->
<table cellspacing="0" cellpadding="0" border="0">
  <tr>
    <td valign="top">
      <img alt="Device View" src="./assets/images/Device_View.png" width="400" align="top" />
    </td>
    <td valign="top">
      <img alt="Channel View" src="./assets/images/Channel_View.png" width="400" align="top" />
    </td>
  </tr>
</table>

## The Thinking

My thinking was to keep the app as simple to look at and use as possible.

- avoid the app being an extremely geeky LoRa/Mesh app.
- try to give users a simple chat experience, similar to ones they will be accustomed to with WhatsApp, Telegram,
  etc.
- you will need to use some other app to configure their radio and join a mesh

I've made some unusual (and questionable) UI choices even in the minimal UI I have. They just kind of
materialized as I went, and I don't claim it's great...If people can use it easily, great. If not, help is welcome
to improve it.

## Newer Features

Here are some of the newer features I have added in recent releases:

### 0.2.1 Release

This release includes:

- Discover nearby MeshTastic compatible radios via Bluetooth and list them in the Device View
- Connect to a MeshTastic radio, then view a list of Channels and Nodes it knows about
- Save the last device connected to (and channel if applicable), and on re-start automatically reconnect to it and
  open the channel
- Filter the list of Channels and Nodes by name
- Start a chat with a Channel or a Node, viewing messages received and send new messages
  (Text, Text Reply, Position, Alert, NodeInfo)
- Acknowledgement indicator on a message to show it was received by the other side
- Unread message count indicator on Channels, Nodes and Device overall
- macOS and Linux application bundles are included in the GH Release Artifacts
- Ability to Reply to a message, show replies quoting the original message
- Ability to Forward a message to another Channel or Node
- Ability to Copy a message to the clipboard to be pasted elsewhere
- Ability to React to a message with an emoji
- Ability to start a DM with a Node from its name in a message
- Empty views for Device List and Channel/Node View when there is nothing to see, with some instructions
- Ability to Send your radio's current position
- Ability to Send your node's info
- Show the battery level of the connected radio in the header
- Ability to alias a BlueTooth Device with a more friendly or memorable name of your choosing
- Ability to alias a Node with a more friendly or memorable name of your choosing
- Ability to favourite Nodes and show the list of Favourite nodes at the top of the Device View
- Button on each node in the Device View to allow you to see its position (on Google Maps)

## Discussions

I have enabled [GitHub discussions](https://github.com/andrewdavidmackenzie/meshchat/discussions), so if you want to
talk about things, jump in there.

In particular, I am interested in hearing users thoughts
about [storing chat history locally](https://github.com/andrewdavidmackenzie/meshchat/discussions/145)

## Supported OS

Meshchat uses the `Iced`, `Meshtastic` and other rust crates that are all cross-platform, so it should run on
many Operating Systems, including macOS, Windows and Linux.

So far, it has been confirmed to run correctly on:

* macOS (Tahoe, Apple Silicon / ARM)
* Linux (x86 and ARM)
    * Pi500 running PiOS (there are still problems with Pi4/400 I am working on)
    * There is a known [bug]https://github.com/andrewdavidmackenzie/meshchat/issues/16 in BLE device discovery—it
      detects all BlueTooth devices, not just Meshtastic radios
* Windows (both x86 and ARM)

If you successfully run it on other OS or variants of the above, drop me a message in the repo's
[discussions](https://github.com/andrewdavidmackenzie/meshchat/discussions) with some details, and I will add to a list
of known working OS.

## CI Testing

Tests are run in GitHub actions on macos-15 (arm64), ubuntu-latest (x86), ubuntu-arm, window-latest (x86)
and windows-11-arm.

## Supported Radios

It should work with all Meshtastic radios that are supported by the Meshtastic rust crate.

So far, I have tested with a LillyGo T-ECHO, a T-Deck Pro and Heltec V3.

Again, if you get it working successfully with other radios, drop me a message in
[discussions](https://github.com/andrewdavidmackenzie/meshchat/discussions) and I will create some list of known working
radios.

## Installing

After a bit of optimizing I did, the release binary size is around 5.6 MBytes

### Download an installer

Each release contains installers for macOS, Linux and Windows that you can download and run from
[Latest Release on GitHub](https://github.com/andrewdavidmackenzie/meshchat/releases/latest)

### Cargo install

If you have a working rust toolchain installed, you can use:

`cargo install meshchat`

to get the binary built and installed and in your `$PATH`.

### Build and run from source

Clone the repo, then run meshchat directly with:

`cargo run --release`

## Configuration Options

There are some configuration options that can be done manually for now, pending deciding on providing a
UI for them or not.

First locate the `config.toml` config file in your home directory (e.g., `~/.config/meshchat/config.toml` on Linux, or
in `~/Libarary/Application Support/net.Mackenzie-Serres.meshchat/config.toml` on macOS) then with the app closed
edit the `.toml` file manually to add the following lines:

```
[history_length]
messages = 100
```

or

```
[history_length.duration]
secs = 86400
nanos = 0
```

## Users wanted! / Help wanted!

I did this as a bit of an experiment to see if I could get it working with real hardware and the mesh, which
I did, so I am delighted.

If you use it successfully on some new OS variant, or LoRa radio, please drop me a message in the discussions.

I may (as usual) play with some aspects of it to learn more rust or Iced or specific things (e.g., I really need
to knuckle down and learn about theming and styling in Iced...).

But I would only invest significant amounts of time if I see real interest and usage from people. I have other
open source toy projects that keep me busy without this one—the one with the most traction from users will be
the one that gets more of my time.

## Remaining work / Contributing

I add to the [GitHub Issues](https://github.com/andrewdavidmackenzie/meshchat/issues) as they occur to me. I have
marked a few with the "help needed" label, but I would basically welcome help in any area, no matter how small.

Help from someone with some real UI / UX chops would be great.

Major areas of work remaining I would call out are:

- Review / Re-Implement a lot of the styling in Iced, using Themes and respecting the OS theme settings
- Improve the testing, probably using new (0.14.0) Iced test facilities
- Chat history persistence (or not, as
  per [discussion]https://github.com/andrewdavidmackenzie/meshchat/discussions/145)

If you want to help out, submit a well-written issue, start
a [discussion](https://github.com/andrewdavidmackenzie/meshchat/discussions) or clone the repo and submit a PR.

### MeshCore Support

I have started work on a MeshCore radio crate at https://github.com/andrewdavidmackenzie/meshcore-rs, and will
now start improving it and adapting for use here. I will be working on supporting both mesh technologies
simultaneously in this app.

### Known Issues

Here is the list
of [Known Bugs](https://github.com/andrewdavidmackenzie/meshchat/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug)

## Licensing

These are the top-level dependencies of meshchat and their licenses:

* meshtastic - [GPL-3.0 License]https://github.com/meshtastic/rust/blob/main/LICENSE
* iced - [MIT License]https://github.com/iced-rs/iced/blob/master/LICENSE
* iced_futures - Inherits from iced, so MIT
* directories - Apache Version 2, or MIT license at your option

So, due to the meshtastic license, this project is also licensed under the [GPL-3.0 License](LICENSE)