You have a bug in instantiate_template_from_string, where opts aren't being passed correctly to Tilt.new. In addition, in lib/angelo/templates.rb, line 61, the code render = ->{ template.render(self, locals) } should respect the :scope option, if set.