Tinode Instant Messaging Server
Tinode is not XMPP/Jabber. It is not compatible with XMPP. It's meant as a replacement for XMPP. On the surface, it's a lot like open source WhatsApp or Telegram.
Version 0.17. This is beta-quality software: feature-complete and stable but probably with a few bugs. Follow instructions to install and run or use one of the cloud services below. Read API documentation.
The promise of XMPP was to deliver federated instant messaging: anyone would be able to spin up an IM server capable of exchanging messages with any other XMPP server in the world. Unfortunately, XMPP never delivered on this promise. Instant messengers are still a bunch of incompatible walled gardens, similar to what AoL of the late 1990s was to the open Internet.
The goal of this project is to deliver on XMPP's original vision: create a modern open platform for federated instant messaging with an emphasis on mobile communication. A secondary goal is to create a decentralized IM platform that is much harder to track and block by the governments.
Installing and running
- Read API documentation and FAQ. Read configuration instructions contained in the
- For support, general questions, discussions post to https://groups.google.com/d/forum/tinode.
- For bugs and feature requests open an issue.
- Consider buying paid support: https://tinode.co/support.html
- If you are a software developer, send us your pull requests with bug fixes and feature requests.
- If you use the app and discover bugs or missing features, please let us know by filing bug reports and feature requests.
- If you speak a language other than English, you can translate the apps into your language.
- If you are a UI/UX expert, help us polish the app UI.
- Let people know about Tinode: write a blog post or an article about Tinode, share your findings and experiences at conferences.
- Use it: install it for your colleagues or friends at work or at home.
A public Tinode service is now available. You can use it just like any other instant messenger. Keep in mind that demo accounts present in sandbox are not available in the public service. You must register an account using valid email in order to use the service.
TinodeWeb, a single page web app, is available at https://web.tinode.co/ (source). See screenshots below. Currently available in English, Simplified Chinese, Traditional Chinese, Korean, Russian, Spanish. More translations are welcome.
Tinode for Android a.k.a Tindroid is stable and functional (source). See the screenshots below. A debug APK is also provided for convenience. Currently available in English, Simplified Chinese, Traditional Chinese, Korean, Russian, Spanish. More translations are welcome.
Tinode for iOS a.k.a. Tinodios is stable and functional (source). See the screenshots below. Currently available in English, Simplified Chinese, Traditional Chinese, Spanish. More translations are welcome.
A sandboxed demo service is available at https://sandbox.tinode.co/.
Log in as one of
frank. Password is
<login>123, e.g. login for
alice123. You can discover other users by email or phone by prefixing them with
tel: respectively. Emails are
email@example.com, phones are
When you register a new account you are asked for an email address to send validation code to. For demo purposes you may use
123456 as a universal validation code. The code you get in the email is also valid.
- The sandbox server is reset (all data wiped) every night at 3:15am Pacific time. An error message
User not found or offlinemeans the server was reset while you were connected. If you see it on the web, reload and relogin. On Android log out and re-login. If the database was changed, delete the app then reinstall.
- Sandbox user
Tinois a basic chatbot which responds with a random quote to any message.
- As generally accepted, when you register a new account you are asked for an email address. The server will send an email with a verification code to that address and you can use it to validate the account. To make things easier for testing, the server will also accept
123456as a verification code. Remove line
tinode.confto disable this option.
- The sandbox server is configured to use ACME TLS implementation with hard-coded requirement for SNI. If you are unable to connect then the most likely reason is your TLS client's missing support for SNI. Use a different client.
- Docker images with the same demo are available.
- You are welcome to test your client software against the sandbox, hack it, etc. No DDoS-ing though please.
- Multiple platforms:
- One-on-one and group messaging.
- Channels with an unlimited number of read-only subscribers.
- Sharded clustering with failover.
- Granular access control with permissions for various actions.
- Server-generated presence notifications for people, group chats.
- Support for custom authentication backends.
- Bindings for various programming languages:
- Websocket, long polling, and gRPC over TCP or Unix sockets.
- JSON or protobuf version 3 wire protocols.
- User search/discovery.
- Rich formatting of messages markdown-style: *style* → style.
- Inline images, file attachments.
- Forms and templated responses suitable for chatbots.
- Message status notifications: message delivery to server; received and read notifications; typing notifications.
- Most recent message preview in contact list.
- Ability to block unwanted communication server-side.
- Anonymous users (important for use cases related to tech support over chat).
- Storage and out of band transfer of large objects like video files using local file system or Amazon S3.
- Plugins to extend functionality, for example, to support moderation or chatbots.
- End to end encryption with OTR for one-on-one messaging and undecided method for group messaging.
- Replying and forwarding messages.
- Voice and video messages, location sharing.
- Previews of attached videos, documents, links.
- Hot standby.
- Different levels of message persistence (from strict persistence to "store until delivered" to purely ephemeral messaging).
All client software has support for internationalization. The following translations are provided:
More translations are welcome. Particularly interested in Arabic, Vietnamese, Persian, Indonesian, Portuguese, Hindi, Bengali.
- Demo avatars and some other graphics are from https://www.pexels.com/ under CC0 license and https://pixabay.com/ under their license.
- Web and Android background patterns are from http://subtlepatterns.com/ under CC BY-SA 3.0 license.
- Android icons are from https://material.io/tools/icons/ under Apache 2.0 license.
- Some iOS icons are from https://icons8.com/ under CC BY-ND 3.0 license.
Words 'chat' and 'instant messaging' in Chinese, Russian, Persian and a few other languages.
- 聊天室 即時通訊
- чат мессенджер
- 인스턴트 메신저
- پیام رسان فوری
- تراسل فوري
- Nhắn tin tức thời
- anlık mesajlaşma sohbet
- mensageiro instantâneo
- pesan instan
- mensajería instantánea
External services contacted through RPC
|External services contacted through RPC|
Package auth provides interfaces and types required for implementing an authenticaor.
|Package auth provides interfaces and types required for implementing an authenticaor.|
Package anon provides authentication without credentials.
|Package anon provides authentication without credentials.|
Package basic is an authenticator by login-password.
|Package basic is an authenticator by login-password.|
Package mock_auth is a generated GoMock package.
|Package mock_auth is a generated GoMock package.|
Package rest provides authentication by calling a separate process over REST API (technically JSON RPC, not REST).
|Package rest provides authentication by calling a separate process over REST API (technically JSON RPC, not REST).|
Package token implements authentication by HMAC-signed security token.
|Package token implements authentication by HMAC-signed security token.|
Package concurrency is a very simple implementation of a mutex with channels.
|Package concurrency is a very simple implementation of a mutex with channels.|
Package adapter contains the interfaces to be implemented by the database adapter
|Package adapter contains the interfaces to be implemented by the database adapter|
Package common contains utility methods used by all adapters.
|Package common contains utility methods used by all adapters.|
Package drafty contains utilities for conversion from Drafty to plain text.
|Package drafty contains utilities for conversion from Drafty to plain text.|
Package logs exposes info, warning and error loggers.
|Package logs exposes info, warning and error loggers.|
Package media defines an interface which must be implemented by media upload/download handlers.
|Package media defines an interface which must be implemented by media upload/download handlers.|
Package fs implements github.com/tinode/chat/server/media interface by storing media objects in a single directory in the file system.
|Package fs implements github.com/tinode/chat/server/media interface by storing media objects in a single directory in the file system.|
Package s3 implements media interface by storing media objects in Amazon S3 bucket.
|Package s3 implements media interface by storing media objects in Amazon S3 bucket.|
Package push contains interfaces to be implemented by push notification plugins.
|Package push contains interfaces to be implemented by push notification plugins.|
Package fcm implements push notification plugin for Google FCM backend.
|Package fcm implements push notification plugin for Google FCM backend.|
Package stdout is a sample implementation of a push plugin.
|Package stdout is a sample implementation of a push plugin.|
Package tnpg implements push notification plugin for Tinode Push Gateway.
|Package tnpg implements push notification plugin for Tinode Push Gateway.|
Package ringhash implementats a consistent ring hash: https://en.wikipedia.org/wiki/Consistent_hashing
|Package ringhash implementats a consistent ring hash: https://en.wikipedia.org/wiki/Consistent_hashing|
Package store provides methods for registering and accessing database adapters.
|Package store provides methods for registering and accessing database adapters.|
Package mock_store is a generated GoMock package.
|Package mock_store is a generated GoMock package.|
Package types provides data types for persisting objects in the databases.
|Package types provides data types for persisting objects in the databases.|
Package validate defines an interface which must be implmented by credential validators.
|Package validate defines an interface which must be implmented by credential validators.|
Package email is a credential validator which uses an external SMTP server.
|Package email is a credential validator which uses an external SMTP server.|
Package tel is an incomplete implementation of SMS or voice credential validator.
|Package tel is an incomplete implementation of SMS or voice credential validator.|