chat

 chat  is informal messaging offered by numerous services, a few of which interoperate or bridge with each other, and also a set of brainstorms for what an amazing indieweb friendly chat web app/site could do.

For indieweb community chatrooms:
 * See: discuss

https://imgs.xkcd.com/comics/chat_systems.png

Why
The dictionary definition of the verb `chat` is "talk in a friendly and informal way", wikipedia defines only `online chat` and it's real-time aspect:

"Online chat may refer to any kind of communication over the Internet that offers a real-time transmission of text messages from sender to receiver."

Indieweb chat should embrace the ability for people to own their messages and to create them using the tools available.

How
We already have people who are posting to their own domain with mf2 and micropub and then using POSSE to distribute those items to the silo of their choice. This should apply to chat just as it applies to photos, notes, fitness, etc. With micropub and webmention (salmention even) we should be able to use the existing data flow and apply it to the chat problem.

We don't want to start with any Architecture Astronaut or plumbing just yet ... let's get the problems defined first and then iterate on possible implementations!

IndieWeb Examples
None so far. See and contribute to the below, and try implementing something on your site, perhaps to bridge to the #indieweb IRC channel!

Examples In General
Organizers of Virtual HWCs have considered and used several online audio / video chat apps, sites, and software. Notes and impressions are below.

(Please contribute if you have positive or negative experiences with any of these!)

Stateless Examples
The following examples do not appear to keep any state information about you or your calls, thus they do not really qualify as a silo (they are not siloing any data of yours).

appear.in
appear.in has been used by the vHWC CEST with success.

Looks extremely similar to Talky in both features and technology.

Talky
Talky was often used for IndieWebCamp remote participation, and was used for the virtual meet-ups on Central European Time.

Mumble
Mumble is being looked into as a viable tool for future virtual meet-ups.

Silo Examples
These all keep some sort of information, chat logs, contacts, etc.

Slack
Slack is a chat silo, and often popular user-friendly replacement for IRC.

You can use Slack to access the IndieWeb IRC channels:
 * https://chat.indieweb.org/slack

Google Hangouts
Hangouts was used for the HWC virtual meet-ups on Pacific Time.

Discord
Discord is being looked into as a viable tool for future virtual meet-ups.

Brainstorming
In IRC or XMPP a message is a single line that is sent to the server, marked up with the sender, the channel and the date/time of the message. The server then distributes it to anyone currently connected and "listening" to the channel.


 * Can we map what a note is and use it for a single post to a chat group?
 * Can we use webmention to have the post be sent to a group or feed
 * Can we use a feed to represent a group or channel
 * chat messages are logged and searchable
 * this seems to be orthogonal to the initial problem of describing what is chat

datetime stamps

 * Publication date and time -- when the message was posted
 * Update date and time -- when the message was updated

A concern I have is making sure that date and time stamps allow for proper presentation of messages as a stream. If Fido is posting to a channel but their system clock is skewed then messages from them may appear out of sequence to others.

Do we allow an aggregating server to apply another timestamp to the message? If so what would that be called? `dt-syndicated` ?

message URL

 * Identifies the message
 * Identifies the message owner's h-card
 * use mf2 authorship rules?

distribution
distribution becomes a function of the sender deciding where to syndicate the message to - this can be based on h-feed category or anything the sender wants.


 * polling
 * have a chat server pull from an h-feed with a defined syndication target
 * webmention publish ala brid.gy
 * pubsubhubbub or superfeedr
 * suggestion by Kevin: "What if the webmention was for join/leave and that triggered the pubsubhubbub following? Kind of how #indieweb works on twitter now. So any post with #indieweb goes to the channel"

example
   Sat, Jun 25, 2016 9:20am -04:00 yep, a chat message 

Oct 2018 Prototype
has taken the first step to owning his IRC chat logs. He is using sopel.

In this demo four separate browser sessions across two different devices bridged with IRC in real time.

Note Aaron Parecki's URL was discovered by using his h-card on chat-names.



reactions
http://indiewebcamp.com/irc/2016-06-25#t1466894946795

[18:49:06] <@aaronpk>	it kind of sounds like chat is nothing more than an aggregation of an h-feed [18:49:19] 	that is what i'm trying to aim for as a first pass [18:49:27] <@aaronpk>	like if we all syndicated posts to news.indiewebcamp.com in rapid succession it would act kind of like a chat room [18:49:53] 	when I thought hard about it - it always devolved into that [18:50:01] 	it's a quick updating list of notes [18:50:02] <@aaronpk>	at which point it really becomes more of a UI challenge than a protocol challenge [18:50:09] 	yes [18:50:28] 	there is some plumbing items for say a chat service [18:50:33] <@aaronpk>	that's where Monocle is evolving towards, based on https://aaronparecki.com/2015/08/29/8/why-i-live-in-irc [18:50:38] 	[Aaron Parecki] Why I Live in IRC [18:51:00] 	yea, I have a similar evolution - I just never wrote about it [18:51:03]  <@aaronpk>	turns out i prefer reading feeds in a chat-like interface vs something like google reader or twitter

...

[18:53:38] 	what is the important difference between "chat-interface" and "traditional" readers for you? more compact presentation? different notion of read/unread (read as soon as you've seen the headline, not on interaction?) [18:53:48] <@aaronpk>	good question [18:54:12] 	for me it really boils down to decades of seeing data flow across a terminal [18:54:26] 	my whole habit is wired towards being able to process that [18:54:27] <@aaronpk>	for me, one aspect that differs from traditional readers is that i segment my chat channels by topic rather than by source [18:55:18] 	yea, I have a filter that allows me to have a "important" channel and it puts different items into it based on who or where the item comes from [18:56:52] 	that sounds like something a traditional reader-like system could implement as well, it's just easier to DIY/script in chat tools you are used to hacking on? [18:57:14] 	oh sure, I imagine someone else would do a much better version of this [18:57:36] 	I just have xmpp tools in python that let me add features quickly [18:57:57] 	it's all this feature-rich content that has made me want to change [18:58:18] <@aaronpk>	sknebel: yeah sure but for whatever reason, none have [18:58:33] <@aaronpk>	and similar for me with IRC [18:58:50] 	I am just not a fan of the magazine style UI [18:58:52]  <@aaronpk>	but now wanting features like inline images, inline action buttons, emoji responses, all are not possible within the IRC protocol [18:59:02] 	(which is my bad way of describing what I think of most readers) [18:59:31] 	technically it's not within XMPP except with some not fully supported extensions [18:59:50] 	an XMPP MUC message is a simple text field [19:00:05] 	html tags are not supposed to be present [19:00:23] 	aaronpk: yeah, traditional readers are fairly bad at filtering [19:00:35] <@aaronpk>	it's more than "filtering" is my point

prototype chat flow
Prototype of a chat message flow:


 * 1) Fido crafts a message: `hey, just posted about my latest kibble recipe`
 * 2) Fido uses micropub to post a chat item with the tag `#indieweb`
 * 3) The client adds the note to Fido's site
 * 4) The micropub processing code knows that a chat item needs to be syndicated and crafts a webmention to the group associated with the tag `#indieweb`
 * 5) The webmention is sent and the item is sent to the feed (hand wavy bits here)
 * 6) Everyone who follows the group can
 * 7) get an update when the process the h-feed of the group
 * 8) receive a push message from the group
 * 9) get updated when something like bridgy handles the webmention
 * 10) Flo gets the update and then either crafts a chat to the group or references the URL of Fido's post
 * 11) rinse-and-repeat

raw conversation in IRC
http://indiewebcamp.com/irc/2016-06-24/line/1466814050453

Please help process the below into individual sections on features / phases etc.!

17:20 tantek bear what do you think of our "chat" as "a tool incubated at/by indieweb community" rather than just "a tool of the indieweb community" 17:20 bear then loqi could be a consumer of any chat feed 17:20 tantek ? 17:20 Loqi who, me? 17:21 bear I like the idea 17:21 tantek interesting. so it's not completely crazy then. 17:21 bear it allows chat to become another stream of data that can be liberated from silos 17:21 bear as IRC is as much a silo as facebook is 17:21 tantek ^^^ that's a super powerful perspective 17:21 bear which fits into a thing i've been chasing/chewing on for quite a while now 17:22 tantek like what would it mean to connect to chat.indieweb.org via XMPP for example? 17:22 bear yes! 17:22 bear wiring up other chat protocols becomes a translation layer 17:22 aaronpk The only redeeming quality IRC has is that it's a relatively standard protocol so there are at least multiple clients you can use to connect to a server like freenode 17:22 tantek agreed 17:22 bear same can be said of XMPP 17:23 tantek XMPP doesn't seem to have survived / gotten adopted as much for group chats 17:23 tantek especially persistent / logged group chats 17:23 bear so by having indieweb chat have two well known and mature endpoints - web, irc and xmpp -- you have a lot of flexibility 17:23 tantek or maybe I'm missing the parallel universe of folks using XMPP the way so many open source devs use IRC 17:23 bear you don't see them but they are there 17:23 bear yes 17:24 bear we just got done with a series of xmpp summits just around the MUC part of the spec 17:24 tantek I think I've seen that episode of startrek tng 17:24 bear good/bad spock 17:25 tantek the one where they're out of phase and can't see each other or something 17:25 bear ahh - yes 17:26 bear i've always thought that if IRC -> really simple text or json blob ... then a lot of things can consume that 17:26 bear and it's bidirectional 17:26 bear toss in microformats... and you have the makings of a lot of flexibility 17:27 bear aaronpk is probably over there watching the feature creep and just moaning 17:27 aaronpk lol 17:27 aaronpk onthe contrary 17:27 bear (which is why I'm itching to help with this) 17:28 aaronpk I have a lot of ideas on how I want to make http chat a thing 17:28 bear and I have a core use for it - my work just had to deal with 4 hours of no slack access 17:28 bear which meant that we lost contact with our ops bot 17:28 aaronpk ouch 17:28 bear so I'm all about having multiple paths to any chat endpoint 17:29 bear yea, http chat in this case becomes a web socket (or whatever) of small json blobs 17:29 bear with microformats -- so you have identity built in 17:29 bear async chat can be over webmention 17:29 bear or micropub 17:30 bear and unlike a lot of past attempts to force a round chat peg into a square protocol hole... I don't see any oddities with that 17:31 bear with indieweb chat - each line already has a distinct url 17:32 bear that's been like a version 4 dream of mine - to have a chat conversation have replies or notes or comments from multiple sources and be threaded