diff --git a/.eslintignore b/.eslintignore
index 8773f6f9f..69eb4216d 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -16,9 +16,11 @@ test/views/*.js
 
 # ES2015+ files
 !js/background.js
+!js/logging.js
 !js/models/conversations.js
 !js/views/attachment_view.js
 !js/views/conversation_search_view.js
+!js/views/debug_log_view.js
 !js/views/file_input_view.js
 !js/views/inbox_view.js
 !main.js
diff --git a/js/background.js b/js/background.js
index 0c6e733f5..506874823 100644
--- a/js/background.js
+++ b/js/background.js
@@ -1,7 +1,5 @@
 /* eslint-disable */
 
-/* eslint-env browser */
-
 /* global Backbone: false */
 /* global $: false */
 
diff --git a/js/logging.js b/js/logging.js
index cd66f9e97..d1961226f 100644
--- a/js/logging.js
+++ b/js/logging.js
@@ -1,3 +1,10 @@
+/* eslint-env node */
+
+/* eslint strict: ['error', 'never'] */
+
+/* global $: false */
+/* global textsecure: false */
+
 const electron = require('electron');
 const bunyan = require('bunyan');
 const _ = require('lodash');
@@ -23,13 +30,14 @@ const LEVELS = {
 // Backwards-compatible logging, simple strings and no level (defaulted to INFO)
 
 function redactPhone(text) {
-  return text.replace(PHONE_REGEX, "+[REDACTED]$1");
+  return text.replace(PHONE_REGEX, '+[REDACTED]$1');
 }
 
 function redactGroup(text) {
-  return text.replace(GROUP_REGEX, function(match, before, id, after) {
-    return before + '[REDACTED]' + id.slice(-3) + after;
-  });
+  return text.replace(
+    GROUP_REGEX,
+    (match, before, id, after) => `${before}[REDACTED]${id.slice(-3)}${after}`
+  );
 }
 
 function now() {
@@ -37,19 +45,16 @@ function now() {
   return date.toJSON();
 }
 
-function log() {
-  const args = Array.prototype.slice.call(arguments, 0);
-
+function log(...args) {
   const consoleArgs = ['INFO ', now()].concat(args);
-  console._log.apply(console, consoleArgs);
+  console._log(...consoleArgs);
 
   // To avoid [Object object] in our log since console.log handles non-strings smoothly
-  const str = args.map(function(item) {
+  const str = args.map((item) => {
     if (typeof item !== 'string') {
       try {
         return JSON.stringify(item);
-      }
-      catch (e) {
+      } catch (error) {
         return item;
       }
     }
@@ -71,14 +76,14 @@ if (window.console) {
 function getHeader() {
   let header = window.navigator.userAgent;
 
-  header += ' node/' + window.config.node_version;
-  header += ' env/' + window.config.environment;
+  header += ` node/${window.config.node_version}`;
+  header += ` env/${window.config.environment}`;
 
   return header;
 }
 
 function getLevel(level) {
-  var text = LEVELS[level];
+  const text = LEVELS[level];
   if (!text) {
     return BLANK_LEVEL;
   }
@@ -87,7 +92,7 @@ function getLevel(level) {
 }
 
 function formatLine(entry) {
-  return getLevel(entry.level) + ' ' + entry.time + ' ' + entry.msg;
+  return `${getLevel(entry.level)} ${entry.time} ${entry.msg}`;
 }
 
 function format(entries) {
@@ -95,30 +100,31 @@ function format(entries) {
 }
 
 function fetch() {
-  return new Promise(function(resolve) {
+  return new Promise((resolve) => {
     ipc.send('fetch-log');
 
-    ipc.on('fetched-log', function(event, text) {
-      var result = getHeader() + '\n' + format(text);
+    ipc.on('fetched-log', (event, text) => {
+      const result = `${getHeader()}\n${format(text)}`;
       resolve(result);
     });
   });
 }
 
-function publish(log) {
-  log = log || fetch();
+function publish(rawContent) {
+  const content = rawContent || fetch();
 
-  return new Promise(function(resolve) {
+  return new Promise((resolve) => {
     const payload = textsecure.utils.jsonThing({
       files: {
         'debugLog.txt': {
-          content: log
-        }
-      }
+          content,
+        },
+      },
     });
 
+    // eslint-disable-next-line more/no-then
     $.post('https://api.github.com/gists', payload)
-      .then(function(response) {
+      .then((response) => {
         console._log('Posted debug log to ', response.html_url);
         resolve(response.html_url);
       })
@@ -136,22 +142,19 @@ const logger = bunyan.createLogger({
   streams: [{
     level: 'debug',
     stream: {
-      write: function(entry) {
+      write(entry) {
         console._log(formatLine(JSON.parse(entry)));
-      }
-    }
-  }]
+      },
+    },
+  }],
 });
 
 // The Bunyan API: https://github.com/trentm/node-bunyan#log-method-api
-function logAtLevel() {
-  const level = arguments[0];
-  const args = Array.prototype.slice.call(arguments, 1);
-
-  const ipcArgs = ['log-' + level].concat(args);
-  ipc.send.apply(ipc, ipcArgs);
+function logAtLevel(level, ...args) {
+  const ipcArgs = [`log-${level}`].concat(args);
+  ipc.send(...ipcArgs);
 
-  logger[level].apply(logger, args);
+  logger[level](...args);
 }
 
 window.log = {
@@ -165,11 +168,11 @@ window.log = {
   publish,
 };
 
-window.onerror = function(message, script, line, col, error) {
+window.onerror = (message, script, line, col, error) => {
   const errorInfo = error && error.stack ? error.stack : JSON.stringify(error);
-  window.log.error('Top-level unhandled error: ' + errorInfo);
+  window.log.error(`Top-level unhandled error: ${errorInfo}`);
 };
 
-window.addEventListener('unhandledrejection', function(rejectionEvent) {
-  window.log.error('Top-level unhandled promise rejection: ' + rejectionEvent.reason);
+window.addEventListener('unhandledrejection', (rejectionEvent) => {
+  window.log.error(`Top-level unhandled promise rejection: ${rejectionEvent.reason}`);
 });
diff --git a/js/views/attachment_view.js b/js/views/attachment_view.js
index b42987284..861ab218f 100644
--- a/js/views/attachment_view.js
+++ b/js/views/attachment_view.js
@@ -1,5 +1,3 @@
-/* eslint-env browser */
-
 /* global $: false */
 /* global _: false */
 /* global Backbone: false */
diff --git a/js/views/debug_log_view.js b/js/views/debug_log_view.js
index 357e2bf5e..0abdea58f 100644
--- a/js/views/debug_log_view.js
+++ b/js/views/debug_log_view.js
@@ -1,66 +1,69 @@
-/*
- * vim: ts=4:sw=4:expandtab
- */
+/* global i18n: false */
+/* global Whisper: false */
+
+// eslint-disable-next-line func-names
 (function () {
-    'use strict';
-    window.Whisper = window.Whisper || {};
+  'use strict';
 
-    Whisper.DebugLogLinkView = Whisper.View.extend({
-        templateName: 'debug-log-link',
-        initialize: function(options) {
-            this.url = options.url;
-        },
-        render_attributes: function() {
-            return {
-                url: this.url,
-                reportIssue: i18n('reportIssue')
-            };
-        }
-    });
-    Whisper.DebugLogView = Whisper.View.extend({
-        templateName: 'debug-log',
-        className: 'debug-log modal',
-        initialize: function() {
-            this.render();
-            this.$('textarea').val(i18n('loading'));
+  window.Whisper = window.Whisper || {};
 
-            window.log.fetch().then(function(text) {
-                this.$('textarea').val(text);
-            }.bind(this));
-        },
-        events: {
-            'click .submit': 'submit',
-            'click .close': 'close'
-        },
-        render_attributes: {
-            title: i18n('submitDebugLog'),
-            cancel: i18n('cancel'),
-            submit: i18n('submit'),
-            close: i18n('gotIt'),
-            debugLogExplanation: i18n('debugLogExplanation')
-        },
-        close: function(e) {
-            e.preventDefault();
-            this.remove();
-        },
-        submit: function(e) {
-            e.preventDefault();
-            var text = this.$('textarea').val();
-            if (text.length === 0) {
-                return;
-            }
-            log.publish(text).then(function(url) {
-                var view = new Whisper.DebugLogLinkView({
-                    url: url,
-                    el: this.$('.result')
-                });
-                this.$('.loading').removeClass('loading');
-                view.render();
-                this.$('.link').focus().select();
-            }.bind(this));
-            this.$('.buttons, textarea').remove();
-            this.$('.result').addClass('loading');
-        }
-    });
+  Whisper.DebugLogLinkView = Whisper.View.extend({
+    templateName: 'debug-log-link',
+    initialize(options) {
+      this.url = options.url;
+    },
+    render_attributes() {
+      return {
+        url: this.url,
+        reportIssue: i18n('reportIssue'),
+      };
+    },
+  });
+  Whisper.DebugLogView = Whisper.View.extend({
+    templateName: 'debug-log',
+    className: 'debug-log modal',
+    initialize() {
+      this.render();
+      this.$('textarea').val(i18n('loading'));
 
-})();
+      // eslint-disable-next-line more/no-then
+      window.log.fetch().then((text) => {
+        this.$('textarea').val(text);
+      });
+    },
+    events: {
+      'click .submit': 'submit',
+      'click .close': 'close',
+    },
+    render_attributes: {
+      title: i18n('submitDebugLog'),
+      cancel: i18n('cancel'),
+      submit: i18n('submit'),
+      close: i18n('gotIt'),
+      debugLogExplanation: i18n('debugLogExplanation'),
+    },
+    close(e) {
+      e.preventDefault();
+      this.remove();
+    },
+    submit(e) {
+      e.preventDefault();
+      const text = this.$('textarea').val();
+      if (text.length === 0) {
+        return;
+      }
+      // eslint-disable-next-line more/no-then
+      window.log.publish(text).then((url) => {
+        const view = new Whisper.DebugLogLinkView({
+          url,
+          el: this.$('.result'),
+        });
+        this.$('.loading').removeClass('loading');
+        view.render();
+        this.$('.link').focus().select();
+      });
+      this.$('.buttons, textarea').remove();
+      this.$('.result').addClass('loading');
+    },
+  });
+}());