diff --git a/assets/images/icons.png b/assets/images/icons.png
index 3a1b610b..1a5f97e4 100644
Binary files a/assets/images/icons.png and b/assets/images/icons.png differ
diff --git a/assets/images/icons@2x.png b/assets/images/icons@2x.png
index 2ba54e2f..534dc4df 100644
Binary files a/assets/images/icons@2x.png and b/assets/images/icons@2x.png differ
diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee
index fa13ae6c..7d009e9b 100644
--- a/assets/javascripts/templates/pages/about_tmpl.coffee
+++ b/assets/javascripts/templates/pages/about_tmpl.coffee
@@ -110,6 +110,11 @@ credits = [
'2014 Yehuda Katz, Tom Dale and Ember.js contributors',
'MIT',
'https://raw.github.com/emberjs/ember.js/master/LICENSE'
+ ], [
+ 'Express',
+ '2009-2014 TJ Holowaychuk',
+ 'MIT',
+ 'https://raw.githubusercontent.com/visionmedia/express/master/LICENSE'
], [
'Git',
'2005-2014 Linus Torvalds and others',
diff --git a/assets/javascripts/templates/pages/news_tmpl.coffee b/assets/javascripts/templates/pages/news_tmpl.coffee
index 454d4f5e..61fd5e48 100644
--- a/assets/javascripts/templates/pages/news_tmpl.coffee
+++ b/assets/javascripts/templates/pages/news_tmpl.coffee
@@ -24,7 +24,10 @@ newsItem = (date, news) ->
result
app.news = [
- [ 1396742400000, # April 6, 2014
+ [ 1399075200000, # May 3, 2014
+ """ New Express documentation """,
+ ], [
+ 1396742400000, # April 6, 2014
""" New Go documentation """,
], [
1396137600000, # March 30, 2014
diff --git a/assets/javascripts/views/pages/express.coffee b/assets/javascripts/views/pages/express.coffee
new file mode 100644
index 00000000..c26f106a
--- /dev/null
+++ b/assets/javascripts/views/pages/express.coffee
@@ -0,0 +1,4 @@
+#= require views/pages/base
+#= require views/pages/underscore
+
+app.views.ExpressPage = app.views.UnderscorePage
diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss
index 6409e2a1..36cea34c 100644
--- a/assets/stylesheets/application.css.scss
+++ b/assets/stylesheets/application.css.scss
@@ -33,6 +33,7 @@
'pages/coffeescript',
'pages/d3',
'pages/ember',
+ 'pages/express',
'pages/go',
'pages/jquery',
'pages/knockout',
diff --git a/assets/stylesheets/global/_icons.scss b/assets/stylesheets/global/_icons.scss
index bf2ee16c..f6eeb97c 100644
--- a/assets/stylesheets/global/_icons.scss
+++ b/assets/stylesheets/global/_icons.scss
@@ -53,3 +53,4 @@
._icon-yii:before { background-position: -4rem -7rem; }
._icon-cpp:before { background-position: 0 -8rem; }
._icon-go:before { background-position: -1rem -8rem; }
+._icon-express:before { background-position: -2rem -8rem; }
diff --git a/assets/stylesheets/pages/_express.scss b/assets/stylesheets/pages/_express.scss
new file mode 100644
index 00000000..9b388a9d
--- /dev/null
+++ b/assets/stylesheets/pages/_express.scss
@@ -0,0 +1,8 @@
+._express {
+ padding-left: 1rem;
+
+ h1, h2, h3 { margin-left: -1rem; }
+ h2 { @extend %block-heading; }
+ h3 { @extend %block-label, %label-blue; }
+ p > code { @extend %label; }
+}
diff --git a/lib/docs/filters/express/clean_html.rb b/lib/docs/filters/express/clean_html.rb
new file mode 100644
index 00000000..4ad96619
--- /dev/null
+++ b/lib/docs/filters/express/clean_html.rb
@@ -0,0 +1,24 @@
+module Docs
+ class Express
+ class CleanHtmlFilter < Filter
+ def call
+ css('section').each do |node|
+ node.before(node.children).remove
+ end
+
+ # Put id attributes on headings
+ css('h2 + a[name]').each do |node|
+ node.previous_element['id'] = node['name']
+ node.remove
+ end
+
+ # Remove code highlighting
+ css('pre').each do |node|
+ node.content = node.content
+ end
+
+ doc
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/express/entries.rb b/lib/docs/filters/express/entries.rb
new file mode 100644
index 00000000..55e81223
--- /dev/null
+++ b/lib/docs/filters/express/entries.rb
@@ -0,0 +1,21 @@
+module Docs
+ class Express
+ class EntriesFilter < Docs::EntriesFilter
+ def additional_entries
+ type = 'Application'
+
+ doc.children.each_with_object [] do |node, entries|
+ if node.name == 'h2'
+ type = node.content
+ next
+ elsif node.name == 'h3'
+ name = node.content.strip
+ name.sub! %r{\(.+\)}, '()'
+
+ entries << [name, node['id'], type]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/docs/scrapers/express.rb b/lib/docs/scrapers/express.rb
new file mode 100644
index 00000000..f6474bae
--- /dev/null
+++ b/lib/docs/scrapers/express.rb
@@ -0,0 +1,19 @@
+module Docs
+ class Express < UrlScraper
+ self.name = 'Express'
+ self.type = 'express'
+ self.version = '4.1.1'
+ self.base_url = 'http://expressjs.com/4x/api.html'
+
+ html_filters.push 'express/clean_html', 'express/entries', 'title'
+
+ options[:title] = 'Express'
+ options[:container] = '#right'
+ options[:skip_links] = true
+
+ options[:attribution] = <<-HTML
+ © 2009–2014 TJ Holowaychuk
+ Licensed under the MIT License.
+ HTML
+ end
+end
diff --git a/public/icons/docs/express/16.png b/public/icons/docs/express/16.png
new file mode 100644
index 00000000..222fd388
Binary files /dev/null and b/public/icons/docs/express/16.png differ
diff --git a/public/icons/docs/express/16@2x.png b/public/icons/docs/express/16@2x.png
new file mode 100644
index 00000000..f1edfe4c
Binary files /dev/null and b/public/icons/docs/express/16@2x.png differ