{"id":907,"date":"2016-02-01T06:29:33","date_gmt":"2016-02-01T11:29:33","guid":{"rendered":"https:\/\/www.visophyte.org\/blog\/?p=907"},"modified":"2016-02-01T06:29:33","modified_gmt":"2016-02-01T11:29:33","slug":"an-email-conversation-summary-visualization","status":"publish","type":"post","link":"https:\/\/www.visophyte.org\/blog\/2016\/02\/01\/an-email-conversation-summary-visualization\/","title":{"rendered":"An email conversation summary visualization"},"content":{"rendered":"<p>We&#8217;ve been overhauling the Firefox OS Gaia Email app and its back-end to understand email conversations.\u00a0 I also created a <a href=\"https:\/\/facebook.github.io\/react\/\">react.js<\/a>-based desktop-ish development UI, <a href=\"https:\/\/github.com\/asutherland\/glodastrophe\">glodastrophe<\/a>, that consumes the same back-end.<\/p>\n<p>My first attempt at summaries for glodastrophe was the following:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-910\" src=\"https:\/\/www.visophyte.org\/blog\/wp-content\/uploads\/2016\/02\/old-summaries.png\" alt=\"old summaries; 3 message tidbits\" width=\"601\" height=\"161\" srcset=\"https:\/\/www.visophyte.org\/blog\/wp-content\/uploads\/2016\/02\/old-summaries.png 601w, https:\/\/www.visophyte.org\/blog\/wp-content\/uploads\/2016\/02\/old-summaries-600x161.png 600w, https:\/\/www.visophyte.org\/blog\/wp-content\/uploads\/2016\/02\/old-summaries-300x80.png 300w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><\/p>\n<p>The back-end derives a conversation summary object from all of the messages that make up the conversation whenever any message in the conversation changes.\u00a0 While there are some things that are always computed (the number of messages in the conversation, whether there are any unread messages, any starred\/flagged messages, etc.), the back-end also provides hooks for the front-end to provide application logic to do its own processing to meet its UI needs.<\/p>\n<p>In the case of this conversation summary, the application logic finds the first 3 unread messages in the conversation and stashes their date, author, and extracted snippet (if any) in a list of &#8220;tidbits&#8221;.\u00a0 This also is used to determine the height of the conversation summary in the conversation list.\u00a0 (The virtual list is aware of a quantized coordinate space where each conversation summary object is between 1 and 4 units high in this case.)<\/p>\n<p>While this is interesting because it&#8217;s something Thunderbird&#8217;s thread pane could not do, it&#8217;s not clear that the tidbits are an efficient use of screen real-estate.\u00a0 At least not when the number of unread messages in the conversation exceeds the 3 we cap the tidbits at.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-911\" src=\"https:\/\/www.visophyte.org\/blog\/wp-content\/uploads\/2016\/02\/time-based-thread-vis-summary.png\" alt=\"time-based thread summary visualization\" width=\"527\" height=\"81\" srcset=\"https:\/\/www.visophyte.org\/blog\/wp-content\/uploads\/2016\/02\/time-based-thread-vis-summary.png 527w, https:\/\/www.visophyte.org\/blog\/wp-content\/uploads\/2016\/02\/time-based-thread-vis-summary-300x46.png 300w\" sizes=\"auto, (max-width: 527px) 100vw, 527px\" \/><\/p>\n<p>But our app logic can actually do anything it wants.\u00a0 It could, say, establish the threading relationship of the messages in the conversation to enable us to make a highly dubious visualization of the thread structure in the conversation as well as show the activity in the conversation over time.\u00a0 Much like the visualization you already saw before you read this sentence.\u00a0 We can see the rhythm of the conversation.\u00a0 We can know whether this is a highly active conversation that&#8217;s still ongoing, or just that someone has brought back to life.<\/p>\n<p>Here&#8217;s the same visualization where we still use the <a href=\"https:\/\/github.com\/mbostock\/d3\/wiki\/Cluster-Layout\">d3 cluster layout<\/a> but don&#8217;t clobber the x-position with our manual-quasi-logarithmic time-based scale:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-912\" src=\"https:\/\/www.visophyte.org\/blog\/wp-content\/uploads\/2016\/02\/non-time-based-thread-vis-summary.png\" alt=\"the visualization without time-based x-positioning\" width=\"527\" height=\"81\" srcset=\"https:\/\/www.visophyte.org\/blog\/wp-content\/uploads\/2016\/02\/non-time-based-thread-vis-summary.png 527w, https:\/\/www.visophyte.org\/blog\/wp-content\/uploads\/2016\/02\/non-time-based-thread-vis-summary-300x46.png 300w\" sizes=\"auto, (max-width: 527px) 100vw, 527px\" \/><\/p>\n<p>Disclaimer: This visualization is ridiculously impractical in cases where a conversation has only a small number of messages.\u00a0 But a neat thing is that the application logic could decide to use textual tidbits for small numbers of unread and a cool graph for larger numbers.\u00a0 The graph&#8217;s vertical height could even vary based on the number of messages in the conversation.\u00a0 Or the visualization could use <a href=\"http:\/\/domino.watson.ibm.com\/library\/cyberdig.nsf\/papers\/7A30ED0AAC59BF5D85256D79006F272F\/$File\/RC22850.pdf\">thread-arcs<\/a> if you like visualizations but want them based on actual research.<\/p>\n<p>If you&#8217;re interested in the moving pieces in the implementation, they&#8217;re here:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/asutherland\/glodastrophe\/blob\/401d68f1229f9de66af9c8905fc5316402b75275\/www\/app\/felam\/conv_churn.js\">The application logic that generates the summary objects.<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/asutherland\/glodastrophe\/blob\/401d68f1229f9de66af9c8905fc5316402b75275\/www\/app\/felam\/conv_client_decorator.js\">The support logic that normalizes it into a form for consumption by the front-end.<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/asutherland\/glodastrophe\/blob\/b79d1585c618f2f3a4c0255aab6323e9f31cfb7b\/www\/app\/components\/visualizations\/conv_time_threading.jsx\">The visualization logic in the front-end.<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>We&#8217;ve been overhauling the Firefox OS Gaia Email app and its back-end to understand email conversations.\u00a0 I also created a react.js-based desktop-ish development UI, glodastrophe, that consumes the same back-end. My first attempt at summaries for glodastrophe was the following: &hellip; <a href=\"https:\/\/www.visophyte.org\/blog\/2016\/02\/01\/an-email-conversation-summary-visualization\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[5,116,3,13,4],"tags":[132],"class_list":["post-907","post","type-post","status-publish","format-standard","hentry","category-email","category-firefox-os","category-mozilla","category-shiny","category-visualizing","tag-glodastrophe"],"_links":{"self":[{"href":"https:\/\/www.visophyte.org\/blog\/wp-json\/wp\/v2\/posts\/907","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.visophyte.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.visophyte.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.visophyte.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.visophyte.org\/blog\/wp-json\/wp\/v2\/comments?post=907"}],"version-history":[{"count":2,"href":"https:\/\/www.visophyte.org\/blog\/wp-json\/wp\/v2\/posts\/907\/revisions"}],"predecessor-version":[{"id":914,"href":"https:\/\/www.visophyte.org\/blog\/wp-json\/wp\/v2\/posts\/907\/revisions\/914"}],"wp:attachment":[{"href":"https:\/\/www.visophyte.org\/blog\/wp-json\/wp\/v2\/media?parent=907"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.visophyte.org\/blog\/wp-json\/wp\/v2\/categories?post=907"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.visophyte.org\/blog\/wp-json\/wp\/v2\/tags?post=907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}