README.md

  1# Conversations
  2
  3Conversations: the very last word in instant messaging
  4
  5[![Google Play](http://developer.android.com/images/brand/en_generic_rgb_wo_60.png)](https://play.google.com/store/apps/details?id=eu.siacs.conversations) [![Amazon App Store](https://images-na.ssl-images-amazon.com/images/G/01/AmazonMobileApps/amazon-apps-store-us-black.png)](http://www.amazon.com/dp/B00WD35AAC/)
  6
  7![screenshots](https://raw.githubusercontent.com/siacs/Conversations/master/screenshots.png)
  8
  9## Design principles
 10
 11* Be as beautiful and easy to use as possible without sacrificing security or
 12  privacy
 13* Rely on existing, well established protocols (XMPP)
 14* Do not require a Google Account or specifically Google Cloud Messaging (GCM)
 15* Require as few permissions as possible
 16
 17## Features
 18
 19* End-to-end encryption with either [OTR](https://otr.cypherpunks.ca/) or [OpenPGP](http://www.openpgp.org/about_openpgp/)
 20* Send and receive images as well as other kind of files
 21* Share your location via an external [plug-in](https://play.google.com/store/apps/details?id=eu.siacs.conversations.sharelocation)
 22* Indication when your contact has read your message
 23* Intuitive UI that follows Android Design guidelines
 24* Pictures / Avatars for your Contacts
 25* Syncs with desktop client
 26* Conferences (with support for bookmarks)
 27* Address book integration
 28* Multiple accounts / unified inbox
 29* Very low impact on battery life
 30
 31
 32### XMPP Features
 33
 34Conversations works with every XMPP server out there. However XMPP is an
 35extensible protocol. These extensions are standardized as well in so called
 36XEP's. Conversations supports a couple of these to make the overall user
 37experience better. There is a chance that your current XMPP server does not
 38support these extensions; therefore to get the most out of Conversations you
 39should consider either switching to an XMPP server that does or — even better —
 40run your own XMPP server for you and your friends. These XEP's are:
 41
 42* XEP-0065: SOCKS5 Bytestreams (or mod_proxy65). Will be used to transfer
 43  files if both parties are behind a firewall (NAT).
 44* XEP-0163: Personal Eventing Protocol for avatars
 45* XEP-0191: Blocking command lets you blacklist spammers or block contacts
 46  without removing them from your roster.
 47* XEP-0198: Stream Management allows XMPP to survive small network outages and
 48  changes of the underlying TCP connection.
 49* XEP-0280: Message Carbons which automatically syncs the messages you send to
 50  your desktop client and thus allows you to switch seamlessly from your mobile
 51  client to your desktop client and back within one conversation.
 52* XEP-0237: Roster Versioning mainly to save bandwidth on poor mobile connections
 53* XEP-0313: Message Archive Management synchronize message history with the
 54  server. Catch up with messages that were sent while Conversations was
 55  offline.
 56* XEP-0352: Client State Indication lets the server know whether or not
 57  Conversations is in the background. Allows the server to save bandwidth by
 58  withholding unimportant packages.
 59* XEP-xxxx: HttpUpload allows you to share files in conferences and with offline
 60  contacts. Requires an [additional component](https://github.com/siacs/HttpUploadComponent)
 61  on your server.
 62
 63## Team
 64
 65#### Head of Development
 66
 67* [Daniel Gultsch](https://github.com/inputmice)
 68
 69#### Code Contributions
 70
 71(In order of appearance)
 72
 73* [Rene Treffer](https://github.com/rtreffer) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Artreffer+is%3Amerged))
 74* [Andreas Straub](https://github.com/strb) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Astrb+is%3Amerged))
 75* [Alethea Butler](https://github.com/alethea) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Aalethea+is%3Amerged))
 76* [M. Dietrich](https://github.com/emdete) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Aemdete+is%3Amerged))
 77* [betheg](https://github.com/betheg) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3Abetheg+is%3Amerged))
 78* [Sam Whited](https://github.com/SamWhited) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3ASamWhited+is%3Amerged))
 79* [BrianBlade](https://github.com/BrianBlade) ([PRs](https://github.com/siacs/Conversations/pulls?utf8=%E2%9C%93&q=is%3Apr+author%3ABrianBlade+is%3Amerged))
 80
 81#### Logo
 82* [Ilia Rostovtsev](https://github.com/qooob) (Progress)
 83* [Diego Turtulici](http://efesto.eigenlab.org/~diesys) (Original)
 84
 85#### Translations
 86Translations are managed on [Transifex](https://www.transifex.com/projects/p/conversations/)
 87
 88## FAQ
 89
 90### General
 91
 92#### How do I install Conversations?
 93
 94Conversations is entirely open source and licensed under GPLv3. So if you are a
 95software developer you can check out the sources from GitHub and use ant to
 96build your apk file.
 97
 98The more convenient way — which not only gives you automatic updates but also
 99supports the further development of Conversations — is to buy the App in the
100Google [Play Store](https://play.google.com/store/apps/details?id=eu.siacs.conversations).
101
102Buying the App from the Play Store will also give you access to our [beta test](#beta).
103
104#### I don't have a Google Account but I would still like to make a contribution
105
106I accept donations over PayPal, Bitcoin and Flattr. For donations via PayPal you
107can use the email address `donate@siacs.eu` or the button below.
108
109[![Donate with PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CW3SYT3KG5PDL)
110
111**Disclaimer:** I'm not a huge fan of PayPal and their business policies. For
112larger contributions please get in touch with me beforehand and we can talk
113about bank transfer (SEPA).
114
115My Bitcoin Address is: `1NxSU1YxYzJVDpX1rcESAA3NJki7kRgeeu`
116
117
118[![Flattr this!](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=inputmice&url=http%3A%2F%2Fconversations.siacs.eu&title=Conversations&tags=github&category=software)
119
120#### How do I create an account?
121
122XMPP, like email, is a federated protocol which means that there is not one
123company you can create an 'official XMPP account' with. Instead there are
124hundreds, or even thousands, of provider out there. To find one use a web search
125engine of your choice. Or maybe your university has one. Or you can run your
126own. Or ask a friend to run one. Once you've found one, you can use
127Conversations to create an account. Just select 'register new account on server'
128within the create account dialog.
129
130#### Where can I set up a custom hostname / port
131Conversations will automatically look up the SRV records for your domain name
132which can point to any hostname port combination. If your server doesn’t provide
133those please contact your admin and have them read
134[this](http://prosody.im/doc/dns#srv_records)
135
136#### Conversations doesn't work for me. Where can I get help?
137
138You can join our conference room on `conversations@conference.siacs.eu`.
139A lot of people in there are able to answer basic questions about the usage of
140Conversations or can provide you with tips on running your own XMPP server. If
141you found a bug or your app crashes please read the Developer / Report Bugs
142section of this document.
143
144#### I need professional support with Conversations or setting up my server
145
146I'm available for hire. Contact me at `inputmice@siacs.eu`.
147
148#### How does the address book integration work?
149
150The address book integration was designed to protect your privacy. Conversations
151neither uploads contacts from your address book to your server nor fills your
152address book with unnecessary contacts from your online roster. If you manually
153add a Jabber ID to your phones address book Conversations will use the name and
154the profile picture of this contact. To make the process of adding Jabber IDs to
155your address book easier you can click on the profile picture in the contact
156details within Conversations. This will start an "add to address book" intent
157with the JID as the payload. This doesn't require Conversations to have write
158permissions on your address book but also doesn't require you to copy/paste a
159JID from one app to another.
160
161#### I get 'delivery failed' on my messages
162
163If you get delivery failed on images it's probably because the recipient lost
164network connectivity during reception. In that case you can try it again at a
165later time.
166
167For text messages the answer to your question is a little bit more complex.
168When you see 'delivery failed' on text messages, it is always something that is
169being reported by the server. The most common reason for this is that the
170recipient failed to resume a connection. When a client loses connectivity for a
171short time the client usually has a five minute window to pick up that
172connection again. When the client fails to do so because the network
173connectivity is out for longer than that all messages sent to that client will
174be returned to the sender resulting in a delivery failed.
175
176Other less common reasons are that the message you sent didn't meet some
177criteria enforced by the server (too large, too many). Another reason could be
178that the recipient is offline and the server doesn't provide offline storage.
179
180Usually you are able to distinguish between these two groups in the fact that
181the first one happens always after some time and the second one happens almost
182instantly.
183
184#### Where can I see the status of my contacts? How can I set a status or priority?
185
186Statuses are a horrible metric. Setting them manually to a proper value rarely
187works because users are either lazy or just forget about them. Setting them
188automatically does not provide quality results either. Keyboard or mouse
189activity as indicator for example fails when the user is just looking at
190something (reading an article, watching a movie). Furthermore automatic setting
191of status always implies an impact on your privacy (are you sure you want
192everybody in your contact list to know that you have been using your computer at
1934am‽).
194
195In the past status has been used to judge the likelihood of whether or not your
196messages are being read. This is no longer necessary. With Chat Markers
197(XEP-0333, supported by Conversations since 0.4) we have the ability to **know**
198whether or not your messages are being read.  Similar things can be said for
199priorities. In the past priorities have been used (by servers, not by clients!)
200to route your messages to one specific client. With carbon messages (XEP-0280,
201supported by Conversations since 0.1) this is no longer necessary. Using
202priorities to route OTR messages isn't practical either because they are not
203changeable on the fly. Metrics like last active client (the client which sent
204the last message) are much better.
205
206Unfortunately these modern replacements for legacy XMPP features are not widely
207adopted. However Conversations should be an instant messenger for the future and
208instead of making Conversations compatible with the past we should work on
209implementing new, improved technologies and getting them into other XMPP clients
210as well.
211
212Making these status and priority optional isn't a solution either because
213Conversations is trying to get rid of old behaviours and set an example for
214other clients.
215
216#### Conversations is missing a certain feature
217
218I'm open for new feature suggestions. You can use the [issue tracker][issues] on
219GitHub.  Please take some time to browse through the issues to see if someone
220else already suggested it. Be assured that I read each and every ticket. If I
221like it I will leave it open until it's implemented. If I don't like it I will
222close it (usually with a short comment). If I don't comment on an feature
223request that's probably a good sign because this means I agree with you.
224Commenting with +1 on either open or closed issues won't change my mind, nor
225will it accelerate the development.
226
227#### You closed my feature request but I want it really really badly
228
229Just write it yourself and send me a pull request. If I like it I will happily
230merge it if I don't at least you and like minded people get to enjoy it.
231
232#### I need a feature and I need it now!
233
234I am available for hire. Contact me via XMPP: `inputmice@siacs.eu`
235
236### Security
237
238#### Why are there two end-to-end encryption methods and which one should I choose?
239
240In most cases OTR should be the encryption method of choice. It works out of the
241box with most contacts as long as they are online. However PGP can, in some
242cases, (message carbons to multiple clients) be more flexible.
243
244#### How do I use OpenPGP
245
246Before you continue reading you should note that the OpenPGP support in
247Conversations is experimental. This is not because it will make the app unstable
248but because the fundamental concepts of PGP aren't ready for widespread use.
249The way PGP works is that you trust Key IDs instead of JID's or email addresses.
250So in theory your contact list should consist of Public-Key-IDs instead of
251JID's. But of course no email or XMPP client out there implements these
252concepts. Plus PGP in the context of instant messaging has a couple of
253downsides: It is vulnerable to replay attacks, it is rather verbose, and
254decrypting and encrypting takes longer than OTR. It is however asynchronous and
255works well with message carbons.
256
257To use OpenPGP you have to install the open source app
258[OpenKeychain](http://www.openkeychain.org) and then long press on the account in
259manage accounts and choose renew PGP announcement from the contextual menu.
260
261#### How does the encryption for conferences work?
262
263For conferences the only supported encryption method is OpenPGP (OTR does not
264work with multiple participants). Every participant has to announce their
265OpenPGP key (see answer above). If you would like to send encrypted messages to
266a conference you have to make sure that you have every participant's public key
267in your OpenKeychain. Right now there is no check in Conversations to ensure
268that. You have to take care of that yourself. Go to the conference details and
269touch every key id (The hexadecimal number below a contact). This will send you
270to OpenKeychain which will assist you on adding the key.  This works best in
271very small conferences with contacts you are already using OpenPGP with. This
272feature is regarded experimental. Conversations is the only client that uses
273XEP-0027 with conferences. (The XEP neither specifically allows nor disallows
274this.)
275
276### Development
277
278<a name="beta"></a>
279#### Beta testing
280If you bought the App on [Google Play](https://play.google.com/store/apps/details?id=eu.siacs.conversations)
281you can get access to the latest beta version by joining the
282[Conversations Beta Testers](https://plus.google.com/communities/107649347599361240873)
283community on Google+ and then using [this link](https://play.google.com/apps/testing/eu.siacs.conversations)
284to sign up for the beta test.
285
286#### How do I build Conversations
287
288Make sure to have ANDROID_HOME point to your Android SDK
289
290    git clone https://github.com/siacs/Conversations.git
291    cd Conversations
292    ./gradlew build
293
294
295[![Build Status](https://travis-ci.org/siacs/Conversations.svg?branch=development)](https://travis-ci.org/siacs/Conversations)
296
297### How do I update/add external libraries?
298
299If the library you want to update is in Maven Central or JCenter (or has its own
300Maven repo), add it or update its version in `build.gradle`. If the library is
301in the `libs/` directory, you can update it using a subtree merge by doing the
302following (using `minidns` as an example):
303
304    git remote add minidns https://github.com/rtreffer/minidns.git
305    git fetch minidns
306    git merge -s subtree minidns master
307
308To add a new dependency to the `libs/` directory (replacing "name", "branch" and
309"url" as necessary):
310
311    git remote add name url
312    git merge -s ours --no-commit name/branch
313    git read-tree --prefix=libs/name -u name/branch
314    git commit -m "Subtree merged in name"
315
316#### How do I debug Conversations
317
318If something goes wrong Conversations usually exposes very little information in
319the UI (other than the fact that something didn't work). However with adb
320(android debug bridge) you squeeze some more information out of Conversations.
321These information are especially useful if you are experiencing trouble with
322your connection or with file transfer.
323
324    adb -d logcat -v time -s conversations
325
326#### I found a bug
327
328Please report it to our [issue tracker][issues]. If your app crashes please
329provide a stack trace. If you are experiencing misbehaviour please provide
330detailed steps to reproduce. Always mention whether you are running the latest
331Play Store version or the current HEAD. If you are having problems connecting to
332your XMPP server your file transfer doesn’t work as expected please always
333include a logcat debug output with your issue (see above).
334
335[issues]: https://github.com/siacs/Conversations/issues