diff --git a/doc-src/Rules b/doc-src/Rules
index 07e0549e..25875512 100644
--- a/doc-src/Rules
+++ b/doc-src/Rules
@@ -23,6 +23,10 @@ compile '/' do
   layout 'main'
 end
 
+compile '/search-data/' do
+  filter :erb
+end
+
 compile '/examples/*/' do
   filter :haml, :ugly => true
   filter :highlight if ENV['SYNTAX']
@@ -54,6 +58,10 @@ compile '*' do
   layout item[:layout] || 'main'
 end
 
+route '/search-data/' do
+  "#{SITE_ROOT}/javascripts"+item.identifier[0..-2]+".js"
+end
+
 (0..5).each do |i|
   route("/stylesheets/#{'*/' * i}_*/") {nil}
 end
diff --git a/doc-src/content/search-data.js.erb b/doc-src/content/search-data.js.erb
new file mode 100644
index 00000000..42fab9d4
--- /dev/null
+++ b/doc-src/content/search-data.js.erb
@@ -0,0 +1,7 @@
+function search(term, callback) {
+  var ids = index.terms[term] || index.approximate[term] || [];
+  var items = $.map(ids, function(id){ return index.items[id]; });
+  callback(items)
+}
+
+var index = <%= search_index.to_json %>;
diff --git a/doc-src/content/search.haml b/doc-src/content/search.haml
new file mode 100644
index 00000000..595c03f1
--- /dev/null
+++ b/doc-src/content/search.haml
@@ -0,0 +1,28 @@
+---
+title: Search | Compass Documentation
+crumb: Search
+body_id: search
+---
+- content_for(:javascripts) do
+  %script(type="text/javascript" src="/docs/javascripts/search-data.js")
+  :javascript
+    $(function(){
+      $('input').keypress(function(){
+        search(this.value, displayResults);
+      });
+    })
+    function displayResults(items) {
+      if (items.length > 0) {
+        var html = ""
+        for (var i = 0; i < items.length; i++) {
+          html += '<li><a href="'+items[i].url+'">'+items[i].title+'</a></li>';
+        }
+        $('ol#results').html(html)
+      } else {
+        $('ol#results').html("<li class='none'>Nothing found.</li>");
+      }
+    }
+%input{:type => "text", :placeholder=>"Search"}
+
+%ol#results
+  %li.none Please enter a search term.
\ No newline at end of file
diff --git a/doc-src/layouts/main.haml b/doc-src/layouts/main.haml
index ce8c8798..f88576af 100644
--- a/doc-src/layouts/main.haml
+++ b/doc-src/layouts/main.haml
@@ -41,4 +41,5 @@
   %footer(role="contentinfo")= render "partials/footer"
   %script(src="/docs/javascripts/jquery-1.3.2.min.js")
   %script(src="/docs/javascripts/fixups.js" deferred)
+  = @item[:content_for_javascripts]
   = render "partials/analytics"
diff --git a/doc-src/lib/search.rb b/doc-src/lib/search.rb
new file mode 100644
index 00000000..6755b954
--- /dev/null
+++ b/doc-src/lib/search.rb
@@ -0,0 +1,74 @@
+require 'json'
+
+STOP_WORDS = %w{
+  a about above across after afterwards again against all almost 
+  alone along already also although always am among amongst amoungst 
+  amount an and another any anyhow anyone anything anyway anywhere 
+  are around as at back be became because become becomes becoming 
+  been before beforehand behind being below beside besides between 
+  beyond bill both bottom but by call can cannot cant co computer con 
+  could couldnt cry de describe detail do done down due during each 
+  eg eight either eleven else elsewhere empty enough etc even ever 
+  every everyone everything everywhere except few fifteen fify fill 
+  find fire first five for former formerly forty found four from 
+  front full further get give go had has hasnt have he hence her here 
+  hereafter hereby herein hereupon hers herself him himself his how 
+  however hundred i ie if in inc indeed interest into is it its 
+  itself keep last latter latterly least less ltd made many may me 
+  meanwhile might mill mine more moreover most mostly move much must 
+  my myself name namely neither never nevertheless next nine no 
+  nobody none noone nor not nothing now nowhere of off often on once 
+  one only onto or other others otherwise our ours ourselves out over 
+  own part per perhaps please put rather re same see seem seemed 
+  seeming seems serious several she should show side since sincere 
+  six sixty so some somehow someone something sometime sometimes 
+  somewhere still such system take ten than that the their them 
+  themselves then thence there thereafter thereby therefore therein 
+  thereupon these they thick thin third this those though three 
+  through throughout thru thus to together too top toward towards 
+  twelve twenty two un under until up upon us very via was we well 
+  were what whatever when whence whenever where whereafter whereas 
+  whereby wherein whereupon wherever whether which while whither who 
+  whoever whole whom whose why will with within without would yet you 
+  your yours yourself yourselves
+} unless defined?(STOP_WORDS)
+
+def search_terms_for(item)
+  if item.identifier =~ /^\/(reference|tutorials)/
+    content = item.rep_named(:default).compiled_content
+    doc = Nokogiri::HTML(content)
+    full_text = doc.css("p, h1, h2, h3, h4, h5, h6").map{|el| el.inner_text}.join(" ")
+    "#{item[:title]} #{item[:meta_description]} #{full_text}".gsub(/[\W\s]+/m,' ').downcase.split(/\s+/).uniq - STOP_WORDS
+  else
+    []
+  end
+end
+
+def search_index
+  id = 0;
+  idx = {
+    "approximate" => {},
+    "terms" => {},
+    "items" => {}
+  }
+  @items.each do |item|
+    search_terms_for(item).each do |term|
+      idx["terms"][term] = []
+      idx["terms"][term] << id
+      (0...term.length).each do |c|
+        subterm = term[0...c]
+        idx["approximate"][subterm] ||= []
+        unless idx["approximate"][subterm].include?(id)
+          idx["approximate"][subterm] << id
+        end
+      end
+    end
+    idx["items"][id] = {
+      "url" => item.identifier,
+      "title" => item[:title],
+      "crumb" => item[:crumb]
+    }
+    id += 1
+  end
+  idx
+end