diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,7 +1,23 @@
 * Hackage: <http://hackage.haskell.org/package/crackNum>
 * GitHub:  <http://github.com/LeventErkok/crackNum/>
 
-* Latest Hackage released version: 3.26, 2026-08-19
+* Latest Hackage released version: 3.27, 2026-08-20
+
+### Version 3.27, 2026-08-20
+
+  * There is now a Linux binary distribution, alongside the macOS one: see the
+    Releases page. It ships the `crackNum` executable, a copy of `z3` (which crackNum
+    shells out to for every operation), the Tcl/Tk GUI script, and a README. Both
+    binaries are statically linked, so there is no libc or distribution requirement:
+    they run as-is on any x86_64 Linux, old or new. The GUI additionally needs `wish`,
+    which does have to come from your system.
+
+  * `--gui` now also looks for `crackNum.tcl` next to the crackNum executable itself,
+    after `$CRACKNUM_TCL` and the PATH but before the cabal data-directory. A binary
+    distribution carries the script alongside the binary, where the data-directory
+    baked in at build time names a path from the build machine that does not exist
+    on the user's; the GUI now works in such a bundle however it is unpacked or
+    copied, rather than only when the script was also placed on the PATH.
 
 ### Version 3.26, 2026-08-19
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -13,13 +13,47 @@
 
 ### Installation
 
+#### Prebuilt binaries (nothing to build, no Haskell toolchain)
+
+The easiest way to get crackNum is from the
+[Releases page](https://github.com/LeventErkok/crackNum/releases). Each bundle is
+self-contained: the `crackNum` executable, a copy of `z3`, the graphical interface,
+a LICENSE, and a README with the platform-specific details.
+
+| Platform | Asset | Notes |
+| --- | --- | --- |
+| Linux (x86_64) | `crackNum-<version>-linux-x86_64.tar.gz` | Statically linked, so there is no glibc or distribution requirement: it runs as-is on any x86_64 Linux, old or new. |
+| macOS (Apple Silicon) | `crackNum-<version>-macos-arm64.tar.gz` | Includes `CrackNum.app`. Ad-hoc signed rather than notarized, so clear the quarantine flag as the bundled README explains. |
+
+Unpack it and you can run straight out of the directory:
+
 ```
+$ tar xzf crackNum-3.27-linux-x86_64.tar.gz
+$ cd crackNum-3.27-linux-x86_64
+$ ./crackNum -fsp 3.5
+```
+
+To use it from anywhere, put the files on your `PATH`. `z3` has to be there too,
+since crackNum shells out to it for every operation:
+
+```
+$ mkdir -p ~/bin && cp crackNum z3 ~/bin/       # on Linux, add crackNum.tcl for the GUI
+$ export PATH=$HOME/bin:$PATH                   # add to your shell rc to make it stick
+```
+
+Each bundle's own README covers the platform details — installing `CrackNum.app` on
+macOS, and `wish` for the Tcl/Tk GUI on Linux.
+
+#### From Hackage
+
+```
 $ cabal install crackNum
 ```
 
 `crackNum` uses [SBV](http://hackage.haskell.org/package/sbv) and delegates the
-actual floating-point reasoning to an SMT solver, so you also need
-[z3](https://github.com/Z3Prover/z3) on your `PATH`.
+actual floating-point reasoning to an SMT solver, so installed this way you also
+need [z3](https://github.com/Z3Prover/z3) on your `PATH`. (The prebuilt bundles
+above carry their own copy, so there is nothing extra to install.)
 
 ### Supported formats
 
@@ -314,9 +348,13 @@
 
 ![crackNum GUI](https://raw.githubusercontent.com/LeventErkok/crackNum/master/crackNumGUI.png)
 
+If you installed from a [release bundle](#prebuilt-binaries-nothing-to-build-no-haskell-toolchain)
+the GUI is already in it, and there is nothing to build on either platform. The rest
+of this section is for installing from Hackage or from a source checkout.
+
 **macOS** — a native Swift/AppKit app (`GUI/swiftGUI/`). It is not part of the
-Hackage package, so you need a clone of the repository to build it. You also
-need the Swift compiler that comes with the Xcode Command Line Tools
+Hackage package, so building it yourself needs a clone of the repository and the
+Swift compiler that comes with the Xcode Command Line Tools
 (`xcode-select --install`):
 
 ```
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.26
+Version            : 3.27
 Synopsis           : Crack various integer and floating-point data formats
 Description        : Crack IEEE-754 and other float formats and arbitrary sized words and integers, showing the layout.
                      .
diff --git a/src/CrackNum/Main.hs b/src/CrackNum/Main.hs
--- a/src/CrackNum/Main.hs
+++ b/src/CrackNum/Main.hs
@@ -30,11 +30,12 @@
 import qualified Control.Exception as C
 
 import Text.Read             (readMaybe)
-import System.Environment    (getArgs, getProgName, withArgs, lookupEnv)
+import System.Environment    (getArgs, getProgName, withArgs, lookupEnv, getExecutablePath)
 import System.Console.GetOpt (ArgOrder(Permute), getOpt, ArgDescr(..), OptDescr(..), usageInfo)
 import System.Exit           (exitFailure, ExitCode(..))
 import System.IO             (hPutStr, stderr)
 import System.Directory      (findExecutable, doesFileExist)
+import System.FilePath       (takeDirectory, (</>))
 import System.Process        (rawSystem)
 import qualified System.Info as Info
 
@@ -336,11 +337,14 @@
 tclRelPath = "GUI/tclGUI/crackNum.tcl"
 
 -- | Locate the Tcl/Tk GUI script. Normally it is installed together with the
--- binary, so this just works; we look in three places, in order:
+-- binary, so this just works; we look in four places, in order:
 --
 --   1. $CRACKNUM_TCL, if set: an explicit override, mirroring $CRACKNUM_GUI on macOS.
 --   2. The PATH, so a source checkout can shadow the installed copy while hacking.
---   3. The copy cabal installed in our data-directory.
+--   3. Next to the executable itself. This is what makes a relocatable binary
+--      distribution work: in one the data-directory below was baked in on the
+--      build machine, and names a path that does not exist on the user's.
+--   4. The copy cabal installed in our data-directory.
 locateTcl :: IO FilePath
 locateTcl = do mbEnv <- lookupEnv "CRACKNUM_TCL"
                case mbEnv of
@@ -351,20 +355,28 @@
                                            , ""
                                            , "    " ++ p
                                            ]
-                 Nothing -> do mbPath <- findExecutable "crackNum.tcl"
+                 Nothing -> do beside    <- besideExe
+                               installed <- getDataFileName tclRelPath
+                               mbPath    <- findExecutable "crackNum.tcl"
                                case mbPath of
                                  Just p  -> pure p
-                                 Nothing -> do installed <- getDataFileName tclRelPath
-                                               ok        <- doesFileExist installed
-                                               if ok
-                                                  then pure installed
-                                                  else die (noTcl installed)
-  where noTcl installed =
+                                 Nothing -> search [beside, installed] (noTcl beside installed)
+  where -- NB. getExecutablePath resolves symlinks, so this finds the script even
+        -- when the binary is reached through a link from elsewhere on the PATH.
+        besideExe = do exe <- getExecutablePath
+                       pure (takeDirectory exe </> "crackNum.tcl")
+
+        search []     onFail = die onFail
+        search (c:cs) onFail = do ok <- doesFileExist c
+                                  if ok then pure c else search cs onFail
+
+        noTcl beside installed =
              [ "Cannot find the CrackNum GUI script (crackNum.tcl)."
              , ""
              , "Looked in:"
              , "  $CRACKNUM_TCL                 (not set)"
              , "  crackNum.tcl on your PATH     (not found)"
+             , "  " ++ beside
              , "  " ++ installed
              , ""
              , "This script is normally installed along with crackNum, so seeing this"
@@ -385,8 +397,8 @@
 -- them. The GUI itself calls back into this executable to do the actual cracking.
 --
 -- On macOS the GUI is a Swift/AppKit app; CRACKNUM_GUI can override the .app bundle
--- location. On Linux the GUI is a Tcl/Tk script; both 'wish' and 'crackNum.tcl' are
--- located via PATH.
+-- location. On Linux the GUI is a Tcl/Tk script; 'wish' is located via PATH, and
+-- 'crackNum.tcl' via 'locateTcl'.
 launchGUI :: [String] -> IO ()
 launchGUI vals
   | Info.os == "darwin"
