diff --git a/deploy/app.js b/deploy/app.js
index 1d177c569118df2a3b13fe0675f7ee88829eac78..072bad34549a13ea0169f0375cb4dfe5a879e928 100644
--- a/deploy/app.js
+++ b/deploy/app.js
@@ -66,17 +66,14 @@ app.use('/.well-known', express.static(path.join(__dirname, 'well-known')))
  * only use compression for production
  * this allows locally built aot to be served without errors
  */
-if (process.env.NODE_ENV === 'production') {
-  const { compressionMiddleware } = require('./compression')
-  app.use(compressionMiddleware, express.static(PUBLIC_PATH))
-} else {
-  app.use(express.static(PUBLIC_PATH))
-}
 
-app.use((req, res, next) => {
+const { compressionMiddleware } = require('./compression')
+app.use(compressionMiddleware, express.static(PUBLIC_PATH))
+
+const jsonMiddleware = (req, res, next) => {
   res.set('Content-Type', 'application/json')
   next()
-})
+}
 
 const templateRouter = require('./templates')
 const nehubaConfigRouter = require('./nehubaConfig')
@@ -84,11 +81,11 @@ const datasetRouter = require('./datasets')
 const pluginRouter = require('./plugins')
 const previewRouter = require('./preview')
 
-app.use('/templates', templateRouter)
-app.use('/nehubaConfig', nehubaConfigRouter)
-app.use('/datasets', datasetRouter)
-app.use('/plugins', pluginRouter)
-app.use('/preview', previewRouter)
+app.use('/templates', jsonMiddleware, templateRouter)
+app.use('/nehubaConfig', jsonMiddleware, nehubaConfigRouter)
+app.use('/datasets', jsonMiddleware, datasetRouter)
+app.use('/plugins', jsonMiddleware, pluginRouter)
+app.use('/preview', jsonMiddleware, previewRouter)
 
 const catchError = require('./catchError')
 app.use(catchError)
diff --git a/deploy/compression/index.js b/deploy/compression/index.js
index 4d0a9caabd9cd18ca9ba5be10f2c44792bf2499e..bc5d2acb4b69d219d1a6c32bb0148296c4d020c4 100644
--- a/deploy/compression/index.js
+++ b/deploy/compression/index.js
@@ -30,22 +30,28 @@ exports.detEncoding = detEncoding
 exports.compressionMiddleware = (req, res, next) => {
   const acceptEncoding = req.get('Accept-Encoding')
   const encoding = detEncoding(acceptEncoding)
+
+  // if no encoding is accepted
+  // or in dev mode, do not use compression
+  if (!encoding) return next()
   
   const ext = /(\.\w*?)$/.exec(req.url)
 
+  // if cannot determine mime-type, do not use encoding
+  // as Content-Type header is required for browser to understand response
   if (!ext || !mimeMap.get(ext[1])) return next()
   
+  res.set('Content-Type', mimeMap.get(ext[1]))
+
   if (encoding === BROTLI) {
     req.url = req.url + '.br'
     res.set('Content-Encoding', encoding)
-    res.set('Content-Type', mimeMap.get(ext[1]))
     return next()
   }
 
   if (encoding === GZIP) {
     req.url = req.url + '.gz'
     res.set('Content-Encoding', encoding)
-    res.set('Content-Type', mimeMap.get(ext[1]))
     return next()
   }