diff --git a/gnu/packages/radio.scm b/gnu/packages/radio.scm
index f34511b352..f8b10e7061 100644
--- a/gnu/packages/radio.scm
+++ b/gnu/packages/radio.scm
@@ -14,6 +14,7 @@
 ;;; Copyright © 2022 Ryan Tolboom <ryan@using.tech>
 ;;; Copyright © 2023 Sharlatan Hellseher <sharlatanus@gmail.com>
 ;;; Copyright © 2023 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2024 Leo Famulari <leo@famulari.name>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1890,6 +1891,146 @@ (define-public dump1090
     (home-page "https://github.com/flightaware/dump1090")
     (license license:gpl2+)))
 
+(define-public viz1090
+  (let ((commit "ec055e1220f897b393f033a4cee02771c69dadc3")
+        (revision "0"))
+    (package
+      (name "viz1090")
+      ;; There are no "releases" of this program yet.
+      (version (git-version "0.0.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                       (url "https://www.github.com/nmatsuda/viz1090")
+                       (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0gksr6dsaa4rffwrfcbhhnclmj5yabrv0dc8mb8q7hmbv8znd232"))))
+      (build-system gnu-build-system)
+      (arguments
+        (list
+          #:tests? #f ; No test suite
+          #:make-flags
+          #~(list (string-append "CXXFLAGS=-I"
+                                 #$(this-package-input "sdl-union")
+                                 "/include/SDL2")
+                  (string-append "CC=" #+(cc-for-target)))
+          #:phases
+          #~(modify-phases %standard-phases
+             (delete 'configure) ; No ./configure script
+             (add-before 'build 'build-map-data
+               (lambda _
+                 (let* ((share (string-append #$output "/share/viz1090")))
+                   ;; Disable the build-time maps downloader and adjust the
+                   ;; decompression procedure accordingly.
+                   (substitute* "getmap.sh"
+                     (("wget") "#wget")
+                     (("unzip.*")
+                      (string-append
+                        "unzip " #$(this-package-native-input "political-maps") " && \n"
+                        "unzip " #$(this-package-native-input "population-maps") " && \n"
+                        "unzip " #$(this-package-native-input "airports-map") " && \n"
+                        "unzip " #$(this-package-native-input "arcgis-data") " && \n")))
+                   ;; Adjust the run-time paths of the map data
+                   (substitute* "Map.cpp"
+                     (("mapdata.bin")
+                      (string-append share "/mapdata.bin"))
+                     (("airportdata.bin")
+                      (string-append share "/airportdata.bin"))
+                     (("\\\(\"mapnames")
+                      (string-append "\(\"" share "/mapnames"))
+                     (("\\\(\"airportnames")
+                      (string-append "\(\"" share "/airportnames")))
+                   (invoke "./getmap.sh"))))
+             (add-before 'build 'patch-font-path
+               (lambda _
+                 (substitute* "View.cpp"
+                   (("font\\/")
+                    (string-append #$output "/font/")))))
+             (replace 'install ; No install target
+               (lambda* (#:key outputs #:allow-other-keys)
+                 (let* ((bin (string-append #$output "/bin"))
+                        (share (string-append #$output "/share/viz1090"))
+                        (doc (string-append share "-" #$(package-version this-package) "/doc"))
+                        (fonts (string-append #$output "/font")))
+                   (install-file "viz1090" bin)
+                   (install-file "mapdata.bin" share)
+                   (install-file "airportdata.bin" share)
+                   (install-file "mapnames" share)
+                   (install-file "airportnames" share)
+                   (install-file "README.md" doc)
+                   (mkdir fonts)
+                   (copy-recursively "font" fonts)))))))
+      (native-inputs
+       `(("political-maps"
+          ;; version 5.1.1 of this data
+          ;; The upstream site does not version the URL for the most recent
+          ;; release, so we store them on archive.org to create a stable URL.
+          ;; See 'getmap.sh' in the viz1090 source distribution.
+          ,(origin
+             (method url-fetch)
+             (uri
+               "https://archive.org/download/ne_10m_admin_1_states_provinces/ne_10m_admin_1_states_provinces.zip")
+               ;"https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_1_states_provinces.zip")
+             (sha256
+              (base32
+               "019bp9ccna1xxrk3c1af6k6pjcb7jvf0l8a6jj7ha8vk6ck9gigg"))))
+         ("population-maps"
+          ;; version 5.1.2 of this data
+          ;; The upstream site does not version the URL for the most recent
+          ;; release, so we store them on archive.org to create a stable URL.
+          ;; See 'getmap.sh' in the viz1090 source distribution.
+          ,(origin
+             (method url-fetch)
+             (uri
+               "https://archive.org/download/ne_10m_populated_places/ne_10m_populated_places.zip")
+               ;"https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip")
+             (sha256
+              (base32
+               "0yqxqkydzlwylh2j6fidqc57sdd4h2wrk8qd87h069ixy239256d"))))
+         ("airports-map"
+          ;; version 5.0.0 of this data
+          ;; The upstream site does not version the URL for the most recent
+          ;; release, so we store them on archive.org to create a stable URL.
+          ;; See 'getmap.sh' in the viz1090 source distribution.
+          ,(origin
+             (method url-fetch)
+             (uri
+               "https://archive.org/download/ne_10m_airports/ne_10m_airports.zip")
+               ;"https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_airports.zip")
+             (sha256
+              (base32
+               "1cvxgp141i7jy9fd49xxfz3g2k07szh745zd3l9lq7kynrf377m2"))))
+         ("arcgis-data"
+          ;; See 'getmap.sh' in the viz1090 source distribution.
+          ,(origin
+             (method url-fetch)
+             (uri
+               "https://opendata.arcgis.com/datasets/4d8fa46181aa470d809776c57a8ab1f6_0.zip")
+             (sha256
+              (base32
+               "1aqa7dc3xp1mcz7zm3v5m2qjdkzgyzgzlif4cvqsba2l2flc3v74"))))
+         ;; For building the map data
+         ("unzip" ,unzip)
+         ("python" ,python)
+         ("python-numpy" ,python-numpy)
+         ("python-tqdm" ,python-tqdm)))
+      (inputs
+        (list gdal
+              rtl-sdr
+              (sdl-union (list sdl2 sdl2-ttf sdl2-gfx))
+              python-fiona
+              python-shapely
+              python-requests))
+      (synopsis "Visualizer for dump1090 ADS-B data")
+      (description "Viz1090 provides a visual map-based display of
+@acronym{ADS-B, Automatic Dependent Surveillance–Broadcast} data that is
+broadcast from airborne aircraft.  It reads data provided by @code{dump1090} as
+described in @file{README.md} to show nearby aircraft on a map.")
+      (home-page "https://github.com/nmatsuda/viz1090")
+      (license license:bsd-2))))
+
 (define-public rtl-433
   (package
     (name "rtl-433")
