ajnsit / simplex-chat

๐Ÿš€ SimpleX - decentralized chat with a focus on usersโ€™ privacy - doesn't use global user identities - now with groups and sending files!

Home Page:https://simplex.chat

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SimpleX logo

SimpleX chat

Private, secure, decentralized

GitHub build GitHub release

NEW in v0.4: groups and sending files!

The motivation for SimpleX chat is presented here.

SimpleX chat prototype is a thin terminal UI on top of SimpleXMQ message broker that uses SMP protocols.

See simplex.chat website for chat demo and the explanations of the system and how SMP protocol works.

Quick installation

curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/master/install.sh | bash

simplex-chat

Welcome word

We are building the most private and secure chat in the world - open-source, decentralized, and without global identities of any kind. If you would like to support it, you can do so in the following ways:

  • ๐ŸŒŸ Star it on GitHub - it's a great feedback you like it and helps us raise the visibility of the project.

  • Install the chat and try using it - if you spot a bug it would help a lot if you could raise an issue.

  • Spread the word - terminal chat is an early-stage product while we stabilize the protocol - you can invite your friends for some fun chatting inside your terminal. We're using it right inside our IDEs as we are coding it ๐Ÿ‘จโ€๐Ÿ’ป

  • Make a donation via opencollective - the amount doesn't matter, we appreciate any donation!

  • Make a contribution to the project - we're constantly moving the project forward and there are always lots of things to do.

We appreciate all the help from our contributors, thank you!

Table of contents

Disclaimer

This is WIP implementation of SimpleX chat that implements a new network topology for asynchronous communication combining the advantages and avoiding the disadvantages of federated and P2P networks.

If you expect a software being reliable most of the time and doing something useful, then this is probably not ready for you yet. We do use it for terminal chat though, and it seems to work most of the time - we would really appreciate if you try it and give us your feedback.

Please note: The main differentiation of SimpleX network is the approach to internet message routing rather than encryption; for that reason no sufficient attention was paid to either TCP transport level encryption or to E2E encryption protocols - they are implemented in an ad hoc way based on RSA and AES algorithms. See SMP protocol on TCP transport encryption protocol (AEAD-GCM scheme, with an AES key negotiation based on RSA key hash known to the client in advance) and this section on E2E encryption protocol (an ad hoc hybrid scheme a la PGP). These protocols will change in a consumer ready version to something more robust.

Network topology

SimpleX is a decentralized client-server network that uses redundant, disposable nodes to asynchronously pass the messages via message queues, providing receiver and sender anonymity.

Unlike P2P networks, all messages are passed through one or several (for redundancy) servers, that do not even need to have persistence (in fact, the current SMP server implementation uses in-memory message storage, persisting only the queue records) - it provides better metadata protection than P2P designs, as no global participant ID is required, and avoids many problems of P2P networks.

Unlike federated networks, the participating server nodes do NOT have records of the users, do NOT communicate with each other, do NOT store messages after they are delivered to the recipients, and there is no way to discover the full list of participating servers - it avoids the problem of metadata visibility that federated networks suffer from and better protects the network, as servers do not communicate with each other. Each server node provides unidirectional "dumb pipes" to the users, that do authorization without authentication, having no knowledge of the the users or their contacts. Each queue is assigned two RSA keys - one for receiver and one for sender - and each queue access is authorized with a signature created using a respective key's private counterpart.

The routing of messages relies on the knowledge of client devices how user contacts and groups map at any given moment of time to these disposable queues on server nodes.

Terminal chat features

  • 1-to-1 chat with multiple people in the same terminal window.
  • Group messaging.
  • Sending files to contacts and groups.
  • Auto-populated recipient name - just type your messages to reply to the sender once the connection is established.
  • Demo SMP servers available and pre-configured in the app - or you can deploy your own server.
  • No global identity or any names visible to the server(s), ensuring full privacy of your contacts and conversations.
  • E2E encryption, with RSA public key that has to be passed out-of-band (see How to use SimpleX chat).
  • Message signing and verification with automatically generated RSA keys.
  • Message integrity validation (via including the digests of the previous messages).
  • Authentication of each command/message by SMP servers with automatically generated RSA key pairs.
  • TCP transport encryption using SMP transport protocol.

RSA keys are not used as identity, they are randomly generated for each contact.

๐Ÿš€ Installation

Download chat client

Linux and MacOS

To install or update simplex-chat, you should run the install script. To do that, use the following cURL or Wget command:

curl -o- https://raw.githubusercontent.com/simplex-chat/simplex-chat/master/install.sh | bash
wget -qO- https://raw.githubusercontent.com/simplex-chat/simplex-chat/master/install.sh | bash

Once the chat client downloads, you can run it with simplex-chat command in your terminal.

Alternatively, you can manually download the chat binary for your system from the latest stable release and make it executable as shown below.

chmod +x <binary>
mv <binary> ~/.local/bin/simplex-chat

(or any other preferred location on PATH).

On MacOS you also need to allow Gatekeeper to run it.

Troubleshooting on Unix

If you get simplex-chat: command not found when executing the downloaded binary, you need to add the directory containing it to the PATH variable (find "PATH" in page). To modify PATH for future sessions, put PATH="$PATH:/path/to/dir" in ~/.profile, or in ~/.bash_profile if that's what you have. See this answer for the detailed explanation on the appropriate place to define environment variables for bash and other shells.

For example, if you followed the previous instructions, open ~/.profile for editing:

vi ~/.profile

And add the following line to the end:

PATH="$PATH:$HOME/.local/bin"

Note that this will not automatically update your PATH for the remainder of the session. To do this, you should run:

source ~/.profile

Or restart your terminal to start a new session.

Windows

move <binary> %APPDATA%/local/bin/simplex-chat.exe

Build from source

Using Docker

On Linux, you can build the chat executable using docker build with custom output:

$ git clone git@github.com:simplex-chat/simplex-chat.git
$ cd simplex-chat
$ DOCKER_BUILDKIT=1 docker build --output ~/.local/bin .

Please note: If you encounter version `GLIBC_2.28' not found error, rebuild it with haskell:8.10.4-stretch base image (change it in your local Dockerfile).

Using Haskell stack

Install Haskell stack:

curl -sSL https://get.haskellstack.org/ | sh

and build the project:

$ git clone git@github.com:simplex-chat/simplex-chat.git
$ cd simplex-chat
$ stack install

Usage

Running the chat client

To start the chat client, run simplex-chat from the terminal. If you get simplex-chat: command not found, see Troubleshooting on Unix.

By default, app data directory is created in the home directory (~/.simplex, or %APPDATA%/simplex on Windows), and two SQLite database files simplex.chat.db and simplex.agent.db are initialized in it.

To specify a different file path prefix for the database files use -d command line option:

$ simplex-chat -d alice

Running above, for example, would create alice.chat.db and alice.agent.db database files in current directory.

Default SMP servers are hosted on Linode (London, UK and Fremont, CA) - they are pre-configured in the app. Base-64 encoded string after server host is the transport key digest.

If you deployed your own SMP server(s) you can configure client via -s option:

$ simplex-chat -s smp.example.com:5223#KXNE1m2E1m0lm92WGKet9CL6+lO742Vy5G6nsrkvgs8=

The base-64 encoded string in server address is the digest of RSA transport handshake key that the server will generate on the first run and output its digest.

You can still talk to people using default or any other server - it only affects the location of the message queue when you initiate the connection (and the reply queue can be on another server, as set by the other party's client).

Run simplex-chat -h to see all available options.

How to use SimpleX chat

Once you have started the chat, you will be prompted to specify your "display name" and an optional "full name" to create a local chat profile. Your display name is an alias for your contacts to refer to you by - it is not unique and does not serve as a global identity. In case different contacts chose the same display name, the chat client adds a numeric suffix to their local display names.

This diagram shows how to connect and message a contact:

Once you've set up your local profile, enter /c (for /connect) to create a new connection and generate an invitation. Send this invitation to your contact via any other channel.

You are able to create multiple invitations by entering /connect multiple times and sending these invitations to the corresponding contacts you'd like to connect with.

The invitation has the format smp::<server>::<queue_id>::<rsa_public_key_for_this_queue_only>. The invitation can only be used once and even if this is intercepted, the attacker would not be able to use it to send you the messages via this queue once your contact confirms that the connection is established.

The contact who received the invitation should enter /c <invitation> to accept the connection. This establishes the connection, and both parties are notified.

They would then use @<name> <message> commands to send messages. You may also just start typing a message to send it to the contact that was the last.

Use /help in chat to see the list of available commands.

Groups

To create a group use /g <group>, then add contacts to it with /a <group> <name>and send messages with #<group> <message>. Use /help groups for other commands.

simplex-chat

Please note: the groups are not stored on any server, they are maintained as a list of members in the app database to whom the messages will be sent.

Sending files

You can send a file to your contact with /f @<contact> <file_path> - the recipient will have to accept it before it is sent. Use /help files for other commands.

simplex-chat

You can send files to a group with /f #<group> <file_path>.

Access chat history

๐Ÿšง Section currently out of date - will be updated soon ๐Ÿ—

SimpleX chat stores all your contacts and conversations in a local database file, making it private and portable by design, fully owned and controlled by you.

You can search your chat history via SQLite database file:

sqlite3 ~/.simplex/smp-chat.db

Now you can query messages table, for example:

select * from messages
where conn_alias = cast('alice' as blob)
  and body like '%cats%'
order by internal_id desc;

Please note: SQLite foreign key constraints are disabled by default, and must be enabled separately for each database connection. The latter can be achieved by running PRAGMA foreign_keys = ON; command on an open database connection. By running data altering queries without enabling foreign keys prior to that, you may risk putting your database in an inconsistent state.

Future roadmap

  1. Mobile and desktop apps (in progress).
  2. SMP protocol improvements:
    • SMP queue redundancy and rotation.
    • Message delivery confirmation.
    • Support multiple devices.
  3. Privacy-preserving identity server for optional DNS-based contact/group addresses to simplify connection and discovery, but not used to deliver messages:
    • keep all your contacts and groups even if you lose the domain.
    • the server doesn't have information about your contacts and groups.
  4. Media server to optimize sending large files to groups.
  5. Channels server for large groups and broadcast channels.

License

AGPL v3

About

๐Ÿš€ SimpleX - decentralized chat with a focus on usersโ€™ privacy - doesn't use global user identities - now with groups and sending files!

https://simplex.chat

License:GNU Affero General Public License v3.0


Languages

Language:Haskell 98.5%Language:TypeScript 0.8%Language:Shell 0.6%Language:Dockerfile 0.1%