diff --git a/config.example.toml b/config.example.toml
index 765dd9d6bae7c6a09355fc3b40da2b758f4fb8b6..d70a741d2c38393e9b60646b6c7a6382b0117a4b 100644
--- a/config.example.toml
+++ b/config.example.toml
@@ -3,6 +3,7 @@ ssid = 0
 icon = 0
 frequency = 430_500_000 # The standard CATS frequency
 enable_tx = true # If false, will be an RX-only I-Gate
+debug = false # If true, print additional packet debug information
 
 [felinet]
 address = "https://felinet.cats.radio"
diff --git a/src/config.rs b/src/config.rs
index e6723ac183c0190fdfb9747e3fabcaf745e0daa9..96f8f0d63dfd67a95f45265566aef7f8fceb8fae 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -47,6 +47,8 @@ pub struct Config {
     pub frequency: u32,
     #[serde(default = "default_enable_tx")]
     pub enable_tx: bool,
+    #[serde(default)]
+    pub debug: bool,
     pub felinet: Option<FelinetConfig>,
     pub beacon: BeaconConfig,
 }
diff --git a/src/gate.rs b/src/gate.rs
index 7c000728c6690ff0fc3b94463e0e6aeeb4502592..bbf71e12f97a4650accd6890cb7aaef146f8c13d 100644
--- a/src/gate.rs
+++ b/src/gate.rs
@@ -184,6 +184,7 @@ pub async fn packet_handler(
     packet_send: mpsc::Sender<Vec<u8>>,
     mut packet_receive: mpsc::Receiver<(Vec<u8>, f64)>,
     uuid: Uuid,
+    debug: bool,
 ) -> anyhow::Result<()> {
     loop {
         let (packet, rssi) = packet_receive
@@ -192,7 +193,7 @@ pub async fn packet_handler(
             .context("Packet receive channel died")?;
 
         let mut buf = [0; MAX_PACKET_LEN];
-        if let Ok(mut packet) = attempt_decode(&packet, &mut buf, rssi) {
+        if let Some(mut packet) = attempt_decode(&packet, &mut buf, rssi, debug) {
             let mut buf2 = [0; MAX_PACKET_LEN];
             let mut internet_packet = packet.clone_backing(&mut buf2);
             match append_internet_to_packet_route(&callsign, ssid, rssi, &mut internet_packet) {
diff --git a/src/main.rs b/src/main.rs
index 3253781d387d9459671af5e4deb82674f6ee3dd6..f4b0963bb45b0fb7c0e8313c043bee7681f7c5ad 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -143,6 +143,7 @@ async fn gate_forever(
         let packet_send = packet_send.clone();
         let ssid = config.ssid;
         let callsign = config.callsign.clone();
+        let debug = config.debug;
 
         tokio::task::spawn(async move {
             if let Err(e) = packet_handler(
@@ -152,6 +153,7 @@ async fn gate_forever(
                 packet_send,
                 packet_receive,
                 uuid,
+                debug,
             )
             .await
             {
diff --git a/src/util.rs b/src/util.rs
index eda22addf3d2e080c8e2e792264a869383e76b96..776e44dec568e0625df464be5952be41d6394fa2 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -1,5 +1,4 @@
 use crate::radio::MAX_PACKET_LEN;
-use anyhow::anyhow;
 use colored::{Color, Colorize};
 use ham_cats::{
     identity::Identity,
@@ -126,13 +125,25 @@ pub fn attempt_decode<'a>(
     packet: &[u8],
     buf: &'a mut [u8; MAX_PACKET_LEN],
     rssi: f64,
-) -> anyhow::Result<Packet<'a, MAX_PACKET_LEN>> {
-    let packet: Packet<MAX_PACKET_LEN> =
-        Packet::fully_decode(packet, buf).map_err(|e| anyhow!("Could not decode packet: {e:?}"))?;
+    debug: bool,
+) -> Option<Packet<'a, MAX_PACKET_LEN>> {
+    if debug {
+        eprintln!("Attempt decode with len: {}", packet.len());
+    }
+    let packet: Packet<MAX_PACKET_LEN> = match Packet::fully_decode(packet, buf) {
+        Ok(x) => x,
+        Err(e) => {
+            if debug {
+                eprintln!("Could not decode packet: {e}");
+            }
+
+            return None;
+        }
+    };
 
     print_packet(&packet, Some(rssi));
 
-    Ok(packet)
+    Some(packet)
 }
 
 // i-gating is kind of weird.