diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000000000000000000000000000000000000..453747e14e12ff6c0f61cfdbc973cf97b79b7dd4
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,4 @@
+/public/
+/tmp/
+/vendor/
+
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000000000000000000000000000000000000..16eb18ecba2132ded93b682881b8e2c205656039
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,23 @@
+{
+  "extends": "airbnb",
+  "globals": {
+    "$": false,
+    "_": false,
+    "beforeEach": false,
+    "d3": false,
+    "define": false,
+    "describe": false,
+    "document": false,
+    "expect": false,
+    "fixture": false,
+    "gl": false,
+    "it": false,
+    "jQuery": false,
+    "Mousetrap": false,
+    "spyOn": false,
+    "spyOnEvent": false,
+    "Turbolinks": false,
+    "window": false
+  }
+}
+
diff --git a/.gitignore b/.gitignore
index 9166512606d3cdcdfbaead1ea48ee84586b6990f..6a1002621f4800fc5eb9acefe2c50b75bc77d521 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,6 +37,7 @@
 /doc/code/*
 /dump.rdb
 /log/*.log*
+/node_modules/
 /nohup.out
 /public/assets/
 /public/uploads.*
diff --git a/package.json b/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..942b2113e65f671502115fb114698805332ffc4d
--- /dev/null
+++ b/package.json
@@ -0,0 +1,14 @@
+{
+  "private": true,
+  "scripts": {
+    "eslint": "eslint .",
+    "eslint-fix": "eslint --fix ."
+  },
+  "devDependencies": {
+    "eslint": "^3.1.1",
+    "eslint-config-airbnb": "^12.0.0",
+    "eslint-plugin-import": "^2.0.1",
+    "eslint-plugin-jsx-a11y": "^2.2.3",
+    "eslint-plugin-react": "^6.4.1"
+  }
+}