Blog Posts tagged with: open-source

Aug 08 2011


Friday Update 1.1

Welcome to the latest installment of the critically acclaimed "Friday Update"! This week's theme is "In-browser Awesomeness (plus one more)", and boy do we have an exciting lineup for you today!

First up, our brilliant intern Vojto (pronounced VOY-toe) has spiked out a Cocoa library called Atmosphere which waits for client-side changes and pushes those changes to the server automagically. You can read more about it on his blog.

Next we have the illustrious Chad Humphries, who is investigating using Rails 3.1, Backbone.js and Jasmine to build applications. He is excited to announce that the Jasmine tests run both inside and outside the browser.

Continuing our theme, Bobby Calderwood and Alex Redington are working on an in-browser ClojureScript evaluator. A server is required to perform compilation, but, in conjunction with some additonal work from Alan Dipert and Brenton Ashworth, we could soon have a browser-connected REPL!

And our c-c-c-combo breaker: David Liebke is working on a Clojure library called cogito. It's a Clojure implementation of System-Z+, a probabalistic reasoner.

That's it for now!

And don't forget to sign up for Clojure/conj!

Aug 01 2011


Friday Update 1.0

An important part of Relevance's culture is the work we do on Fridays. Many of you have likely heard of 20% time. Perhaps you've even heard it from us! But for those who haven't, 20% time is time that is devoted entirely to personal development and contributing to the open-source community. It doesn't have to be open-source, but it almost always is. In fact, we used to call the 20% time "Open-source Friday," but decided to stop lest we discourage people from following interests or scratching itches that couldn't be open-sourced.

Since this time is so important to us, we've decided to share a cross-section of our Friday projects with the rest of you! Consider this the first of many Friday Updates.

On the Clojure front, the Clojure/core team has been focusing on porting Clojure and its libraries to the recently announced ClojureScript. In particular, keep your eye out for David Liebke's port of Annalemma, dubbed Apogee. And if you haven't seen it already, Stuart Sierra recently wrote a blog post about ClojureScript.

The team is also busy organizing the second Clojure/conj! Which you should sign up for today! Early bird pricing ends soon!

Rob Sanheim and Jamie Kite put together a Rails 3 engine called Honey Badger which sticks a badge onto the page of a running Rails app with the environment, current git SHA, or anything else you'd like displayed in non-Production environments.

Craig Andera recently released ShadowSpawn, a Windows utility for working with shadow copies. Check out his announcement for more details.

And last, but most certainly not least, Jess Martin has released an iOS library called CoolButtons. It allows you to draw glassy iOS-style buttons, all using CoreGraphics and no images.

See you next week!

Jul 25 2011


Rails 3.1 HackFest Wrap-up

Thanks to everyone who participated in the Rails 3.1 HackFest! I hope you enjoyed sharing your love of Rails, plus a few beers, as much as we did. It was great getting to know some of our neighbors.

In addition to upgrading a few Rails apps to the latest 3.1 release candidate, we also submitted a few RailsGuides patches, found a bug and submitted a failing test. We didn't even have a chance to fix it before grzuy picked it up and submitted the patch.

We ran into a few bumps moving to the 3.1 asset pipeline, but overall the upgrade from Rails 3.0 to 3.1 has been smooth. As for the 2.3 to 3.0 upgrade, Rails provides deprecation warnings in the previous point release, 3.0.9 as I write this, so the upgrade goes a little something like this:

  1. Upgrade to Rails 3.0.9
  2. Upgrade other gems as necessary (e.g., haml 3.0 to haml 3.1 + sass 3.1)
  3. Run tests, fix tests, rinse and repeat
  4. Walk through the application and fix any deprecation warnings that crop up in the rails log
  5. Upgrade to Rails 3.1

And now...your moment of zen.

Jul 20 2011


Rails 3.1 HackFest comes to Bull City, July 22-23

Join us at Relevance Inc. this Friday and Saturday as we participate in the Rails 3.1 HackFest.

Come on down for two days of upgradin', pipelinein', bug fixin' good times! This is a great opportunity to meet some local Rails hackers, work through the 3.1 upgrade process, and give back to the larger Rails community. If you're in town this Friday or Saturday, please drop by any time.

UPDATE: The Relevance office will be open Friday and Saturday from 8:30am until 6:00pm or after. Grab your laptop and swing by for an hour or camp out for both days; we'll be here...with pizza.

Find us at:
514 South Duke Street
Durham, NC 27701

For more information, please contact us via email at or by phone at 919-283-2748.

Apr 05 2011


Introducing Postfixer

"Have you got anything without spam?"

We recently heard from a client concerned that a few of his customers weren't receiving automated emails. His email account was filling with hundreds of bounce notifications, customers were getting frustrated, and there was nothing he could do about it.

Inspection of the Postfix logs on his and several other servers revealed a systematic problem. When these apps were first deployed, most emails were successfully delivered to customers (although a few might have ended up in the Spam/Bulk folder). Over the years, however, the spam problem has only gotten worse; and email clients, ISPs, and mail services aggressively terminate suspect messages with extreme prejudice.

Enter Postfixer

Most of us aren't Postfix gurus, let alone email experts. Postfixer helps with the following error-prone tasks:

  • Configuring Postfix properly
  • Setting up the necessary DNS entries
  • Testing everything to ensure your emails make it to the Inbox

Postfixer is a standalone utility powered by Capistrano. Git clone it, drop in a config file, and say goodbye to the Spam folder.

$ git clone
$ cd postfixer
$ cp

Here's a sample config:

application_user: deploy

sudo_user: deploy

Let's break it down:

canonical_hostname: Fully-qualified domain name (FQDN) for your application server

additional_hostnames: Any additional hostnames that this server is known by (may be empty)

email_domains: All domains for which this server should be able to send email

forwarding_address: Email address for local messages (such as errors from cron jobs)

  • I typically use "errors@" followed by the first entry from email_domains.
  • The domain (the part following the @ sign) MUST be included in email_domains.
  • Email addressed to local user accounts (root, nobody, etc) will be forwarded to this address.

envelope_sender: SMTP envelope sender (where bounce messages end up)

  • As with forwarding_address, the domain (the part following the @ sign) MUST be included in email_domains.

application_user: Local user account under which your application runs

  • Emails addressed to this user's account (for example, error messages from cron jobs) will be sent to forwarding_address.
  • Outgoing email from this user's account (messages sent by ActionMailer without an explicit From address or sent using the /usr/sbin/sendmail binary, for example) will be rewritten to change the From address to the forwarding_address set above.

sudo_user: Local user account with root sudo permissions

  • Postfixer will SSH into the server using this account. Might be the same as application_user.

address: FQDN or IP address used to SSH into this server

Once you've updated your Postfixer config, a number of cap tasks are at your disposal:

$ export   # specifies which .yml file Postfixer uses
$ cap email:send_test_email                 # send a test message
$ cap email:check_dns                       # print a report of your existing DNS entries

The send_test_email task uses the very helpful port25 verifier. If you're like me, the response to the test email looks something like this:

Summary of Results
SPF check:          softfail      (BAD)
DomainKeys check:   neutral       (BAD)
DKIM check:         neutral       (BAD)
Sender-ID check:    softfail      (BAD)
SpamAssassin check: ham           (GOOD)

Yuck! Let's fix that up.

$ cap email:install_packages                # install DKIM-milter (and Postfix, if not installed)
$ cap email:backup_config                   # archive your current config files
$ cap email:generate_config                 # generate new config file based on the .yml
$ cap email:install_config                  # copy new config files to the server
$ cap email:restart                         # restart Postfix and DKIM-milter
$ cap email:print_dns                       # generate a report of the DNS changes you should make

Based on the output from print_dns, you should add/update your DNS configuration. If you're using Slicehost for DNS, log in and edit DNS entries via SliceManager. Otherwise, check with your registrar (Namecheap, GoDaddy, etc).

(Note: print_dns assumes you're using Google Apps. If you're using your ISP's or your own incoming mail server, replace "" in the SPF records with something appropriate to your setup.)

Once you've updated your Postfix config and DNS entries, give cap email:send_test_email another try.

Summary of Results
SPF check:          pass          (GOOD)
DomainKeys check:   neutral       (BAD)
DKIM check:         pass          (GOOD)
Sender-ID check:    pass          (GOOD)
SpamAssassin check: ham           (GOOD)

Ahhhhh, much better.


Postfixer does not (yet) check if your server is on a blacklist

  • I recommend the awesome DNSBL Lookup tool from
  • If your server is on a blacklist, you'll need to request to be removed (the process should be available on the blacklist provider's web site)

Postfixer does not check for general DNS issues

Posfixer does not (yet) support Yahoo DomainKeys (as seen in the port25 verifier results above)


Huge thanks to Relevance for giving me Fridays to make these kinds of contributions.

Thanks also to Shay Frendt for being my first guinea pig and for his new feature ideas.

Thanks to Mike Bailey for deprec, from which I got the idea to generate config files locally (using ERB templates) and deploy via Capistrano.

I'd like to contribute

That sounds great; I'd like you to contribute, too! Postfixer is available on Github and distributed under the MIT license.

Nov 16 2010


hooppps - A Mobile dribbble Browser

I wanted to make a dribbble browser for my phone, so I convinced some of my Relevance teammates to help me in this endeavor. The result: hooppps! hooppps is an open-source Rails 3 app hosted on Heroku. Under the covers it uses the swish gem, a Ruby wrapper for the dribbble API.

A screenshot of hooppps (from a desktop web browser): A screenshot of the regular browser layout of hooppps, seen at

(On the screenshot above, the images inside hooppps are shots on dribbble by: David Lanham and Dan Cassaro)

What is dribbble?

"Dribbble is show and tell for designers, developers and other creatives. Share sneak peeks of your work as 'shots' — small screenshots of the designs and applications you’re working on" - Quoted from the dribbble blog.

I love dribbble. People ask me, "What is dribbble?" and I always reply, "It's like Twitter, but for designers." The truth is, although there are similarities, it's very different from Twitter. dribbble is a community of some of the most talented designers and artists in the world! A dribbble user (AKA "player") is asked the question, "What are you working on?" You respond by uploading an image (AKA "shot") no larger than 400px x 300px. This community is invite-only (AKA "draft"), and you can only post a limited number of "shots" per month. "Players" can follow each other, "like" shots, and leave comments. There is a lot of feedback shared amongst players, and keeping in the spirit of the application's basketball theme, players can "rebound" shots. A "rebound" posts a shot that is inspired by another shot. If you like looking at beautiful art and design, you should definitely check out dribbble.

Why make hooppps?

While dribbble is amazing in a desktop browser, they have not yet created a mobile interface. So when dribbble came out with an API, it made me think of how cool it would be to browse dribbble on my phone via a lovingly-crafted mobile interface.

Not just for iPhones

Even though I personally use an iPhone, I didn't want to limit the functionality to just that segment. Others have released native iPhone clients for dribble that you can buy in the App Store. And they are great apps. What I wanted though, was a simple and lightweight browser that anybody could access via their smartphone browser. So, if you are on Android or iOS, you can experience dribbble on your phone in a mobile-friendly format via hooppps.

Start small and iterate

hooppps is not a complete implementation of dribbble, nor does it attempt to cover every feature of the dribbble API. It is a simple experiment meant to improve the dribbble mobile experience. So far, that initial goal has been accomplished. However, this is just the first release. We want to make hooppps better. As the API provides more functionality, we'll add that functionality to hooppps as we see fit.

Release 1

With the first release of hooppps, we hoped to get initial responses and feedback from people.

The first release features include:


  • popular shots
  • shot detail
  • player detail
  • go to player


  • comments on shots
  • pagination
  • share shot on Twitter
  • follow player on Twitter
  • iPhone home screen icon

In addition to the features in hooppps today, the dribbble API also provides access to "shots by everyone" and "debut shots." We did not implement these extra views...yet.

Coming soon!

When I created the first view on hooppps, I thought, "Let's implement the popular shots thread, because it's popular." Well, it turns out that it may be full of popular shots, but it's not the most popular view in dribbble. Since we first mentioned hooppps on Twitter, people have noted that the "everyone" thread is more interesting, and that is what people view the most. So that was our first feature request. We are implementing that, and we will include the "debut" thread as well.

What would you like to see in hooppps?

Desktop browser vs. mobile browser

I originally designed hooppps to just be experienced on a phone. But as I got to thinking about how people would be introduced to hooppps, I realized that a lot of people would end up on hooppps via their laptop or desktop computer. Simply showing them the mobile layout in their desktop browser would result in a subpar introduction to hooppps. But I didn't want to focus on a layout for desktop browsers, because dribbble already has a wonderful desktop interface. Nevertheless, I wanted people to have an awesome first impression of hooppps, which meant that hooppps needed a special layout for the desktop browser: a preview of sorts.

So then I got to thinking, "Why not make hooppps functional in its desktop preview?" I created a position:absolute div over an iPhone image with overflow: hidden. Then, using the jQuery mousewheel plugin, I enabled scrolling of the content inside of that div, simulating the mobile experience. (Thanks to Larry for solving that problem!) In short, hooppps has a fully functional mobile interface visible in a desktop browser!

Collaboration and fun

hooppps has been a really fun project for me. I have learned more about Rails and designing for the mobile experience. It has also been really fun to get other developers here at Relevance involved. (For a list of contributors, see the README.)

From the very beginning, the idea was to open this up for others to contribute or fork to make their own dribbble browser. So, all of the code is public on GitHub. I would love to help other designers get involved (or even get started with their own implementation), so @reply me on Twitter with any questions.


I want to say thanks to everyone here at Relevance for helping me get hooppps out the door. Thank also to Jeremy Weiskotten for the swish gem. Without that, I probably would have not been ramped up so quickly. I also want to say thanks to Dan Cederholm and Rich Thornett for doing such an awesome job with dribbble. And thanks to everyone out there that contributes to open-source software. It is really awesome to have so many tools and a wonderful community to work with!

Nov 02 2010


The Relevant Bits - Nov 2, 2010

In addition to pulling off a successful "Conj", here is the run down of what we at Relevance were doing with our 20% time in October:

  • Chad continued his quest for Vimlander 2 The Quickening to be the only vim config around.
  • Stuart H has been knocking out tickets and applying patches to Clojure. Grab 1.3.0 Alpha 2 if you want to keep up with the latest in Clojure development.
  • Michael was an expert panel judge for the Rails Rumble.
  • Aaron shows off how to do mobile org in his emacs config.
  • Stuart H, Michael and Jon enhanced Mycroft. If you're already using it, see the history to see what's new. If you're not already using, grab it and start inspecting your JVM data.
  • Jon and Michael added paginated lists to their fork of swish.
  • Stuart S released Lazytest 1.0.1, 1.0.2, 1.1.0, 1.1.1 and 1.1.2 of his testing framework. See the changelog to figure out what your version of Lazytest provides.
  • Jon and Aaron updated labrepl, the environment for learning Clojure, for Clojure 1.3.0 compatability and closed out some GitHub issues.
  • Stuart H uploaded his slides from his Clojure presentation on protocols at JAOO.
  • Chris released 1.0 of ValidationReflection, for Rails 3 compatibility.
  • Alan updated reconfig to be Clojure 1.3 compatible. Check out this library if you want to reload config files in Clojure on SIGHUP.
  • Stuart S created Message, experiments in message-passing architectures in Clojure.
  • Chad, Alex R and Larry forked ruby-saml and started adding some new features, including optional HTTP parameter passing and more test coverage.
  • Alex R created Dwarf, a data mining tool for Rails 3.

Sep 27 2010


The Relevant Bits - Sep 27, 2010

Lots of Clojure stuff going on since our last update. Here's the latest report on what we've done with our 20% time:

Sep 06 2010


The Relevant Bits - Labor Day 2010 Edition

The big result of our "20% time" this week is the release of the clojure-conj web site. That, and other bits, are detailed below:

  • It's live! Announcing more details about the (first clojure-conj). And now, you can register for the event itself. Seats are limited, so don't miss out on this great event we've been planning.
  • Chris has been mentoring Fela Winkelmolen on his Ruby Summer of Code project this summer. Congrats to Fela as he has reached the end! Read about his accomplishments.
  • Stuart H started a four week series of an in-house version of The Pragmatic Studio's Clojure Programming course for a large part of the company in the evenings.
  • Chad & Chris each converted a client app over to be on the latest versions of Ruby 1.9.2, Rails 3.0 and Bundler 1.0. We feel that these technologies are ready for production use, and so should you.
  • Jared released version 0.4.6 of PDFKit.
  • Aaron released clojure-web, a collection of clojure web recipes.
  • Rob updated New World Order, his Rails 3 template, to be compatible with the final release of Rails 3.0.
  • Stuart S continued his crusade to prepare clojure-contrib for future development and releases. Read his detailed proposal.
  • Stuart S also continued improving upon LazyTest. Check out the 24 commits he's pushed over the last few days.

Aug 30 2010


The Relevant Bits - 08/30/2010 Edition

New point releases, new projects, and more info about the first clojure-conj. Here are The Relevant Bits from last week's "20%" time:

  • Lots of planning and organization on the (first clojure-conj). This is an event you are not going to want to miss! We will be unveiling the fruits of this labor later this week. Keep a close eye on the website for more information.
  • David released Incanter 1.2.3.
  • Jared released Errbit, the open source error catcher that's Hoptoad API compliant. Read more about it in his recent blog post.
  • Rob released watch-me-now 1.9.0
  • Jared can't let a week go about without an improvement to PDFKit, this week, announcing PDFKit 0.4.5.
  • Stuart S also contributed his weekly improvements to Lazytest.
  • Aaron updated labrepl to work with the latest Compojure.

Popular Tags