Relevance - Preview release

I’m a tab-aholic

I normally do a search, start opening the tabs that seem interesting, and then as I flip through them, I end up opening even more links on tabs as they seem relevant. Next thing I know I have a huge mess of tabs, and it’s hard to remember which one I’ve read or which one is important.

Relevance is a Chrome plugin I wrote to help manage that.

When you install Relevance, it’ll keep track of the pages you actually read and how long you spend reading them. This information is kept completely private, on your local Chrome install.

As you open tabs, its knowledge of what’s important to you grows, and when you activate it by pressing the button, the tabs for your current window are ordered depending on how long you have spent reading them.

This ordering creates a natural arrangement where the tabs you have spent the longest on, which are expected to be the most relevant, are placed first, and the ones you haven’t read at all are shunted to the end.

I’ve found this very useful in organizing what I should be prioritizing, which tabs I’m actually reading, and which ones I should close.

The Clojure connection

I wrote Relevance entirely in ClojureScript, using Khroma, re-frame and cljs.async.

The Chrome extension API is well documented, but almost every call is async. This means that if what you need to do depends on values returned by three different APIs, you’d have to juggle three different callbacks. And that’s before we get to how almost everything that Relevance needs to keep track of is an event, which may happen at the same time as we’re waiting for the aforementioned callbacks.

Clojure’s immutability and core.async made dealing with this situation a pleasure.

Whenever I found any unexpected behavior, it was trivial to reason about the execution flow and what may have gone wrong. Once I’m done with a 1.0 release, I’ll do a post-launch analysis elaborating on it if there’s enough interest.

Software preview

This is just a preview release - consider it a soft launch. Relevance is not yet public on the Chrome webstore, since I thought I’d circulate among the development community first.

I’ll be happy to hear your comments. If you have any suggestions on what you think might make Relevance better, please reach out on BlueSky or via e-mail.

Experimental StartPage integration

Ever ran into a situation where you re-do a search, but can’t remember which ones were the most important links?

This version of Relevance has a pre-release integration with StartPage, which is my search engine of choice. After you run a search, it’ll look at the results on your current page and re-prioritize the links shown to bring to the front those you have spent the longest reading.

The assumption here is that if a search returns ten results and you open five of them, but only barely glanced at 3, they’re less relevant than the ones you actually spent time reading.

This is how a sample search looks before:

![Relevance search before](/images/relevance/relevance-0.3-clojure chrome before.png)

And after Relevance has sorted and annotated it:

![Relevance search after](/images/relevance/relevance-0.3-clojure chrome after.png)

If there’s enough interest, I could extend this integration to others as well.

Upcoming additions

I’m eating my own Relevance dogfood daily, so I expect I’ll be releasing regular improvements. If you have any particular requests or notes, do let me know!


Published: 2015-11-02