Collections at the moment is a fairly general product. Not to fall in the trap of ‘doing 1,001 things and none of them well’, our current roadmap is to go usecase by usecase and majorly deepen the experience. Big portion of the last week was devoted to improve the experience of collecting links. For every link you collect we generate an image which represents it. Sometimes it’s a screenshot, sometimes (in the case of links from, say, Instagram or Youtube) it’s an embedded picture from the page.
Having spent a couple of days writing our home-grown (and grass-fed) screenshot generator server with a dozen of optimizations, what we had was still not fully reliable service. Taming the entire internet is not easy. Some links would just crash the PhantomJS renderer leading to the entire server being unresponsive. Then we asked ourselves - is our mission in making webpage screenshots? If no, why bother when we have a dozen of more important tasks as the part of our roadmap? If you can do something doesn’t necessarily mean you should be doing it. I’m sure if we spent an entire week (or a month as optimistic developers are bad at estimating how long things take), we would get something fairly stable. It’s OK (and efficient) not to be heroic, give up and let someone else who already solved this problem handle it for you.
Below in alphabetic order - the list of (some) services we happily use at Collections:
- Amazon Web Services - We are using S3 to store files uploaded by users, URL screenshots, user avatars, design assets, public Collections binaries, etc.
- Asana - After attending Justin Rosenstein’s talk at YC, we decided to stop the search for a single project management solution and track all the tasks, feature requests and bugs in Asana (before that we were dabbling with Wrike, Pivotal Tracker, Basecamp, Trello, and Kickoff).
- Bonsai - These guys provide us a hosted ElasticSearch index for fast full-text search.
- Dropbox - Sharing files when the folder hierarchy is important (syncing internal Collections binaries or design assets).
- Embedly - We use Embedly to generate image previews for URLs coming from 261 providers they’re heavily optimized for,
- Evernote - To write down ideas and blog posts like this one ;)
- Github - That’s how us and millions of developers on the planet host their private code repositories.
- Heroku - No surprise here, that’s how we quickly deploy our core REST API server as well as a few mini-servers we have (e.g. file downloading proxy, thumbnail generator, etc.).
- inDinero - Thanks to Jessica Mah and the team for an awesome accounting service they built!
- MailChimp - They helped us build the mailing list when we used to be in invite-only mode. Now we use MailChimp to communicate with our users via email.
- MailGun - that’s how we send email notifications to our users.
- MongoHQ - MongoDB is how we store things, and MongoHQ is a cloud-based service for it
- olark - That’s how we chat with our users on the website and within the app.
- Pusher - Some of our real-time functionality (like instantly updating the shared collections across all users) is courtesy of Pusher.
- Redis to Go - Redis is extremely fast key-value store and Redis to Go is a hosting for it.
- Segment.io - One-stop analytics API which sends our analytics data to KISSmetrics, Customer.io, Google Analytics, Keen IO and mixpanel.
- URL2PNG - the aforementioned screenshots as a service.
- uservoice - That’s how we collect user feedback on our website.
- zendesk - That’s how we streamline user support from emails, Facebook, and Twitter.
- zenpayroll - We pay ourselves using yet another Zen solution.
A few developer-oriented services we’re considering:
- CircleCI - Hosted Continuous Integration. They run your tests whenever you push code to GitHub.
- context.io - We dealt a lot with archaic IMAP protocol when working on email attachments from GMail. For future maintenance, it might be a good idea to outsource dealing with IMAP to the experts.
- DiffBot - Their awesome Article API takes any URL as an input, and produce a clean article text as an output. We’re thinking of using DiffBot to enhance the experience of collecting links.
- Parse - This might be a stretch at the moment when we invested so much in our backend server. Regardless, we see the appeal of a backend server as a service.
- Firebase - Entirely new way of looking at the database system. All the data is stored as a single JSON-like document. Real-time persistence.
It’s easy to forget that time is the most precious resource. If you’re a startup, focus on what you’re best at. And let others do all the heavy lifting outside of your core competency. That’s the true specialization, that’s the true division of labor Plato talked about back in 4th century BC. There’s a trend among startups to refactor every possible developer’s need and provide ‘the pickaxes during a Gold Rush’. If all the company does is generates screenshots and charges money for it, you bet they know much more about this than you do. Save time, pay for a pickaxe and continue the journey.
P/S: Thanks to my friend and colleague Tony Xiao for discussions leading to this post!