Skip to content
streaming music bookmark service
JavaScript Ruby CSS HTML Other
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Streaming Music Bookmark Side Project


stereopaw is a monorepo consisting of three main applications:


The Rails website consists of Backend models with API endpoints serving a Backbone.js single page app.

The Backbone app is found in app/app/assets/javascripts/app

  • The /routers subdirectory gives an overview of the SPA.
  • Many of the components rely on a global event bus, where components listen to a variety of triggers.
  • Backbone Views use JST templates found in app/assets/javascripts/templates/, which are preprocessed by haml-coffee-assets. For some reason I thought was a good idea.

The Rails app contains CRUD endpoints for the various models, and a bunch of setup to use devise with a SPA app. There's also some some additional search logic that uses pg_search.


The marklet is a large POJO (plain javascript object) that sniffs the DOM of the audio playing service. It plucks the appropriate metadata and timestamp, displaying it on a panel, and later sent to the backend.

It's meant to be light and simple.


The chrome extension is a convenience wrapper that loads the bookmarklet. There is no additional functionality besides placing the bookmarklet code in the DOM.

There used to be some message passing for a few audio services but those are no longer supported.

Popularity Calc

Trys to favor newer tracks, don't necessarily want to show same things.

age = (( ( - track.created_at_timestamp) / 3600 ) + 2) ^ 1.2

popularity = track.num_plays / age

Quick commands

As I am ever so forgetful; some quick refresher commands:

# dev env: loads db +  rails app stack

sudo docker-compose up

# deploy to prod
# run capitastrano with ssh forwarding
# might need to add the key to keyring (ssh-add)
# .env are symlinked

sudo docker-compose run -e "SSH_AUTH_SOCK=/ssh-agent" \
    -v $SSH_AUTH_SOCK:/ssh-agent web bundle exec cap production deploy

# misc helpful dev commands

sudo docker-compose run web bash

sudo docker-compose build

Dev Environment

Docker contains the rails and nodejs executables and various dependencies (ruby, gems, installed node_modules, etc.)

The app code for stereopaw (rails app, marklet, chrome extension) is bind mounted into the container.

The container runs additional db migration and asset pipeline commands through But server command is run from docker-compose.yml, which is the intended development environment executable.

Docker isn't used for production (old school capistrano) but only to spin up a dev environment.

Rails and Docker Dev Environment

# run rails stack

sudo-docker-compose up

Marklet & Chrome Extension Build

# build marklet:
# minifies marklet code to be distributed in the rails _public_ directory
# dev, prod environments respectively

sudo docker-compose run -w /stereopaw/marklet web grunt
sudo docker-compose run -w /stereopaw/marklet web grunt prod

# build extension bundle found in _extension_chrome/dist_
# dev, prod

sudo docker-compose run -w /stereopaw/extension_chrome web grunt
sudo docker-compose run -w /stereopaw/extension_chrome web grunt prod

Dockerfile Builds / docker-compose

Caching bundle install:

  • A full bundle install is extremely expensive and time consuming for every build. Want to avoid this.
  • Keep Dockerfile minimal
  • place Gemfile in temp location prior to a bundle install to avoid triggering a dirty rebuild on minor changes.

Database Image + Docker Network:

  • postgres docker image uses postgres user, need to set that in config/database.yml

  • set 'db' as hostname for development database, as using default network when running via docker-compose.

Build Docker Image

To build the docker env, if I am unlucky to upgrade a rails app again....

# build dev env

sudo docker-compose build .

haml_coffee_assets and github

This dependency v 1.6.2 lives in a github repo that for reasons . . . doesn't seem to install properly via docker-compose and whatever version of bundler is set. A "manual" bundle install via the ole bash-in-docker seems to work.

sudo docker run stereopaw/stereopaw bash
bundle install

sudo docker-compose run web bash
bundle install

Deployment Notes

Trying to keep a minimal deployment setup, currently running on a spot ec2 instance. Deployment is done via capistrano.

Capistrano is executed within Docker hence the ssh key forwarding.

sudo docker-compose run -e "SSH_AUTH_SOCK=/ssh-agent" \
    -v $SSH_AUTH_SOCK:/ssh-agent web bundle exec cap production deploy

sudo docker-compose run -e "SSH_AUTH_SOCK=/ssh-agent" \
    -v $SSH_AUTH_SOCK:/ssh-agent web bash

# rarely will need to restart nginx (memory issues on my tiny instance, etc)

service nginx restart

Delayed Job

Background worker is used to process the track submissions. Sometimes they die.

RAILS_ENV=production delayed_job <start|stop>


  • These are symlinked externally. See /app/.env.example
  • marklet and extension are symlinked:
    • requires own, and for both marklet and extension_chrome.
    • See respective .env.example.json for content.

You can’t perform that action at this time.