Turn your Rails app into a Progressive Web App

The Rails asset pipeline makes a number of assumptions about what's best for deploying JavaScript, including asset digest fingerprints and long-lived cache headers - mostly to increase "cacheability". Rails also assumes a single parent directory, /public/assets, to make it easier to look up the file path for a given asset.

We want Sprockets to compile service worker JavaScript from ES6/7, CoffeeScript, ERB, etc. but must remove the caching and scoping mechanisms offered by Rails asset pipeline defaults. This is where serviceworker-rails comes in.

Check out the blog post for more background.

Service Worker Rails

Source code on GitHub · Demo app


A Ruby library for modeling recurring events

Why would you need Montrose? Well, a calendaring or scheduling application may reach a point where it needs to handle entries that repeat at predefined intervals; it may useful to have an abstraction to represent that recurrence. How would you handle "every Friday 13th, forever"? It wouldn't be feasible to generate infinite events upfront to represent each instance - Montrose helps you define and enumerate these recurrences on demand.

# Friday the 13th, forever
Montrose.monthly(on: { friday: 13 })

I also wrote plenty of examples using Montrose if you're interested to learn more.

Go ahead and star the project on GitHub and fork the project to contribute.

$ gem install montrose

Source code on GitHub · Documentation


A Ruby wrapper for the Trello API

Ruby toolkit for the Trello API... a work-in-progress. Design and philosophy inspired by ocktokit.rb. I love using Trello almost everyday for work and personal stuff - which means there's a treasure trove of data waiting to be unlocked. The Tacokit gem is a simple ruby interface. It's well-tested, well-documented, and easy to use by Rubyists.

$ gem install tacokit


Source code on GitHub · Documentation


Rails engine for authenticating internal applications

OpenSesame is a Warden strategy for providing "walled garden" authentication for access to Rack-based applications via Omniauth. For example, your company has internal apps and/or staging enviroments for multiple projects and you want something better than HTTP basic auth. The intent is protect the visibility of your app from the out

$ gem install opensesame


Source code on GitHub · Documentation


Trello? Export your Trello data to Google Docs

LionelRichie is a script for exporting Trello data to Google Docs. Written in ruby, it provides a DSL for mapping data from a Trello board to Google spreadsheets cells and a command line executable suitable for use in scripts. It can be installed via rubygems:

$ gem install lionel_richie

Source code on GitHub


Redis-backed activity feeds for Rails

A Ruby gem for distributing activity items to Redis-backed activity feeds in a Rails application. Abstractions are provided to make it easy to declare "recipients" of a given event and how these activities should be rendered. To install:

$ gem install seymour

Documentation · Source code on GitHub


Sudokill is a realtime, multiplayer, web-based Sudoku game

One of my favorite projects, Sudokill is a realtime multiplayer Sudoku implementation. The interface designed to support human vs human over the web, computer vs computer via TCP, or human vs computer. I built the game for NYU heuristics students to compete with their own Sudokill “player” programs.The object of the game is to force the other player to make an invalid Sudoku move. Players take turn playing valid sudoku moves. Moves are valid as long as they don’t violate traditional sudoku configuration. Moves need not conform to the final solution of the board as in solitary Sudoku; in fact, the possibility of invalid states increases as more moves are made which diverge from the actual solution. The best strategies work reduce valid possibilities for the opponent based by looking ahead to future board states.

This project is particularly exciting to me as it leverages the HTML5 WebSocket protocol to make it possible to play the game in a web browser and communicate with a server in realtime using only HTML, CSS and Javascript on the front-end. I implemented a separate protocol to allow programs to connect to the server and play the game via TCP. Fellow students at NYU wrote computer “players” in a variety of languages (java, python, ruby, c ). The game also has some interesting features, such as configurable board density, an on-deck player queue, and a chat server.

Play Sudokill: Sudoku's not a one player game anymore

Try it out · Source code on GitHub

Running on Tilt

Podcast for the amateur endurance athlete

My friend Brenn got me into running not long after moving to New York. We’re both lifelong lovers of sport and we’ve shared many stories of athletic adventures and mishaps. runningontilt was born out of the desire to share our own sports stories with the world. I build, design and maintain the site, while Brenn does most of the podcasting. This site is formerly known as turfcasts.

Running on Tilt

Website · Source code on GitHub


Searchable database of the World's Languages

Professor Dennis Shasha at NYU recruited me to create a linguistics research tool. The vision is to provide a platform for linguists to make comparisons across a variety of attributes and properties of the world’s languages. Together with an undergrad developer, we built the site over a single semester and launched this past May, 2011. I continue to provide ongoing support.We devised a few database abstractions that would support a wide variety of use cases such as syntactic structures or phonetics. I engineered a multilevel search algorithm to filter results by a variety of potential inputs including linguistic properties, categories, keywords, parent and child relationships and examples.

Terraling: searchable database of the world's languages

Website · Source code on GitHub


Browser-based tool for editing and showing off simple presentation slides

In August 2010, I created a simple in-browser PowerPoint-like application as an entry in the 10K Apart contest from a list apart. Contestants were challenged to use features of HTML5 to create front-end applications in less than 10K of code. Soapbox leverages HTML5 localStorage to save slides in stringified JSON for future use. Although my my entry didn’t win, it was a good experience to create something straightforward and useful under constraints and a tight timeline.

Website · Source code on GitHub