Unrolled thread from @prayingmedic Automated Screen Scraper = #Qanon https://qcodefag.github.io/ https://threadreaderapp.com/thread/962480672064466944.html Evidence Below ((( https://jerome.gangneux.net/blog/2017/09/12/thread-reader-from-idea-to-launch.html ))) This project started on August 11, 2017 Like levels.io’ Hoodmaps project — which is a great source of inspiration — I wanted to show how easy it is to build a functioning web service from the idea to the first sign of traction. This post is not to brag about me or anything like that, but instead show you that you can do it too. I made few videos so you can follow the technical parts. These videos are not here for you to copy that project but more to give you inspiration and a sense of the time it takes. The problem First of all I came up with a problem, it is better if it is a problem you personally have. It has not to be some game changing idea, start small. The objective is to find people that have the same problem as you. My problem was that it is a pain to read Twitter threads (or Tweetstorm) on the official twitter website/app and I think that all the Tweets put one after another in a medium.com alike page could be better. I made up a description of the idea plus a one-liner to check if it could interest anyone. I will try to expose many people to that message and see how they react. One-liner: Read Twitter threads with ease Detail: The base idea is to allow people to better read Twitter threads. Let say one person needs to say more than can fit in a tweet, the way of doing that is to start a “thread”. A thread is a tweet followed by many replies to each others. So when you read the first one the others are linked and you can follow the full story, but in reality Twitter is not meant to be used that way, the UX is less than optimal. What about a service that helps you unroll a full Twitter thread on a dedicated beautifully designed page to allow an easy read of the whole story? Want to test it follow => @ThreadReaderApp For that specific idea, because it targets Twitter, I will use that medium to start gather users. But depending on your idea you could build a quick landing page to try to convince user with your message and ask for emails. To make a landing page you could use launchrock.com (mostly free with paying upgrades) We need to prepare a minimum of graphic assets to make it credible. Of course nothing exists yet so we will have to fake it. To illustrate the service I will take a real Twitter thread on web and show a fake result that looks like the final page. For that I will use medium.com as an inspiration (design side) and Photoshop to copy/paste elements from Twitter and make the illusion working. During all the process you should stay close to your first users (prospects) and include them in the progress loop. It could be with update on Twitter, email, polls or anything. We must build some with minimum effort so it would be easy to iterate and to deploy. At that point it CAN be buggy, but it must be online. For that project we will need a Twitter account and Twitter App Tech stack My choice will be the LAMP stack with the Silex framework, Silex is a very minimal php framework. I chose it because I like to work with it, but also because it is very close to raw php so you can understand the code (no specific framework code on our way). Now that our web App is ready and our Twitter App is created, we are going to spend some time with the Twitter API and get around the official documentation. See: https://dev.twitter.com/rest/public and https://dev.twitter.com/overview/api/tweets Of course in our process we want to leverage the existing and do not reinvent the wheel we will choose an existing PHP library that will allow us to interact with Twitter. The choice of any library could be tricky, the best is to check if the platform has an official version and if not if they recommend any. For Twitter they list multiple PHP libraries. So you have to check by yourself, see if the project is active, and how many stars it has on Github for example. I choosed j7mbo/twitter-api-php after some testing. Note: This project is built live and you will see that, like any real project, we will encounter unexpected feasibility issues. The next step is to get the replies to a specific tweet. My opinion is that this feature should be exposed somewhere in the API, so let’s read the documentation. … Ok, I can not find anything talking about “replies” in the documentation, I’m quite sure I’m missing something but let’s check that on Google. Ooops, as seen on a recent post of Stack overflow the Twitter API does not provide replies to a specific tweet. OMG that’s a shame 😔 People suggest to use the Search API with specifics queries to get tweets related to the one we want. We have no choice, let’s try that. Note: During the building phase you’re going to have a lot of feature ideas. DO NOT IMPLEMENT THEM Note them in a todo/idea list but you should be focused on something minimal and go live instead of a bigger project that will never hit the server. Let’s continue the code for now, a working proof of concept could be online soon, then it will be easy to iterate and add features. The code quality is far from perfect but it is not the goal here, refactoring will be fun and cheap as we don’t put much features in it. And to be honest in 90% of the time projects won’t succeed and you’re going to trash everything. Trust me on this one. You should fail fast. Design Getting the data works! Now it is time to put that in a great design, then add some caching to prevent long loading time and Twitter API rate limitation. For that I will look for a public free template with a medium.com look and built a static HTML+CSS page which I will integrate after. After spending some time on the Internet looking for a free template, I realize that it is not that easy, so I’m going to get some “inspiration” (cough copy cough) from medium.com Design is always important so let’s use a good tool from the start: Bootstrap and use one of their example as a starting base https://getbootstrap.com/examples/sticky-footer-navbar/ Now that the data are in the template, we need to put some basic caching in place. It is mainly because the Twitter API is quite slow and we do have quotas to respect too. Expiry time has to be tweaked to get an optimal value, I would say between 3 and 5 minutes. Technical note: Be careful as the caching mechanism is not proof to the dogpile effect and need some more work but it is enough for a MVP. We are almost ready to go live, let the user add some content to the site and it will be done. Great the user can unroll his URL, now it is time to test with few real use cases and check if everything is alright… In this project the data is user generated, so we will encounter many edge cases. Either the user will do something wrong, or we have a real bug, in both cases we will have to help our users understand why they don’t get the expected result. The way to handle that could be an error message saying that it does not seems to be a thread and to ask the user to make a report if he thinks it is one indeed. I put that in the todo list 😀 Launching Going online For a small PHP+MySQL MVP project you don’t need expensive server at start. I checked for you 000webhost.com hosting and it looks like it can do the trick. I’ll let you check how you can push a project online, it is not that complicated but you will have to pay a little to get a domain and an great service. On my side I’ll use my personal server for now. If you have AWS it would do too of course. Note: I did prepare a few video about pushing a project online but because I already have my server it is not relevant so I decided to not publish it. Iterate Unfortunately the twitter search API has major limitation that goes on our way: First it does not index all tweets Then the index expires quite early (about 10 days) Finally we can not get more than 100 entries per call Note: Remember that working on a specific platform is always risky. We can hit platform limitations or even be banned or get our API point modified, that is the game. Let’s do our last technical improvement: remove twitter search and work with timeline instead. We also put in place a minimum of analytics, the choice of a KPI could be important too. Here because it is a website based service I will watch for users sessions (Google Analytics) and as a second KPI I’ll take the number of unrolled thread (as seen in the database). At this point it misses many features: https, a domain name, display media, follow author, polish design, share the page, replies, favicon, extension version, trends and more… but we need to resist and take some time to communicate and ask for feedback. Everything is online now, it is communication time! Communication I’m not a marketing guy, like not at all. But for this service, because it is on Twitter, it seems easy to find a few growth hacks or dropping the buzzword: automated marketing. Here are some idea I got, as usual it takes time to implement so I will test it manually first: When a thread has been unrolled on the service, the Twitter account could follow the main user and reply to the thread with a link to read it on the website. Use Twitter search to look for thread related keywords like #threads #unroll and so on, then unroll the thread if applicable and message the author. That’s right, I’m taking some human time to contact people and unroll thread by hand to get the tool some traction. Also it allows me to talk with the user and see if they are interested. I spent about 2 × 3h to do that. Basically I search for “#thread” or “tweetstorm”, and it is not so easy to find great content (something that our bot will have to deal with) Note: As a rule of thumb we have to ask people to pay early to see if the service has value, but for this service I decided to offer it for free. Now that we are on tracks and can iterate fast, let’s ask user for feedbacks and start implements new features. User feedbacks You should contact every user you have and ask them for feedback, I did contact many of them on Twitter and I got some interesting thoughts: “Can it be a browser extension so I don’t have to leave Twitter?” “How can you be sure that people will remember about your product each time they need it, and how to be sure they will take the time to use it resisting the urge to see the story in the first place” “Hey can you make it so if you have a pic in first tweet it shows up w/in blue box?” “I like the idea but how you’re going to handle the mobile version?” “Maybe it needs a refresh thread button?” In the second episode (coming soon) we will talk more in depth about communication and traction. 👉 Meanwhile you can check the Thread Reader website. Annexe Youtube videos Create a Twitter account and App Setup PHP and Silex framework Get your first Tweet from the Twitter API Get replies from a given Tweet with the Twitter search API Loop over each Tweet plus testing and debug Template using example from Twitter bootstrap Implement a caching mechanism Allow use to post new content to the site Switch from Twitter Search to Timeline TODO List This is an example of my todo list at some point, it is here to show you that you don’t have to worry about having many thing to do, it goes by: Show media Sometime people write “1/x” we could remove/lighten that? When a thread is too old the API does not allow to retrieve it Extended tweets has all the @mentions at the start of the tweet text, put them aside If the thread has only one tweet, show an error message (try to be explicit about the reason) Beautiful error pages Show embedded tweets/youtube videos Sometime expended links are to long and break the design Add suggestion of what to read next in the bottom of the page Add a big CTA “share this thread” on top of the page Full twitter user badge on each page Make a Twitter bot to do the job and explain that on the homepage Allow people to reclaim and/or remove a specific tttthreads (and block it) Sondages are not shown, that’s ok but explicit it someway Make some gif to show how it works (bot and full service) Make a waiting page if the thread had never been retrieved because it can be super long Block specific #hashtag (including for example #thread) Prepare the communication for diverses websites Automated marketing, look for #thread and try to unroll, if the result is > 3 send the link to the user Preview should show textual information and hashtags instead of image Add trends on homepage If possible merge bots so mention would work with both or keep only one And so on… contact: jerome@gangneux.net https://jerome.gangneux.net/ Jérôme Gangneux Mobile developer + Entrepreneur Working holiday VISA @ Vancouver jerome@gangneux.net 32 years old (French) Professional Experience October 17 – now Vancouver, Canada Android developer for Later.com - June 16 – June 17 Paris, France Hacker in residence for Augment Android Prototyping & User testing — Developer experience (samples and official developer website) + R&D Jan 16 – May 16 Paris, France CTO for Whask My role was to help Whask to internalize the technical parts so we can iterate more quickly. Thanks to the LEAN methodology, we tested multiple ideas to get to the market. I did both mobile applications (iOS / Android) and managed one intern Oct 14 – Dec 15 Paris, France CTO for Budeal & MrSmartphone My role at Budeal was to help build beautiful and working applications (native iOS / Android / Web) With Budeal we were part of the Paris NUMA incubator season 7 Budeal pivoted to Mr Smartphone Oct 13 – Oct 14 Paris, France Working for Webedia Backend architect and lead developer for academiedugout.fr using Symfony2 on LAMP July 12 – Sep 13 Paris, France Working for Newsring.fr Lead backend developer for the website using Kohana framework, then migrated to Symfony2 on LAMP Newsring was acquired by Webedia July 10 – July 12 Paris, France Founder of Citroon.com I worked on my own startup citroon.com Combining various technologies like XMPP / Android / LAMP Sep 08 – July 10 Paris, France Web Developer for Netvibes I did some R&D about DB / NoSQL, and worked on the new PHP feed backend Oct 07 – Mar 08 Perth, Australia Web Developer for TheBroth I worked on Facebook games scaling the existing codebase for million of users. PHP/MySQL Extremely Vulnerable Site www.globaleaks.org/ [+] URL: https://www.globaleaks.org/ [+] Started: Fri Feb 16 06:15:27 2018 [+] robots.txt available under: 'https://www.globaleaks.org/robots.txt' [+] Interesting entry from robots.txt: https://www.globaleaks.org/wp-admin/ [+] Interesting entry from robots.txt: https://www.globaleaks.org/wp-admin/admin-ajax.php [!] The WordPress 'https://www.globaleaks.org/readme.html' file exists exposing a version number [+] Interesting header: CF-RAY: 3ede6000a82535cc-LHR [+] Interesting header: EXPECT-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" [+] Interesting header: LINK: ; rel="https://api.w.org/", ; rel=shortlink [+] Interesting header: SERVER: cloudflare [+] Interesting header: SET-COOKIE: wfvt_961270297=5a86771c82029; expires=Fri, 16-Feb-2018 06:45:56 GMT; Max-Age=1800; path=/; secure; httponly [+] Interesting header: STRICT-TRANSPORT-SECURITY: max-age=0; includeSubDomains; preload [+] Interesting header: X-CONTENT-TYPE-OPTIONS: nosniff [+] Interesting header: X-POWERED-BY: PleskLin [+] XML-RPC Interface available under: https://www.globaleaks.org/xmlrpc.php [+] WordPress version 4.9.4 (Released on 2018-02-06) identified from links opml [!] 1 vulnerability identified from the version number [!] Title: WordPress <= 4.9.4 - Application Denial of Service (DoS) (unpatched) Reference: https://wpvulndb.com/vulnerabilities/9021 Reference: https://baraktawily.blogspot.fr/2018/02/how-to-dos-29-of-world-wide-websites.html Reference: https://github.com/quitten/doser.py Reference: https://thehackernews.com/2018/02/wordpress-dos-exploit.html Reference: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-6389 [+] Enumerating installed plugins (only ones marked as popular) ... We found 9 plugins: [+] Name: all-in-one-seo-pack - v2.4.3.1 | Last updated: 2018-02-13T22:08:00.000Z | Location: https://www.globaleaks.org/wp-content/plugins/all-in-one-seo-pack/ | Readme: https://www.globaleaks.org/wp-content/plugins/all-in-one-seo-pack/readme.txt [!] The version is out of date, the latest version is 2.4.5 [+] Name: backwpup - v3.4.4 | Latest version: 3.4.4 (up to date) | Last updated: 2018-01-08T12:29:00.000Z | Location: https://www.globaleaks.org/wp-content/plugins/backwpup/ | Readme: https://www.globaleaks.org/wp-content/plugins/backwpup/readme.txt [+] Name: contact-form-7 - v4.9.2 | Last updated: 2018-01-31T04:25:00.000Z | Location: https://www.globaleaks.org/wp-content/plugins/contact-form-7/ | Readme: https://www.globaleaks.org/wp-content/plugins/contact-form-7/readme.txt [!] The version is out of date, the latest version is 5.0 [+] Name: disable-emojis - v1.7 | Latest version: 1.7 (up to date) | Last updated: 2017-08-05T20:59:00.000Z | Location: https://www.globaleaks.org/wp-content/plugins/disable-emojis/ | Readme: https://www.globaleaks.org/wp-content/plugins/disable-emojis/readme.txt [+] Name: flamingo - v1.7 | Last updated: 2018-01-25T00:54:00.000Z | Location: https://www.globaleaks.org/wp-content/plugins/flamingo/ | Readme: https://www.globaleaks.org/wp-content/plugins/flamingo/readme.txt [!] The version is out of date, the latest version is 1.8 [+] Name: raw-html - v1.5.1 | Latest version: 1.5.1 (up to date) | Last updated: 2017-11-09T12:54:00.000Z | Location: https://www.globaleaks.org/wp-content/plugins/raw-html/ | Readme: https://www.globaleaks.org/wp-content/plugins/raw-html/readme.txt [+] Name: sitepress-multilingual-cms | Latest version: 2.0.4.1 | Last updated: 2011-06-05T13:40:00.000Z | Location: https://www.globaleaks.org/wp-content/plugins/sitepress-multilingual-cms/ [!] We could not determine a version so all vulnerabilities are printed out [!] Title: sitepress-multilingual-cms - Full Path Disclosure Reference: https://wpvulndb.com/vulnerabilities/6104 [i] Fixed in: 3.1.7.2 [!] Title: WPML <= 3.1.7.2 - Multiple Vulnerabilities (Including SQLi) Reference: https://wpvulndb.com/vulnerabilities/7843 Reference: http://seclists.org/bugtraq/2015/Mar/60 Reference: http://wpml.org/2015/03/wpml-security-update-bug-and-fix/ Reference: http://packetstormsecurity.com/files/130810/ Reference: http://klikki.fi/adv/wpml.html Reference: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-2314 Reference: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-2791 Reference: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-2792 Reference: https://www.exploit-db.com/exploits/36414/ [i] Fixed in: 3.1.9 [!] Title: WPML 2.9.3-3.2.6 - Cross-Site Scripting (XSS) in Accept-Language Header Reference: https://wpvulndb.com/vulnerabilities/8173 Reference: http://blog.secupress.fr/en/xss-wpml-header-405.html [i] Fixed in: 3.2.7 [+] Name: wordfence - v7.0.5 | Latest version: 7.0.4 (up to date) | Last updated: 2018-02-12T20:30:00.000Z | Location: https://www.globaleaks.org/wp-content/plugins/wordfence/ | Readme: https://www.globaleaks.org/wp-content/plugins/wordfence/readme.txt [+] Name: wp-mail-smtp - v1.2.2 | Last updated: 2018-02-06T21:39:00.000Z | Location: https://www.globaleaks.org/wp-content/plugins/wp-mail-smtp/ | Readme: https://www.globaleaks.org/wp-content/plugins/wp-mail-smtp/readme.txt [!] The version is out of date, the latest version is 1.2.5 [+] Enumerating timthumb files ... Time: 00:06:50 <=====================================================================> (2533 / 2533) 100.00% Time: 00:06:50 [+] No timthumb files found [+] Finished: Fri Feb 16 06:28:20 2018 [+] Requests Done: 4322 [+] Memory used: 118.883 MB [+] Elapsed time: 00:12:52 Resolving 10 unique hosts... 212.35.212.87 analytics.globaleaks.org 194.150.168.64 checktorda.globaleaks.org 51.15.199.225 demo.globaleaks.org 194.150.168.64 experiment.globaleaks.org 212.35.212.87 globaleaks.org 213.108.104.108 lists.globaleaks.org 194.150.168.64 planet.globaleaks.org 194.150.168.64 server.globaleaks.org 194.150.168.64 wiki.globaleaks.org 104.20.49.159 www.globaleaks.org Found subnets: - 194.150.168.0-255 : 5 hosts - 212.35.212.0-255 : 2 hosts Probing 10 ports... 80/tcp 104.20.49.159 www.globaleaks.org 443/tcp 104.20.49.159 www.globaleaks.org 443/tcp 213.108.104.108 lists.globaleaks.org 443/tcp 51.15.199.225 demo.globaleaks.org 80/tcp 213.108.104.108 lists.globaleaks.org 80/tcp 51.15.199.225 demo.globaleaks.org 80/tcp 194.150.168.64 experiment.globaleaks.org, server.globaleaks.org, checktorda.globaleaks.org and 2 more 443/tcp 194.150.168.64 server.globaleaks.org, experiment.globaleaks.org, planet.globaleaks.org and 2 more 80/tcp 212.35.212.87 analytics.globaleaks.org, globaleaks.org 443/tcp 212.35.212.87 analytics.globaleaks.org, globaleaks.org Preferred TLSv1.2 256 bits ECDHE-ECDSA-CHACHA20-POLY1305 Curve P-256 DHE 256 Accepted TLSv1.2 128 bits ECDHE-ECDSA-AES128-GCM-SHA256 Curve P-256 DHE 256 Accepted TLSv1.2 128 bits ECDHE-ECDSA-AES128-SHA Curve P-256 DHE 256 Accepted TLSv1.2 128 bits ECDHE-ECDSA-AES128-SHA256 Curve P-256 DHE 256 Accepted TLSv1.2 256 bits ECDHE-ECDSA-AES256-GCM-SHA384 Curve P-256 DHE 256 Accepted TLSv1.2 256 bits ECDHE-ECDSA-AES256-SHA Curve P-256 DHE 256 Accepted TLSv1.2 256 bits ECDHE-ECDSA-AES256-SHA384 Curve P-256 DHE 256 Accepted TLSv1.2 256 bits ECDHE-RSA-CHACHA20-POLY1305 Curve P-256 DHE 256 Accepted TLSv1.2 128 bits ECDHE-RSA-AES128-GCM-SHA256 Curve P-256 DHE 256 Accepted TLSv1.2 128 bits ECDHE-RSA-AES128-SHA Curve P-256 DHE 256 Accepted TLSv1.2 128 bits ECDHE-RSA-AES128-SHA256 Curve P-256 DHE 256 Accepted TLSv1.2 128 bits AES128-GCM-SHA256 Accepted TLSv1.2 128 bits AES128-SHA Accepted TLSv1.2 128 bits AES128-SHA256 Accepted TLSv1.2 256 bits ECDHE-RSA-AES256-GCM-SHA384 Curve P-256 DHE 256 Accepted TLSv1.2 256 bits ECDHE-RSA-AES256-SHA Curve P-256 DHE 256 Accepted TLSv1.2 256 bits ECDHE-RSA-AES256-SHA384 Curve P-256 DHE 256 Accepted TLSv1.2 256 bits AES256-GCM-SHA384 Accepted TLSv1.2 256 bits AES256-SHA Accepted TLSv1.2 256 bits AES256-SHA256 Preferred TLSv1.1 128 bits ECDHE-RSA-AES128-SHA Curve P-256 DHE 256 Accepted TLSv1.1 128 bits AES128-SHA Accepted TLSv1.1 256 bits ECDHE-RSA-AES256-SHA Curve P-256 DHE 256 Accepted TLSv1.1 256 bits AES256-SHA Preferred TLSv1.0 128 bits ECDHE-RSA-AES128-SHA Curve P-256 DHE 256 Accepted TLSv1.0 128 bits AES128-SHA Accepted TLSv1.0 256 bits ECDHE-RSA-AES256-SHA Curve P-256 DHE 256 Accepted TLSv1.0 256 bits AES256-SHA Accepted TLSv1.0 112 bits DES-CBC3-SHA SSL Certificate: Signature Algorithm: ecdsa-with-SHA256 Subject: ssl746003.cloudflaressl.com Altnames: DNS:ssl746003.cloudflaressl.com, DNS:*.globaleaks.org, DNS:globaleaks.org Issuer: COMODO ECC Domain Validation Secure Server CA 2 Not valid before: Jan 24 00:00:00 2018 GMT Not valid after: Aug 2 23:59:59 2018 GMT AVAILABLE PLUGINS ----------------- PluginOpenSSLCipherSuites PluginChromeSha1Deprecation PluginCertInfo PluginHSTS PluginSessionResumption PluginCompression PluginHeartbleed PluginSessionRenegotiation CHECKING HOST(S) AVAILABILITY ----------------------------- www.globaleaks.org:8443 => 104.20.48.159:8443 SCAN RESULTS FOR WWW.GLOBALEAKS.ORG:8443 - 104.20.48.159:8443 ------------------------------------------------------------- * Deflate Compression: OK - Compression disabled * Session Renegotiation: Client-initiated Renegotiations: OK - Rejected Secure Renegotiation: OK - Supported * Certificate - Content: SHA1 Fingerprint: d01e7716bf10ecb08069251ca6744c1bdc092e4a Common Name: ssl746002.cloudflaressl.com Issuer: COMODO RSA Domain Validation Secure Server CA 2 Serial Number: E9A1EA4D5471017F9C61B192D7030FA5 Not Before: Jan 24 00:00:00 2018 GMT Not After: Aug 2 23:59:59 2018 GMT Signature Algorithm: sha256WithRSAEncryption Public Key Algorithm: rsaEncryption Key Size: 2048 bit Exponent: 65537 (0x10001) X509v3 Subject Alternative Name: {'DNS': ['ssl746002.cloudflaressl.com', '*.globaleaks.org', 'globaleaks.org']} * Certificate - Trust: Hostname Validation: OK - Subject Alternative Name matches Google CA Store (09/2015): OK - Certificate is trusted Java 6 CA Store (Update 65): OK - Certificate is trusted Microsoft CA Store (09/2015): OK - Certificate is trusted Mozilla NSS CA Store (09/2015): OK - Certificate is trusted Apple CA Store (OS X 10.10.5): OK - Certificate is trusted Certificate Chain Received: ['ssl746002.cloudflaressl.com', 'COMODO RSA Domain Validation Secure Server CA 2', 'COMODO RSA Certification Authority'] * Certificate - OCSP Stapling: OCSP Response Status: successful Validation w/ Mozilla's CA Store: OK - Response is trusted Responder Id: D4B0F4FD4F9C42A46CDC3D2EEE5B4118C9AD03F6 Cert Status: good Cert Serial Number: E9A1EA4D5471017F9C61B192D7030FA5 This Update: Feb 11 22:33:45 2018 GMT Next Update: Feb 18 22:33:45 2018 GMT * SSLV2 Cipher Suites: Server rejected all cipher suites. * SSLV3 Cipher Suites: Server rejected all cipher suites. * Session Resumption: With Session IDs: OK - Supported (5 successful, 0 failed, 0 errors, 5 total attempts). With TLS Session Tickets: OK - Supported ]]]]]]]]]]]]]]]]]] https://threadreaderapp.com/help#about Life Hacker Some tweetstorms are good, but reading them on Twitter can be a pain in the ass. Thread Reader reformats a tweetstorm into a readable essay Tech Crunch Thread Reader can take your barely readable Twitter rant of choice and transform it into normal text served up on a sparse, normal looking page. Product Why Thread Reader App? My problem was that it is a pain to read Twitter threads (or Tweetstorm) on the official twitter website/app and I think that all the Tweets put one after another in a medium.com alike page could be better. So I ask myself: "What about a service that helps you unroll a full Twitter thread on a dedicated beautifully designed page to allow an easy read of the whole story?" You can read more about it on my blog What is Thread Reader App? Thread Reader App is a service that allows anyone to unroll long Twitter thread and display them on an easy to read page. I also try to help people discover interesting threads with a trending section and hashtag based pages. The unroll part is mostly done with a bot you can interact with, see Help section. What else does Thread Reader App do? Thread Reader has other interesting features, like getting a PDF Archive of a given thread. Some are Premium features other like subscription are free for everyone. Team @jrmgx Founder + Developer @ThreadReaderApp Thread fan bot Values Transparency Every month I try to add a new post on my Patreon talking about challenges I had, stats and money I make. You can read it there: https://www.patreon.com/ThreadReaderApp (and participate!) Is this some big company making this site? No this site is me on a laptop coding everything. From the bot, to the trending section. It's all hand-coded, designed, deployed and marketed by me. This service is not related to Twitter.com Pricing Why isn't Thread Reader App free? Read these two answers bellow, they help you understand the mechanics of Internet's startups and why you should support Thread Reader! To the question: Why isn't Thread Reader App free? Remember all those cool startups you used that were free but then they were acquired, shut down and now don't exist anymore? It's because free apps don't make money, and therefore can't survive: Someone builds a cool, free product, it gets popular, and that popularity attracts a buyer. The new owner shuts the product down and the founders issue a glowing press release about how excited they are about synergies going forward. They are never heard from again. Whether or not this is done in good faith, in practice this kind of 'exit event' is a pump-and-dump scheme. The very popularity that attracts a buyer also makes the project financially unsustainable. The owners cash out, the acquirer gets some good engineers, and the users get screwed. To avoid this problem, avoid mom-and-pop projects that don't take your money! You might call this the anti-free-software movement. If every additional user is putting money in the developers' pockets, then you're less likely to see the site disappear overnight. If every new user is costing the developers money, and the site is really taking off, then get ready to read about those synergies. To illustrate, I have prepared this handy chart: What if a little site you love doesn't have a business model? Yell at the developers! Explain that you are tired of good projects folding and are willing to pay cash American dollar to prevent that from happening. It doesn't take prohibitive per-user revenue to put a project in the black. It just requires a number greater than zero. I love free software and could not have built my site without it. But free web services are not like free software. If your free software project suddenly gets popular, you gain resources: testers, developers and people willing to pitch in. If your free website takes off, you lose resources. Your time is spent firefighting and your money all goes to the nice people at Linode. So stop getting caught off guard when your favorite project sells out! “They were getting so popular, why did they have to shut it down?” Because it's hard to resist a big payday when you are rapidly heading into debt. And because it's culturally acceptable to leave your user base high and dry if you get a good offer, citing self-inflicted financial hardship. Like a service? Make them charge you or show you ads. If they won't do it, clone them and do it yourself. Soon you'll be the only game in town! So if you want this service to survive, please support it and become a paid member. – by Maciej from Pinboard . To the question: Why isn't Thread Reader App free? Because this is not a venture-capital funded startup. It's bootstrapped! We don't have any external funding on purpose. The problem with so many venture-capital funded startups is that their investors force them to grow fast in user base without making any money in the first few years, to then sell out to BigCo (e.g. Google, Facebook) for a few million dollars, then write a blog post about their incredible journey, then either shut the site down, or fuck over their users by filling the service with ads. That sucks, right? I don't get that. I don't like that. The reason people do that because they're trying to make a quick buck. I get it. I'd love to too. But the odds of actual success are very low in that realm. So I'd rather go for higher odds of success, try to make money on day one, and not make a billion dollars but just make good money to live off. Maybe I can hire a few people then later on. Maybe I even get funding later, but then it should be money that's really necessary. Maybe I'd actually get acquired later too. But it'd have to be good for the users in the first place. And there shouldn't be the extreme high growth trajectory which will then F over my users. The challenge of going this way is that you can't offer everything for free, like Facebook or Google or any other funded startup does. You have to get money somehow. I could make money in sneaky ways like selling your user data, but that'd suck and honestly it wouldn't make that much money at this scale. So the fastest way is simply asking you, as a user of this site, for money. Remember, right now this site is mostly me on a laptop coding my way through life. I love it and it's super fun but it also means that if I can't make any money with it I have literally no money and I'll have to get some desk job and this site won't exist. So if you like what I do, please support this site and become a paid member. – by Levelsio from Nomad List . It can't cost much to run a site like this? You're mistaken. A good full stack developer is paid $150,000+. A normal startup probably has 4 engineers. That's $600,000/y. Add some social media marketing people and you're close to $800,000/y in labor costs. Sending emails (like subscriptions alerts) costs $5,000/y. Hosting and bandwidth is relatively cheap but still gets to $5,000/year including backup storage and backup servers. You need regular security people to check your server and avoid it getting hacked, which probably is another $10,000/y. Using Twitter's APIs is not (all the time) free. That means we'd be close to $1,000,000/y to make this profitable not even talking about taxes. I can assure you, I don't even make close that! I would like to advertise on Thread Reader Please contact me by email at hello@threadreaderapp.com How do you make money? Thread Reader mostly makes money from Premium membership and ads. Tech How do you unroll threads? I made a series of videos about the technical part of Thread Reader, you will find all the tricks used here: Youtube. What is the tech stack? It's HTML, CSS, JavaScript and PHP. It's hosted on a Ubuntu machine running Apache. Something is not working! Twitter is not an easy platform for developers, plus I'm a fallible human, equals: from time to time you will find a glitch or a blocking bug. Please let me know on Twitter @ThreadReaderApp (DM or public) and I'll do my best to help you and fix the bug. https://threadreaderapp.com/ Thread Reader Bot 🤖 @threadreaderapp