Night Theme

by Ben Ubois

Feedbin now has a great-looking night theme. It’s nice to use when there’s not much ambient light in the room or if you just prefer a darker app.

The layout has been updated as well to make room for a new starred view so you can easily see all of your starred articles organized by tag and feed.

Feedbin’s First Year

by Ben Ubois

Feedbin launched into a market with no future. Google owned RSS and they had let it languish.

That all changed when Google announced they were shutting down Google Reader two days after Feedbin launched.

I built Feedbin because I still loved RSS but I didn’t like Google Reader. It looked like it had been abandoned after the last update in 2011 that attempted to prop up Google+ by removing many features.

The goal was to be able to cover costs in one year. Instead it took three weeks. It cost about $170/month to run Feedbin when it launched and with $1.62/user/month in profit after credit card fees it looked like I would need just over 100 customers who were also looking for a Google Reader alternative.

Feedbin has one of those boring business models that actually works. Charging money for a good or service. Feedbin will never have millions of customers but that’s OK. It just needs you.

Timing was everything for Feedbin’s success. I think having a halfway decent product only went so far as to not actively hurt Feedbin’s chances. Of course Google Reader closing was the event that started it all, but gaining Reeder support early on gave Feedbin a built in audience.

Scaling

Getting so much interest was exciting but also extremely challenging. Feedbin had scaling problems within the first few weeks as the number of feeds to refresh went up. For feed refreshing Mike Perham’s Sidekiq was critical to getting acceptable refresh times. It’s the fastest and least memory intensive background job processor I’ve used and it keeps getting better and better. Feedbin would have been tougher to build without it.

Scaling the background stuff was possible thanks to Sidekiq, but scaling the web facing side was more stressful. Feedbin was hosted on Heroku for the first four months. I was frequently turning on more front-end servers (dynos) and bumping up the database plan. Once I was on the highest-end $6,400/month PostgreSQL plan, I knew I needed to try something else because there was nowhere else to go on Heroku.

I’ve heard Ruby isn’t the fastest language and I’m sure my code could have been improved, but the performance didn’t add up. I also still had a full time job at Flickerbox back then so I didn’t have time to diagnose what was going on.

With a copy of the production database running locally on an 11-inch MacBook Air, pages took a fraction of the time to load. The biggest difference between that environment and production was a solid-state drive. At the time Amazon did not offer any SSD options so I suspected Heroku Postgres was held back by running on spinning disks.

I started to look into dedicated hosting that had some hardware flexibility and settled on SoftLayer. If you’ve never used a dedicated server before it’s a breath of fresh air coming from AWS or any VPS. All those problems of noisy neighbors, poor I/O, weird LAN latency or other networking anomalies just go away. Oh yeah and it’s fast.

Response time for critical pages (left before move, right after move)

On the day of the move people asked why Feedbin had to move on a weekday and the reason was that I didn’t think I had a choice. I was looking at these graphs pretty sure that Feedbin was about to fall over.

For all this performance, surely the price must have gone way up? Well no. Feedbin’s last bill on Heroku was for $7,997 and the first month’s bill on SoftLayer was $3,932 so dedicated does not mean expensive.

Design

One of the things I’m most proud of about Feedbin is the design. The design has always been a collaboration between Todd J. Collins and I. In the beginning it was more me, but starting with the redesign Todd has set the visual direction, which explains why it’s gotten so good. Todd and I get together most Mondays to plan and design new features. For such a short window of time I think we get a lot done.

The design has evolved since my crude, static HTML mockups.

Early Feedbin HTML Mockup (October 2012)
Feedbin at Launch (March 2013)
Feedbin Now (March 2014)

The RSS Market

I have no doubt that RSS is better for Google having folded their offering. There’s so much choice now that it’s actually a crowded market. It’s also an area that attracts a lot of developers because everybody thinks they can build one (and they’re right).

RSS is one of the last holdouts of a more open web and it’s been gratifying to see that there’s enough interest in it to sustain some great independent services that care more about the product than eyeballs.

The next time you read somebody declaring the death of RSS, you can just smile to yourself as you mark it as read in your favorite reader and move on to the next article.

Redesigned Feed Settings Page

by Ben Ubois

The Feed Settings page has been redesigned.

This refresh has a cleaner and denser look and two new features. The first feature is that you can now sort a feed’s last updated date. The second is the feed activity graph that shows post frequency relative to other feeds you are subscribed to.

The last updated date can come in handy if you want to unsubscribe from feeds that haven’t been updated in a few years or that may have silently changed feed addresses. The activity graph is great for finding noisy feeds or for some nice looking stats.

Update: A search field has been added that will filter your feeds list as you type.

Recently Read

by Ben Ubois

There’s a new section that sits right below Starred called Recently Read.

The idea is that sometimes a glimmer of a memory pops into your head of something you read recently and you desperately try to piece your life back together to figure out “where did I read that thing?”

Recently Read can help you in these types of situations by remembering for you.

Recently Read attempts to only remember articles that you’ve actually read, not just marked as read. Currently if you stay on an article for more than 10 seconds it will end up here.

It’s also a great way to be mindful of what you’re actually reading so that maybe you can get a bit of your life back by unsubscribing from those high-volume feeds that you just scan and delete.

Distraction Free Reading with Full Screen Mode

by Ben Ubois

Feedbin now includes a full screen mode that makes for an enjoyable reading experience.

You can access full screen through the format toolbar or using the keyboard shortcut shift + f.

One of the great things about RSS readers is that they can provide a consistent and customizable reading environment. Feedbin is my favorite place to read on the web and anything that can make it even more pleasant is the best kind of feature.

Thanks to Dan Mundy for the idea.

View Changes in Updated Articles

by Ben Ubois

Feedbin has been updating articles if they change after they were originally published for a little while. When this was added, Feedbin would also save the original article.

This feature provides a way to see the differences between the article when it was first picked up by Feedbin and the latest version.

I had been thinking about this feature for a while but lacked a way to show differences in HTML markup effectively. There are many libraries for showing the differences in two pieces of text, but most of them don’t take HTML into account. The answer came the other day when I saw this tweet about Discourse’s updated post history interface which included a nice HTML inline diff option. So Feedbin uses the code from Discourse which I packaged into a Gem.

PubSubHubbub

by Ben Ubois

Feedbin now supports the PubSubHubbub or PuSH protocol.

Refreshing feeds without PuSH is inefficient. The process is to download every feed, look at every item in the feed to check for new content, then repeat this many times a day to stay up to date.

PuSH is great because instead of downloading the entire feed over and over again, PuSH sends new content to Feedbin making it so articles show up right after they are published. Feedbin already has thousands of articles getting pushed every hour.

Julien Genestoux from Superfeedr took me up on my offer to pair with me on this. Julien knows the PubSubHubbub protocol well and I could help out with my knowledge of the Feedbin codebase. It was a great experience and I think it came together more quickly than if either of us had attempted to do it alone.

About 20% of feeds in Feedbin support PuSH and it would be great to increase this. If you own a blog or a site that publishes RSS feeds and you want to make sure your updates are propagated faster to Feedbin, you should also implement PubSubHubbub on your end. It’s a completely open (and free!) protocol. You can use a community hub like http://pubsubhubbub.superfeedr.com for this.

Powering Actions with Elasticsearch Percolate

by Ben Ubois

Actions are built on a great feature of elasticsearch called percolate.

Percolate allows you to register queries ahead of time, then whenever you send a new document to be indexed, elasticsearch can tell you if this document matches any saved queries.

Here’s how it works.

Feedbin is a Rails app and uses the tire gem for working with elasticsearch.

Whenever an action is added or updated, it is also sent to elasticsearch as a percolator query.

Entry.index.register_percolator_query(3) do
  string "kittens"
end

The 3 is the id of this action. This is used later on to find what user this action belongs to and which actions should be performed.

A model called Entry is used for storing RSS articles. Whenever a new entry is added it also gets sent to elasticsearch for indexing.

class Entry < ActiveRecord::Base
  include Tire::Model::Search
  after_commit :search_index_store, on: :create

  private

  def search_index_store
    result = self.index.store(self, {percolate: true})
    ActionsPerform.perform_async(self.id, result['matches'])
  end

end

An array of matched actions ids is returned in result['matches']. So if this entry mentions “kittens” an array like ["3"] would be returned.

Feedbin uses Sidekiq to process background jobs. The ActionsPerform.perform_async part is creating a new background job that performs the actions. A simplified version of this looks like:

class ActionsPerform
  include Sidekiq::Worker

  def perform(entry_id, action_ids)
    actions = Action.where(id: action_ids)
    actions.each do |action|
      if action.actions.include?("send_push_notification")
        PushNotificationSend.perform_async(entry_id, user_ids)
      end
    end
  end

end

Get in touch if you have any questions about this or sign up to see it in action.

Actions - Workflows for Your RSS Feeds

by Ben Ubois

Actions are a great way to filter out articles you’re not interested in or surface articles you want to be sure to read.

Because this is based on search you can use some powerful operations. For example if you’re not much of a baseball fan, but still want to see news about your favorite team you could set up an action to mark anything as read that matches baseball NOT yankees, which would mark anything as read that matches baseball but keep baseball AND yankees unread.

If you’re using Safari on OS X Mavericks there is a push notification action. This is the new home for configuring push notifications because it makes the old location redundant. All push notifications that were previously set up have been migrated into actions.

If you have not tried Feedbin before, now is a great time to check it out. There’s a free trial so it’s easier than ever to give it a try.

Mavericks Push Notifications

by Ben Ubois

OS X Mavericks was released on Tuesday and it has a cool feature that allows websites to send push notifications to your Mac.

Feedbin can now take advantage of this by offering push notifications for new articles.

To set it up you will need to be using Safari 7 on Mavericks. Then visit the Feeds page under Settings and there will be an option to enable push notifications. Click that and choose to allow Feedbin to send push notification in the resulting pop-up.

Next you will need to select which feeds you want to enable push for in the Feed Settings list. It’s a per-feed setting because enabling this for all feeds would be overwhelming.

Clicking on a notification will open up the original article and mark the article as read in Feedbin.

Newer
Older