diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,8 +1,19 @@
 * Hackage: <http://hackage.haskell.org/package/crackNum>
 * GitHub:  <http://github.com/LeventErkok/crackNum/>
 
-* Latest Hackage released version: 3.18, 2026-08-13
+* Latest Hackage released version: 3.19, 2026-08-13
 
+### Version 3.19, 2026-08-13
+
+  * Fix decoding in the Tcl/Tk GUI: hex and binary input was silently converted
+    to decimal before being handed to `crackNum`, so entering `0xdeadbeef` encoded
+    the value 3735928559 instead of decoding the bit-pattern. Verilog (`N'h`) input
+    was unaffected.
+
+  * Drop the lane count from both GUIs. The number of lanes is inferred from
+    Verilog (`N'h`) input, and everything else is a single lane, so there was
+    nothing useful for the interface to set.
+
 ### Version 3.18, 2026-08-13
 
   * Add a Tcl/Tk GUI (`GUI/tclGUI/crackNum.tcl`) that works on Linux and macOS.
@@ -13,10 +24,6 @@
     with the binary: `cabal install crackNum` is enough for `crackNum --gui` to
     work on Linux, with no PATH setup. To run a different copy of the script,
     set `CRACKNUM_TCL`, or put it on your PATH as `crackNum.tcl`.
-
-  * Both GUIs now expose the number of lanes (`-l`), so multi-lane decoding is
-    reachable from the graphical interface, and `--gui -l4 ...` is honored
-    rather than silently dropped.
 
   * Both front-ends now live under `GUI/`: the macOS app moved from `gui/` to
     `GUI/swiftGUI/`, and the Tcl/Tk script to `GUI/tclGUI/`.
diff --git a/GUI/tclGUI/crackNum.tcl b/GUI/tclGUI/crackNum.tcl
--- a/GUI/tclGUI/crackNum.tcl
+++ b/GUI/tclGUI/crackNum.tcl
@@ -7,9 +7,8 @@
 # ---------------------------------------------------------------------------
 
 proc locate {name} {
-    set path [split [expr {
-        [info exists ::env(PATH)] ? $::env(PATH) : "/usr/bin:/bin"
-    }] :]
+    if {[info exists ::env(PATH)]} { set raw $::env(PATH) } else { set raw "/usr/bin:/bin" }
+    set path [split $raw :]
     foreach dir $path {
         set candidate [file join $dir $name]
         if {[file executable $candidate]} { return $candidate }
@@ -69,7 +68,6 @@
 set state(selection) ""   ;# selected format id
 set state(value)     ""
 set state(rounding)  "RNE"
-set state(lanes)     1
 set state(bitWidth)  64
 set state(expWidth)  11
 set state(fontSize)  11
@@ -158,19 +156,20 @@
 
     set flag $flagResult
     set rm   "-r$state(rounding)"
-    set val  [expr {$state(value) eq "" ? "0" : $state(value)}]
 
+    # NB: do NOT use [expr] to default this. expr parses its operands as numbers,
+    # so "0xdeadbeef" would arrive as 3735928559 and crackNum would encode the
+    # decimal instead of decoding the bit-pattern.
+    set val $state(value)
+    if {$val eq ""} { set val 0 }
+
     # Pass SBV_Z3 so crackNum finds z3 even when PATH is minimal.
-    set savedZ3 [expr {[info exists ::env(SBV_Z3)] ? $::env(SBV_Z3) : ""}]
+    if {[info exists ::env(SBV_Z3)]} { set savedZ3 $::env(SBV_Z3) } else { set savedZ3 "" }
     set ::env(SBV_Z3) $Z3
 
-    set cmd [list $CRACKNUM $flag $rm]
-    # Only pass -l when it's actually multi-lane: giving -l1 explicitly would
-    # suppress crackNum's lane inference for Verilog (N'h) input.
-    if {[string is integer -strict $state(lanes)] && $state(lanes) > 1} {
-        lappend cmd -l$state(lanes)
-    }
-    lappend cmd -- $val
+    # We never pass -l: crackNum infers the lane count from Verilog (N'h) input,
+    # and everything else is a single lane.
+    set cmd [list $CRACKNUM $flag $rm -- $val]
 
     # 2>@1 folds stderr into the captured result, so errors show up in the pane.
     set rc [catch {exec {*}$cmd 2>@1} output]
@@ -384,21 +383,6 @@
     crack
 }
 
-# Lanes (decoding only; crackNum rejects -l when encoding)
-frame .main.side.ln
-pack .main.side.ln -fill x -pady {6 0}
-label .main.side.ln.l -text "Lanes:"
-pack  .main.side.ln.l -side left
-entry .main.side.ln.e -textvariable state(lanes) -width 6 -justify right \
-    -font {Courier 11}
-pack  .main.side.ln.e -side right
-bind  .main.side.ln.e <Return> crack
-
-label .main.side.ln2 \
-    -text "(lanes apply to decoding only)" \
-    -font {TkDefaultFont 8} -foreground gray -wraplength 200 -justify left
-pack .main.side.ln2 -fill x
-
 # Custom parameters
 labelframe .main.side.custom -text "Custom parameters" -padx 4 -pady 4
 pack .main.side.custom -fill x -pady {8 0}
@@ -492,9 +476,6 @@
         } elseif {[string match "-r*" $a]} {
             set rm [string toupper [string range $a 2 end]]
             if {$rm in {RNE RNA RTP RTN RTZ}} { set state(rounding) $rm }
-        } elseif {[string match "-l*" $a]} {
-            set v [string range $a 2 end]
-            if {[string is integer -strict $v] && $v > 0} { set state(lanes) $v }
         } elseif {![string match "-*" $a]} {
             lappend values $a
         }
diff --git a/crackNum.cabal b/crackNum.cabal
--- a/crackNum.cabal
+++ b/crackNum.cabal
@@ -1,6 +1,6 @@
 Cabal-version      : 2.2
 Name               : crackNum
-Version            : 3.18
+Version            : 3.19
 Synopsis           : Crack various integer and floating-point data formats
 Description        : Crack IEEE-754 float formats and arbitrary sized words and integers, showing the layout.
                      .
