Jake Teton‑Landis

Perfection enthusiast and byte crasftsman in San Francisco, CA. Service orchestration and developer tools at Airbnb.


2010 - 2011

Grooveshark Desktop

Grooveshark Desktop was my take on a desktop client for the now-defunct music service Grooveshark - a kind-of proto-Spotify based on a dubious legal plaftform. My app featured:

Grooveshark Desktop recieved over 50,000 downloads, and was even featured on Lifehacker.

search ui screenshot minicontroller screenshot

Grooveshark updated their online app regularly, and the work required to maintain my desktop cleint became overwhelming. I dropped it in 2010 in favor of spending more time on my studies.


My client was implemented as a userscript for the Mac-only site-specific browser application Fluid. To create the seamless double-high menubar, I relied on a specific Fluid feature to totally disable window chrome. I then implemented window-movement as a javascript event handler. The “traffic lights” were also entirely Javascript.

I’d like to think that I pioneered the technique of poorly-recreated native UI elements in a thin Webkit wrapper, but really it was all Site-Specific browser programmers. Now thin webapp wrappers are common-place: Facebook Mobile, Rdio, and Spotify are all poorly-disguised webviews masquerading as honest desktop clients.

Because Grooveshark Desktop was just a Javascript file and a collection of settings for the Fluid SSB runtime, installation could be a real hassle. A SSB in Fluid consists of several parts:

I thought an OS X package would be the easiest (and most correct) way for my users to get these pieces into place. Unfortunately, the tools to directly create an OS X package that targets the user’s home directory faded away into obscurity, even in 2009. All the information on the package format I could find was years out of date. I could create packages that targeted /Applications and /Library just fine, but these required administrator passwords and were perceived as intrusive.

I eventually cobbled together a script using the remaining package utils from Xcode 3 from references for Xcode 2 tools and Panther. Took plenty of trial-and-error. The package tools happily build a complaint package to install all the Grooveshark Desktop components into the filesystem root. Then the script unpacks that package, manipulates the auto-generated manifest, flattens the package directories, and the re-compresses everything back into a .pkg file.

The source is still availible online at Github.