diff --git a/pwnagotchi/agent.py b/pwnagotchi/agent.py
index 69d846e..ed4ad0d 100644
--- a/pwnagotchi/agent.py
+++ b/pwnagotchi/agent.py
@@ -49,9 +49,9 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
         if not os.path.exists(config['bettercap']['handshakes']):
             os.makedirs(config['bettercap']['handshakes'])
 
-        logging.info("%s@%s (v%s)" % (pwnagotchi.name(), self.fingerprint(), pwnagotchi.version))
+        logging.info("%s@%s (v%s)", pwnagotchi.name(), self.fingerprint(), pwnagotchi.version)
         for _, plugin in plugins.loaded.items():
-            logging.debug("plugin '%s' v%s" % (plugin.__class__.__name__, plugin.__version__))
+            logging.debug("plugin '%s' v%s", plugin.__class__.__name__, plugin.__version__)
 
     def config(self):
         return self._config
@@ -63,11 +63,11 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
         return self._supported_channels
 
     def setup_events(self):
-        logging.info("connecting to %s ..." % self.url)
+        logging.info("connecting to %s ...", self.url)
 
         for tag in self._config['bettercap']['silence']:
             try:
-                self.run('events.ignore %s' % tag, verbose_errors=False)
+                self.run('events.ignore %s', tag, verbose_errors=False)
             except Exception as e:
                 pass
 
@@ -90,7 +90,7 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
             s = self.session()
             for iface in s['interfaces']:
                 if iface['name'] == mon_iface:
-                    logging.info("found monitor interface: %s" % iface['name'])
+                    logging.info("found monitor interface: %s", iface['name'])
                     has_mon = True
                     break
 
@@ -99,11 +99,11 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
                     logging.info("starting monitor interface ...")
                     self.run('!%s' % mon_start_cmd)
                 else:
-                    logging.info("waiting for monitor interface %s ..." % mon_iface)
+                    logging.info("waiting for monitor interface %s ...", mon_iface)
                     time.sleep(1)
 
-        logging.info("supported channels: %s" % self._supported_channels)
-        logging.info("handshakes will be collected inside %s" % self._config['bettercap']['handshakes'])
+        logging.info("supported channels: %s", self._supported_channels)
+        logging.info("handshakes will be collected inside %s", self._config['bettercap']['handshakes'])
 
         self._reset_wifi_settings()
 
@@ -151,12 +151,12 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
 
         if not channels:
             self._current_channel = 0
-            logging.debug("RECON %ds" % recon_time)
+            logging.debug("RECON %ds", recon_time)
             self.run('wifi.recon.channel clear')
         else:
-            logging.debug("RECON %ds ON CHANNELS %s" % (recon_time, ','.join(map(str, channels))))
+            logging.debug("RECON %ds ON CHANNELS %s", recon_time, ','.join(map(str, channels)))
             try:
-                self.run('wifi.recon.channel %s' % ','.join(map(str, channels)))
+                self.run('wifi.recon.channel %s', ','.join(map(str, channels)))
             except Exception as e:
                 logging.exception("error")
 
@@ -212,7 +212,7 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
             ch = ap['channel']
             # if we're sticking to a channel, skip anything
             # which is not on that channel
-            if channels != [] and ch not in channels:
+            if not channels and ch not in channels:
                 continue
 
             if ch not in grouped:
@@ -274,7 +274,7 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
         pwnagotchi.reboot()
 
     def _save_recovery_data(self):
-        logging.warning("writing recovery data to %s ..." % RECOVERY_DATA_FILE)
+        logging.warning("writing recovery data to %s ...", RECOVERY_DATA_FILE)
         with open(RECOVERY_DATA_FILE, 'w') as fp:
             data = {
                 'started_at': self._started_at,
@@ -289,7 +289,7 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
         try:
             with open(RECOVERY_DATA_FILE, 'rt') as fp:
                 data = json.load(fp)
-                logging.info("found recovery data: %s" % data)
+                logging.info("found recovery data: %s", data)
                 self._started_at = data['started_at']
                 self._epoch.epoch = data['epoch']
                 self._handshakes = data['handshakes']
@@ -297,7 +297,7 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
                 self._last_pwnd = data['last_pwnd']
 
                 if delete:
-                    logging.info("deleting %s" % RECOVERY_DATA_FILE)
+                    logging.info("deleting %s", RECOVERY_DATA_FILE)
                     os.unlink(RECOVERY_DATA_FILE)
         except:
             if not no_exceptions:
@@ -334,7 +334,7 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
                         new_shakes += 1
                         ap_and_station = self._find_ap_sta_in(sta_mac, ap_mac, s)
                         if ap_and_station is None:
-                            logging.warning("!!! captured new handshake: %s !!!" % key)
+                            logging.warning("!!! captured new handshake: %s !!!", key)
                             self._last_pwnd = ap_mac
                             plugins.on('handshake', self, filename, ap_mac, sta_mac)
                         else:
@@ -342,15 +342,15 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
                             self._last_pwnd = ap['hostname'] if ap['hostname'] != '' and ap[
                                 'hostname'] != '<hidden>' else ap_mac
                             logging.warning(
-                                "!!! captured new handshake on channel %d, %d dBm: %s (%s) -> %s [%s (%s)] !!!" % (
+                                "!!! captured new handshake on channel %d, %d dBm: %s (%s) -> %s [%s (%s)] !!!",
                                     ap['channel'],
                                     ap['rssi'],
                                     sta['mac'], sta['vendor'],
-                                    ap['hostname'], ap['mac'], ap['vendor']))
+                                    ap['hostname'], ap['mac'], ap['vendor'])
                             plugins.on('handshake', self, filename, ap, sta)
 
             except Exception as e:
-                logging.error("error: %s" % e)
+                logging.error("error: %s", e)
 
             finally:
                 self._update_handshakes(new_shakes)
@@ -392,15 +392,15 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
 
     def associate(self, ap, throttle=0):
         if self.is_stale():
-            logging.debug("recon is stale, skipping assoc(%s)" % ap['mac'])
+            logging.debug("recon is stale, skipping assoc(%s)", ap['mac'])
             return
 
         if self._config['personality']['associate'] and self._should_interact(ap['mac']):
             self._view.on_assoc(ap)
 
             try:
-                logging.info("sending association frame to %s (%s %s) on channel %d [%d clients], %d dBm..." % ( \
-                    ap['hostname'], ap['mac'], ap['vendor'], ap['channel'], len(ap['clients']), ap['rssi']))
+                logging.info("sending association frame to %s (%s %s) on channel %d [%d clients], %d dBm...",
+                    ap['hostname'], ap['mac'], ap['vendor'], ap['channel'], len(ap['clients']), ap['rssi'])
                 self.run('wifi.assoc %s' % ap['mac'])
                 self._epoch.track(assoc=True)
             except Exception as e:
@@ -413,15 +413,15 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
 
     def deauth(self, ap, sta, throttle=0):
         if self.is_stale():
-            logging.debug("recon is stale, skipping deauth(%s)" % sta['mac'])
+            logging.debug("recon is stale, skipping deauth(%s)", sta['mac'])
             return
 
         if self._config['personality']['deauth'] and self._should_interact(sta['mac']):
             self._view.on_deauth(sta)
 
             try:
-                logging.info("deauthing %s (%s) from %s (%s %s) on channel %d, %d dBm ..." % (
-                    sta['mac'], sta['vendor'], ap['hostname'], ap['mac'], ap['vendor'], ap['channel'], ap['rssi']))
+                logging.info("deauthing %s (%s) from %s (%s %s) on channel %d, %d dBm ...",
+                    sta['mac'], sta['vendor'], ap['hostname'], ap['mac'], ap['vendor'], ap['channel'], ap['rssi'])
                 self.run('wifi.deauth %s' % sta['mac'])
                 self._epoch.track(deauth=True)
             except Exception as e:
@@ -434,7 +434,7 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
 
     def set_channel(self, channel, verbose=True):
         if self.is_stale():
-            logging.debug("recon is stale, skipping set_channel(%d)" % channel)
+            logging.debug("recon is stale, skipping set_channel(%d)", channel)
             return
 
         # if in the previous loop no client stations has been deauthenticated
@@ -450,12 +450,12 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
         if channel != self._current_channel:
             if self._current_channel != 0 and wait > 0:
                 if verbose:
-                    logging.info("waiting for %ds on channel %d ..." % (wait, self._current_channel))
+                    logging.info("waiting for %ds on channel %d ...", wait, self._current_channel)
                 else:
-                    logging.debug("waiting for %ds on channel %d ..." % (wait, self._current_channel))
+                    logging.debug("waiting for %ds on channel %d ...", wait, self._current_channel)
                 self.wait_for(wait)
             if verbose and self._epoch.any_activity:
-                logging.info("CHANNEL %d" % channel)
+                logging.info("CHANNEL %d", channel)
             try:
                 self.run('wifi.recon.channel %d' % channel)
                 self._current_channel = channel
@@ -465,4 +465,4 @@ class Agent(Client, Automata, AsyncAdvertiser, AsyncTrainer):
                 plugins.on('channel_hop', self, channel)
 
             except Exception as e:
-                logging.error("error: %s" % e)
+                logging.error("error: %s", e)