Jake Teton‑Landis

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


December 2013 - January 2014


Teeveed is a natural language interface for the media center. I built it as my winter break project in 2013.

teeveed icon

You talk to it with your smartphone’s web browser. You say “Okay TV, play Game of Thrones episode 3,” and teeveed will open that media in VLC on your media center computer.

Teeveed is made up of three components:

The intents you see here are parsed from the user’s plain-text input by Wit.ai, then handled by the coordinator daemon.

Project Status

Development has ceased. I quit working on this early in the Spring 2014 semester as my classes became more demanding.

What went well

I’m very happy with the progress I made on teeveed in the limited time I gave it. I learned a ton.

What went poorly


Here are my notes from

Current Tasks

  1. Switching from DataMapper to Sequel for our ruby-hipster ORM. DataMapper does too much work that keeps us from raw SQL, which we need to implement trigram-based text matching

  2. Use the JavaFX entry point. Right now teeveed boots from jar-bootstrap.rb via JRuby’s org.jruby.JarBootstrapMain. We need to use a JavaFX main to use JavaFX bundling tools and eliminate dependence on mvn com.zenjava:javafx-maven-plugin:2.0:fix-classpath for deployment

  3. Switch from JRuby-based JIT compiling to AOT compiling. teeveed boots really, really slowly, and that’s because there’s a lot of JIT happening when the jar is loaded. Maybe things would go faster if we pre-compiled teeveed (and its gems) somehow.


teeveed uses gem-maven-plugin instead of Bundler to manage requirements. See pom.xml for more information.

Get Hacking

  1. git clone https://github.com/justjake/teeveed or similar to get the source
  2. cd teeveed, mvn initialize will download and install the required rubygems in teeveed/target/rubygems
  3. source env.sh will correct your $GEM_HOME and $RUBY_LIB environment variables to point to the gems installed in teeveed/target/rubygems and the teeveed sources.
  4. Hack away. run teeveed (alias provided by env.sh) to start the daemon, or cli to start the Pry command line.

If things feel too slow, You should get drip in your ~/bin, and then source drip.env.sh before launching any of this ruby junk. Drip’ll put the spring back in your step!



The only reason we need Maven and the JDK is because (right now) teeveed isn’t packaged as a JavaFX runtime app. Because the JavaFX runtime does some interesting native loading things, the simplest way is just to move the JavaFX libraries into the implicit system classpath.

I will get around to fixing this, but it’s low priority for my own machines.


  1. (sudo) mvn com.zenjava:javafx-maven-plugin:2.0:fix-classpath

    This moves JavaFX onto the classpath so the JavaFX libraries are always loaded. THIS STEP IS ONLY REQUIRED ON USER-INTERFACE MACHINES

  2. make a directory for all of the teeveed resources. I like ~/teeveed.

  3. copy teeveed-0.2.2.jar and example.teeveed.conf.rb into your teeveed folder.
  4. copy teeveed.sh into your ~/bin or somewhere else on your path, and modify $TEEVEED_HOME in it to point to your teeveed folder.
  5. Create a Postgres database and user for teeveed. Make sure your postgres instance is accessable over TCP (unencrypted)
  6. Change example.teeveed.conf.rb so that it matches your setup. Important things to change:

    • database command to match the setup of your Postgres database
    • library command’s path should be ‘/path/to/your/media’
    • You’ll need to insert your Wit.ai token for the teeveed instance




The index is stored in a PostgeSQL database, which gets us nice full-text-search for free. Indexing is performed by crawling each library section on a specified schedule, and adding new items, and removing old items based on a last_seen timestamp.

At some point we should use the following algorithm when returning search results, so that we never return a file that doesn’t exist:

Natural Language Interface