diff --git a/tools/ruby/standalone_ruby.py b/tools/ruby/standalone_ruby.py
new file mode 100644
index 0000000..0c574e0
--- /dev/null
+++ b/tools/ruby/standalone_ruby.py
@@ -0,0 +1,75 @@
+#!/usr/bin/python
+
+import zlib, sys, os, stat
+
+with file(sys.argv[2], "wb+") as outf:
+  outf.write("""#!/usr/bin/env ruby
+require "zlib"
+
+def zip_file_binding()
+  binding()
+end
+
+module Kernel
+  class ZipRequireRecord
+    attr_accessor :fname, :val
+    def initialize(fname, val)
+      @fname = fname
+      @val = val
+    end
+    def do_require()
+      return false if !@val
+      eval(@val, binding = zip_file_binding(), filename="//@bazel/" + @fname)
+      @val = nil
+      return true
+    end
+  end
+  BAZEL_START_ENTRY = "/@bazel/"
+  ZIP_TEMP_OBJS = {}
+  def require_relative(relative_feature)
+    file = caller.first.split(/:\d/,2).first
+    raise LoadError, "require_relative is called in #{$1}" if /\A\((.*)\)/ =~ file
+    require File.expand_path(relative_feature, File.dirname(file))
+  end
+  def require_zip(moduleName)
+    if moduleName.start_with?(BAZEL_START_ENTRY)
+      moduleName = moduleName[BAZEL_START_ENTRY.length..-1]
+    end
+    zip_obj = ZIP_TEMP_OBJS[moduleName]
+    if not zip_obj and !moduleName.end_with?('.rb')
+      zip_obj = ZIP_TEMP_OBJS[moduleName + '.rb']
+    end
+    return zip_obj.do_require() if (zip_obj)
+    return pre_zip_load_require(moduleName)
+  end
+  alias :pre_zip_load_require :require
+  alias :require :require_zip
+  def init_app(main_fname)
+    $0 = "//@bazel/" + main_fname
+    Kernel.require_zip(main_fname)
+  end
+  def register_inline_file(fname, data)
+    raise if ZIP_TEMP_OBJS.has_key?(fname)
+    ZIP_TEMP_OBJS[fname] = Kernel::ZipRequireRecord.new(fname, data.force_encoding("UTF-8"))
+  end
+end
+
+my_data = Zlib.inflate(DATA.read())
+""")
+
+  blob_data = []
+  offset = 0
+  with file(sys.argv[1], 'r') as infile:
+    for line in infile.xreadlines():
+      file_outname, file_binname = line.strip().split('|')
+      with file(file_binname, 'r') as obj_file:
+        obj = obj_file.read()
+      blob_data.append(obj)
+      new_off = offset + len(obj)
+      outf.write("Kernel.register_inline_file(%s, my_data.slice(%s...%s))\n" %
+                 (repr(file_outname), offset, new_off))
+      offset = new_off
+
+  outf.write("Kernel.init_app(%s)\n" % repr(sys.argv[3]))
+  outf.write("__END__\n")
+  outf.write(zlib.compress("".join(blob_data)))
