Update! The source-code for this app can be found at https://github.com/edent/TweeView





Many years ago, I created a threaded conversation viewer for fledgling social network App.net. It was a unique way to flow through a conversation without having to be constrained by the linear vertical scroll of the typical web browser.

App.net died – and I never found a reasonable way to recreate it for Twitter. Until today.

Paul Butler has created “Treeverse” a Chrome Extension which lets you visualise Twitter conversations in a tree view.

This is what Twitter threads actually look like. They’re not linear conversations, they’re branching organic trees.

They’re even more beautiful when you decouple them from content. This is the same conversation but viewed differently.

That’s a d3 representation of the data created by the twarc utilities.

Some threads become so long and involved that the original user might not even see how they conclude. This is what “off topic” looks like!

Some arc off into a mess – but that’s OK! You should be able to prune off the branches which don’t matter to you.

Some threads are small, but perfectly formed. Is this easier to read than Twitter’s vertical list? I don’t know – but it is more useful for seeing how a discussion evolves.

But you’ll never be able to take advantage of all the beauty you create. Twitter selfishly keeps its “conversation/show.json” API private.

Most Twitter conversation viewers use the only resource available to them – the search API.

Take a Tweet then search for @ messages to the author, and then filter the ones you need. Of course, the search function only goes back 7 days, so you can’t see older conversations.

Want to go more than one level deep? Ha! Good luck. Your recursive calls will quickly hit the API limits.

A proper conversation API has been one of the most requested features of Twitter.

It exists.

But only for official Twitter Apps.

Plenty of people have documented Twitter’s private APIs. In order to call conversation/show.json , you’ll need to use the official API keys. This is left as an exercise to the reader.

Once done, I’ve written a short Python script which grabs the first 100 tweets in a conversation, and then spits out a twarc file like:

{"in_reply_to_user_id_str": null, "favorite_count": 38, "conversation_muted": false, "geo": null, "user": {"has_custom_timelines": true, "has_extended_profile": true, "can_media_tag": true, "profile_text_color": "000000", "verified": true, "geo_enabled": true, "translator_type": "regular", "profile_sidebar_fill_color": "000000", "profile_banner_url": "https://pbs.twimg.com/profile_banners/14054507/1475930656", "protected": false, "friends_count": 1410, "lang": "en", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "profile_link_color": "111111", "media_count": 4687, "favourites_count": 4843, "profile_image_url": "http://pbs.twimg.com/profile_images/785312424031293440/ilDkJR5W_normal.jpg", "listed_count": 524, "follow_request_sent": false, "profile_background_tile": false, "contributors_enabled": false, "notifications": false, "is_translator": false, "fast_followers_count": 0, "statuses_count": 57733, "url": "https://t.co/kwnDM2CmcS", "profile_background_color": "000000", "default_profile_image": false, "profile_sidebar_border_color": "000000", "is_translation_enabled": false, "location": "Oxford, UK", "utc_offset": 0, "pinned_tweet_ids": [554772317738659840], "screen_name": "edent", "followers_count": 6998, "id_str": "14054507", "time_zone": "London", "description": "Digital Troublemaker & Unicode Wizard\r

Long haired \u24cb geek\r

Contact: https://t.co/0PrrgROeBF\r

Husband to @summerbeth\r

Open Standards at GDS\r

All content personal & \u00a9", "name": "Terence Eden \u23fb", "following": false, "default_profile": false, "created_at": "Thu Feb 28 13:10:25 +0000 2008", "profile_use_background_image": false, "id": 14054507, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "business_profile_state": "none", "followed_by": false, "profile_image_url_https": "https://pbs.twimg.com/profile_images/785312424031293440/ilDkJR5W_normal.jpg", "entities": {"description": {"urls": [{"expanded_url": "http://edent.tel", "indices": [68, 91], "url": "https://t.co/0PrrgROeBF", "display_url": "edent.tel"}]}, "url": {"urls": [{"expanded_url": "https://shkspr.mobi/blog/", "indices": [0, 23], "url": "https://t.co/kwnDM2CmcS", "display_url": "shkspr.mobi/blog/"}]}}, "normal_followers_count": 6998}, "retweet_count": 28, "text": "Why does Twitter only allow ASCII usernames?

Why can't people be

@\u6768\u7d2b\u743c

@\u0cb6\u0cbf\u0cb2\u0ccd\u0caa\u0cbe

@\u05d2\u05dc\u05d2\u05d3\u05d5\u05ea

Seems like a good way to attract more diverse users.", "in_reply_to_screen_name": null, "place": null, "lang": "en", "id_str": "836480213706027009", "source": "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>", "supplemental_language": null, "display_type": "Unfiltered", "retweeted": false, "is_quote_status": false, "conversation_id": 836480213706027009, "in_reply_to_status_id_str": null, "favorited": false, "truncated": false, "created_at": "Tue Feb 28 07:36:38 +0000 2017", "in_reply_to_status_id": null, "in_reply_to_user_id": null, "entities": {"user_mentions": [], "symbols": [], "urls": [], "hashtags": []}, "id": 836480213706027009, "coordinates": null, "contributors": null} {"in_reply_to_user_id_str": "14054507", "favorite_count": 8, "conversation_muted": false, "geo": null, "user": {"has_custom_timelines": false, "has_extended_profile": false, "can_media_tag": true, "profile_text_color": "000000", "verified": false, "geo_enabled": false, "translator_type": "none", "profile_sidebar_fill_color": "E0FF92", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3245521/1354025434", "protected": false, "friends_count": 277, "lang": "en", "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/673972/DSC00618.jpg", "profile_link_color": "8A0707", "media_count": 2259, "favourites_count": 8873, "profile_image_url": "http://pbs.twimg.com/profile_images/793351707141046272/NLnNTFtC_normal.jpg", "listed_count": 224, "follow_request_sent": false, "profile_background_tile": false, "contributors_enabled": false, "notifications": false, "is_translator": false, "fast_followers_count": 0, "statuses_count": 60264, "url": "https://t.co/IrlbubdFwS", "profile_background_color": "FFFFFF", "default_profile_image": false, "profile_sidebar_border_color": "87BC44", "is_translation_enabled": false, "location": "London/Dartford", "utc_offset": 0, "pinned_tweet_ids": [804450143999127552], "screen_name": "Thayer", "followers_count": 3903, "id_str": "3245521", "time_zone": "London", "description": "I tweet about technology, videogaming, running, cats & music. Oh, and microbragging like everyone else.", "name": "Thayer Prime", "following": true, "default_profile": false, "created_at": "Mon Apr 02 20:06:57 +0000 2007", "profile_use_background_image": true, "id": 3245521, "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/673972/DSC00618.jpg", "business_profile_state": "none", "followed_by": true, "profile_image_url_https": "https://pbs.twimg.com/profile_images/793351707141046272/NLnNTFtC_normal.jpg", "entities": {"description": {"urls": []}, "url": {"urls": [{"expanded_url": "http://www.linkedin.com/in/thayerprime", "indices": [0, 23], "url": "https://t.co/IrlbubdFwS", "display_url": "linkedin.com/in/thayerprime"}]}}, "normal_followers_count": 3903}, "retweet_count": 0, "text": "@edent because Twitter was created and is run by a load of white dudes?", "in_reply_to_screen_name": "edent", "place": null, "lang": "en", "id_str": "836481289926676481", "source": "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>", "supplemental_language": null, "display_type": "Unfiltered", "retweeted": false, "is_quote_status": false, "conversation_id": 836480213706027009, "in_reply_to_status_id_str": "836480213706027009", "favorited": false, "truncated": false, "created_at": "Tue Feb 28 07:40:55 +0000 2017", "in_reply_to_status_id": 836480213706027009, "in_reply_to_user_id": 14054507, "entities": {"user_mentions": [{"id_str": "14054507", "screen_name": "edent", "id": 14054507, "indices": [0, 6], "name": "Terence Eden \u23fb"}], "symbols": [], "urls": [], "hashtags": []}, "id": 836481289926676481, "coordinates": null, "contributors": null} {"in_reply_to_user_id_str": "14054507", "favorite_count": 0, "conversation_muted": false, "geo": null, "user": {"has_custom_timelines": true, "has_extended_profile": false, "can_media_tag": false, "profile_text_color": "333333", "verified": false, "geo_enabled": false, "translator_type": "regular", "profile_sidebar_fill_color": "F0F5FF", "profile_banner_url": "https://pbs.twimg.com/profile_banners/247221187/1400569584", "protected": false, "friends_count": 1302, "lang": "de", "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/201253234/twitter.jpg", "profile_link_color": "249100", "media_count": 76, "favourites_count": 1650, "profile_image_url": "http://pbs.twimg.com/profile_images/478498295824670720/iP35wpZ6_normal.png", "listed_count": 41, "follow_request_sent": false, "profile_background_tile": false, "contributors_enabled": false, "notifications": false, "is_translator": false, "fast_followers_count": 0, "statuses_count": 7000, "url": "http://t.co/Eq4HweFqdR", "profile_background_color": "080E1D", "default_profile_image": false, "profile_sidebar_border_color": "000000", "is_translation_enabled": false, "location": "Germany", "utc_offset": 3600, "pinned_tweet_ids": [578321256224854018], "screen_name": "m_strehl", "followers_count": 306, "id_str": "247221187", "time_zone": "Bern", "description": "A web enthusiast usually known as Boldewyn. Head over to @CodepointsNet, if you\u2019re interested in #Unicode!", "name": "Manuel Strehl", "following": false, "default_profile": false, "created_at": "Fri Feb 04 10:29:35 +0000 2011", "profile_use_background_image": true, "id": 247221187, "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/201253234/twitter.jpg", "business_profile_state": "none", "followed_by": true, "profile_image_url_https": "https://pbs.twimg.com/profile_images/478498295824670720/iP35wpZ6_normal.png", "entities": {"description": {"urls": []}, "url": {"urls": [{"expanded_url": "http://www.manuel-strehl.de", "indices": [0, 22], "url": "http://t.co/Eq4HweFqdR", "display_url": "manuel-strehl.de"}]}}, "normal_followers_count": 306}, "retweet_count": 0, "text": "@edent a very easy way to dodge implementing UTR 35 and UTS 39, methinks.", "in_reply_to_screen_name": "edent", "place": null, "lang": "en", "id_str": "836481297069588480", "source": "<a href=\"https://about.twitter.com/products/tweetdeck\" rel=\"nofollow\">TweetDeck</a>", "supplemental_language": null, "display_type": "Unfiltered", "retweeted": false, "is_quote_status": false, "conversation_id": 836480213706027009, "in_reply_to_status_id_str": "836480213706027009", "favorited": false, "truncated": false, "created_at": "Tue Feb 28 07:40:56 +0000 2017", "in_reply_to_status_id": 836480213706027009, "in_reply_to_user_id": 14054507, "entities": {"user_mentions": [{"id_str": "14054507", "screen_name": "edent", "id": 14054507, "indices": [0, 6], "name": "Terence Eden \u23fb"}], "symbols": [], "urls": [], "hashtags": []}, "id": 836481297069588480, "coordinates": null, "contributors": null} {"in_reply_to_user_id_str": "14054507", "favorite_count": 1, "conversation_muted": false, "geo": null, "user": {"has_custom_timelines": false, "has_extended_profile": false, "can_media_tag": true, "profile_text_color": "000000", "verified": false, "geo_enabled": false, "translator_type": "none", "profile_sidebar_fill_color": "000000", "profile_banner_url": "https://pbs.twimg.com/profile_banners/2785681244/1411232504", "protected": false, "friends_count": 161, "lang": "en-gb", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "profile_link_color": "FA743E", "media_count": 58, "favourites_count": 537, "profile_image_url": "http://pbs.twimg.com/profile_images/705780791901560832/av_PgMEV_normal.jpg", "listed_count": 21, "follow_request_sent": false, "profile_background_tile": false, "contributors_enabled": false, "notifications": false, "is_translator": false, "fast_followers_count": 0, "statuses_count": 743, "url": "http://t.co/un8YyBG1hM", "profile_background_color": "000000", "default_profile_image": false, "profile_sidebar_border_color": "000000", "is_translation_enabled": false, "location": "", "utc_offset": null, "pinned_tweet_ids": [], "screen_name": "sxaTech", "followers_count": 101, "id_str": "2785681244", "time_zone": null, "description": "Node.JS, technical toys and other things separate from my other feeds.. All opinions are mine and may not represent those of my employer", "name": "Stewart X Addison", "following": false, "default_profile": false, "created_at": "Tue Sep 02 10:28:50 +0000 2014", "profile_use_background_image": false, "id": 2785681244, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "business_profile_state": "none", "followed_by": true, "profile_image_url_https": "https://pbs.twimg.com/profile_images/705780791901560832/av_PgMEV_normal.jpg", "entities": {"description": {"urls": []}, "url": {"urls": [{"expanded_url": "http://sxatech.blogspot.com", "indices": [0, 22], "url": "http://t.co/un8YyBG1hM", "display_url": "sxatech.blogspot.com"}]}}, "normal_followers_count": 101}, "retweet_count": 0, "text": "@edent I suspect because it would be very difficult for many people to @ them easily(Plus it'd make it more easy to make fake looking names)", "in_reply_to_screen_name": "edent", "place": null, "lang": "en", "id_str": "836481618193842176", "source": "<a href=\"http://www.twitter.com\" rel=\"nofollow\">Twitter for Windows</a>", "supplemental_language": null, "display_type": "Unfiltered", "retweeted": false, "is_quote_status": false, "conversation_id": 836480213706027009, "in_reply_to_status_id_str": "836480213706027009", "favorited": false, "truncated": false, "created_at": "Tue Feb 28 07:42:13 +0000 2017", "in_reply_to_status_id": 836480213706027009, "in_reply_to_user_id": 14054507, "entities": {"user_mentions": [{"id_str": "14054507", "screen_name": "edent", "id": 14054507, "indices": [0, 6], "name": "Terence Eden \u23fb"}], "symbols": [], "urls": [], "hashtags": []}, "id": 836481618193842176, "coordinates": null, "contributors": null} {"in_reply_to_user_id_str": "14054507", "favorite_count": 1, "conversation_muted": false, "geo": null, "user": {"has_custom_timelines": false, "has_extended_profile": false, "can_media_tag": true, "profile_text_color": "663B12", "verified": false, "geo_enabled": true, "translator_type": "regular", "profile_sidebar_fill_color": "DAECF4", "protected": false, "friends_count": 904, "lang": "en", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme2/bg.gif", "profile_link_color": "1F98C7", "media_count": 204, "favourites_count": 4340, "profile_image_url": "http://pbs.twimg.com/profile_images/339464991/twitter_normal.jpg", "listed_count": 99, "follow_request_sent": false, "profile_background_tile": false, "contributors_enabled": false, "notifications": false, "is_translator": false, "fast_followers_count": 0, "statuses_count": 14135, "url": "https://t.co/MeDbivDBJS", "profile_background_color": "C6E2EE", "default_profile_image": false, "profile_sidebar_border_color": "C6E2EE", "is_translation_enabled": false, "location": "London", "utc_offset": 0, "pinned_tweet_ids": [653282279503069186], "screen_name": "philandstuff", "followers_count": 1140, "id_str": "15619048", "time_zone": "London", "description": "Wrangling registers at @gdsteam. Husband of @sonia_stevenson.", "name": "Philip Potter", "following": false, "default_profile": false, "created_at": "Sun Jul 27 10:19:37 +0000 2008", "profile_use_background_image": true, "id": 15619048, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme2/bg.gif", "business_profile_state": "none", "followed_by": true, "profile_image_url_https": "https://pbs.twimg.com/profile_images/339464991/twitter_normal.jpg", "entities": {"description": {"urls": []}, "url": {"urls": [{"expanded_url": "http://www.philandstuff.com", "indices": [0, 23], "url": "https://t.co/MeDbivDBJS", "display_url": "philandstuff.com"}]}}, "normal_followers_count": 1140}, "retweet_count": 0, "text": "@edent also, a good way to allow tricky impersonators (see also: IRIs in phishing attacks)", "in_reply_to_screen_name": "edent", "place": null, "lang": "en", "id_str": "836483586828222465", "source": "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>", "supplemental_language": null, "display_type": "Unfiltered", "retweeted": false, "is_quote_status": false, "conversation_id": 836480213706027009, "in_reply_to_status_id_str": "836480213706027009", "favorited": false, "truncated": false, "created_at": "Tue Feb 28 07:50:02 +0000 2017", "in_reply_to_status_id": 836480213706027009, "in_reply_to_user_id": 14054507, "entities": {"user_mentions": [{"id_str": "14054507", "screen_name": "edent", "id": 14054507, "indices": [0, 6], "name": "Terence Eden \u23fb"}], "symbols": [], "urls": [], "hashtags": []}, "id": 836483586828222465, "coordinates": null, "contributors": null} {"in_reply_to_user_id_str": "3245521", "favorite_count": 1, "conversation_muted": false, "geo": null, "user": {"has_custom_timelines": true, "has_extended_profile": true, "can_media_tag": true, "profile_text_color": "000000", "verified": true, "geo_enabled": true, "translator_type": "regular", "profile_sidebar_fill_color": "000000", "profile_banner_url": "https://pbs.twimg.com/profile_banners/14054507/1475930656", "protected": false, "friends_count": 1410, "lang": "en", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "profile_link_color": "111111", "media_count": 4687, "favourites_count": 4843, "profile_image_url": "http://pbs.twimg.com/profile_images/785312424031293440/ilDkJR5W_normal.jpg", "listed_count": 524, "follow_request_sent": false, "profile_background_tile": false, "contributors_enabled": false, "notifications": false, "is_translator": false, "fast_followers_count": 0, "statuses_count": 57733, "url": "https://t.co/kwnDM2CmcS", "profile_background_color": "000000", "default_profile_image": false, "profile_sidebar_border_color": "000000", "is_translation_enabled": false, "location": "Oxford, UK", "utc_offset": 0, "pinned_tweet_ids": [554772317738659840], "screen_name": "edent", "followers_count": 6998, "id_str": "14054507", "time_zone": "London", "description": "Digital Troublemaker & Unicode Wizard\r

Long haired \u24cb geek\r

Contact: https://t.co/0PrrgROeBF\r

Husband to @summerbeth\r

Open Standards at GDS\r

All content personal & \u00a9", "name": "Terence Eden \u23fb", "following": false, "default_profile": false, "created_at": "Thu Feb 28 13:10:25 +0000 2008", "profile_use_background_image": false, "id": 14054507, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "business_profile_state": "none", "followed_by": false, "profile_image_url_https": "https://pbs.twimg.com/profile_images/785312424031293440/ilDkJR5W_normal.jpg", "entities": {"description": {"urls": [{"expanded_url": "http://edent.tel", "indices": [68, 91], "url": "https://t.co/0PrrgROeBF", "display_url": "edent.tel"}]}, "url": {"urls": [{"expanded_url": "https://shkspr.mobi/blog/", "indices": [0, 23], "url": "https://t.co/kwnDM2CmcS", "display_url": "shkspr.mobi/blog/"}]}}, "normal_followers_count": 6998}, "retweet_count": 0, "text": "@Thayer sadly, yup.", "in_reply_to_screen_name": "Thayer", "place": null, "lang": "en", "id_str": "836484449193902081", "source": "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>", "supplemental_language": null, "display_type": "Unfiltered", "retweeted": false, "is_quote_status": false, "conversation_id": 836480213706027009, "in_reply_to_status_id_str": "836481289926676481", "favorited": false, "truncated": false, "created_at": "Tue Feb 28 07:53:28 +0000 2017", "in_reply_to_status_id": 836481289926676481, "in_reply_to_user_id": 3245521, "entities": {"user_mentions": [{"id_str": "3245521", "screen_name": "Thayer", "id": 3245521, "indices": [0, 7], "name": "Thayer Prime"}], "symbols": [], "urls": [], "hashtags": []}, "id": 836484449193902081, "coordinates": null, "contributors": null} {"in_reply_to_user_id_str": "2785681244", "favorite_count": 4, "conversation_muted": false, "geo": null, "user": {"has_custom_timelines": true, "has_extended_profile": true, "can_media_tag": true, "profile_text_color": "000000", "verified": true, "geo_enabled": true, "translator_type": "regular", "profile_sidebar_fill_color": "000000", "profile_banner_url": "https://pbs.twimg.com/profile_banners/14054507/1475930656", "protected": false, "friends_count": 1410, "lang": "en", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "profile_link_color": "111111", "media_count": 4687, "favourites_count": 4843, "profile_image_url": "http://pbs.twimg.com/profile_images/785312424031293440/ilDkJR5W_normal.jpg", "listed_count": 524, "follow_request_sent": false, "profile_background_tile": false, "contributors_enabled": false, "notifications": false, "is_translator": false, "fast_followers_count": 0, "statuses_count": 57733, "url": "https://t.co/kwnDM2CmcS", "profile_background_color": "000000", "default_profile_image": false, "profile_sidebar_border_color": "000000", "is_translation_enabled": false, "location": "Oxford, UK", "utc_offset": 0, "pinned_tweet_ids": [554772317738659840], "screen_name": "edent", "followers_count": 6998, "id_str": "14054507", "time_zone": "London", "description": "Digital Troublemaker & Unicode Wizard\r

Long haired \u24cb geek\r

Contact: https://t.co/0PrrgROeBF\r

Husband to @summerbeth\r

Open Standards at GDS\r

All content personal & \u00a9", "name": "Terence Eden \u23fb", "following": false, "default_profile": false, "created_at": "Thu Feb 28 13:10:25 +0000 2008", "profile_use_background_image": false, "id": 14054507, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "business_profile_state": "none", "followed_by": false, "profile_image_url_https": "https://pbs.twimg.com/profile_images/785312424031293440/ilDkJR5W_normal.jpg", "entities": {"description": {"urls": [{"expanded_url": "http://edent.tel", "indices": [68, 91], "url": "https://t.co/0PrrgROeBF", "display_url": "edent.tel"}]}, "url": {"urls": [{"expanded_url": "https://shkspr.mobi/blog/", "indices": [0, 23], "url": "https://t.co/kwnDM2CmcS", "display_url": "shkspr.mobi/blog/"}]}}, "normal_followers_count": 6998}, "retweet_count": 0, "text": "@sxaTech Errr? If you natively type in Chinese / Arabic / whatever, it'll be *easier* to @ someone in the same language.", "in_reply_to_screen_name": "sxaTech", "place": null, "lang": "en", "id_str": "836484666769178626", "source": "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>", "supplemental_language": null, "display_type": "Unfiltered", "retweeted": false, "is_quote_status": false, "conversation_id": 836480213706027009, "in_reply_to_status_id_str": "836481618193842176", "favorited": false, "truncated": false, "created_at": "Tue Feb 28 07:54:20 +0000 2017", "in_reply_to_status_id": 836481618193842176, "in_reply_to_user_id": 2785681244, "entities": {"user_mentions": [{"id_str": "2785681244", "screen_name": "sxaTech", "id": 2785681244, "indices": [0, 8], "name": "Stewart X Addison"}], "symbols": [], "urls": [], "hashtags": []}, "id": 836484666769178626, "coordinates": null, "contributors": null}

This can then be imported into Treeverse:

Or processed in twarc:

Or anything else your imagination desires.

Enjoy!

Carry on the conversation on Twitter.