Two-Party Threaded Chat
I’ve been thinking about how chat tools could support multiple threads of conversation naturally. Here are my current ideas. I have also written an online demo (pure client-side JavaScript). Feel free to discuss the idea in the comments on my blog post.
Motivation
The Problem
Consider this conversation:
jane: How about lunch tomorrow?
*alex is typing
jane: Oh, and did you see my latest blog post?
alex: I'd love to, how about Spaghetti Factory at 11:30?
jane: At first I wasn't sure I should post it, but then just went ahead.
jane: Splendid, 11:30 then.
alex: No, but I'll check it out in a minute.
...
Clearly there are two separate threads of conversation. The branch occurred when Jane, impatient with Alex’s slow response, started out on an tangent while he was still typing.
An Alternative
Now consider this alternative:
Jane
jane: How about lunch tomorrow?
Alex is still typing when Jane gets impatient and sends the second, unrelated message. Jane thus starts a new thread.
jane: How about lunch tomorrow?
jane: Oh, and did you see my latest blog post?
So Alex now sees:
Alex
jane: How about lunch tomorrow?
*alex: I'd love to, how about Spaghetti <-- still typing here
---
!jane: Oh, and did you see my latest blog post?
Alex now has two options:
* Continue typing, finishing the response to Jane's first message.
* Trigger a UI action to move Jane's second message up below her first so Alex can respond to both at once, effectively merging the threads again.
He chooses to continue responding to the first message. When he’s done, he sees:
Alex
jane: How about lunch tomorrow?
alex: I'd love to, how about Spaghetti Factory at 11:30?
*alex: <-- typing here
---
!jane: Oh, and did you see my latest blog post?
*alex: <-- could type here
A hotkey allows him to switch the selected thread to respond to.
Meanwhile, Jane saw:
Jane
jane: How about lunch tomorrow?
jane: Oh, and did you see my latest blog post?
*jane: <-- typing here
When Alex’s first message comes in, she sees (the transition would be smoothly animated):
Jane
jane: How about lunch tomorrow?
!alex: I'd love to, how about Spaghetti Factory at 11:30?
*jane: <-- could type here
---
jane: Oh, and did you see my latest blog post?
*jane: At first I wasn't sure I should <-- still typing here
She also chooses to finish her current message:
Jane
jane: How about lunch tomorrow?
!alex: I'd love to, how about Spaghetti Factory at 11:30?
*jane: <-- could type here
---
jane: Oh, and did you see my latest blog post?
jane: At first I wasn't sure I should post it, but then just went ahead.
*jane: <-- typing here
Then she switches to the first thread:
Jane
jane: How about lunch tomorrow?
alex: I'd love to, how about Spaghetti Factory at 11:30?
*jane: Splendid, 1 <-- typing here
---
jane: Oh, and did you see my latest blog post?
jane: At first I wasn't sure I should post it, but then just went ahead.
*jane: <-- could type here
Meanwhile, Alex has also switched and sees:
Alex
jane: How about lunch tomorrow?
alex: I'd love to, how about Spaghetti Factory at 11:30?
*alex: <-- could type here
---
jane: Oh, and did you see my latest blog post?
*alex: No, but I'll check it <-- typing here
And when Jane’s message comes in:
Alex
jane: How about lunch tomorrow?
alex: I'd love to, how about Spaghetti Factory at 11:30?
!jane: Splendid, 11:30 then.
*alex: <-- could type here
---
jane: Oh, and did you see my latest blog post?
*alex: No, but I'll check it <-- typing here
Again, he just finishes.
Which gives Jane:
Jane
jane: How about lunch tomorrow?
alex: I'd love to, how about Spaghetti Factory at 11:30?
jane: Splendid, 11:30 then.
*jane: <-- typing here
---
jane: Oh, and did you see my latest blog post?
jane: At first I wasn't sure I should post it, but then just went ahead.
!alex: No, but I'll check it out in a minute.
*jane: <-- could type here
Observations
- A message that arrives while you’re still typing starts a new thread. You have the option to quickly pull the new message up into the current thread if you want to.
- A message that arrives re an earlier message in the current thread starts a new thread.
- A message that arrives in a thread where you haven’t typed does not start a new thread. It remains highlighted until you focus that thread again (the ! above).
- You can explicitly merge threads.
- Threads are separated by sizers.
- You have a separate input box per thread so you can have multiple unfinished responses pending.
Implementation
A key idea could be that one can always identify the message re which one is responding by the smallest sufficient prefix of the message text. This might also be rather compatible with tools that do not support the thread UI. For the latter, we might want to use a minimum prefix length so the text reads better.
jane: How about lunch tomorrow?
jane: Oh, and did you see my latest blog post?
alex: I'd love to, how about Spaghetti Factory at 11:30? (re: How...)
jane: At first I wasn't sure I should post it, but then just went ahead. (re: Oh,...)
jane: Splendid, 11:30 then. (re: I'd...)
alex: No, but I'll check it out in a minute. (re: At ...)
...
In fact, it is even possible for people to do the (re: …) stuff manually when in a plain chat tool.
Demo
You can play with some of the ideas presented here in an online demo (pure client-side JavaScript).
Feel free to discuss this idea in the comments on my blog post.