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.

Discuss this on Hacker News.

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 14 day free trial so it’s easier than ever to give it a try.

Discuss this on Hacker News.

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.

Saved Searches

by Ben Ubois

Any search can now be saved for quick access later. To create a saved search, start by searching for something, hit save and give your search a title.

There’s a saved searches API, if you want to do something with the data other than view it in Feedbin.

Search Beta

by Ben Ubois

I’m very happy to announce the availability of search for Feedbin.

I’m calling it a beta because there are still improvements to be made and bugs that have not been found, so I’d appreciate your feedback.

Search supports some great advanced options like AND, OR and NOT.

Have a lot of starred items? Try adding is:starred to your query to just search starred items. is:read/unread are also supported.

To search a specific feed, you can add AND feed_id:XX.

Results are is sorted by relavance by default, but you can optionally sort by date with sort:asc/desc.

Under the hood Feedbin is using elasticsearch to power all of this.

Due to the new field, subscribe has been moved and can be accessed by clicking on the dropdown next to search.

Mark Above/Below as Read

by Ben Ubois

Pair With Me

by Ben Ubois

I read Frank Chimero’s “The Inferno of Independence” yesterday. It’s a great article, and while I generally have poor reading comprehension, something resonated with me which is that “independence is lonely.”

I’ve been thinking that one thing I miss when working on Feedbin is the opportunity to work with others. Open sourcing Feedbin has helped make the work a bit more social, but I’m still left wanting more.

So I have an experiment I’d like to try.

Do you have an idea for a feature or a bug you would like to fix, but aren’t sure how to approach it or you would like to work on it with someone else? If so, why don’t we work on it together?

To set something up, just send me an email with what you’d like to work on and when you’re available.

The only thing I would ask is that you already have Feedbin running locally and have Screenhero and Skype installed.