diff --git a/gulpfile.js b/gulpfile.js
index 358058d880e4fd58af46198066843d046db19eaf..2bffc4124dc1e72eff1f305b863977797294cbb2 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -166,7 +166,14 @@ gulp.task('scripts:production', gulp.series('clean:js', function js () {
 // Build App.
 gulp.task('app', function() {
     return gulp.src(options.theme.app + 'src/')
-        .pipe(webpack( require(options.theme.app + 'webpack/dev.config.js') ))
+        .pipe(webpack( require(options.theme.app + 'webpack.dev.config.js') ))
+        .pipe(gulp.dest(options.theme.app_dest));
+})
+
+// Build Prod App
+gulp.task('app:production', function() {
+    return gulp.src(options.theme.app + 'src/')
+        .pipe(webpack( require(options.theme.app + 'webpack.prod.config.js') ))
         .pipe(gulp.dest(options.theme.app_dest));
 })
 
@@ -221,10 +228,10 @@ gulp.task('watch:static', function watch () {
 gulp.task('watch', gulp.parallel('watch:css', 'watch:lint:sass', 'watch:js', 'watch:lint:js', 'watch:images', 'watch:fonts', 'watch:static'));
 
 // Build everything.
-gulp.task('build', gulp.series(gulp.parallel('styles:production', 'scripts:production', 'images', 'fonts', 'lint'), 'collectstatic'));
+gulp.task('build', gulp.series(gulp.parallel('styles:production', 'scripts:production', 'app:production', 'images', 'fonts', 'lint'), 'collectstatic'));
 
 // Deploy everything.
-gulp.task('deploy', gulp.parallel('styles:production', 'scripts:production', 'images', 'fonts'));
+gulp.task('deploy', gulp.parallel('styles:production', 'scripts:production', 'app:production', 'images', 'fonts'));
 
 // The default task.
 gulp.task('default', gulp.series('build'));
diff --git a/opentech/settings/base.py b/opentech/settings/base.py
index 6986d6a9bdaa84e65c95445accd6d4e0797eb4d6..4921570711078598352bb003eb0d17aea8110e35 100644
--- a/opentech/settings/base.py
+++ b/opentech/settings/base.py
@@ -592,3 +592,10 @@ if env.get('SECURE_CONTENT_TYPE_NOSNIFF', 'true').lower().strip() == 'true':
 
 REFERRER_POLICY = env.get('SECURE_REFERRER_POLICY',
                           'no-referrer-when-downgrade').strip()
+
+WEBPACK_LOADER = {
+    'DEFAULT': {
+        'BUNDLE_DIR_NAME': 'app/',
+        'STATS_FILE': os.path.join(BASE_DIR, './opentech/static_compiled/app/webpack-stats.json'),
+    }
+}
diff --git a/opentech/settings/dev.py b/opentech/settings/dev.py
index 1313d7fe3968cfaa9b3b729e93b0f26d36801880..176f00d6dc4033024cd9f363b2bb28663575f326 100644
--- a/opentech/settings/dev.py
+++ b/opentech/settings/dev.py
@@ -109,11 +109,3 @@ if DEBUGTOOLBAR:
     MIDDLEWARE = [
         'debug_toolbar.middleware.DebugToolbarMiddleware',
     ] + MIDDLEWARE
-
-
-WEBPACK_LOADER = {
-    'DEFAULT': {
-        'BUNDLE_DIR_NAME': 'app/',
-        'STATS_FILE': os.path.join(BASE_DIR, './opentech/static_src/src/app/webpack-stats.json'),
-    }
-}
diff --git a/opentech/settings/production.py b/opentech/settings/production.py
index c4a21eedde2ef80a89bd01f0e8142a096bef376f..b9e649bebf041d563d73cad0a2ad41043daa83a1 100644
--- a/opentech/settings/production.py
+++ b/opentech/settings/production.py
@@ -21,5 +21,8 @@ if 'MAILGUN_API_KEY' in env:
         "WEBHOOK_SECRET": env.get('ANYMAIL_WEBHOOK_SECRET', None)
     }
 
+WEBPACK_LOADER['DEFAULT'].update({
+    'STATS_FILE': os.path.join(BASE_DIR, './opentech/static_compiled/app/webpack-stats-prod.json'),
+})
 
 django_heroku.settings(locals())
diff --git a/opentech/static_src/src/app/webpack.dev.config.js b/opentech/static_src/src/app/webpack.dev.config.js
index 29349fe9fb6d2881d1e03bf0cb4c236990f2e8dc..ce97aee7ded896e275251f7413a694af46c86a6b 100644
--- a/opentech/static_src/src/app/webpack.dev.config.js
+++ b/opentech/static_src/src/app/webpack.dev.config.js
@@ -11,7 +11,7 @@ config.output.publicPath = 'http://localhost:3000/app/'
 config.plugins = config.plugins.concat([
     new webpack.HotModuleReplacementPlugin(),
     new webpack.NoEmitOnErrorsPlugin(),
-    new BundleTracker({filename: './webpack-stats.json'}),
+    new BundleTracker({filename: './opentech/static_compiled/app/webpack-stats.json'}),
 ])
 
 // Add a loader for JSX files with react-hot enabled
diff --git a/opentech/static_src/src/app/webpack/prod.config.js b/opentech/static_src/src/app/webpack.prod.config.js
similarity index 51%
rename from opentech/static_src/src/app/webpack/prod.config.js
rename to opentech/static_src/src/app/webpack.prod.config.js
index 5fdcde239c57b88deb4225cb77e91e8550f07c68..9b0ff64acf263045ea57e046147492c9f347a7d2 100644
--- a/opentech/static_src/src/app/webpack/prod.config.js
+++ b/opentech/static_src/src/app/webpack.prod.config.js
@@ -6,28 +6,19 @@ var config = require('./webpack.base.config.js')
 config.output.path = require('path').resolve('./assets/dist')
 
 config.plugins = config.plugins.concat([
-    new BundleTracker({filename: './webpack-stats-prod.json'}),
+    new BundleTracker({filename: './opentech/static_compiled/app/webpack-stats-prod.json'}),
 
     // removes a lot of debugging code in React
     new webpack.DefinePlugin({
         'process.env': {
             'NODE_ENV': JSON.stringify('production')
         }}),
-
-    // keeps hashes consistent between compilations
-    new webpack.optimize.OccurenceOrderPlugin(),
-
-    // minifies your code
-    new webpack.optimize.UglifyJsPlugin({
-        compressor: {
-            warnings: false
-        }
-    })
 ])
 
-// Add a loader for JSX files
-config.module.loaders.push(
-    { test: /\.jsx?$/, exclude: /node_modules/, loader: 'babel' }
-)
+config.optimization = {
+    minimize: true
+}
+
+config.mode = "production"
 
 module.exports = config