Host your bookmarks or maintain a link blog.

  • post from a command-line, a bookmarklet, or directly from your murlsh
  • fetches url titles and generates thumbnails from page
  • jGrowls embedded versions of Imageshack, Imgur, Vimeo and YouTube urls
  • converts Twitter status urls to their full text and adds user thumbnail
  • generates Atom and RSS feeds
  • generates podcast RSS feed and m3u file for all audio urls
  • generates json and jsonp feeds for client-side inclusion in other sites
  • search, all output formats can be filtered by search criteria
  • uses HTML5 audio for mp3 and ogg urls
  • looks good on iPhone
  • PubSubHubbub notification
  • plugin interface
  • rack interface
  • Gravatar support
  • generates import scripts from delicious api exports
  • optionally store thumbnails in S3
  • experimental support for posting by email via POP

See http://urls.matthewm.boedicker.org/ for example.

Installation

Phusion Passenger

DESTINATION_DIRECTORY is the web directory to install the murlsh site to.


gem install murlsh
murlsh DESTINATION_DIRECTORY
cd DESTINATION_DIRECTORY
rake config[root_url,<site root url>]
change anything else you want in config.yaml
rake init

Heroku

S3 is used for thumbnail storage because Heroku cannot write local files.


gem install heroku
heroku keys:add

gem install murlsh
mkdir murlsh_deploy <or any other name>
cd murlsh_deploy
murlsh .
git init
heroku create --stack cedar <choose a name>

rake app:gemfile
bundle install

rake heroku:config
rake config[s3_bucket,<your S3 bucket name>]
rake config[s3_id,<your S3 id>]
rake config[s3_secret,<your S3 secret>]
change anything else you want in config.yaml

rake user:add

git add .
git commit
git push heroku master

heroku addons:add shared-database
heroku run rake db:migrate

Development

Create a fork on Github and clone it.


rake config[root_url,http://localhost:9292/]
rake db:migrate
rake user:add
rackup

Browse to http://localhost:9292/

Updating

If you are using the gem and it gets updated to a new version you should run the murlsh command again from your web directory to update plugins, javascript and css. It will prompt before overwriting anything in case you have made modifications.

Posting

Bookmarklet


rake post_bookmarklet

This will produce a bookmarklet link customized with your murlsh’s URL and your password. Create a link in your bookmarks toolbar with the output; the resulting bookmarklet will let you post to your murlsh from whatever page you’re currently viewing.

If you select text on the page before hitting the bookmarklet, your selection will be used as the title; otherwise, the page’s title will be used.

Shell script


rake post_sh

will produce a customized shell script that will take command-line arguments for URL, etc, and post to your murlsh using curl.

API

Recent urls

  • http://your_root/atom.atom
  • http://your_root/rss.rss
  • http://your_root/podcast.rss (urls with audio/mpeg content type)
  • http://your_root/m3u.m3u (urls with audio content types)
  • http://your_root/json.json
  • http://your_root/json.json?callback=x (jsonp)

Thumbnails

Thumbnail images are generated from added urls using plumnailer. They are scaled down to ‘thumbnail_max_side’ in config.yaml and stored locally.

Thumbnails can also be manually specified by passing their url as the ‘thumbnail’ parameter when adding a url. They are also scaled and stored locally.

The plugin add_pre_40_thumbnail_shortcuts.rb can be used to specify short names for frequently used thumbnail urls that can be passed in instead.

Plugins

Classes in the plugins directory can be used to change behavior at certain points. Each class that extends Murlsh::Plugin and sets an instance variable called @hook will be called for that hook. Each plugin has a run() method that accepts arguments and returns something. These methods will be called in the order of their class names sorted lexically. Some hooks pass the output of their run() method to the next plugin for that hook so that the data can be passed through a chain of methods that each do something to it.

A lot of the standard behavior is implemented as plugins. See the plugins directory for examples.

Plugin hooks

Hook Description run() arguments Returns
add_pre called before a new url is saved url, config hash undefined
add_post called after a new url is saved url, config hash undefined
avatar called to get an avatar url from an email md5 sum avatar url, url, config hash avatar url
store_asset store an asset somewhere where it can be loaded by url name, data, config hash asset url if successfully stored
url_display_add called to display additional information after urls markup builder, url, config hash undefined
url_display_pre called to modify a url on-the-fly before display, does not change database url, rack request, config hash undefined

PubSubHubbub

Murlsh can notify PubSubHubbub hubs when a new url is added by adding them to config.yaml. The pubsubhubbub_hubs key is a list of hashes in the following format:


pubsubhubbub_hubs:
- publish_url: http://pubsubhubbub.appspot.com/publish
  subscribe_url: http://pubsubhubbub.appspot.com/

publish_url is where the notifications get sent subscribe_url is what gets put in the feed as link rel=“hub”

This will make updates to your feed show up in Google Reader instantly.

Questions and comments: matthewm@boedicker.org