diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 8576f08c97..f033f6cf84 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -8,7 +8,7 @@
 ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
 ;;; Copyright © 2016, 2017, 2020 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2016 Pjotr Prins <pjotr.guix@thebird.nl>
-;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016, 2017, 2021 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Peter Feigl <peter.feigl@nexoid.at>
 ;;; Copyright © 2016 John J. Foerch <jjfoerch@earthlink.net>
@@ -130,6 +130,7 @@
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages popt)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-crypto)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
@@ -4752,6 +4753,266 @@ setup, maintenance, supervision, or any long-running processes.")
     (home-page "https://github.com/leahneukirchen/nq")
     (license license:public-domain)))
 
+(define-public python-qmk-dotty-dict
+  (package
+    (name "python-qmk-dotty-dict")
+    (version "1.3.0.post1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "qmk_dotty_dict" version))
+        (sha256
+          (base32 "18kyzk9a00xbxjsph2a9p03zx05f9dw993n66mlamgv06qwiwq9v"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'disable-broken-test
+           (lambda _ (delete-file "tests/test_dotty_cache.py"))))))
+    (native-inputs
+     `(("python-setuptools-scm" ,python-setuptools-scm)
+       ("python-pytest" ,python-pytest)))
+    (home-page "https://github.com/pawelzny/dotty_dict")
+    (synopsis "Dictionary wrapper for quick access to deeply nested keys.")
+    (description "Dictionary wrapper for quick access to deeply nested keys.")
+    (license license:expat)))
+
+(define-public python-hjson
+  (package
+    (name "python-hjson")
+    (version "3.0.2")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (pypi-uri "hjson" version))
+        (sha256
+          (base32 "1mgwmim5k3pnlcxr63cz110jr28r78zrbkkfa6j9x0z501rgsf18"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:tests? #false)) ; txt file is missing
+    (home-page "http://github.com/hjson/hjson-py")
+    (synopsis "Hjson, a user interface for JSON.")
+    (description "Hjson, a user interface for JSON.")
+    (license license:expat)))
+
+(define-public python-spinners
+  (package
+    (name "python-spinners")
+    (version "0.0.24")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "spinners" version))
+       (sha256
+        (base32 "0zz2z6dpdjdq5z8m8w8dfi8by0ih1zrdq0caxm1anwhxg2saxdhy"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'relax-requirement-on-tox
+           (lambda _
+             (substitute* "requirements-dev.txt"
+               (("tox==2.8.2") "tox")
+               (("pylint.*") "")
+               (("coverage.*") "coverage\n")))))))
+    (native-inputs
+     `(("python-coverage" ,python-coverage)
+       ("python-tox" ,python-tox)
+       ("python-nose" ,python-nose)))
+    (home-page "https://github.com/manrajgrover/py-spinners")
+    (synopsis "Spinners for terminals")
+    (description "Spinners for terminals")
+    (license license:expat)))
+
+(define-public python-log-symbols
+  (package
+    (name "python-log-symbols")
+    (version "0.0.14")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "log-symbols" version))
+       (sha256
+        (base32 "0mh5d0igw33libfmbsr1ri1p1y644p36nwaa2w6kzrd8w5pvq2yg"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'relax-requirement-on-tox
+           (lambda _
+             (substitute* "requirements-dev.txt"
+               (("tox==2.8.2") "tox")
+               (("pylint.*") "")
+               (("coverage.*") "coverage\n")))))))
+    (propagated-inputs
+     `(("python-colorama" ,python-colorama)))
+    (native-inputs
+     `(("python-coverage" ,python-coverage)
+       ("python-tox" ,python-tox)
+       ("python-nose" ,python-nose)))
+    (home-page "https://github.com/manrajgrover/py-log-symbols")
+    (synopsis "Colored symbols for various log levels for Python")
+    (description "Colored symbols for various log levels for Python")
+    (license license:expat)))
+
+(define-public python-halo
+  (package
+    (name "python-halo")
+    (version "0.0.31")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "halo" version))
+       (sha256
+        (base32 "1mn97h370ggbc9vi6x8r6akd5q8i512y6kid2nvm67g93r9a6rvv"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'relax-requirement-on-tox
+           (lambda _
+             (substitute* "requirements-dev.txt"
+               (("tox.*") "tox\n")
+               (("pylint.*") "pylint\n")
+               (("coverage.*") "coverage\n")))))))
+    (propagated-inputs
+     `(#;("python-backports.shutil-get-terminal-size"
+       ,python-backports.shutil-get-terminal-size)
+       ("python-colorama" ,python-colorama)
+       ("python-log-symbols" ,python-log-symbols)
+       ("python-six" ,python-six)
+       ("python-spinners" ,python-spinners)
+       ("python-termcolor" ,python-termcolor)))
+    (native-inputs
+     `(("python-twine" ,python-twine)
+       ("python-coverage" ,python-coverage)
+       ("python-tox" ,python-tox)
+       ("python-pylint" ,python-pylint)
+       ("python-nose" ,python-nose)))
+    (home-page "https://github.com/manrajgrover/halo")
+    (synopsis "Beautiful terminal spinners in Python")
+    (description "Beautiful terminal spinners in Python")
+    (license license:expat)))
+
+(define-public python-milc
+  (package
+    (name "python-milc")
+    (version "1.6.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "milc" version))
+       (sha256
+        (base32 "0bbqgyzzcq7hpp8xypd188ga49zf9kv7qljbd29ms9kvl45d9j5j"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     `(("python-appdirs" ,python-appdirs)
+       ("python-argcomplete" ,python-argcomplete)
+       ("python-colorama" ,python-colorama)
+       ("python-halo" ,python-halo)
+       ("python-spinners" ,python-spinners)))
+    (home-page "https://milc.clueboard.co/")
+    (synopsis "Opinionated Batteries-Included Python 3 CLI Framework.")
+    (description "Opinionated Batteries-Included Python 3 CLI Framework.")
+    (license license:expat)))
+
+(define-public python-hid
+  (package
+    (name "python-hid")
+    (version "1.0.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "hid" version))
+       (sha256
+        (base32 "1h9zi0kyicy3na1azfsgb57ywxa8p62bq146pb44ncvsyf1066zn"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'foo
+           (lambda* (#:key inputs #:allow-other-keys)
+             (substitute* "hid/__init__.py"
+               (("libhidapi-hidraw.so.0")
+                (string-append (assoc-ref inputs "hidapi") "/lib/libhidapi-hidraw.so.0"))))))))
+    (inputs
+     `(("hidapi" ,hidapi)))
+    (native-inputs
+     `(("python-nose" ,python-nose)))
+    (home-page "https://github.com/apmorton/pyhidapi")
+    (synopsis "ctypes bindings for hidapi")
+    (description "ctypes bindings for hidapi")
+    (license license:expat)))
+
+(define-public python-qmk
+  (package
+    (name "python-qmk")
+    (version "1.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "qmk" version))
+       (sha256
+        (base32 "1jpr22k539yc1rhn69igvh0s7hrd40vkkgmrn0vwqj257k3ywqns"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'build
+           (lambda _
+             (invoke "python3" "-m" "pip" "install" "."))))))
+    (native-inputs
+     `(("python-build" ,python-pypa-build)
+       ("python-setuptools" ,python-setuptools)))
+    (propagated-inputs
+     `(("python-hid" ,python-hid)
+       ("python-hjson" ,python-hjson)
+       ("python-jsonschema" ,python-jsonschema)
+       ("python-milc" ,python-milc)
+       ("python-pygments" ,python-pygments)
+       ("python-pyusb" ,python-pyusb)
+       ("python-qmk-dotty-dict" ,python-qmk-dotty-dict)
+       ("python-setuptools" ,python-setuptools)))
+    (home-page "")
+    (synopsis "A program to help users work with QMK Firmware.")
+    (description "A program to help users work with QMK Firmware.")
+    (license license:expat)))
+
+(define-public qmk-toolbox
+  (package
+    (name "qmk-toolbox")
+    (version "0.1.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/qmk/qmk_toolbox")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1ypsa0fzb5svyyjnsg67dwy0k1didfmspiwk89y8j9c8w71n6dis"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f
+       #:make-flags '("-C" "linux")
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((bin (string-append (assoc-ref outputs "out") "/bin")))
+               (install-file "linux/qmk_toolbox" bin)))))))
+    (inputs
+     `(("gtk+" ,gtk+)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "https://github.com/qmk/qmk_toolbox")
+    (synopsis "Toolbox for QMK keyboard firmware")
+    (description "This is a collection of flashing tools for QMK keyboard
+firmwar.  It supports auto-detection and auto-flashing of firmware to
+keyboards.")
+    (license license:expat)))
+
 (define-public lsofgraph
   (let ((commit "1d414bdc727c00a8c6cbfffc3c43128c60d6f0de")
         (revision "1"))