diff --git a/.travis.yml b/.travis.yml
index c4467c5aaa38c689bd708b0594296f5e61d91a64..aaddb6a8b52c39cd2ea08f8c274afd36496efbae 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,18 +1,26 @@
 language: node_js
 node_js:
 - '4.2'
+- 'stable'
 cache:
   directories:
   - node_modules
-env:
-  global:
-  - DEPLOY_MESSAGE='"Travis build ${TRAVIS_BUILD_NUMBER}"'
-before_deploy:
-    - git config --global user.email "no-reply@scratch.mit.edu"
-    - git config --global user.name "scratch-gui"
-deploy:
-  provider: script
-  script: make deploy
-  skip_cleanup: true
-  on:
-    branch: master
+after_script:
+- |
+  # RELEASE_BRANCHES and NPM_TOKEN defined in Travis settings panel
+  declare exitCode
+  $(npm bin)/travis-after-all
+  exitCode=$?
+  if [[
+    # Execute after all jobs finish successfully
+    $exitCode = 0 &&
+    # Only release on release branches
+    $RELEASE_BRANCHES =~ $TRAVIS_BRANCH &&
+    # Don't release on PR builds
+    $TRAVIS_PULL_REQUEST = "false"
+  ]]; then
+    # Publish to gh-pages as most recent committer
+    git config --global user.email $(git log --pretty=format:"%ce" -n1)
+    git config --global user.name $(git log --pretty=format:"%cn" -n1)
+    ./node_modules/.bin/gh-pages -x -r https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git -d playground -m "Build for $(git log --pretty=format:%H)"
+  fi
diff --git a/package.json b/package.json
index 866d0dec64f4de704c4c9feff5c6cffe230ea649..5b60df0974d6b1b75b125f01c6c32cf5878bde15 100644
--- a/package.json
+++ b/package.json
@@ -33,6 +33,7 @@
     "scratch-blocks": "*",
     "scratch-render": "*",
     "scratch-vm": "*",
+    "travis-after-all": "1.4.4",
     "webpack": "1.13.2",
     "webpack-dev-server": "1.15.2"
   }