diff --git a/packages/gatsby-cli/src/create-cli.js b/packages/gatsby-cli/src/create-cli.js
index b3645263d4b1a..0cdf6c0626b6c 100644
--- a/packages/gatsby-cli/src/create-cli.js
+++ b/packages/gatsby-cli/src/create-cli.js
@@ -124,6 +124,10 @@ function buildLocalCommands(cli, isLocalSite) {
         type: `boolean`,
         default: false,
         describe: `Build site with link paths prefixed (set prefix in your config).`,
+      }).option(`no-uglify`, {
+        type: `boolean`,
+        default: false,
+        describe: `Build site without uglifying JS bundles (for debugging).`,
       }),
     handler: handlerP(
       getCommandHandler(`build`, (args, cmd) => {
diff --git a/packages/gatsby/src/commands/build.js b/packages/gatsby/src/commands/build.js
index 8a4fb4c008b2b..05533d41a32b6 100644
--- a/packages/gatsby/src/commands/build.js
+++ b/packages/gatsby/src/commands/build.js
@@ -18,6 +18,7 @@ type BuildArgs = {
   sitePackageJson: object,
   browserslist: string[],
   prefixPaths: boolean,
+  noUglify: boolean,
 }
 
 module.exports = async function build(program: BuildArgs) {
diff --git a/packages/gatsby/src/utils/babel-config.js b/packages/gatsby/src/utils/babel-config.js
index 88f89dbd71fba..0c1b18e81edb7 100644
--- a/packages/gatsby/src/utils/babel-config.js
+++ b/packages/gatsby/src/utils/babel-config.js
@@ -128,7 +128,7 @@ function findBabelPackage(directory) {
  * the paths will be absolute so that Babel behaves as expected.
  */
 module.exports = async function babelConfig(program, stage) {
-  const { directory } = program
+  const { directory, noUglify } = program
 
   let babelrc = findBabelrc(directory) || findBabelPackage(directory)
 
@@ -149,7 +149,7 @@ module.exports = async function babelConfig(program, stage) {
       require.resolve(`babel-preset-env`),
       {
         loose: true,
-        uglify: true,
+        uglify: !noUglify,
         modules: `commonjs`,
         targets: {
           browsers: program.browserslist,
diff --git a/packages/gatsby/src/utils/webpack.config.js b/packages/gatsby/src/utils/webpack.config.js
index 349cbbf6ee035..fe161630f9a42 100644
--- a/packages/gatsby/src/utils/webpack.config.js
+++ b/packages/gatsby/src/utils/webpack.config.js
@@ -45,6 +45,7 @@ module.exports = async (
   // webpack config.
   const stage = suppliedStage
   const babelConfig = await genBabelConfig(program, suppliedStage)
+  const { noUglify } = program
 
   function processEnv(stage, defaultNodeEnv) {
     debug(`Building env for "${stage}"`)
@@ -235,7 +236,7 @@ module.exports = async (
           .getState()
           .pages.map(page => page.componentChunkName)
         components = uniq(components)
-        return [
+        const plugins = [
           // Moment.js includes 100s of KBs of extra localization data by
           // default in Webpack that most sites don't want. This line disables
           // loading locale modules. This is a practical solution that requires
@@ -315,26 +316,31 @@ module.exports = async (
             filename: `chunk-manifest.json`,
             manifestVariable: `webpackManifest`,
           }),
-          // Minify Javascript.
-          new webpack.optimize.UglifyJsPlugin({
-            compress: {
-              screw_ie8: true, // React doesn't support IE8
-              warnings: false,
-            },
-            mangle: {
-              screw_ie8: true,
-            },
-            output: {
-              comments: false,
-              screw_ie8: true,
-            },
-          }),
           // Ensure module order stays the same. Supposibly fixed in webpack 2.0.
           new webpack.optimize.OccurenceOrderPlugin(),
           new GatsbyModulePlugin(),
           // new WebpackStableModuleIdAndHash({ seed: 9, hashSize: 47 }),
           new HashedChunkIdsPlugin(),
         ]
+        if (!noUglify) {
+          // Minify JavaScript.
+          plugins.push(
+            new webpack.optimize.UglifyJsPlugin({
+              compress: {
+                screw_ie8: true, // React doesn't support IE8
+                warnings: false,
+              },
+              mangle: {
+                screw_ie8: true,
+              },
+              output: {
+                comments: false,
+                screw_ie8: true,
+              },
+            })
+          )
+        }
+        return plugins
       }
       default:
         throw new Error(`The state requested ${stage} doesn't exist.`)