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