about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.guix-channel31
-rw-r--r--README.org2
-rw-r--r--gn/deploy/machines/myserver.scm2
-rw-r--r--gn/deploy/octopus.scm2
-rw-r--r--gn/packages/bioinformatics.scm902
-rw-r--r--gn/packages/bnw.scm1
-rw-r--r--gn/packages/check.scm61
-rw-r--r--gn/packages/cran.scm3
-rw-r--r--gn/packages/crates-io.scm40
-rw-r--r--gn/packages/databases.scm12
-rw-r--r--gn/packages/dlang.scm2
-rw-r--r--gn/packages/edash.scm9
-rw-r--r--gn/packages/emacs-xyz.scm2
-rw-r--r--gn/packages/fpga.scm2
-rw-r--r--gn/packages/genecup.scm33
-rw-r--r--gn/packages/genenetwork.scm281
-rw-r--r--gn/packages/guile.scm256
-rw-r--r--gn/packages/java.scm1
-rw-r--r--gn/packages/javascript.scm556
-rw-r--r--gn/packages/julia.scm47
-rw-r--r--gn/packages/jupyterhub.scm2
-rw-r--r--gn/packages/machine-learning.scm176
-rw-r--r--gn/packages/mouse-longevity.scm87
-rw-r--r--gn/packages/node.scm23
-rw-r--r--gn/packages/ocaml.scm4
-rw-r--r--gn/packages/pangenome.scm2
-rw-r--r--gn/packages/patches/python-unittest2-python3-compat.patch46
-rw-r--r--gn/packages/patches/python-unittest2-remove-argparse.patch11
-rw-r--r--gn/packages/python-web.scm40
-rw-r--r--gn/packages/python.scm81
-rw-r--r--gn/packages/r-shiny.scm47
-rw-r--r--gn/packages/ruby.scm278
-rw-r--r--gn/packages/sambamba.scm2
-rw-r--r--gn/packages/static.scm2
-rw-r--r--gn/packages/statistics.scm133
-rw-r--r--gn/packages/virtualization.scm3
-rw-r--r--gn/packages/web.scm20
-rw-r--r--gn/packages/yaj.scm3
-rw-r--r--gn/past/genenetwork1.scm2
-rw-r--r--gn/services/bnw-container.scm2
-rw-r--r--gn/services/databases.scm33
-rw-r--r--gn/services/discourse.scm5
-rw-r--r--gn/services/genecup-container.scm3
-rw-r--r--gn/services/gitea-container.scm2
-rw-r--r--gn/services/pluto.scm3
45 files changed, 2524 insertions, 731 deletions
diff --git a/.guix-channel b/.guix-channel
index e7e9a9a..2d61e63 100644
--- a/.guix-channel
+++ b/.guix-channel
@@ -3,21 +3,42 @@
  (dependencies
   (channel
    (name guix-past)
-   (url "https://gitlab.inria.fr/guix-hpc/guix-past")
+   (url "https://codeberg.org/guix-science/guix-past")
    (introduction
     (channel-introduction
      (version 0)
-     (commit "0c119db2ea86a389769f4d2b9c6f5c41c027e336")
+     (commit "c3bc94ee752ec545e39c1b8a29f739405767b51c")
      (signer
       "3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5"))))
   (channel
    (name guix)
-   (url "https://git.savannah.gnu.org/git/guix.git")
+   (url "https://codeberg.org/guix/guix")
    (branch "master")
-   (commit "b0b988c41c9e0e591274495a1b2d6f27fcdae15a")
+   (commit "0a4740705090acc4c8a10d4f53afc58c9f62e980")
    (introduction
     (channel-introduction
      (version 0)
      (commit "9edb3f66fd807b096b48283debdcddccfea34bad")
      (signer
-      "BBB0 2DDF 2CEA F6A8 0D1D  E643 A2A0 6DF2 A33A 54FA"))))))
+      "BBB0 2DDF 2CEA F6A8 0D1D  E643 A2A0 6DF2 A33A 54FA"))))
+  (channel
+   (name guix-rust-past-crates)
+   (url "https://codeberg.org/guix/guix-rust-past-crates.git")
+   (branch "trunk")
+   (introduction
+    (channel-introduction
+     (version 0)
+     (commit "b8b7ffbd1cec9f56f93fae4da3a74163bbc9c570")
+     (signer
+      "F4C2 D1DF 3FDE EA63 D1D3 0776 ACC6 6D09 CA52 8292"))))
+  (channel
+   (name guix-forge)
+   (url "https://git.systemreboot.net/guix-forge/")
+   (branch "main")
+   (commit "e43fd9a4d73654d3876e2c698af7da89f3408f89")
+   (introduction
+    (channel-introduction
+     (version 0)
+     (commit "0432e37b20dd678a02efee21adf0b9525a670310")
+     (signer
+      "7F73 0343 F2F0 9F3C 77BF  79D3 2E25 EE8B 6180 2BB3"))))))
diff --git a/README.org b/README.org
index c5936fa..be8db7c 100644
--- a/README.org
+++ b/README.org
@@ -20,7 +20,7 @@ To easily use the packages from this repo, simply add it to your
 #+BEGIN_SRC scheme
   (list (channel
          (name 'gn-bioinformatics)
-         (url "https://git.genenetwork.org/guix-bioinformatics/guix-bioinformatics.git")
+         (url "https://git.genenetwork.org/guix-bioinformatics")
          (branch "master")))
 #+END_SRC
 
diff --git a/gn/deploy/machines/myserver.scm b/gn/deploy/machines/myserver.scm
index 11ffcd1..9a8bedf 100644
--- a/gn/deploy/machines/myserver.scm
+++ b/gn/deploy/machines/myserver.scm
@@ -51,7 +51,7 @@
 
   ;; Add services to the baseline: a DHCP client and
   ;; an SSH server with nginx
-  (services (append (list (service dhcp-client-service-type)
+  (services (append (list (service dhcp-service-type)
                           (service openssh-service-type
                                    (openssh-configuration
                                     ; (authorized-keys
diff --git a/gn/deploy/octopus.scm b/gn/deploy/octopus.scm
index 32a0495..fc631b8 100644
--- a/gn/deploy/octopus.scm
+++ b/gn/deploy/octopus.scm
@@ -154,7 +154,7 @@
                          (run-mfsmetalogger-service? #t)
                          ))
 
-              (service dhcp-client-service-type)
+              (service dhcp-service-type)
               (service openntpd-service-type))
             %base-services))
 
diff --git a/gn/packages/bioinformatics.scm b/gn/packages/bioinformatics.scm
index ed6d4d4..e6ca5db 100644
--- a/gn/packages/bioinformatics.scm
+++ b/gn/packages/bioinformatics.scm
@@ -41,12 +41,12 @@
   #:use-module (gnu packages compression)
   #:use-module (gnu packages cpp)
   #:use-module (gnu packages cran)
-  #:use-module (gnu packages crates-io)
-  #:use-module (gnu packages crates-graphics)
+  #:use-module (past-crates packages crates-io)
   #:use-module (gnu packages curl)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages datastructures)
   #:use-module (gnu packages digest)
+  #:use-module (gnu packages documentation)
   #:use-module (gnu packages elf)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages gcc)
@@ -54,6 +54,7 @@
   #:use-module (gnu packages graph)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages guile)
+  #:use-module (gnu packages haskell-xyz)
   #:use-module (gnu packages image)
   #:use-module (gnu packages imagemagick)
   #:use-module (gnu packages java)
@@ -73,11 +74,13 @@
   #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-science)
   #:use-module (gnu packages python-web)
-  #:use-module ((gnu packages python-xyz) #:hide (python2-six))
+  #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages python-check)
   #:use-module (gnu packages rdf)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages rsync)
   #:use-module (gnu packages ruby)
+  #:use-module (gnu packages ruby-xyz)
   #:use-module (gnu packages rust)
   #:use-module (gnu packages serialization)
   #:use-module (gnu packages shells)
@@ -1601,7 +1604,7 @@ runApp(launch.browser=0, port=4208)~%\n"
 (define-public seqwish
   (package
     (name "seqwish")
-    (version "0.7.9")
+    (version "0.7.11")
     (source (origin
              (method git-fetch)
              (uri (git-reference
@@ -1610,7 +1613,7 @@ runApp(launch.browser=0, port=4208)~%\n"
                    (recursive? #t)))
              (file-name (git-file-name name version))
              (sha256
-              (base32 "0xnv40kjlb610bk67n4xdqz5dfsjhrqld5bxzblji57k6bb4n66x"))
+              (base32 "18wsrvqf0nsfk29v3ggdq2r4q15d4n4sq8v228qq1jsybbjlkgsa"))
              (patches (search-patches "seqwish-paryfor-riscv.diff"
                                       "seqwish-shared-library.diff"))
              (snippet
@@ -1810,14 +1813,14 @@ dictionaries to record a queryable version of the graph.")
 (define-public smoothxg
   (package
     (name "smoothxg")
-    (version "0.7.2")
+    (version "0.8.0")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://github.com/pangenome/smoothxg"
                                  "/releases/download/v" version
                                  "/smoothxg-v" version ".tar.gz"))
              (sha256
-              (base32 "1px8b5aaa23z85i7ximdamk2jj7wk5hb7bpbrgxsvkxc69zlwy38"))
+              (base32 "1gl4dskj81hlma7wsjrwwg77hgzk7dc9iaqqnf2wzrf2f4ll1cdj"))
              (snippet
               #~(begin
                   (use-modules (guix build utils))
@@ -1855,7 +1858,8 @@ dictionaries to record a queryable version of the graph.")
                (with-directory-excursion
                  (string-append "../smoothxg-v" #$version "/deps/abPOA")
                  (substitute* "Makefile"
-                   (("-march=native") ""))
+                   (("-march=native") "")
+                   (("-march=armv8-a\\+simd") ""))
                  (apply invoke "make" "libabpoa" make-flags)))))))
     (inputs
      (list jemalloc
@@ -1897,14 +1901,13 @@ The path-guided stochastic gradient descent based 1D sort implemented in
 (define-public graphaligner
   (package
     (name "graphaligner")
-    (version "1.0.14")
+    (version "1.0.20")
     (source (origin
       (method url-fetch)
-      (uri (string-append "https://github.com/maickrau/GraphAligner/files/"
-                          "7813545/GraphAligner.tar.gz"))
+      (uri "https://github.com/user-attachments/files/17976913/GraphAligner.tar.gz")
       (file-name (string-append name "-" version ".tar.gz"))
       (sha256
-       (base32 "1y4vwp03fl2ck6bnyn0sc97vgvdb8i0yfzjk5mv5gk0bc7a4f0n1"))))
+       (base32 "1gs6jds4lazljb1s7s8f1vp0l4j8jvqy6qhb9sck7x66z8157ndm"))))
     (build-system gnu-build-system)
     (arguments
      (list
@@ -1916,16 +1919,17 @@ The path-guided stochastic gradient descent based 1D sort implemented in
            (delete 'configure) ; no configure phase
            (add-after 'unpack 'patch-source
              (lambda* (#:key inputs #:allow-other-keys)
-               (let ((concurrentqueue (assoc-ref inputs "concurrentqueue")))
-                 (delete-file-recursively "concurrentqueue")
-                 (substitute* "makefile"
-                   (("-Iconcurrentqueue")
-                    (string-append "-I" concurrentqueue "/include/concurrentqueue"))
-                   (("^JEMALLOCFLAGS.*")
-                    "JEMALLOCFLAGS= `pkg-config --libs jemalloc`\n")
-                   ;; No need to build statically.
-                   (("-Wl,-Bstatic") "")
-                   (("-static-libstdc\\+\\+") "")))))
+               (delete-file-recursively "concurrentqueue")
+               (substitute* "makefile"
+                 (("-Iconcurrentqueue")
+                  (string-append "-I" (search-input-directory inputs "/include/concurrentqueue")))
+                 (("^JEMALLOCFLAGS.*")
+                  "JEMALLOCFLAGS= `pkg-config --libs jemalloc`\n")
+                 (("`pkg-config --cflags zlib`/bamtools")
+                  (string-append "-I " (search-input-directory inputs "include/bamtools")))
+                 ;; No need to build statically.
+                 (("-Wl,-Bstatic") "")
+                 (("-static-libstdc\\+\\+") ""))))
            (replace 'install
              (lambda* (#:key outputs #:allow-other-keys)
                (let ((out (assoc-ref outputs "out")))
@@ -1938,17 +1942,19 @@ The path-guided stochastic gradient descent based 1D sort implemented in
                      (install-file header (string-append out "/include")))
                    (find-files "src" "\\.h(pp)?$"))))))))
     (native-inputs
-     `(("pkg-config" ,pkg-config)
-       ("sparsehash" ,sparsehash)))
+     (list (list jemalloc "bin")
+           pkg-config
+           sparsehash))
     (inputs
-     `(("boost" ,boost)
-       ("concurrentqueue" ,concurrentqueue)
-       ("jemalloc" ,jemalloc)
-       ("libdivsufsort" ,libdivsufsort)
-       ("mummer" ,mummer)
-       ("protobuf" ,protobuf)
-       ("sdsl-lite" ,sdsl-lite)
-       ("zlib" ,zlib)))
+     (list bamtools
+           boost
+           concurrentqueue
+           jemalloc
+           libdivsufsort
+           mummer
+           protobuf
+           sdsl-lite
+           zlib))
     (home-page "https://github.com/maickrau/GraphAligner")
     (synopsis "Seed-and-extend program for aligning  genome graphs")
     (description "Seed-and-extend program for aligning long error-prone reads to
@@ -2141,7 +2147,7 @@ suitable for long reads, but works also well with short reads.")
 (define-public odgi
   (package
     (name "odgi")
-    (version "0.8.3")
+    (version "0.9.0")
     (outputs '("out" "static"))
     (source (origin
               (method url-fetch)
@@ -2149,7 +2155,7 @@ suitable for long reads, but works also well with short reads.")
                                   "/download/v" version
                                   "/odgi-v" version ".tar.gz"))
               (sha256
-               (base32 "1gw1xdb945z25rar6pba6kq5xdx8l7fkhxjyrvc1z1brva53p9hk"))
+               (base32 "0brg0sz45v1wv4ld3p4jwiab10nyp2f691zfwpiva6g6f71q3cbk"))
               (snippet
                #~(begin
                    (use-modules (guix build utils))
@@ -2159,6 +2165,7 @@ suitable for long reads, but works also well with short reads.")
     (build-system cmake-build-system)
     (arguments
      (list
+       #:tests? #f  ;; FIXME: tests are broken
        #:phases
        #~(modify-phases %standard-phases
            (add-after 'unpack 'use-gnuinstalldirs-macros
@@ -2333,14 +2340,14 @@ in-memory footprint at the cost of packing and unpacking.")
 (define-public vg
   (package
     (name "vg")
-    (version "1.50.0")
+    (version "1.65.0")
     (source
       (origin
         (method url-fetch)
         (uri (string-append "https://github.com/vgteam/vg/releases/download/v"
                             version "/vg-v" version ".tar.gz"))
         (sha256
-         (base32 "1n06fh6qvffhbxy7m096r8cy16wi0nm6gfgi3rsjy9zrb7g1jzhs"))
+         (base32 "022wiz0rs1x90nk9zaxcf8szhma8kzygnbfhciq9166kjysd0pc6"))
         (snippet
          #~(begin
              (use-modules (guix build utils))
@@ -2351,199 +2358,184 @@ in-memory footprint at the cost of packing and unpacking.")
                (("-mcx16") ""))))))
     (build-system gnu-build-system)
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (delete 'configure)    ; no configure script
-         (add-after 'unpack 'patch-source
-           (lambda* (#:key inputs #:allow-other-keys)
-             ;; Most of these are so that we can skip bootstrapping some of the sources.
-             (substitute* "Makefile"
-               ;; PKG_CONFIG_DEPS needs to be substituted to actually link to everything.
-               (("cairo libzstd")
-                "cairo htslib libzstd libdw libelf protobuf raptor2 sdsl-lite tabixpp vcflib fastahack libdeflate")
-
-               ;; Skip the part where we link static libraries special. It doesn't like the changes we make
-               (("-Wl,-B.*") "\n")
-
-               (("\\$\\(CWD\\)/\\$\\(LIB_DIR\\)/libtabixpp\\.a") "$(LIB_DIR)/libtabixpp.a")
-               ((" \\$\\(LIB_DIR\\)/libtabixpp\\.a")
-                (string-append " " (search-input-file inputs "/lib/libtabixpp.so")))
-               (("\\$\\(LIB_DIR\\)/pkgconfig/tabixpp\\.pc")
-                (string-append " " (search-input-file inputs "/lib/pkgconfig/tabixpp.pc")))
-
-               (("\\$\\(CWD\\)/\\$\\(LIB_DIR\\)/libhts\\.a") "$(LIB_DIR)/libhts.a")
-               ((" \\$\\(LIB_DIR\\)/libhts\\.a")
-                (string-append " " (search-input-file inputs "/lib/libhts.so")))
-               (("\\$\\(LIB_DIR\\)/pkgconfig/htslib\\.pc")
-                (string-append " " (search-input-file inputs "/lib/pkgconfig/htslib.pc")))
-
-               (("\\$\\(CWD\\)/\\$\\(LIB_DIR\\)/libdeflate\\.a") "$(LIB_DIR)/libdeflate.a")
-               ((" \\$\\(LIB_DIR\\)/libdeflate\\.a")
-                (string-append " " (search-input-file inputs "/lib/libdeflate.so")))
-
-               ((" \\$\\(LIB_DIR\\)/libvcflib.a")
-                (string-append " " (search-input-file inputs "/lib/libvcflib.so")))
-               ((" \\$\\(BIN_DIR\\)/vcf2tsv")
-                (string-append " " (search-input-file inputs "/bin/vcf2tsv")))
-
-               ((" \\$\\(FASTAHACK_DIR\\)/fastahack")
-                (string-append " " (search-input-file inputs "/bin/fastahack")))
-               (("\\+= \\$\\(OBJ_DIR\\)/Fasta\\.o")
-                (string-append "+= " (search-input-file inputs "/lib/libfastahack.so")))
-
-               ((" \\$\\(LIB_DIR\\)/libsnappy.a")
-                (string-append " " (search-input-file inputs "/lib/libsnappy.so")))
-
-               ;; Only link against the libraries in the elfutils package.
-               (("-ldwfl -ldw -ldwelf -lelf -lebl") "-ldw -lelf")
-               ((" \\$\\(LIB_DIR\\)/libelf.a")
-                (string-append " " (search-input-file inputs "/lib/libelf.so")))
-               ((" \\$\\(LIB_DIR\\)/libdw.a")
-                (string-append " " (search-input-file inputs "/lib/libdw.so")))
-
-               ;; We need the Make.helper file in SDSL_DIR for gcsa2
-               ;((" \\$\\(LIB_DIR\\)/libsdsl.a")
-               ; (string-append " " (search-input-file inputs "/lib/libsdsl.so")))
-
-               ((" \\$\\(LIB_DIR\\)/%divsufsort.a")
-                (string-append " " (dirname
+     (list
+      #:make-flags
+      #~(list (string-append "CC=" #$(cc-for-target))
+              ;; Set rpath so the validate-runpath phase finds
+              ;; libhandlegraph.so.
+              (string-append "LDFLAGS=-Wl,-rpath=" #$output "/lib"))
+      #:phases
+      #~(modify-phases %standard-phases
+          (delete 'configure)    ; no configure script
+          (add-after 'unpack 'patch-source
+            (lambda* (#:key inputs #:allow-other-keys)
+              ;; Most of these are so that we can skip bootstrapping some of the sources.
+              (substitute* "Makefile"
+                ;; PKG_CONFIG_DEPS needs to be substituted to actually link to everything.
+                (("cairo libzstd")
+                 "cairo htslib libzstd libdw libelf protobuf raptor2 sdsl-lite tabixpp vcflib fastahack libdeflate")
+
+                ;; Skip the part where we link static libraries special. It doesn't like the changes we make
+                (("-Wl,-B.*") "\n")
+
+                (("\\$\\(CWD\\)/\\$\\(LIB_DIR\\)/libtabixpp\\.a") "$(LIB_DIR)/libtabixpp.a")
+                ((" \\$\\(LIB_DIR\\)/libtabixpp\\.a")
+                 (string-append " " (search-input-file inputs "/lib/libtabixpp.so")))
+                (("\\$\\(LIB_DIR\\)/pkgconfig/tabixpp\\.pc")
+                 (string-append " " (search-input-file inputs "/lib/pkgconfig/tabixpp.pc")))
+
+                (("\\$\\(CWD\\)/\\$\\(LIB_DIR\\)/libhts\\.a") "$(LIB_DIR)/libhts.a")
+                ((" \\$\\(LIB_DIR\\)/libhts\\.a")
+                 (string-append " " (search-input-file inputs "/lib/libhts.so")))
+                (("\\$\\(LIB_DIR\\)/pkgconfig/htslib\\.pc")
+                 (string-append " " (search-input-file inputs "/lib/pkgconfig/htslib.pc")))
+
+                (("\\$\\(CWD\\)/\\$\\(LIB_DIR\\)/libdeflate\\.a") "$(LIB_DIR)/libdeflate.a")
+                ((" \\$\\(LIB_DIR\\)/libdeflate\\.a")
+                 (string-append " " (search-input-file inputs "/lib/libdeflate.so")))
+
+                ((" \\$\\(LIB_DIR\\)/libvcflib.a")
+                 (string-append " " (search-input-file inputs "/lib/libvcflib.so")))
+                ((" \\$\\(BIN_DIR\\)/vcf2tsv")
+                 (string-append " " (search-input-file inputs "/bin/vcf2tsv")))
+
+                ((" \\$\\(FASTAHACK_DIR\\)/fastahack")
+                 (string-append " " (search-input-file inputs "/bin/fastahack")))
+                (("\\+= \\$\\(OBJ_DIR\\)/Fasta\\.o")
+                 (string-append "+= " (search-input-file inputs "/lib/libfastahack.so")))
+
+                ((" \\$\\(LIB_DIR\\)/libsnappy.a")
+                 (string-append " " (search-input-file inputs "/lib/libsnappy.so")))
+
+                ;; Only link against the libraries in the elfutils package.
+                (("-ldwfl -ldw -ldwelf -lelf -lebl") "-ldw -lelf")
+                ((" \\$\\(LIB_DIR\\)/libelf.a")
+                 (string-append " " (search-input-file inputs "/lib/libelf.so")))
+                ((" \\$\\(LIB_DIR\\)/libdw.a")
+                 (string-append " " (search-input-file inputs "/lib/libdw.so")))
+
+                ((" \\$\\(LIB_DIR\\)/%divsufsort.a")
+                 (string-append " " (dirname
                                      (search-input-file inputs "/lib/libdivsufsort.so"))
-                               "%divsufsort.so"))
-               ((" \\$\\(LIB_DIR\\)/libdivsufsort.a")
-                (string-append " " (search-input-file inputs "/lib/libdivsufsort.so")))
-               ((" \\$\\(LIB_DIR\\)/%divsufsort64.a")
-                (string-append " " (dirname
+                                "%divsufsort.so"))
+                ((" \\$\\(LIB_DIR\\)/libdivsufsort.a")
+                 (string-append " " (search-input-file inputs "/lib/libdivsufsort.so")))
+                ((" \\$\\(LIB_DIR\\)/%divsufsort64.a")
+                 (string-append " " (dirname
                                      (search-input-file inputs "/lib/libdivsufsort64.so"))
-                               "%divsufsort64.so"))
-               ((" \\$\\(LIB_DIR\\)/libdivsufsort64.a")
-                (string-append " " (search-input-file inputs "/lib/libdivsufsort64.so")))
-
-               ((" \\$\\(LIB_DIR\\)/libjemalloc.a")
-                (string-append " " (search-input-file inputs "/lib/libjemalloc.a")))
-
-               ((" \\$\\(INC_DIR\\)/sparsehash")
-                (string-append " " (search-input-directory inputs "/include/sparsehash")))
-
-               ((" \\$\\(INC_DIR\\)/raptor2")
-                (string-append " " (search-input-directory inputs "/include/raptor2")))
-               ((" \\$\\(LIB_DIR\\)/libraptor2.a")
-                (string-append " " (search-input-file inputs "/lib/libraptor2.so")))
-               ((" \\$\\(BIN_DIR\\)/rapper")
-                (string-append " " (search-input-file inputs "/bin/rapper"))))))
-         (add-after 'unpack 'link-with-some-shared-libraries
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* '("deps/mmmultimap/CMakeLists.txt"
-                            "deps/xg/CMakeLists.txt"
-                            "deps/xg/deps/mmmulti/CMakeLists.txt")
-               (("\".*libsdsl\\.a\"") "\"-lsdsl\"")
-               (("\".*libdivsufsort\\.a\"") "\"-ldivsufsort\"")
-               (("\".*libdivsufsort64\\.a\"") "\"-ldivsufsort64\"")
-               (("\\$\\{sdsl-lite_INCLUDE\\}")
-                (search-input-directory inputs "/include/sdsl"))
-               (("\\$\\{sdsl-lite-divsufsort_INCLUDE\\}")
-                (dirname
+                                "%divsufsort64.so"))
+                ((" \\$\\(LIB_DIR\\)/libdivsufsort64.a")
+                 (string-append " " (search-input-file inputs "/lib/libdivsufsort64.so")))
+
+                ((" \\$\\(LIB_DIR\\)/libjemalloc.a")
+                 (string-append " " (search-input-file inputs "/lib/libjemalloc.a")))
+
+                ((" \\$\\(INC_DIR\\)/sparsehash")
+                 (string-append " " (search-input-directory inputs "/include/sparsehash")))
+
+                ((" \\$\\(INC_DIR\\)/raptor2")
+                 (string-append " " (search-input-directory inputs "/include/raptor2")))
+                ((" \\$\\(LIB_DIR\\)/libraptor2.a")
+                 (string-append " " (search-input-file inputs "/lib/libraptor2.so")))
+                ((" \\$\\(BIN_DIR\\)/rapper")
+                 (string-append " " (search-input-file inputs "/bin/rapper"))))
+              ;; Create obj and lib directories. They do not exist in
+              ;; the release tarball.
+              (mkdir "deps/libbdsg/bdsg/obj")
+              (mkdir "deps/libbdsg/lib")
+              ;; Do not remove obj and lib directories in the clean
+              ;; target.
+              (substitute* "deps/libbdsg/Makefile"
+                (("\\[ ! -e \\$\\(OBJ_DIR\\) \\][^\n]*") "")
+                (("\\[ ! -e \\$\\(LIB_DIR\\) \\][^\n]*") ""))))
+          (add-after 'unpack 'link-with-some-shared-libraries
+            (lambda* (#:key inputs #:allow-other-keys)
+              (substitute* '("deps/mmmultimap/CMakeLists.txt"
+                             "deps/xg/CMakeLists.txt"
+                             "deps/xg/deps/mmmulti/CMakeLists.txt")
+                (("\".*libsdsl\\.a\"") "\"-lsdsl\"")
+                (("\".*libdivsufsort\\.a\"") "\"-ldivsufsort\"")
+                (("\".*libdivsufsort64\\.a\"") "\"-ldivsufsort64\"")
+                (("\\$\\{sdsl-lite_INCLUDE\\}")
+                 (search-input-directory inputs "/include/sdsl"))
+                (("\\$\\{sdsl-lite-divsufsort_INCLUDE\\}")
+                 (dirname
                   (search-input-file inputs "/include/divsufsort.h"))))))
-         #;
-         (add-before 'patch-source 'use-shared-libvg
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (substitute* "Makefile"
-               (("libvg\\.a") "libvg.so")
-               ;; Have the linker find the shared library.
-               (("\\$\\(LIB_DIR\\)/libvg.\\$\\(SHARED_SUFFIX\\) \\$\\(LDFLAGS\\)")
-                "-lvg $(LDFLAGS)")
-               (("\\$\\(LDFLAGS\\) \\$\\(LIB_DIR\\)/libvg.so")
-                "$(LDFLAGS) -lvg"))
-             (setenv "LDFLAGS" (string-append "-Wl,-rpath="
-                                              (assoc-ref outputs "out") "/lib"))
-
-             ;; We need to tell a number of dependencies to build with -fPIC.
-             (substitute* "Makefile"
-               (("^CXXFLAGS := -O3")
-                (string-append "CFLAGS := -fPIC\n"
-                               "CXXFLAGS := -O3 -fPIC"))
-               (("^export CXXFLAGS")
-                (string-append "export CFLAGS\n"
-                               "$(info CFLAGS are $(CFLAGS))\n"
-                               "export CXXFLAGS"))
-               ((" \\$\\(LIB_DIR\\)/libjemalloc.a")
-                (string-append " " (assoc-ref inputs "jemalloc")
-                               "/lib/libjemalloc_pic.a")))
-             ;; We don't want to pull in all the global CXXFLAGS here.
-             (substitute* "deps/sublinear-Li-Stephens/makefile"
-               (("^CXXFLAGS:=") "CXXFLAGS:= -fPIC "))
-             ;; CMAKE_CXX_FLAGS aren't set globally.
-             (substitute* "deps/kff-cpp-api/CMakeLists.txt"
-               (("CMAKE_CXX_FLAGS \"") "CMAKE_CXX_FLAGS \" -fPIC "))))
-         (add-after 'unpack 'dont-build-shared-vgio
-           (lambda _
-             ;; vg will link with libvgio and fail the 'validate-runpath phase.
-             (substitute* "deps/libvgio/CMakeLists.txt"
-               (("TARGETS vgio vgio_static") "TARGETS vgio_static"))))
-         (add-after 'unpack 'fix-fastahack-dependency
-           (lambda _
-             (substitute* (append (list "src/aligner.hpp"
-                                        "src/vg.hpp")
-                                  (find-files "deps/vcflib/src" "\\.cpp$"))
-               (("Fasta.h") "fastahack/Fasta.h"))
-             (substitute* '("deps/vcflib/src/Variant.h"
-                            "src/constructor.hpp"
-                            "src/index_registry.cpp")
-               (("<Fasta.h>") "\"fastahack/Fasta.h\""))))
-         (add-after 'unpack 'adjust-tests
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let ((bash-tap (assoc-ref inputs "bash-tap")))
-               (substitute* (find-files "test/t")
-                 (("BASH_TAP_ROOT.*")
-                  (string-append "BASH_TAP_ROOT=" bash-tap "/bin\n"))
-                 ((".*bash-tap-bootstrap")
-                  (string-append ". " bash-tap "/bin/bash-tap-bootstrap")))
-               (substitute* "test/t/02_vg_construct.t"
-                 (("../deps/fastahack/fastahack") (which "fastahack"))
-                 (("../bin/vcf2tsv") (which "vcf2tsv")))
-               ;; Lets skip the 9 failing tests for now. They fail with our
-               ;; bash-tap and the bundled one.
-               (substitute* "test/t/02_vg_construct.t"
-                 ((".*self-inconsistent.*") "is $(true) \"\" \"\"\n"))
-               (substitute* "test/t/07_vg_map.t"
-                 ;; Change in fasta's output
-                 (("identity\\) 1 \"") "identity) 1.0 \""))
-               (substitute* '("test/t/07_vg_map.t"
-                              "test/t/33_vg_mpmap.t")
-                 ((".*node id.*") "is $(true) \"\" \"\"\n"))
-               (substitute* "test/t/48_vg_convert.t"
-                 (("true \"vg.*") "true \"true\"\n"))
-               (substitute* "test/t/50_vg_giraffe.t"
-                 ((".*A long read can.*") "is $(true) \"\" \"\"\n")
-                 ((".*A long read has.*") "is $(true) \"\" \"\"\n")
-                 ((".*Long read minimizer.*") "is $(true) \"\" \"\"\n"))
-               ;; Don't test the docs, we're not providing npm
-               (substitute* "Makefile"
-                 ((".*test-docs.*") "")))))
-         (add-after 'build 'build-manpages
-           (lambda* (#:key inputs #:allow-other-keys)
-             (when (assoc-ref inputs "asciidoctor")
-               (invoke "make" "man"))))
-         (replace 'install
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out")))
-               (install-file "bin/vg" (string-append out "/bin"))
-               ;(install-file "lib/libvg.so" (string-append out "/lib"))
-               (for-each
+          (add-after 'unpack 'dont-build-shared-vgio
+            (lambda _
+              ;; vg will link with libvgio and fail the 'validate-runpath phase.
+              (substitute* "deps/libvgio/CMakeLists.txt"
+                (("TARGETS vgio vgio_static") "TARGETS vgio_static"))))
+          (add-after 'unpack 'fix-fastahack-dependency
+            (lambda _
+              (substitute* (append (list "src/aligner.hpp"
+                                         "src/vg.hpp")
+                                   (find-files "deps/vcflib/src" "\\.cpp$"))
+                (("Fasta.h") "fastahack/Fasta.h"))
+              (substitute* '("deps/vcflib/src/Variant.h"
+                             "src/constructor.hpp"
+                             "src/index_registry.cpp")
+                (("<Fasta.h>") "\"fastahack/Fasta.h\""))))
+          (add-after 'unpack 'adjust-tests
+            (lambda* (#:key inputs #:allow-other-keys)
+              (let ((bash-tap (assoc-ref inputs "bash-tap")))
+                (substitute* (find-files "test/t")
+                  (("BASH_TAP_ROOT.*")
+                   (string-append "BASH_TAP_ROOT=" bash-tap "/bin\n"))
+                  ((".*bash-tap-bootstrap")
+                   (string-append ". " bash-tap "/bin/bash-tap-bootstrap")))
+                (substitute* "test/t/02_vg_construct.t"
+                  (("../deps/fastahack/fastahack") (which "fastahack"))
+                  (("../bin/vcf2tsv") (which "vcf2tsv")))
+                ;; Lets skip the 9 failing tests for now. They fail with our
+                ;; bash-tap and the bundled one.
+                (substitute* "test/t/02_vg_construct.t"
+                  ((".*self-inconsistent.*") "is $(true) \"\" \"\"\n"))
+                (substitute* "test/t/07_vg_map.t"
+                  ;; Change in fasta's output
+                  (("identity\\) 1 \"") "identity) 1.0 \""))
+                (substitute* '("test/t/07_vg_map.t"
+                               "test/t/33_vg_mpmap.t")
+                  ((".*node id.*") "is $(true) \"\" \"\"\n"))
+                (substitute* "test/t/48_vg_convert.t"
+                  (("true \"vg.*") "true \"true\"\n"))
+                (substitute* "test/t/50_vg_giraffe.t"
+                  ((".*A long read can.*") "is $(true) \"\" \"\"\n")
+                  ((".*A long read has.*") "is $(true) \"\" \"\"\n")
+                  ((".*Long read minimizer.*") "is $(true) \"\" \"\"\n"))
+                ;; Don't test the docs, we're not providing npm
+                (substitute* "Makefile"
+                  ((".*test-docs.*") "")))))
+          (add-after 'build 'build-manpages
+            (lambda* (#:key make-flags #:allow-other-keys)
+              ;; vg is not in PATH. Replace it with full path.
+              (substitute* "doc/vgmanmd.py"
+                (("'vg'") "'./bin/vg'"))
+              (apply invoke "make" "man" make-flags)))
+          (replace 'install
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let ((out (assoc-ref outputs "out")))
+                (install-file "bin/vg" (string-append out "/bin"))
+                (install-file "lib/libhandlegraph.so" (string-append out "/lib"))
+                (for-each
                  (lambda (file)
                    (install-file file (string-append out "/share/man/man1")))
                  (find-files "doc/man" "\\.1$"))))))
-       #:test-target "test"))
+      #:test-target "test"))
     (native-inputs
      (append
        (if (supported-package? ruby-asciidoctor)
          (list ruby-asciidoctor)
          '())
-       (list bash-tap
+       (list asciidoc
+             bash-tap
              bc
              cmake-minimal
+             ghc-pandoc
              jq
              perl
              pkg-config
+             python
              samtools
              util-linux
              which
@@ -2596,121 +2588,159 @@ multiple sequence alignment.")
         license:zlib    ; deps/sonLib/externalTools/cutest
         license:boost1.0)))) ; catch.hpp
 
+(define-public wfmash-0.14
+  (package
+    (inherit wfmash)
+    (version "0.14.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://github.com/waveygang/wfmash/releases/download/v"
+                           version "/wfmash-v" version ".tar.gz"))
+       (sha256
+        (base32
+         "1mk3jschn3hdr45glds65g3hxk7v6nc3plkvxmfbd5pr4kyzlf13"))
+       (snippet
+        #~(begin
+            (use-modules (guix build utils))
+            ;; Unbundle atomic-queue.
+            (delete-file-recursively "src/common/atomic_queue")
+            (substitute* "src/align/include/computeAlignments.hpp"
+              (("\"common/atomic_queue/atomic_queue.h\"")
+               "<atomic_queue/atomic_queue.h>"))
+            ;; Remove compiler optimizations.
+            (substitute* (find-files "." "CMakeLists\\.txt")
+              (("-march=native ") ""))))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments wfmash)
+       ((#:tests? tests? #f) #f)
+       ((#:phases phases #~%standard-phases)
+        #~(modify-phases #$phases
+            (replace 'build-check-prerequisites
+              (lambda _
+                (let ((wfa2-lib #$(string-append "../wfmash-v"
+                                                 version
+                                                 "/src/common/wflign/deps/WFA2-lib")))
+                  (substitute* (string-append wfa2-lib "/Makefile")
+                    ;; Remove architecture-specific flags.
+                    (("-march=x86-64-v3") ""))
+                  (substitute* (string-append wfa2-lib "/tests/wfa.utest.sh")
+                    ;; Fix time command.
+                    (("\\\\time -v") "time"))
+                  ;; Build wfa2-lib.
+                  (invoke "make" "-C" wfa2-lib
+                          #$(string-append "CC=" (cc-for-target))))))))))
+    (inputs
+     (modify-inputs (package-inputs wfmash)
+       (prepend jemalloc)
+       (delete "libdeflate")))))
+
 (define-public pggb
-  (let ((commit "9ebff27320382e470ed38a85b4448402e1e7c353")
-        (revision "1"))
-    (package
-      (name "pggb")
-      (version (git-version "0.5.1" revision commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                       (url "https://github.com/pangenome/pggb")
-                       (commit commit)))
-                (file-name (git-file-name name version))
-                (sha256
-                 (base32 "0rgpj52q3ai7f1saqbilgx5gz4f403x3427wq649qwv84ivmi1sf"))))
-      (build-system copy-build-system)
-      (arguments
-       (list
-         #:install-plan
-         #~'(("pggb" "bin/")
-             ("partition-before-pggb" "bin/")
-             ("scripts/" "bin/")
-             ("scripts" "bin/scripts"))
-         #:phases
-         #~(modify-phases %standard-phases
-             (add-after 'unpack 'force-python3
-               (lambda _
-                 (substitute* (find-files "scripts" "\\.py$")
-                   (("/usr/bin/python") "/usr/bin/python3"))))
-             (add-before 'install 'patch-and-wrap-scripts
-               (lambda* (#:key inputs #:allow-other-keys)
-                 (substitute* "scripts/vcf_preprocess.sh"
-                   (("bcftools ")
-                    (string-append (search-input-file inputs "/bin/bcftools") " ")))
-                 (wrap-script "scripts/net2communities.py"
-                   `("GUIX_PYTHONPATH" ":" prefix
-                     (,(getenv "GUIX_PYTHONPATH"))))))
-             (add-after 'install 'wrap-scripts
-               (lambda* (#:key inputs outputs #:allow-other-keys)
-                 (let ((out (assoc-ref outputs "out")))
-                   (for-each
-                     (lambda (file)
-                       (wrap-script file
-                         `("R_LIBS_SITE" ":" prefix
-                           (,(getenv "R_LIBS_SITE")))
-                         `("PATH" ":" prefix
-                           ,(map (lambda (input) (string-append input "/bin"))
-                                 '#$(map (lambda (label)
-                                           (or (this-package-input (string-append label "-hwcaps"))
-                                               (this-package-input label)))
-                                         (list "bc"
-                                               "bcftools"
-                                               "bedtools"
-                                               "gfaffix"
-                                               "htslib"
-                                               "fastix"
-                                               "multiqc"
-                                               "mummer"
-                                               "odgi"
-                                               "pafplot"
-                                               "parallel"
-                                               "pigz"
-                                               "python"
-                                               "r-data-table"
-                                               "r-minimal"
-                                               "rtg-tools"
-                                               "samtools"
-                                               "seqwish"
-                                               "smoothxg"
-                                               "time"
-                                               "vcfbub"
-                                               "vcflib"
-                                               "vg"
-                                               "wfmash"))))))
-                          (list (string-append out "/bin/pggb")
-                                (string-append out "/bin/partition-before-pggb")
-                                (string-append out "/bin/gfa2evaluation.sh")
-                                (string-append out "/bin/scripts/gfa2evaluation.sh"))))))
-             (add-after 'install 'substitute-file-paths
-               (lambda* (#:key outputs #:allow-other-keys)
-                 (let ((out (assoc-ref outputs "out")))
-                   (substitute* (string-append out "/bin/gfa2evaluation.sh")
-                     (("/usr/local/bin/vcf_preprocess.sh")
-                      (string-append out "/bin/vcf_preprocess.sh"))
-                     (("/usr/local/bin/nucmer2vcf.R")
-                      (string-append out "/bin/nucmer2vcf.R")))))))))
-      (inputs
-       (list bc
-             bcftools
-             bedtools
-             gfaffix
-             guile-3.0      ; for wrap-script
-             htslib         ; tabix
-             fastix
-             multiqc
-             mummer
-             odgi
-             pafplot
-             parallel
-             pigz
-             python
-             python-igraph
-             r-data-table
-             r-minimal
-             rtg-tools
-             samtools
-             seqwish
-             smoothxg
-             time
-             vcfbub
-             vcflib
-             vg
-             wfmash))
-      (home-page "https://doi.org/10.1101/2023.04.05.535718")
-      (synopsis "PanGenome Graph Builder")
-      (description "@command{pggb} builds
+  (package
+    (name "pggb")
+    (version "0.7.2")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/pangenome/pggb")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1k3ffl5h5jqnz9k9y5cjqr8z6hh0gyjfj4szggz11lncp5wkskgv"))))
+    (build-system copy-build-system)
+    (arguments
+     (list
+      #:install-plan
+      #~'(("pggb" "bin/")
+          ("partition-before-pggb" "bin/")
+          ("scripts/" "bin/")
+          ("scripts" "bin/scripts"))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'force-python3
+            (lambda _
+              (substitute* (find-files "scripts" "\\.py$")
+                (("/usr/bin/python") "/usr/bin/python3"))))
+          (add-before 'install 'patch-and-wrap-scripts
+            (lambda* (#:key inputs #:allow-other-keys)
+              (substitute* "scripts/vcf_preprocess.sh"
+                (("bcftools ")
+                 (string-append (search-input-file inputs "/bin/bcftools") " ")))
+              (wrap-script "scripts/net2communities.py"
+                           `("GUIX_PYTHONPATH" ":" prefix
+                             (,(getenv "GUIX_PYTHONPATH"))))))
+          (add-after 'install 'wrap-scripts
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (let ((out (assoc-ref outputs "out")))
+                (for-each
+                 (lambda (file)
+                   (wrap-script file
+                                `("R_LIBS_SITE" ":" prefix
+                                  (,(getenv "R_LIBS_SITE")))
+                                `("PATH" ":" prefix
+                                  ,(map (lambda (input) (string-append input "/bin"))
+                                        '#$(map (lambda (label)
+                                                  (or (this-package-input (string-append label "-hwcaps"))
+                                                      (this-package-input label)))
+                                                (list "bc"
+                                                      "bcftools"
+                                                      "bedtools"
+                                                      "gfaffix"
+                                                      "htslib"
+                                                      "multiqc"
+                                                      "odgi"
+                                                      "parallel"
+                                                      "pigz"
+                                                      "python"
+                                                      "r-data-table"
+                                                      "r-minimal"
+                                                      "rtg-tools"
+                                                      "samtools"
+                                                      "seqwish"
+                                                      "smoothxg"
+                                                      "time"
+                                                      "vcfbub"
+                                                      "vg"
+                                                      "wfmash"))))))
+                 (list (string-append out "/bin/pggb")
+                       (string-append out "/bin/partition-before-pggb")
+                       (string-append out "/bin/gfa2evaluation.sh")
+                       (string-append out "/bin/scripts/gfa2evaluation.sh"))))))
+          (add-after 'install 'substitute-file-paths
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let ((out (assoc-ref outputs "out")))
+                (substitute* (string-append out "/bin/gfa2evaluation.sh")
+                  (("/usr/local/bin/vcf_preprocess.sh")
+                   (string-append out "/bin/vcf_preprocess.sh"))
+                  (("/usr/local/bin/nucmer2vcf.R")
+                   (string-append out "/bin/nucmer2vcf.R")))))))))
+    (inputs
+     (list bc
+           bcftools
+           bedtools
+           gfaffix
+           guile-3.0                    ; for wrap-script
+           htslib                       ; tabix
+           multiqc
+           odgi
+           parallel
+           pigz
+           python
+           python-igraph
+           r-data-table
+           r-minimal
+           rtg-tools
+           samtools
+           seqwish
+           smoothxg
+           time
+           vcfbub
+           vg
+           wfmash-0.14))
+    (home-page "https://doi.org/10.1101/2023.04.05.535718")
+    (synopsis "PanGenome Graph Builder")
+    (description "@command{pggb} builds
 @url{https://doi.org/10.1146%2Fannurev-genom-120219-080406, pangenome}
 @url{https://doi.org/10.1038/nbt.4227, variation graphs} from a set of input
 sequences.
@@ -2735,7 +2765,7 @@ such as the @url{https://github.com/vgteam/vg, vg} and
 @command{pggb} has been tested at scale in the @acronym{Human Pangenome
 Reference Consortium, HPRC} as a method to build a graph from the
 @url{https://doi.org/10.1101/2022.07.09.499321, draft human pangenome}.")
-      (license license:expat))))
+    (license license:expat)))
 
 (define use-glibc-hwcaps
   (package-input-rewriting/spec
@@ -3548,36 +3578,37 @@ protein alignments and syntenic genomic alignments.")
 
 (define-public pplacer
   (let ((commit "807f6f3"))
-   (build-with-ocaml4.07
-    (package
-      (name "pplacer")
-      ;; The commit should be updated with each version change.
-      (version "1.1.alpha19")
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/matsen/pplacer")
-               (commit (string-append "v" version))))
-         (file-name (git-file-name name version))
-         (sha256
-          (base32 "11ppbbbx20p2g9wj3ff64dhnarb12q79v7qh4rk0gj6lkbz4n7cn"))))
-      (build-system ocaml-build-system)
-      (arguments
-       `(#:modules ((guix build ocaml-build-system)
-                    (guix build utils)
-                    (ice-9 ftw))
+    (build-with-ocaml4.07
+     (package
+       (name "pplacer")
+       ;; The commit should be updated with each version change.
+       (version "1.1.alpha19")
+       (source
+        (origin
+          (method git-fetch)
+          (uri (git-reference
+                (url "https://github.com/matsen/pplacer")
+                (commit (string-append "v" version))))
+          (file-name (git-file-name name version))
+          (sha256
+           (base32 "11ppbbbx20p2g9wj3ff64dhnarb12q79v7qh4rk0gj6lkbz4n7cn"))))
+       (build-system ocaml-build-system)
+       (arguments
+        (list
+         #:modules '((guix build ocaml-build-system)
+                     (guix build utils)
+                     (ice-9 ftw))
          #:phases
-         (modify-phases %standard-phases
-           (delete 'configure)
-           (add-after 'unpack 'fix-build-with-latest-ocaml
-             (lambda _
-               (substitute* "myocamlbuild.ml"
-                 (("dep \\[\"c_pam\"\\]" m)
-                  (string-append "flag [\"ocaml\"; \"compile\"] (A \"-unsafe-string\");\n"
-                                 m))
-                 (("let run_and_read" m)
-                  (string-append "
+         #~(modify-phases %standard-phases
+             (delete 'configure)
+             (add-after 'unpack 'fix-build-with-latest-ocaml
+               (lambda _
+                 (substitute* "myocamlbuild.ml"
+                   (("dep \\[\"c_pam\"\\]" m)
+                    (string-append "flag [\"ocaml\"; \"compile\"] (A \"-unsafe-string\");\n"
+                                   m))
+                   (("let run_and_read" m)
+                    (string-append "
 let split s ch =
   let x = ref [] in
   let rec go s =
@@ -3593,76 +3624,72 @@ let before_space s =
   with Not_found -> s
 
 " m))
-                 (("run_and_read \"ocamlfind list \\| cut -d' ' -f1\"" m)
-                  (string-append "List.map before_space (split_nl & " m ")"))
-                 (("    blank_sep_strings &") "")
-                 (("      Lexing.from_string &") ""))
-               #t))
-           (add-after 'unpack 'replace-bundled-cddlib
-             (lambda* (#:key inputs #:allow-other-keys)
-               (let* ((cddlib-src (assoc-ref inputs "cddlib-src"))
-                      (local-dir "cddlib_guix"))
-                 (mkdir local-dir)
-                 (with-directory-excursion local-dir
-                   (invoke "tar" "xvf" cddlib-src))
-                 (let ((cddlib-src-folder
-                        (string-append local-dir "/"
-                                       (list-ref (scandir local-dir) 2)
-                                       "/lib-src")))
-                   (for-each make-file-writable (find-files "cdd_src" ".*"))
-                   (for-each
-                    (lambda (file)
-                      (copy-file file
-                                 (string-append "cdd_src/" (basename file))))
-                    (find-files cddlib-src-folder ".*[ch]$")))
-                 #t)))
-           (add-after 'unpack 'fix-makefile
-             (lambda _
-               ;; Remove system calls to 'git'.
-               (substitute* "Makefile"
-                 (("^DESCRIPT:=pplacer-.*")
-                  (string-append
-                   "DESCRIPT:=pplacer-$(shell uname)-v" ,version "\n")))
-               (substitute* "myocamlbuild.ml"
-                 (("git describe --tags --long .*\\\" with")
-                  (string-append
-                   "echo -n v" ,version "-" ,commit "\" with")))
-               #t))
-           (replace 'install
-             (lambda* (#:key outputs #:allow-other-keys)
-               (let* ((out (assoc-ref outputs "out"))
-                      (bin (string-append out "/bin")))
-                 (copy-recursively "bin" bin))
-               #t)))
-       #:ocaml ,ocaml-4.07
-       #:findlib ,ocaml4.07-findlib))
-      (inputs
-       `(("zlib" ,zlib "static")
-         ("gsl" ,gsl-static)
-         ("ocaml-ounit" ,(package-with-ocaml4.07 ocaml-ounit))
-         ("ocaml-batteries" ,(package-with-ocaml4.07 ocaml-batteries))
-         ("ocaml-camlzip" ,(package-with-ocaml4.07 camlzip))
-         ("ocaml-csv" ,(package-with-ocaml4.07 ocaml-csv))
-         ("ocaml-sqlite3" ,(package-with-ocaml4.07 ocaml-sqlite3))
-         ("ocaml-xmlm" ,(package-with-ocaml4.07 ocaml-xmlm))
-         ("ocaml-mcl" ,(package-with-ocaml4.07 ocaml-mcl))
-         ("ocaml-gsl" ,ocaml4.07-gsl-1)
-         ("sqlite:static" ,sqlite "static")))
-      (native-inputs
-       `(("cddlib-src" ,(package-source cddlib))
-         ("ocamlbuild" ,(package-with-ocaml4.07 ocamlbuild))
-         ("pkg-config" ,pkg-config)))
-      (propagated-inputs
-       (list pplacer-scripts))
-      (synopsis "Phylogenetic placement of biological sequences")
-      (description
-       "Pplacer places query sequences on a fixed reference phylogenetic tree
+                   (("run_and_read \"ocamlfind list \\| cut -d' ' -f1\"" m)
+                    (string-append "List.map before_space (split_nl & " m ")"))
+                   (("    blank_sep_strings &") "")
+                   (("      Lexing.from_string &") ""))))
+             (add-after 'unpack 'replace-bundled-cddlib
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (let* ((cddlib-src (assoc-ref inputs "cddlib-src"))
+                        (local-dir "cddlib_guix"))
+                   (mkdir local-dir)
+                   (with-directory-excursion local-dir
+                     (invoke "tar" "xvf" cddlib-src))
+                   (let ((cddlib-src-folder
+                          (string-append local-dir "/"
+                                         (list-ref (scandir local-dir) 2)
+                                         "/lib-src")))
+                     (for-each make-file-writable (find-files "cdd_src" ".*"))
+                     (for-each
+                      (lambda (file)
+                        (copy-file file
+                                   (string-append "cdd_src/" (basename file))))
+                      (find-files cddlib-src-folder ".*[ch]$"))))))
+             (add-after 'unpack 'fix-makefile
+               (lambda _
+                 ;; Remove system calls to 'git'.
+                 (substitute* "Makefile"
+                   (("^DESCRIPT:=pplacer-.*")
+                    (string-append
+                     "DESCRIPT:=pplacer-$(shell uname)-v" ,version "\n")))
+                 (substitute* "myocamlbuild.ml"
+                   (("git describe --tags --long .*\\\" with")
+                    (string-append
+                     "echo -n v" ,version "-" ,commit "\" with")))))
+             (replace 'install
+               (lambda* (#:key outputs #:allow-other-keys)
+                 (let* ((out (assoc-ref outputs "out"))
+                        (bin (string-append out "/bin")))
+                   (copy-recursively "bin" bin)))))
+         #:ocaml ocaml-4.07
+         #:findlib ocaml4.07-findlib))
+       (inputs
+        (list (list zlib "static")
+              (list gsl "static")
+              (package-with-ocaml4.07 ocaml-ounit)
+              (package-with-ocaml4.07 ocaml-batteries)
+              (package-with-ocaml4.07 camlzip)
+              (package-with-ocaml4.07 ocaml-csv)
+              (package-with-ocaml4.07 ocaml-sqlite3)
+              (package-with-ocaml4.07 ocaml-xmlm)
+              (package-with-ocaml4.07 ocaml-mcl)
+              ocaml4.07-gsl-1
+              (list sqlite "static")))
+       (native-inputs
+        (list (package-source cddlib)
+              (package-with-ocaml4.07 ocamlbuild)
+              pkg-config))
+       (propagated-inputs
+        (list pplacer-scripts))
+       (synopsis "Phylogenetic placement of biological sequences")
+       (description
+        "Pplacer places query sequences on a fixed reference phylogenetic tree
 to maximize phylogenetic likelihood or posterior probability according to a
 reference alignment.  Pplacer is designed to be fast, to give useful
 information about uncertainty, and to offer advanced visualization and
 downstream analysis.")
-      (home-page "https://matsen.fhcrc.org/pplacer/")
-      (license license:gpl3)))))
+       (home-page "https://matsen.fhcrc.org/pplacer/")
+       (license license:gpl3)))))
 
 (define-public python2-biopython
   (python2-package python-biopython))
@@ -4464,7 +4491,7 @@ automatically vectorize for different architectures without adapting the code.")
 
 (define-public r-rrbgen
   (package
-    (name "r-stitch")
+    (name "r-rrbgen")
     (version "0.0.6")
     (source
      (origin
@@ -4573,6 +4600,33 @@ interface to the basic htslib.  It can be easily included in a C++
 program for scripting high-performance genomic analyses.")
     (license license:asl2.0)))
 
+(define-public r-genio
+  (package
+    (name "r-genio")
+    (version "1.1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "genio" version))
+       (sha256
+        (base32 "0izx8yv8mvnfxdqnqpnp2ldw1hzs6ggxi7jgmjlgxkgmm4vngbgl"))))
+    (properties `((upstream-name . "genio")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-dplyr r-rcpp r-readr r-tibble))
+    (native-inputs (list r-knitr r-testthat))
+    (home-page "https://github.com/OchoaLab/genio")
+    (synopsis "Genetics Input/Output Functions")
+    (description "@code{r-genio} implements readers and writers for file formats
+associated with genetics data.  Reading and writing Plink BED/BIM/FAM
+and GCTA binary GRM formats is fully supported, including a
+lightning-fast BED reader and writer implementations.  Other functions
+are readr wrappers that are more constrained, user-friendly, and
+efficient for these particular applications; handles Plink and
+Eigenstrat tables (FAM, BIM, IND, and SNP files).  There are also make
+functions for FAM and BIM tables with default values to go with
+simulated genotype data.")
+    (license license:gpl3)))
+
 (define-public r-stitch
   (package
     (name "r-stitch")
diff --git a/gn/packages/bnw.scm b/gn/packages/bnw.scm
index 1e2c86e..a609905 100644
--- a/gn/packages/bnw.scm
+++ b/gn/packages/bnw.scm
@@ -8,6 +8,7 @@
   #:use-module (gnu packages graphviz)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-science)
   #:use-module (gnu packages statistics)
   #:use-module (gn packages javascript)
   #:use-module (gn packages web))
diff --git a/gn/packages/check.scm b/gn/packages/check.scm
new file mode 100644
index 0000000..960e78e
--- /dev/null
+++ b/gn/packages/check.scm
@@ -0,0 +1,61 @@
+(define-module (gn packages check)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system python)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages check)
+  #:use-module (gnu packages python-xyz)
+  #:use-module (past packages python27))
+
+(define-public python-nosexcover
+  (package
+    (name "python-nosexcover")
+    (version "1.0.11")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "nosexcover" version))
+              (sha256
+               (base32
+                "10xqr12qv62k2flxwqhh8cr00cjhn7sfjrm6p35gd1x5bmjkr319"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     (list python-coverage python-nose))
+    (home-page "https://github.com/cmheisel/nose-xcover")
+    (synopsis "Extends nose.plugins.cover to add Cobertura-style XML reports")
+    (description "Nose-xcover is a companion to the built-in
+@code{nose.plugins.cover}.  This plugin will write out an XML coverage report
+to a file named coverage.xml.
+
+It will honor all the options you pass to the Nose coverage plugin,
+especially -cover-package.")
+    (license license:expat)))
+
+(define-public python-unittest2
+  (package
+    (name "python-unittest2")
+    (version "1.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "unittest2" version))
+       (patches
+        (search-patches "python-unittest2-python3-compat.patch"
+                        "python-unittest2-remove-argparse.patch"))
+       (sha256
+        (base32
+         "0y855kmx7a8rnf81d3lh5lyxai1908xjp0laf4glwa4c8472m212"))))
+    (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda _
+             (zero? (system* "python" "-m" "unittest2" "discover" "--verbose")))))))
+    (propagated-inputs
+     (list python-six python-traceback2))
+    (home-page "https://pypi.org/project/unittest2/")
+    (synopsis "Python unit testing library")
+    (description
+     "Unittest2 is a replacement for the unittest module in the Python
+standard library.")
+    (license license:psfl)))
diff --git a/gn/packages/cran.scm b/gn/packages/cran.scm
index 6a2a4ea..34e781c 100644
--- a/gn/packages/cran.scm
+++ b/gn/packages/cran.scm
@@ -4,7 +4,8 @@
   #:use-module (guix download)
   #:use-module (guix build-system r)
   #:use-module (gnu packages)
-  #:use-module (gnu packages statistics))
+  #:use-module (gnu packages statistics)
+  #:use-module (gnu packages cran))
 
 (define-public r-tictoc
   (package
diff --git a/gn/packages/crates-io.scm b/gn/packages/crates-io.scm
index 4cebb33..23182a2 100644
--- a/gn/packages/crates-io.scm
+++ b/gn/packages/crates-io.scm
@@ -5,9 +5,7 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix build-system cargo)
-  #:use-module (gnu packages crates-graphics)
-  #:use-module (gnu packages crates-io)
-  #:use-module (gnu packages crates-windows)
+  #:use-module (past-crates packages crates-io)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages python))
 
@@ -17,7 +15,7 @@
     (version "0.12.2")
     (source (origin
               (method url-fetch)
-              (uri (crate-uri "assert-cmd" version))
+              (uri (crate-uri "assert_cmd" version))
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
@@ -688,32 +686,28 @@ or any combination.")
     (license license:gpl3+)))
 
 (define-public gn-rust-correlation
-  (let ((commit "a22381e9830bac9a6848449279d258397217e251")
+  (let ((commit "d7b1fd65814511890a4e606e6e610379b6d89393")
         (revision "0"))
     (package
       (name "gn-rust-correlation")
       (version (git-version "0.1.4" revision commit))
       (source
-        (origin
-          (method git-fetch)
-          (uri (git-reference
-                 (url "https://github.com/Alexanderlacuna/correlation_rust.git")
-                 (commit commit)))
-          (file-name (git-file-name name version))
-          (sha256
-           (base32
-            "1cb197p8zmgxymzs9b7bygs0kg67809z6gc2svza909sxr9ac5ps"))))
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/Alexanderlacuna/correlation_rust.git")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1z5p9pjja6a697l558axnp1hr5376b6ng3yl3vxcp2h1skfrykvq"))))
       (build-system cargo-build-system)
-      (native-inputs
-       (list gsl))
+      (native-inputs (list gsl))
       (arguments
-       `(#:cargo-inputs 
-         (("rust-serde" ,rust-serde-1)
-	  ("rust-serde-json" ,rust-serde-json-1)
-	  ("GSL" ,rust-gsl)
-	  ("rust-assert-approx-eq"  ,rust-assert-approx-eq-1))
-	 #:cargo-development-inputs
-	 (("rust-criterion" ,rust-criterion-0.3))))
+       `(#:cargo-inputs (("rust-serde" ,rust-serde-1)
+                         ("rust-serde-json" ,rust-serde-json-1)
+                         ("GSL" ,rust-gsl)
+                         ("rust-assert-approx-eq" ,rust-assert-approx-eq-1))
+         #:cargo-development-inputs (("rust-criterion" ,rust-criterion-0.3))))
       (home-page "https://github.com/Alexanderlacuna/correlation_rust")
       (synopsis "Re-implementation of genenetwork/correlation in Rust")
       (description "Re-implementation of genenetwork/correlation in Rust")
diff --git a/gn/packages/databases.scm b/gn/packages/databases.scm
index 93280c2..20ea612 100644
--- a/gn/packages/databases.scm
+++ b/gn/packages/databases.scm
@@ -136,3 +136,15 @@
       (inputs
        `(("zlib" ,zlib)
          ,@(package-inputs base))))))
+
+
+(define-public python-mysqlclient-2.2.7
+  (package
+    (inherit python-mysqlclient)
+    (version "2.2.7")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "mysqlclient" version))
+       (sha256
+        (base32 "0i9q2vj6rb4w2iggk0mcp9jla2rm91sx7jcrgv7grm8njjsj5bi4"))))))
diff --git a/gn/packages/dlang.scm b/gn/packages/dlang.scm
index 5cab985..a7d76a2 100644
--- a/gn/packages/dlang.scm
+++ b/gn/packages/dlang.scm
@@ -103,7 +103,7 @@ std.algorithm.endsWith(tzName, \"/leapseconds\"))")))))))
        ("tzdata" ,tzdata)
        ("zlib" ,zlib)))
     (native-inputs
-     `(("llvm" ,llvm-6)
+     `(("llvm" ,llvm-12)
        ("python-wrapper" ,python-wrapper)
        ("unzip" ,unzip)
        ("phobos-src"
diff --git a/gn/packages/edash.scm b/gn/packages/edash.scm
index ac88e22..42da046 100644
--- a/gn/packages/edash.scm
+++ b/gn/packages/edash.scm
@@ -18,7 +18,8 @@
   #:use-module (gnu packages check)
   #:use-module (gn packages web)
   #:use-module (gnu packages sqlite)
-  #:use-module (gn packages python))
+  #:use-module (gn packages python)
+  #:use-module (past packages python27))
 
 (define-public python-s3transfer-0.1.13
   (package
@@ -271,8 +272,7 @@ necessary.")
        ("python-pyyaml" ,python-pyyaml)
        ("python-pytest-cov" ,python-pytest-cov)
        ("python-jsonschema" ,python-jsonschema)
-       ("python-pytest-pep8" ,python-pytest-pep8)
-       ("python-pytest-cache" ,python-pytest-cache)
+       ("python-pytest-pycodestyle" ,python-pytest-pycodestyle)
 ;;       ("python-pytest-flakes" ,python-pytest-flakes)
        ))
     (arguments `(#:tests? #f))
@@ -303,8 +303,7 @@ with the Specification.")
        ("python-pyflakes" ,python-pyflakes)
        ("python-flake8" ,python-flake8)
        ("python-pytest-cov" ,python-pytest-cov)
-       ("python-pytest-pep8" ,python-pytest-pep8)
-       ("python-pytest-cache" ,python-pytest-cache)
+       ("python-pytest-pycodestyle" ,python-pytest-pycodestyle)
 ;;       ("python-pytest-flakes" ,python-pytest-flakes)
        ))
     (arguments `(#:tests? #f))
diff --git a/gn/packages/emacs-xyz.scm b/gn/packages/emacs-xyz.scm
index 6d1e525..e524358 100644
--- a/gn/packages/emacs-xyz.scm
+++ b/gn/packages/emacs-xyz.scm
@@ -8,6 +8,7 @@
   #:use-module (guix build emacs-utils)
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages)
+  #:use-module (gnu packages emacs-build)
   #:use-module (gnu packages emacs-xyz)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages rust-apps)
@@ -20,6 +21,7 @@
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages gstreamer)
   #:use-module (gnu packages gnome)
+  #:use-module (gnu packages emacs-build)
   #:use-module (ice-9 match))
 
 (define-public emacs-trident-mode
diff --git a/gn/packages/fpga.scm b/gn/packages/fpga.scm
index 654b71d..b8c3537 100644
--- a/gn/packages/fpga.scm
+++ b/gn/packages/fpga.scm
@@ -1,5 +1,5 @@
 (define-module (gn packages fpga)
-  #:use-module (gnu packages fpga)
+  #:use-module (gnu packages electronics)
   #:use-module (guix git-download)
   #:use-module (guix packages))
 
diff --git a/gn/packages/genecup.scm b/gn/packages/genecup.scm
index 0cd776f..88e0879 100644
--- a/gn/packages/genecup.scm
+++ b/gn/packages/genecup.scm
@@ -7,7 +7,9 @@
   #:use-module (guix git-download)
   #:use-module (guix build-system python)
   #:use-module (gnu packages admin)
+  #:use-module (gnu packages base)
   #:use-module (gnu packages bioinformatics)
+  #:use-module (gnu packages compression)
   #:use-module (gnu packages javascript)
   #:use-module (gnu packages machine-learning)
   #:use-module (gnu packages python)
@@ -18,7 +20,8 @@
   #:use-module (gn packages javascript)
   #:use-module (gn packages machine-learning)
   #:use-module (gn packages python)
-  #:use-module (gn packages web))
+  #:use-module (gn packages web)
+  #:use-module (gn packages machine-learning))
 
 (define use-corrected-inputs
   (package-input-rewriting/spec
@@ -27,19 +30,6 @@
     `(("tensorflow" . ,(const tensorflow-native))
       ("python-h5py" . ,(const python-h5py-2)))))
 
-(define-public python-keras-no-tests
-  (hidden-package
-    (package
-      (inherit python-keras)
-      (source
-        (origin
-          (inherit (package-source python-keras))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments python-keras)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'check))))))))
-
 
 (define-public hrdp-project
   (package
@@ -153,6 +143,11 @@ if __name__ == '__main__':
            (lambda _
              (substitute* "server.py"
                (("4200") "4204"))))
+         ;; TODO: This should be disabled in the source.
+         (add-after 'unpack 'disable-debug-mode
+           (lambda _
+             (substitute* "server.py"
+               (("debug=True") "debug=False"))))
          (add-after 'unpack 'make-files-writable
            (lambda _
              (for-each make-file-writable (find-files "."))))
@@ -179,6 +174,10 @@ if __name__ == '__main__':
                  (("https.*1.12.9/umd/popper.min.js.*\\\">") "/static/popper.min.js\">"))
                (substitute* "ratspub.py"
                  (("hostname") (string-append inetutils "/bin/hostname"))))))
+         (add-after 'unpack 'extract-pubmed-archive
+           (lambda _
+             (invoke "gzip" "-d" "minipubmed.tgz")
+             (invoke "tar" "xvf" "minipubmed.tar")))
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let ((out (assoc-ref outputs "out")))
@@ -230,13 +229,15 @@ if __name__ == '__main__':
     (inputs
      `(("edirect" ,edirect)
        ("inetutils" ,inetutils)
+       ("gzip" ,gzip)
+       ("tar" ,tar)
        ("python-bcrypt" ,python-bcrypt)
        ("python-flask-sqlalchemy" ,python-flask-sqlalchemy)
        ("python-keras" ,python-keras-no-tests)
        ("python-nltk" ,python-nltk)
        ("python-pandas" ,python-pandas)
        ("python-regex" ,python-regex)
-       ("tensorflow" ,tensorflow)))
+       ("tensorflow" ,tensorflow-lite)))
     (native-inputs
      `(("bootstrap" ,web-bootstrap)
        ("cytoscape" ,javascript-cytoscape-3.17)
@@ -263,7 +264,7 @@ concepts and a list of keywords for each concept.")
     (version "HEAD-of-master-branch")
     (source
       (git-checkout
-        (url "https://github.com/hakangunturkun/GeneCup")
+        (url "https://git.genenetwork.org/genecup")
         (branch "master")))))
 
 (define-public genecup-with-tensorflow-native
diff --git a/gn/packages/genenetwork.scm b/gn/packages/genenetwork.scm
index 2b7ca51..1d22a59 100644
--- a/gn/packages/genenetwork.scm
+++ b/gn/packages/genenetwork.scm
@@ -11,6 +11,7 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system python)
   #:use-module (guix build-system trivial)
+  #:use-module (guix build-system pyproject)
   #:use-module (guix graph)
   #:use-module (guix scripts graph)
   #:use-module (guix store)
@@ -18,11 +19,13 @@
   #:use-module (guix packages)
   #:use-module (gnu packages)
   #:use-module (gnu packages base)
+  #:use-module (gnu packages certs)
+  #:use-module ((gnu packages nss) #:select (nss-certs))
   #:use-module (gnu packages bioconductor)
   #:use-module (gnu packages bioinformatics)
   #:use-module (gnu packages check)
   #:use-module (gnu packages cran)
-  #:use-module (gnu packages crates-io)
+  #:use-module (past-crates packages crates-io)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages ghostscript)
@@ -38,6 +41,7 @@
   #:use-module (gnu packages python-science)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages python-science)
   #:use-module (gnu packages rdf)
   #:use-module (gnu packages rust)
   #:use-module (gnu packages scheme)
@@ -47,15 +51,17 @@
   #:use-module (gnu packages version-control)
   #:use-module (gnu packages web)
   #:use-module (gnu packages xml)
+  #:use-module (gnu packages serialization)
   #:use-module (gn packages bioinformatics)
   #:use-module (gn packages crates-io)
   #:use-module (gn packages gemma)
   #:use-module (gn packages javascript)
+  #:use-module (gn packages node)
   #:use-module (gn packages python)
   #:use-module (gn packages statistics)
   #:use-module (gn packages web)
-  #:use-module (gn packages python-web)
-  #:use-module (srfi srfi-1))
+  #:use-module (srfi srfi-1)
+  #:use-module (gn packages databases))
 
 
 (define-public rust-qtlreaper
@@ -112,7 +118,7 @@
       ((#:tests? _ #f) #f)))))
 
 (define-public genenetwork3
-  (let ((commit "9f27bdc3ca41e09a090093bc36f48851fcc4fc42")
+  (let ((commit "019282e64fb401f7a6823f3c8914d1d6e5ad0233")
         (revision "5"))
     (package
       (name "genenetwork3")
@@ -126,7 +132,7 @@
          (file-name (git-file-name name version))
          (sha256
           (base32
-           "10j5afdfi258s1icakrid9fanp4rrpf1scxdqik31hbvyk7qdvfy"))))
+           "1rr2y4i93kpc998a123d32yaakqmqiv5b7n4xva01j6jfqjsgw9s"))))
       (inputs
        (list python-click))
       (native-inputs
@@ -135,19 +141,22 @@
              python-mypy-extensions
              python-pylint))
       (propagated-inputs
-       (list csvdiff
+       (list gn-libs
+             csvdiff
+	     coreutils-minimal
              diffutils
+             nss-certs
              gemma-wrapper
              gn-rust-correlation
+             gunicorn
              python-argon2-cffi
              python-authlib
-             python-bcrypt ;; Replace use of bcrypt with argon
              python-biopython
              python-email-validator
              python-flask
              python-flask-cors
              python-lmdb
-             python-mysqlclient
+             python-mysqlclient-2.2.7
              python-numpy
              python-pandas
              python-pingouin-without-tests
@@ -167,9 +176,11 @@
              r-ctl
              r-optparse
              r-qtl
+	     r-qtl2
              r-rjson
              r-stringi
              r-wgcna
+	     r-thor
              rust-qtlreaper))
       (build-system python-build-system)
       (arguments
@@ -184,8 +195,39 @@
       (description "GeneNetwork3 API for data science and machine learning.")
       (license license:agpl3+))))
 
+
+(define-public temporary-python-flask-session
+  ;; This is a stop-gap to get the applications building with the guix channel
+  ;; set to 61428cc.
+  ;; Remove this as soon as the applications are building with mainline
+  ;; python-flask-session.
+  (package
+    (name "temporary-python-flask-session")
+    (version "0.8.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "flask_session" version))
+       (sha256
+        (base32
+         "1zs20zpq6gxz9gsccbd2jrrbbcfvh0x9z9741gkr8dhh07mlbq10"))))
+    (build-system pyproject-build-system)
+    (arguments
+     '(#:tests? #f)) ; Tests require the various storage backends to be present
+    (inputs
+     (list python-flit-core))
+    (propagated-inputs
+     (list python-cachelib python-flask python-msgspec))
+    (home-page "https://github.com/fengsp/flask-session")
+    (synopsis "Adds server-side session support to your Flask application")
+    (description
+     "Flask-Session is an extension for Flask that adds support for
+Server-side sessions, with a variety of different backends for session
+storage.")
+    (license license:bsd-3)))
+
 (define-public genenetwork2
-  (let ((commit "deb8d7241f1ca05865fababc2799ead9a684f8be")
+  (let ((commit "e2f9e829bffcbffc5934e6b11685e5631fd7a001")
         (revision "4"))
     (package
       (name "genenetwork2")
@@ -198,12 +240,14 @@
                 (file-name (string-append name "-" version))
                 (sha256
                  (base32
-                  "1hvxn88jc9r4h88kgna6jahs66cpkc39vq10qcqcnwa09ghyban1"))))
+                  "13bcq0ya9sjpf3lx2gdzwsm0ya3y0l4qq48198bqinjbh6avqq1f"))))
       (native-inputs
        (list graphviz))
       (propagated-inputs
-       (list genenetwork3
+       (list gn-libs
+             genenetwork3
              coreutils
+             nss-certs
              gemma
              gemma-wrapper
              git
@@ -211,6 +255,7 @@
              gn-rust-correlation
              grep
              gunicorn
+	     javascript-ace
              javascript-bootstrap
              javascript-chroma
              javascript-ckeditor
@@ -230,8 +275,13 @@
              javascript-datatables-col-resize
              javascript-datatables-plugins
              javascript-datatables-scroller
+	     javascript-diff
+	     javascript-diff2html
+	     javascript-diff2html-ui
              javascript-font-awesome
              javascript-htmx
+	     javascript-highlight
+	     javascript-highlight-ui
              javascript-jquery
              javascript-jquery-cookie
              javascript-jquery-ui
@@ -239,6 +289,8 @@
              javascript-jszip
              javascript-linkify
              javascript-linkify-html
+	     javascript-marked
+	     javascript-marked-highlight
              javascript-nouislider
              javascript-nvd3
              javascript-plotly
@@ -250,6 +302,8 @@
              javascript-uikit
              javascript-underscore-string
              javascript-zxcvbn
+	     javascript-xterm
+	     javascript-xterm-style
              js-jstat
              js-md5
              js-parsley
@@ -267,17 +321,17 @@
              python-cssselect
              python-flask
              python-flask-debugtoolbar
-             python-flask-session
+             ;;python-flask-session
+             temporary-python-flask-session
              python-htmlgen
              python-ijson
              python-jinja2
              python-lxml
              python-markdown
              python-mypy
-             python-mysqlclient
+             python-mysqlclient-2.2.7
              python-numpy
              python-pandas
-             python-pillow
              python-pylint
              python-pymonad
              python-pytest
@@ -285,13 +339,14 @@
              python-rdflib
              python-redis
              python-requests
-             python-rpy2
+             ;; python-rpy2 ; restore once python-rpy2 dependencies get upstream
+             python-rpy2-patched ; remove this once python-rpy2 is fixed upstream
              python-scipy
              python-setuptools
              python-simplejson
-             python-sqlalchemy
              python-wrapper
              python-xlsxwriter
+	     python-pillow-9
              r
              r-ctl
              r-qtl
@@ -299,8 +354,6 @@
              redis
              rust-qtlreaper
              which
-             ; javascript-xterm -- disabled until we know what to do with it, not working on production
-             ; javascript-xterm-style
              ; javascript-xterm-addon-fit
              ))
       (inputs
@@ -326,21 +379,6 @@
                        (("\\./gn2/wqflask/static/gif/error")
                         (string-append (site-packages inputs outputs)
                                        "/gn2/wqflask/static/gif/error")))))
-                 (add-after 'unpack 'fix-paths-scripts
-                   (lambda _
-                     (substitute* "bin/genenetwork2"
-                       (("/usr/bin/env") (which "env"))
-                       (("python ") (string-append (which "python3") " "))
-                       (("readlink") (which "readlink"))
-                       (("dirname") (which "dirname"))
-                       (("basename") (which "basename"))
-                       (("cat") (which "cat"))
-                       (("echo") (which "echo"))
-                       (("redis-server") (which "redis-server"))
-                       (("git") (which "git"))
-                       (("grep") (which "grep"))
-                       (("rm") (which "rm"))
-                       (("which") (which "which")))))
                  (add-before 'install 'fix-paths
                    (lambda* (#:key inputs #:allow-other-keys)
                      (let* ((plink2cmd (string-append (assoc-ref inputs "plink-ng-gn") "/bin/plink2"))
@@ -419,8 +457,8 @@
      ))))))
 
 (define-public gn-uploader
-  (let ((commit "60fde66e02dba842b20fa126ff3b2ed9ec2638e6")
-       (version "0.0.1"))
+  (let ((commit "c4494da2e81780bbeeac8936d1fe1aede01cf73c")
+       (version "0.1.1"))
     (package
      (name "gn-uploader")
      (version (string-append version "-" (string-take commit 8)))
@@ -430,33 +468,47 @@
        (uri (git-reference
             (url "https://git.genenetwork.org/gn-uploader")
             (commit commit)))
+       (file-name (git-file-name name version))
        (hash
        (content-hash
         (base32
-         "1q04viyf7d0q30k3424hrzsh9wxhhgs7hywlhzl3m68jki4zq1i7")))))
+         "0fhhpvxaj0anh21pqabikv5wmd1cj3nx2j1bcd9ld8q3ykmm8a9s")))))
      (build-system python-build-system)
      (arguments
       (list
        #:phases
        #~(modify-phases %standard-phases
-                       (replace 'check
-                                (lambda* (#:key tests? #:allow-other-keys)
-                                        (when tests?
-                                          (invoke "pytest" "-m" "unit_test")))))))
+           (replace 'check
+             (lambda* (#:key tests? #:allow-other-keys)
+               (when tests?
+                 (invoke "pytest" "-m" "unit_test" "-n" "auto")))))))
      (native-inputs
       (list python-mypy
             python-pylint
             python-pytest
-            python-hypothesis))
+            python-hypothesis
+            python-pytest-xdist))
      (propagated-inputs
-      (list gunicorn
+      (list gn-libs
+            gunicorn
+            nss-certs
+            python-lxml
             python-redis
             python-flask
             python-pyyaml
+            python-authlib
+            python-pymonad
             python-jsonpickle
-            python-mysqlclient
-            javascript-jquery
-            javascript-bootstrap))
+            python-mysqlclient-2.2.7
+            ;;python-flask-session
+            temporary-python-flask-session
+            web-bootstrap-5
+            javascript-jquery-1
+            javascript-datatables-bootstrap5
+            javascript-datatables-select
+            javascript-datatables-buttons-3
+            javascript-datatables-scroller-2
+            node-resumablejs))
      (synopsis "GeneNetwork Quality Control Application")
      (description
       "gn-uploader is a service allowing upload of new data into GeneNetwork,
@@ -466,50 +518,101 @@
      (license license:agpl3+))))
 
 (define-public gn-auth
-  (package
-    (name "gn-auth")
-    (version "1.0.1")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-            (url "https://git.genenetwork.org/gn-auth")
-            (commit "c8658a764cf30605c6e5a1361dcd09ddd422e371")))
-       (hash
-       (content-hash
-        (base32
-         "1hc95p0nif1r973f61qixm1dxahnczsj9iy9r3d26jn8xv1lfz53")))))
-    (build-system python-build-system)
-    (arguments
-     (list
-      #:phases
-      #~(modify-phases %standard-phases
-         (replace 'check
-           (lambda* (#:key tests? #:allow-other-keys)
-             (when tests?
-              (invoke "pytest" "-k" "unit_test")))))))
-    (native-inputs
-     (list python-hypothesis
-           python-mypy
-           python-mypy-extensions
-           python-pylint
-           python-pytest
-           python-pytest-mock))
-    (propagated-inputs
-     (list gunicorn
-           python-argon2-cffi
-           python-authlib
-           python-email-validator
-           python-flask
-           python-flask-cors
-           python-mysqlclient
-           python-pymonad
-           python-redis
-           yoyo-migrations))
-    (home-page "https://github.com/genenetwork/gn-auth")
-    (synopsis "Authentication and Authorisation server for GeneNetwork services")
-    (description "Authentication and Authorisation server for GeneNetwork services.")
-    (license license:agpl3+)))
+  (let ((commit "9839e5bf35bd7be158b35fa98a734f7a3473688d")
+        (revision "01"))
+    (package
+      (name "gn-auth")
+      (version (git-version "1.0.1" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://git.genenetwork.org/gn-auth")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (hash
+          (content-hash
+           (base32
+            "1lsi7z8hvpdqgcsx3zc5ip701xka9s75c7r4pjlby2ryjc0gw83d")))))
+      (build-system python-build-system)
+      (arguments
+       (list
+        #:phases
+        #~(modify-phases %standard-phases
+            (replace 'check
+              (lambda* (#:key tests? #:allow-other-keys)
+                (when tests?
+                  (invoke "pytest" "-m" "unit_test" "-n" "auto")))))))
+      (native-inputs
+       (list python-hypothesis
+             python-mypy
+             python-mypy-extensions
+             python-pylint
+             python-pytest
+             python-pytest-mock
+             python-pytest-xdist))
+      (propagated-inputs
+       (list gn-libs
+             gunicorn
+             nss-certs
+             python-blinker
+             python-argon2-cffi
+             python-authlib
+             python-email-validator
+             python-flask
+             python-flask-cors
+             python-mysqlclient-2.2.7
+             python-pymonad
+             python-redis
+             yoyo-migrations))
+      (home-page "https://github.com/genenetwork/gn-auth")
+      (synopsis "Authentication and Authorisation server for GeneNetwork services")
+      (description "Authentication and Authorisation server for GeneNetwork services.")
+      (license license:agpl3+))))
+
+
+(define-public gn-libs
+  (let ((commit "894021d27da14bfb0bf286e188a36741bc475906")
+        (revision "02"))
+    (package
+      (name "gn-libs")
+      (version (git-version "0.0.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://git.genenetwork.org/gn-libs")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (hash
+          (content-hash
+           (base32
+            "0ysj8cs259naa0s6s0gr8149qj6zra3iq0n1fspq3bw0ij54wf8i")))))
+      (build-system pyproject-build-system)
+      (arguments
+       (list
+        #:phases
+        #~(modify-phases %standard-phases
+            (replace 'check
+              (lambda* (#:key tests? #:allow-other-keys)
+                (when tests?
+                  (invoke "pytest" "-k" "unit_test")))))))
+      (native-inputs
+       (list python-mypy
+             python-wheel
+             python-pylint
+             python-pytest
+             python-setuptools))
+      (propagated-inputs
+       (list python-authlib
+             python-pymonad
+             python-requests
+             python-mysqlclient-2.2.7))
+      (home-page "https://github.com/genenetwork/gn-libs")
+      (synopsis "Tools/utilities for GeneNetwork projects.")
+      (description "A collection of tools and utilities used across multiple
+GeneNetwork projects.")
+      (license license:agpl3+))))
 
 ;; ./pre-inst-env guix download http://files.genenetwork.org/raw_database/db_webqtl_s.zip
 ;; 0sscjh0wml2lx0mb43vf4chg9gpbfi7abpjxb34n3kyny9ll557x
diff --git a/gn/packages/guile.scm b/gn/packages/guile.scm
new file mode 100644
index 0000000..815df1f
--- /dev/null
+++ b/gn/packages/guile.scm
@@ -0,0 +1,256 @@
+(define-module (gn packages guile)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix gexp)
+  #:use-module (guix packages)
+  #:use-module (guix git-download)
+  #:use-module (guix build-system guile)
+  #:use-module (guix build-system gnu)
+  #:use-module ((gnu packages autotools) #:select (libltdl autoconf automake libtool))
+  #:use-module ((gnu packages bash) #:select (bash-minimal))
+  #:use-module ((gnu packages databases) #:select (mariadb))
+  #:use-module ((gnu packages compression) #:select (zlib))
+  #:use-module ((gnu packages perl) #:select (perl))
+  #:use-module ((gnu packages texinfo) #:select (texinfo))
+  #:use-module ((gnu packages version-control) #:select (git-minimal))
+  #:use-module (guix utils)
+  #:use-module (gnu packages build-tools)
+  #:use-module (gnu packages package-management)
+  #:use-module ((gnu packages bash) #:select (bash-minimal))
+  #:use-module ((gnu packages bioinformatics) #:select (gemma))
+  #:use-module ((gnu packages nss) #:select (nss-certs))
+  #:use-module ((gnu packages guile) #:select (guile-json-4 guile-3.0 guile-2.2 guile-readline))
+  #:use-module ((gnu packages guile-xyz) #:select (guile-dbi guile-dbd-mysql guile-fibers guile-redis guile-hashing guile-commonmark guile-lmdb guile-lib))
+  #:use-module ((gnu packages parallel) #:select (parallel))
+  #:use-module ((gnu packages perl) #:select (perl))
+  #:use-module ((gnu packages tls) #:select (guile-gnutls openssl)))
+
+;; Lifted from:
+;; https://lists.gnu.org/archive/html/artanis/2023-03/txtNk7zz7rJAN.txt
+(define-public guile3-dbi
+  (package
+    (name "guile3-dbi")
+    (version "2.1.8")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/opencog/guile-dbi")
+                    (commit (string-append "guile-dbi-" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "123m4j82bi60s1v95pjh4djb7bh6zdwmljbpyg7zq8ni2gyal7lw"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:modules (((guix build guile-build-system)
+                   #:select (target-guile-effective-version))
+                  ,@%default-gnu-imported-modules)
+       #:imported-modules ((guix build guile-build-system)
+                           ,@%default-gnu-imported-modules)
+       #:configure-flags
+       (list (string-append
+              "--with-guile-site-dir=" %output "/share/guile/site/"
+              (target-guile-effective-version (assoc-ref %build-inputs "guile"))))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'chdir
+           (lambda _
+             ;; The upstream Git repository contains all the code, so change
+             ;; to the directory specific to guile-dbi.
+             (chdir "guile-dbi")))
+         (add-after 'install 'patch-extension-path
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (dbi.scm (string-append out "/share/guile/site/"
+                                            (target-guile-effective-version
+                                             (assoc-ref inputs "guile"))
+                                            "/dbi/dbi.scm"))
+                    (ext (string-append out "/lib/libguile-dbi")))
+               (substitute* dbi.scm (("libguile-dbi") ext))))))))
+    (inputs
+     (list libltdl))
+    (native-inputs
+     (list autoconf automake libtool perl texinfo guile-3.0))
+    (synopsis "Guile database abstraction layer")
+    (home-page "https://github.com/opencog/guile-dbi")
+    (description
+     "guile-dbi is a library for Guile that provides a convenient interface to
+SQL databases.  Database programming with guile-dbi is generic in that the same
+programming interface is presented regardless of which database system is used.
+It currently supports MySQL, Postgres and SQLite3.")
+    (license license:gpl2+)
+    (native-search-paths
+     (list (search-path-specification
+            (variable "GUILE_DBD_PATH")
+            (files '("lib")))))))
+
+(define-public guile3-dbd-mysql
+  (package
+    (inherit guile3-dbi)
+    (name "guile3-dbd-mysql")
+    (arguments
+     (substitute-keyword-arguments (package-arguments guile3-dbi)
+       ((#:phases phases)
+        `(modify-phases ,phases
+           (replace 'chdir
+             (lambda _
+               ;; The upstream Git repository contains all the code, so change
+               ;; to the directory specific to guile-dbd-mysql.
+               (chdir "guile-dbd-mysql")))
+           (add-after 'chdir 'patch-src
+             (lambda _
+               (substitute* "configure.ac"
+                 (("mariadbclient") "mariadb"))
+               (substitute* "src/guile-dbd-mysql.c"
+                 (("<mariadb/") "<mysql/"))))
+           (delete 'patch-extension-path)))))
+    (inputs
+     (modify-inputs (package-inputs guile3-dbi)
+       (prepend `(,mariadb "dev")
+                `(,mariadb "lib")
+                zlib)))
+    (native-inputs
+     (modify-inputs (package-native-inputs guile3-dbi)
+       (prepend guile3-dbi		; only required for headers
+                )))
+    (synopsis "Guile DBI driver for MySQL")
+    (description "@code{guile-dbi} is a library for Guile that provides a
+convenient interface to SQL databases.  This package implements the interface
+for MySQL.")
+    (license license:gpl2+)))
+
+(define-public gn-guile
+  (let ((commit "454244b774ece37f04f146c74353ea4ec35d43e1")
+	(revision "0"))
+    (package
+      (name "gn-guile")
+      (version (git-version "4.0.0" revision commit))
+      (source (origin
+		(method git-fetch)
+		(uri (git-reference
+		      (url "https://git.genenetwork.org/gn-guile/")
+		      (commit commit)))
+		(file-name (string-append name "-" version))
+		(sha256
+		 (base32
+                  "1n1zjpwfksq8bf42d7xr7lnblgsbqc0yszkbid253s943fyxzhfn"))))
+      (build-system guile-build-system)
+      (native-inputs (list guile-3.0))
+      (propagated-inputs
+       (list guile-3.0 guile3-dbi guile3-dbd-mysql guile-fibers guile-gnutls guile-readline
+	     guile-commonmark guile-redis openssl nss-certs gemma parallel guile-hashing
+	     guile-json-4 bash-minimal git-minimal guile-lmdb guile-lib))
+      (arguments
+       (list
+	#:not-compiled-file-regexp "(guix|guix/.*)[.]scm$"
+	#:modules '((srfi srfi-1)
+		    (ice-9 popen)
+		    (guix build guile-build-system)
+		    (guix build utils))
+	#:phases
+	#~(modify-phases %standard-phases
+	    (add-after 'unpack 'patch-git
+	      (lambda* (#:key inputs #:allow-other-keys)
+		(let ((git (assoc-ref inputs "git-minimal")))
+		  (substitute* "web/view/markdown.scm"
+		    (("\"git\"") (string-append "\"" git "/bin/git" "\""))
+		    (("git -C") (string-append git "/bin/git -C"))))))
+	    (add-after 'build 'install-script
+	      (lambda* _
+		(let* ((bash #$(this-package-input "bash-minimal"))
+		       (bash (string-append bash "/bin/bash"))
+		       (guile #$(this-package-input "guile"))
+		       (guile (string-append guile "/bin/guile"))
+		       (build-guile #$(this-package-native-input "guile"))
+                       (build-guile (string-append build-guile "/bin/guile"))
+		       (guile3-dbi #$(this-package-input "guile3-dbi"))
+		       (guile3-dbd-mysql #$(this-package-input "guile3-dbd-mysql"))
+		       (guile-fibers #$(this-package-input "guile-fibers"))
+		       (guile-gnutls #$(this-package-input "guile-gnutls"))
+		       (guile-readline #$(this-package-input "guile-readline"))
+		       (guile-commonmark #$(this-package-input "guile-commonmark"))
+		       (guile-redis #$(this-package-input "guile-redis"))
+		       (guile-hashing #$(this-package-input "guile-hashing"))
+		       (guile-json-4 #$(this-package-input "guile-json"))
+		       (guile-lmdb #$(this-package-input "guile-lmdb"))
+		       (guile-lib #$(this-package-input "guile-lib"))
+		       (out #$output)
+		       (bin (string-append out "/bin"))
+		       (effective (read
+                                   (open-pipe* OPEN_READ
+                                               build-guile "-c"
+                                               "(write (effective-version))")))
+		       (path (list (string-append guile "/bin")))
+		       (webserver (string-append
+				   out
+				   "/share/guile/site/"
+				   effective
+				   "/web/webserver.scm"))
+                       (scm-dir (string-append "/share/guile/site/" effective))
+		       (guile-inputs (list guile3-dbi
+					   guile3-dbd-mysql
+					   guile-lmdb
+					   guile-lib
+					   guile-fibers
+					   guile-gnutls
+					   guile-readline
+					   guile-commonmark
+					   guile-redis
+					   guile-hashing
+					   guile-json-4))
+		       (scm-dev-path
+			(cons*
+			 "./"
+			 (map (lambda (x) (string-append x scm-dir))
+			      guile-inputs)))
+		       (scm-path
+			(map (lambda (x) (string-append x scm-dir))
+			     (cons* out guile-inputs)))
+                       (go-dir (string-append "/lib/guile/" effective
+                                              "/site-ccache/"))
+		       (go-dev-path
+			(map (lambda (x) (string-append x go-dir))
+			     guile-inputs))
+		       (go-path
+			(map (lambda (x) (string-append x go-dir))
+			     (cons* out guile-inputs))))
+		  (mkdir-p "bin")
+		  (copy-file "gn-guile.sh" "bin/gn-guile")
+		  (copy-file "gn-guile.sh" "bin/gn-guile-dev")
+		  (copy-file "scripts/lmdb-publishdata-export.scm"
+			     "bin/lmdb-publishdata-export")
+		  (substitute* "bin/gn-guile"
+			       (("@SHELL@") bash)
+			       (("guile") guile)
+			       (("web/webserver.scm") webserver))
+		  (substitute* "bin/gn-guile-dev"
+		    (("@SHELL@") bash)
+		    (("guile") guile)
+		    (("web/webserver.scm") "./web/webserver.scm"))
+		  (chmod "bin/gn-guile" #o755)
+		  (chmod "bin/gn-guile-dev" #o755)
+		  (chmod "bin/lmdb-publishdata-export" #o755)
+		  (install-file "bin/gn-guile" bin)
+		  (install-file "bin/gn-guile-dev" bin)
+		  (install-file "bin/lmdb-publishdata-export" bin)
+		  (wrap-script
+		   (string-append out "/bin/gn-guile")
+                   `("PATH" ":" prefix ,path)
+                   `("GUILE_AUTO_COMPILE" ":" = ("0"))
+                   `("GUILE_LOAD_PATH" ":" prefix ,scm-path)
+                   `("GUILE_LOAD_COMPILED_PATH" ":" prefix ,go-path))
+		  (wrap-script
+		   (string-append out "/bin/gn-guile-dev")
+                   `("PATH" ":" prefix ,path)
+                   `("GUILE_AUTO_COMPILE" ":" = ("0"))
+                   `("GUILE_LOAD_PATH" ":" prefix ,scm-dev-path)
+                   `("GUILE_LOAD_COMPILED_PATH" ":" prefix ,go-dev-path))
+		  (wrap-program
+		   (string-append out "/bin/lmdb-publishdata-export")
+                   `("PATH" ":" prefix ,path)
+                   `("GUILE_AUTO_COMPILE" ":" = ("0"))
+                   `("GUILE_LOAD_PATH" ":" prefix ,scm-path)
+                   `("GUILE_LOAD_COMPILED_PATH" ":" prefix ,go-path))))))))
+      (home-page "https://git.genenetwork.com/gn-guile")
+      (synopsis "Next generation GN code in guile")
+      (description "Use of guile.")
+      (license license:gpl3))))
diff --git a/gn/packages/java.scm b/gn/packages/java.scm
index f39c5c7..fe63083 100644
--- a/gn/packages/java.scm
+++ b/gn/packages/java.scm
@@ -31,6 +31,7 @@
   #:use-module (gnu packages bash)
   #:use-module (gnu packages bioinformatics)
   #:use-module (gnu packages certs)
+  #:use-module ((gnu packages nss) #:select (nss-certs))
   #:use-module (gnu packages compression)
   #:use-module (gnu packages cups)
   #:use-module (gnu packages gcc)
diff --git a/gn/packages/javascript.scm b/gn/packages/javascript.scm
index 7f9f35d..059999b 100644
--- a/gn/packages/javascript.scm
+++ b/gn/packages/javascript.scm
@@ -373,6 +373,107 @@ Javascript library, adding sorting, paging and filtering abilities to plain HTML
 tables with minimal effort.")
     (license license:expat)))
 
+
+(define-public javascript-datatables-2.2.2
+  (package
+    (name "javascript-datatables-2.2.2")
+    (version "2.2.2")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/DataTables/Dist-DataTables.git")
+               (commit version)))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "1pzpkpybcf9p81j8afyhrmq11l9lskzxhikdv7h7sb55vx98xn9s"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder
+       (begin
+         (use-modules (guix build utils))
+         (let* ((out (assoc-ref %outputs "out"))
+                (targetdir (string-append out "/share/genenetwork2/javascript/DataTables"))
+                (source (assoc-ref %build-inputs "source")))
+           (copy-recursively source targetdir)))))
+    (propagated-inputs (list javascript-jquery-1))
+    (home-page "https://www.datatables.net/")
+    (synopsis "Tables plug-in for jQuery")
+    (description "DataTables is a table enhancing plug-in for the jQuery
+Javascript library, adding sorting, paging and filtering abilities to plain HTML
+tables with minimal effort.")
+    (license license:expat)))
+
+(define-public javascript-datatables-2.2 javascript-datatables-2.2.2)
+
+(define-public javascript-datatables-2 javascript-datatables-2.2)
+
+(define-public javascript-datatables-bootstrap5
+  (package
+    (name "javascript-datatables-bootstrap5")
+    (version "2.2.2")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/DataTables/Dist-DataTables-Bootstrap5.git")
+               (commit version)))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "0hx4m0fs0qkb73f1h3z4436dq8agrm67nib2lzac7pn8hfl09lll"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder
+       (begin
+         (use-modules (guix build utils))
+         (let* ((out (assoc-ref %outputs "out"))
+                (targetdir (string-append out "/share/genenetwork2/javascript/DataTables"))
+                (source (assoc-ref %build-inputs "source")))
+           (copy-recursively source targetdir)))))
+    (propagated-inputs (list javascript-jquery-1))
+    (home-page "https://www.datatables.net/")
+    (synopsis "Tables plug-in for jQuery")
+    (description "DataTables is a table enhancing plug-in for the jQuery
+Javascript library, adding sorting, paging and filtering abilities to plain HTML
+tables with minimal effort.  This package comes with Bootstrap5 integration
+ files for styling.")
+    (license license:expat)))
+
+(define-public javascript-datatables-select
+  (package
+    (name "javascript-datatables-select")
+    (version "3.0.0") ; November 12, 2024
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/DataTables/Dist-DataTables-Select.git")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "15czp4fhvijwc9jl961nmn8ad6ms30p3c8dgpda7l542aadca45x"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder
+       (begin
+         (use-modules (guix build utils))
+         (let* ((out (assoc-ref %outputs "out"))
+                (targetdir (string-append out "/share/genenetwork2/javascript/DataTablesExtensions/select/"))
+                (source (assoc-ref %build-inputs "source")))
+           (copy-recursively source targetdir)))))
+    (propagated-inputs (list javascript-datatables-2))
+    (home-page "https://datatables.net/extensions/select/")
+    (synopsis "Select adds item selection capabilities to a DataTable.")
+    (description "Select adds item selection capabilities to a DataTable.  Items
+ can be rows, columns or cells, which can be selected independently, or together.
+  Item selection can be particularly useful in interactive tables where users
+ can perform some action on the table, such as editing rows or marking items to
+ perform an action on.")
+    (license license:expat)))
+
 (define-public javascript-datatables-scroller-style
   (package
     (name "javascript-datatables-scroller-style")
@@ -402,6 +503,32 @@ tables with minimal effort.")
     (description "Scroller is a virtual rendering plug-in for DataTables which allows large datasets to be drawn on screen very quickly. Virtual rendering means is that only the visible portion of the table is drawn, while the scrolling container gives the visual impression that the whole table is visible, allowing excellent browser performance.")
     (license license:expat)))
 
+
+(define-public javascript-datatables-scroller-style-2.4.3
+  (package
+    (inherit javascript-datatables-scroller-style)
+    (name "javascript-datatables-scroller-style-2.4.3")
+    (version "2.4.3")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+              (url "https://github.com/DataTables/Dist-DataTables-Scroller-DataTables.git")
+               (commit version)))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "1b7m8xwbr05hglfy00kzv1vmqvvp9y8n1kyb3ka95gf7sllihhf9"))))
+    (propagated-inputs
+     (modify-inputs
+      (package-propagated-inputs javascript-datatables-scroller-style)
+      (delete "javascript-datatables")))))
+
+(define-public javascript-datatables-scroller-style-2.4
+  javascript-datatables-scroller-style-2.4.3)
+
+(define-public javascript-datatables-scroller-style-2
+  javascript-datatables-scroller-style-2.4)
+
 (define-public javascript-datatables-scroller
   (package
     (name "javascript-datatables-scroller")
@@ -434,34 +561,67 @@ tables with minimal effort.")
     (license license:expat)))
 
 
+(define-public javascript-datatables-scroller-2.4.3
+  (package
+    (inherit javascript-datatables-scroller)
+    (name "javascript-datatables-scroller-2.4.3")
+    (version "2.4.3")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+              (url "https://github.com/DataTables/Dist-DataTables-Scroller.git")
+               (commit version)))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "0ziwnwc0xbf8rsm6ibikc3a49hyq18l8ya0wmrwyba24pixhajxn"))))
+    (propagated-inputs
+     (modify-inputs
+      (package-propagated-inputs javascript-datatables-scroller-style)
+      (delete "javascript-datatables")
+      (delete "javascript-datatables-scroller-style")))))
+
+(define-public javascript-datatables-scroller-2.4
+  javascript-datatables-scroller-2.4.3)
+
+(define-public javascript-datatables-scroller-2
+  javascript-datatables-scroller-2.4)
+
+
 (define-public javascript-xterm
   (package
     (name "javascript-xterm")
-    (version "4.9.0") ; Jan 08 2021
+    (version "5.3.0") ; Feb 18 2024
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://cdn.jsdelivr.net/npm/xterm@" version
-                           "/lib/xterm.min.js"))
-       (file-name (string-append "xterm.min" version ".js"))
+       (uri
+        (string-append "https://registry.npmjs.org/xterm/-/xterm-"
+                       version
+                       ".tgz"))
        (sha256
-        (base32
-         "1ipk8l837pinl9151qcb39hfrjy5d7zzyf19nsfhv4wgavy8fcar"))))
-    (build-system trivial-build-system)
+        (base32 "11db21afvny4m8ar40jpbc5wb5kgx4wqcbha0w2ixbr8p1l82lhz"))))
+    (build-system minify-build-system)
     (arguments
-     `(#:modules ((guix build utils))
-       #:builder
-       (begin
-         (use-modules (guix build utils))
-         (let* ((out (assoc-ref %outputs "out"))
-                (targetdir
-                 (string-append out "/share/genenetwork2/javascript/xterm"))
-                (source (assoc-ref %build-inputs "source")))
-           (mkdir-p targetdir)
-           (copy-file source (string-append targetdir "/xterm.min.js"))))))
-    (propagated-inputs `(("source" ,source)))
+     `(#:phases
+       (modify-phases %standard-phases
+         (delete 'build) ; xterm.js is already minified
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             ;; copy the minified files
+             (let* ((source (getcwd))
+                    (out (assoc-ref outputs "out"))
+                    (js (string-append out "/share/genenetwork2/javascript/xterm")))
+               (mkdir-p js)
+               (for-each
+                (lambda (filename)
+                  (install-file filename js))
+                (append
+                 (find-files (string-append source "/lib"))))))))))
+    (native-inputs `(("source" ,source)))
     (home-page "https://xtermjs.org/")
-    (synopsis "Javascript library that allows apps to bring fully-featured terminals in browsers.")
+    (synopsis
+     "Javascript library that allows apps to bring fully-featured terminals in browsers.")
     (description
      "Xterm.js is a front-end component written in TypeScript that lets applications bring fully-featured terminals to their users in the browser. It's used by popular projects such as VS Code, Hyper and Theia.")
     (license license:expat)))
@@ -470,27 +630,41 @@ tables with minimal effort.")
   (package
     (inherit javascript-xterm)
     (name "javascript-xterm-style")
-    (version "4.9.0") ; Jan 08 2021
+    (version "5.3.0") ; Feb 18 2024
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://cdn.jsdelivr.net/npm/xterm@" version
-                           "/css/xterm.min.css"))
-       (file-name (string-append "xterm.min" version ".css"))
+       (uri
+        (string-append "https://registry.npmjs.org/xterm/-/xterm-"
+                       version
+                       ".tgz"))
        (sha256
-        (base32
-         "0nc7ysmfngzy1q1x4sasgnd5x91pqc00lgkajynz2gdan1rwsfk3"))))
+        (base32 "11db21afvny4m8ar40jpbc5wb5kgx4wqcbha0w2ixbr8p1l82lhz"))))
+    (build-system minify-build-system)
     (arguments
-     `(#:modules ((guix build utils))
-       #:builder
-       (begin
-         (use-modules (guix build utils))
-         (let* ((out (assoc-ref %outputs "out"))
-                (targetdir
-                 (string-append out "/share/genenetwork2/javascript/xterm"))
-                (source (assoc-ref %build-inputs "source")))
-           (mkdir-p targetdir)
-           (copy-file source (string-append targetdir "/xterm.min.css"))))))
+     `(#:javascript-files (list "css/xterm.css")
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'install 'rename-minified-css
+           (lambda* _
+             (for-each
+              (lambda (file)
+                (let* ((path-length (string-length file))
+                       (ext-length (string-length ".css.min.js")))
+                  (copy-recursively file
+                                    (string-replace file ".min.css" (- path-length ext-length)))))
+              (find-files (string-append (getcwd) "/guix/build")
+                          "\\.css\\.min\\.js$"))))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (js (string-append out "/share/genenetwork2/javascript/xterm")))
+               (mkdir-p js)
+               (for-each
+                (lambda (file)
+                  (install-file file js))
+                (find-files (string-append (getcwd) "/guix/build")
+                            "\\.min\\.css$"))))))))
     (native-inputs `(("source" ,source)))
     (synopsis "Style sheets for xtermjs")
     (description "Style sheets for xtermjs")
@@ -555,6 +729,30 @@ tables with minimal effort.")
     (description "The Buttons extension for DataTables provides a common set of options, API methods and styling to display buttons on a page that will interact with a DataTable. It also provides plug-ins for file export (HTML5 and Flash), print view and column visibility. Other libraries, such as Editor and Select also provide buttons specific to their use cases.")
     (license license:expat)))
 
+(define-public javascript-datatables-buttons-3.2.2
+  (package
+    (inherit javascript-datatables-buttons)
+    (name "javascript-datatables-buttons-3.2.2")
+    (version "3.2.2")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+              (url "https://github.com/DataTables/Dist-DataTables-Buttons.git")
+               (commit version)))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "1186xxj6yhjqh0p13nczj25pc3c15n1f5nirl6fy649rhp4q26xc"))))
+    (propagated-inputs
+     (modify-inputs (package-propagated-inputs javascript-datatables-buttons)
+       (delete "javascript-datatables")))))
+
+(define-public javascript-datatables-buttons-3.2
+  javascript-datatables-buttons-3.2.2)
+
+(define-public javascript-datatables-buttons-3
+  javascript-datatables-buttons-3.2)
+
 (define-public javascript-datatables-buttons-styles
   (package
     (name "javascript-datatables-buttons-styles")
@@ -867,6 +1065,25 @@ visualization components and a data-driven approach to DOM manipulation.")
                (dist (string-append source "/dist")))
           (copy-recursively dist targetdir)))))))
 
+(define-public javascript-jquery-1.12.4
+  (package
+    (inherit javascript-jquery)
+    (name "javascript-jquery-1.12.4")
+    (version "1.12.4")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/jquery/jquery.git")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "02qgvwsyvvr6liijj1xyypq02svbwjlk8m9yr9dgd4hzfs50rlhq"))))))
+
+(define-public javascript-jquery-1.12 javascript-jquery-1.12.4)
+
+(define-public javascript-jquery-1 javascript-jquery-1.12)
+
 (define-public javascript-d3js-4
   (package
     (inherit javascript-d3js)
@@ -2026,66 +2243,83 @@ vector graphics.")
     "A low-level markdown compiler for parsing markdown without caching or blocking for long periods of time.")
    (license license:expat)))
 
+
 (define-public javascript-marked-highlight
   (package
-   (name "javascript-marked-highlight")
-   (version "2.0.6")
-   (source
-    (origin
-     (method url-fetch)
-     (uri (string-append "https://cdn.jsdelivr.net/npm/marked-highlight@" version "/lib/index.umd.min.js"))
-     (sha256
-      (base32
-       "087qcy77fm3r7dl6w0mxsqygmdpimrmksw78r4wkkkjdx9x9dshf"))))
-   (build-system trivial-build-system)
-   (arguments
-    `(#:modules ((guix build utils))
-      #:builder
-      (begin
-	(use-modules (guix build utils))
-	(let* ((out (assoc-ref %outputs "out"))
-	       (targetdir
-		(string-append out "/share/genenetwork2/javascript/marked"))
-	       (source (assoc-ref %build-inputs "source")))
-	  (mkdir-p targetdir)
-	  (copy-file source (string-append targetdir "/marked-highlight.js"))))))
-   (native-inputs `(("source" ,source)))
-   (home-page "https://github.com/markedjs/marked-highlight")
-   (synopsis "Highlight code blocks.")
-   (description
-    "Add code highlighting to marked.")
-   (license license:expat)))
+    (name "javascript-marked-highlight")
+    (version "2.0.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/markedjs/marked-highlight/archive/refs/tags/v"
+             version ".tar.gz"))
+       (sha256
+        (base32 "14pvaknic0pwh1ll7i0z66mi2gviww35palmk03xidyywlbvwklr"))))
+    (build-system minify-build-system)
+    (arguments
+     `(#:javascript-files (list "src/index.js")
+       #:phases (modify-phases %standard-phases
+                  (add-before 'install 'rename-minified-js
+                    (lambda* _
+                      (for-each (lambda (file)
+                                  ;; rename to "marked-highlight.js"
+                                  (copy-recursively file
+                                                    (string-append (dirname
+                                                                    file)
+                                                     "/marked-highlight.js")))
+                                (find-files (string-append (getcwd)
+                                                           "/guix/build")
+                                            "\\.min\\.js$"))))
+                  (replace 'install
+                    (lambda* (#:key outputs #:allow-other-keys)
+                      (use-modules (guix build utils))
+                      (let* ((out (assoc-ref outputs "out"))
+                             (targetdir (string-append out
+                                         "/share/genenetwork2/javascript/marked")))
+                        (mkdir-p targetdir)
+                        (for-each (lambda (file)
+                                    (install-file file targetdir))
+                                  (find-files (string-append (getcwd)
+                                                             "/guix/build")
+                                              "marked-highlight\\.js$"))))))))
+    (home-page "https://github.com/markedjs/marked-highlight")
+    (synopsis "Code highlighting extension for Marked")
+    (description
+     "This package provides a plugin for the Marked Markdown parser that adds
+syntax highlighting support for fenced code blocks.")
+    (license license:expat)))
+
 
 (define-public javascript-ace
   (package
-   (name "javascript-ace")
-   (version "1.31.1")
-   (source
-    (origin
-     (method git-fetch)
-     (uri (git-reference
-	   (url "https://github.com/ajaxorg/ace-builds.git")
-	   (commit (string-append "v" version))))
-     (file-name (git-file-name name version))
-     (sha256
-      (base32 "08rfyrjfjjgb42x4if5qqfyvv8ag2qmf6vsbs7qrcnzgrac66m35"))))
-   (build-system trivial-build-system)
-   (arguments
-    `(#:modules ((guix build utils))
-      #:builder
-      (begin
-	(use-modules (guix build utils))
-	(let* ((out (assoc-ref %outputs "out"))
-	       (targetdir (string-append out "/share/genenetwork2/javascript/ace"))
-	       (source (assoc-ref %build-inputs "source"))
-	       (dist (string-append source "/src-min-noconflict")))
-	  (copy-recursively dist targetdir)))))
-   (native-inputs `(("source" ,source)))
-   (home-page "https://github.com/ajaxorg/ace-builds")
-   (synopsis "Ace is a code editor written in JavaScript.")
-   (description
-    "Ace is a code editor written in JavaScript. ")
-   (license license:expat)))
+    (name "javascript-ace")
+    (version "1.31.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/ajaxorg/ace-builds.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "08rfyrjfjjgb42x4if5qqfyvv8ag2qmf6vsbs7qrcnzgrac66m35"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder (begin
+                   (use-modules (guix build utils))
+                   (let* ((out (assoc-ref %outputs "out"))
+                          (targetdir (string-append out
+                                      "/share/genenetwork2/javascript/ace"))
+                          (source (assoc-ref %build-inputs "source"))
+                          (dist (string-append source "/src-min-noconflict")))
+                     (copy-recursively dist targetdir)))))
+    (native-inputs `(("source" ,source)))
+    (home-page "https://github.com/ajaxorg/ace-builds")
+    (synopsis "Ace is a code editor written in JavaScript.")
+    (description "Ace is a code editor written in JavaScript. ")
+    (license license:bsd-3)))
 
 (define-public javascript-uikit
   (package
@@ -2178,3 +2412,145 @@ for developing fast and powerful web interfaces.")
    (description
     "JavaScript plugin for finding links in plain-text and highlightinging links within strings that contain HTML markup.")
    (license license:expat)))
+
+(define-public javascript-diff2html
+  (package
+    (name "javascript-diff2html")
+    (version "3.4.48")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://cdn.jsdelivr.net/npm/diff2html@" version
+                           "/bundles/js/diff2html.min.js"))
+       (sha256
+        (base32 "02sqk3i5l1viw2dq2c2z4ja9mgsn9cks9l4ln1fsw4y91fw1m6n5"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder (begin
+                   (use-modules (guix build utils))
+                   (let* ((source (assoc-ref %build-inputs "source"))
+                          (out (assoc-ref %outputs "out"))
+                          (targetdir (string-append out
+                                      "/share/genenetwork2/javascript/diff2html")))
+                     (mkdir-p targetdir)
+                     (copy-file source
+                                (string-append targetdir "/diff2html.min.js"))))))
+    (native-inputs `(("source" ,source)))
+    (home-page "https://diff2html.xyz/")
+    (synopsis "Diff parser and pretty html generator.")
+    (description
+     "diff2html generates pretty HTML diffs from git diff or unified diff output.")
+    (license license:expat)))
+
+(define-public javascript-diff2html-ui
+  (package
+    (inherit javascript-diff2html)
+    (name "javascript-diff2html-ui")
+    (version "3.4.48")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://cdn.jsdelivr.net/npm/diff2html@" version
+                           "/bundles/css/diff2html.min.css"))
+       (sha256
+        (base32 "0y05qm8si1nd5l9q67il36p6q1xkbffrzlp7q6pli9sraghlmh10"))))
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder (begin
+                   (use-modules (guix build utils))
+                   (let* ((out (assoc-ref %outputs "out"))
+                          (targetdir (string-append out
+                                      "/share/genenetwork2/javascript/diff2html"))
+                          (source (assoc-ref %build-inputs "source")))
+                     (mkdir-p targetdir)
+                     (copy-file source
+                                (string-append targetdir "/diff2html.min.css"))))))
+    (native-inputs `(("source" ,source)))))
+
+(define-public javascript-diff
+  (package
+    (name "javascript-diff")
+    (version "5.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://cdn.jsdelivr.net/npm/diff@" version
+                           "/dist/diff.min.js"))
+       (sha256
+        (base32 "0zvbllgfyq8x3hjkygc9fd0gqqkbvz6qa02mcilvs6djfj9vsa9s"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder (begin
+                   (use-modules (guix build utils))
+                   (let* ((source (assoc-ref %build-inputs "source"))
+                          (out (assoc-ref %outputs "out"))
+                          (targetdir (string-append out
+                                      "/share/genenetwork2/javascript/jsdiff")))
+                     (mkdir-p targetdir)
+                     (copy-file source
+                                (string-append targetdir "/diff.min.js"))))))
+    (native-inputs `(("source" ,source)))
+    (home-page "https://github.com/kpdecker/jsdiff#readme")
+    (synopsis "A JavaScript text differencing implementation. ")
+    (description "A JavaScript text differencing implementation.")
+    (license license:bsd-3)))
+
+(define-public javascript-highlight
+  (package
+    (name "javascript-highlight")
+    (version "11.10.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/" version
+             "/highlight.min.js"))
+       (sha256
+        (base32 "0cpdabxn5hbij3ci5gb769mi0qmmxvgqxi6d1x2ay1y4j2pgj7j7"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder (begin
+                   (use-modules (guix build utils))
+                   (let* ((out (assoc-ref %outputs "out"))
+                          (targetdir (string-append out
+                                      "/share/genenetwork2/javascript/highlight"))
+                          (source (assoc-ref %build-inputs "source")))
+                     (mkdir-p targetdir)
+                     (copy-file source
+                                (string-append targetdir "/highlight.min.js"))))))
+    (native-inputs `(("source" ,source)))
+    (home-page "https://highlightjs.org/")
+    (synopsis "Highlight.js is a syntax highlighter written in JavaScript.")
+    (description
+     "JavaScript syntax highlighter with language auto-detection and zero dependencies.")
+    (license license:bsd-3)))
+
+(define-public javascript-highlight-ui
+  (package
+    (inherit javascript-highlight)
+    (name "javascript-highlight-ui")
+    (version "11.10.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/" version
+             "/styles/default.min.css"))
+       (sha256
+        (base32 "1ky70fgj8ixlr9h01w4g3fyj6yl8khqyfchmqibc71hxjb00mppv"))))
+    (build-system trivial-build-system)
+    (arguments
+     `(#:modules ((guix build utils))
+       #:builder (begin
+                   (use-modules (guix build utils))
+                   (let* ((out (assoc-ref %outputs "out"))
+                          (targetdir (string-append out
+                                      "/share/genenetwork2/javascript/highlight"))
+                          (source (assoc-ref %build-inputs "source")))
+                     (mkdir-p targetdir)
+                     (copy-file source
+                                (string-append targetdir "/default.min.css"))))))
+    (native-inputs `(("source" ,source)))))
diff --git a/gn/packages/julia.scm b/gn/packages/julia.scm
index a00244f..0557dfc 100644
--- a/gn/packages/julia.scm
+++ b/gn/packages/julia.scm
@@ -2784,3 +2784,50 @@ that still support Julia versions older than 1.6.")
     (synopsis "binary provider for Julia")
     (description "Packages are installed to a @code{Prefix}; a folder that acts similar to the @code{/usr/local} directory on Unix-like systems, containing a @code{bin} folder for binaries, a @code{lib} folder for libraries, etc... @code{Prefix} objects can have tarballs @code{install()}'ed within them, @code{uninstall()}'ed from them, etc...")
     (license license:expat)))
+
+(define-public julia-progressmeter
+  (package
+    (name "julia-progressmeter")
+    (version "1.11.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/timholy/ProgressMeter.jl")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0mgsq5ynqd35yldmafmbcmch0xdjqyga4wb1lllqfffsipj8ki4k"))))
+    (build-system julia-build-system)
+    (home-page "https://github.com/timholy/ProgressMeter.jl")
+    (synopsis "Progress meter for long-running computations")
+    (description "@code{julia-progressmeter} provides a progress meter
+for long-running computations.")
+    (license license:expat)))
+
+(define-public julia-jwas
+  (package
+    (name "julia-jwas")
+    (version "1.2.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+              (url "https://github.com/reworkhow/JWAS.jl")
+              (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0mbs8h98bb503x0k3xf4n11h8lwnnyz9y757b8dgx888jf1firv1"))))
+    (build-system julia-build-system)
+    (propagated-inputs
+     (list julia-csv
+           julia-dataframes
+           julia-distributions
+           julia-forwarddiff
+           julia-progressmeter))
+    (home-page "https://github.com/reworkhow/JWAS.jl")
+    (synopsis "Julia whole-genome analysis library")
+    (description "@code{julia-jwas} is an open-source software tool
+ written in Julia for Bayesian multiple regression methods applied to
+genomic prediction and genome-wide association studies.")
+    (license license:gpl2)))
diff --git a/gn/packages/jupyterhub.scm b/gn/packages/jupyterhub.scm
index 322999b..2779d3e 100644
--- a/gn/packages/jupyterhub.scm
+++ b/gn/packages/jupyterhub.scm
@@ -7,6 +7,7 @@
   #:use-module (gnu packages check)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages docker)
+  #:use-module (gnu packages jupyter)
   #:use-module (gnu packages libffi)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages monitoring)
@@ -16,6 +17,7 @@
   #:use-module (gnu packages python-crypto)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages jupyter)
   #:use-module (gnu packages rpc)
   #:use-module (gnu packages serialization)
   #:use-module (gnu packages time)
diff --git a/gn/packages/machine-learning.scm b/gn/packages/machine-learning.scm
index 8f9f1f0..541b3b6 100644
--- a/gn/packages/machine-learning.scm
+++ b/gn/packages/machine-learning.scm
@@ -2,14 +2,24 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix utils)
-  #:use-module (gnu packages machine-learning))
+  #:use-module (gnu packages machine-learning)
+  #:use-module (guix download)
+  #:use-module (guix build-system python)
+  #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages graphviz)
+  #:use-module (gnu packages python-science)
+  #:use-module (gnu packages check)
+  #:use-module (gnu packages python-check)
+  #:use-module (gnu packages sphinx)
+  #:use-module (gnu packages python-web)
+  #:use-module (past packages python27))
 
 (define-public tensorflow-native
   (package
-    (inherit tensorflow)
+    (inherit tensorflow-lite)
     (name "tensorflow-native")
     (arguments
-     (substitute-keyword-arguments (package-arguments tensorflow)
+     (substitute-keyword-arguments (package-arguments tensorflow-lite)
        ((#:substitutable? _ #f) #f)
        ((#:configure-flags flags)
         `(cons
@@ -19,3 +29,163 @@
 
 (define-public tensowflow-native-instead-of-tensorflow
   (package-input-rewriting/spec `(("tensorflow" . ,(const tensorflow-native)))))
+
+
+(define-public python-keras-applications
+  (package
+    (name "python-keras-applications")
+    (version "1.0.8")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "Keras_Applications" version))
+       (sha256
+        (base32
+         "1rcz31ca4axa6kzhjx4lwqxbg4wvlljkj8qj9a7p9sfd5fhzjyam"))))
+    (build-system python-build-system)
+    ;; The tests require Keras, but this package is needed to build Keras.
+    (arguments '(#:tests? #f))
+    (propagated-inputs
+     (list python-h5py python-numpy))
+    (native-inputs
+     (list python-pytest python-pytest-cov
+           python-pytest-xdist))
+    (home-page "https://github.com/keras-team/keras-applications")
+    (synopsis "Reference implementations of popular deep learning models")
+    (description
+     "This package provides reference implementations of popular deep learning
+models for use with the Keras deep learning framework.")
+    (license license:expat)))
+
+
+(define-public python-keras-preprocessing
+  (package
+    (name "python-keras-preprocessing")
+    (version "1.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "Keras_Preprocessing" version))
+       (sha256
+        (base32
+         "1r98nm4k1svsqjyaqkfk23i31bl1kcfcyp7094yyj3c43phfp3as"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     (list python-numpy python-six))
+    (native-inputs
+     (list python-pandas
+           python-pillow
+           python-pytest
+           python-pytest-cov
+           python-pytest-xdist
+           tensorflow-lite))
+    (home-page "https://github.com/keras-team/keras-preprocessing/")
+    (synopsis "Data preprocessing and augmentation for deep learning models")
+    (description
+     "Keras Preprocessing is the data preprocessing and data augmentation
+module of the Keras deep learning library.  It provides utilities for working
+with image data, text data, and sequence data.")
+    (license license:expat)))
+
+
+(define-public python-keras-no-tests
+  (package
+    (name "python-keras-no-tests")
+    (version "2.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "Keras" version))
+       (sha256
+        (base32
+         "1k68xd8n2y9ldijggjc8nn4d6d1axw0p98gfb0fmm8h641vl679j"))
+       (modules '((guix build utils)))
+       (snippet
+        '(substitute* '("keras/callbacks/callbacks.py"
+                        "keras/engine/training_utils.py"
+                        "keras/engine/training.py"
+                        "keras/engine/training_generator.py"
+                        "keras/utils/generic_utils.py")
+           (("from collections import Iterable")
+            "from collections.abc import Iterable")
+           (("collections.Container")
+            "collections.abc.Container")
+           (("collections.Mapping")
+            "collections.abc.Mapping")
+           (("collections.Sequence")
+            "collections.abc.Sequence")))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'tf-compatibility
+           (lambda _
+             (substitute* "keras/backend/tensorflow_backend.py"
+               (("^get_graph = .*")
+                "get_graph = tf.get_default_graph")
+               (("tf.compat.v1.nn.fused_batch_norm")
+                "tf.nn.fused_batch_norm")
+               ;; categorical_crossentropy does not support axis
+               (("from_logits=from_logits, axis=axis")
+                "from_logits=from_logits")
+               ;; dropout accepts a level number, not a named rate argument.
+               (("dropout\\(x, rate=level,")
+                "dropout(x, level,")
+               (("return x.shape.rank")
+                "return len(x.shape)"))))
+         (add-after 'unpack 'hdf5-compatibility
+           (lambda _
+             ;; The truth value of an array with more than one element is ambiguous.
+             (substitute* "tests/keras/utils/io_utils_test.py"
+               ((" *assert .* == \\[b'(asd|efg).*") ""))
+             (substitute* "tests/test_model_saving.py"
+               (("h5py.File\\('does not matter',")
+                "h5py.File('does not matter', 'w',"))
+             (substitute* "keras/utils/io_utils.py"
+               (("h5py.File\\('in-memory-h5py', driver='core', backing_store=False\\)")
+                "h5py.File('in-memory-h5py', 'w', driver='core', backing_store=False)")
+               (("h5file.fid.get_file_image")
+                "h5file.id.get_file_image"))
+             (substitute* "keras/engine/saving.py"
+               (("\\.decode\\('utf-?8'\\)") ""))))
+         (add-after 'unpack 'delete-unavailable-backends
+           (lambda _
+             (delete-file "keras/backend/theano_backend.py")
+             (delete-file "keras/backend/cntk_backend.py")))
+         (delete 'check))))
+    (propagated-inputs
+     (list python-h5py
+           python-keras-applications
+           python-keras-preprocessing
+           python-numpy
+           python-pydot
+           python-pyyaml
+           python-scipy
+           python-six
+           tensorflow-lite
+           graphviz))
+    (native-inputs
+     (list python-flaky
+           python-markdown
+           python-pandas
+           python-pytest
+           python-pytest-cov
+           python-pytest-timeout
+           python-pytest-xdist
+           python-pyux
+           python-sphinx
+           python-requests))
+    (home-page "https://keras.io/")
+    (synopsis "High-level deep learning framework")
+    (description "Keras is a high-level neural networks API, written in Python
+and capable of running on top of TensorFlow.  It was developed with a focus on
+enabling fast experimentation.  Use Keras if you need a deep learning library
+that:
+@itemize
+@item Allows for easy and fast prototyping (through user friendliness,
+  modularity, and extensibility).
+@item Supports both convolutional networks and recurrent networks, as well as
+  combinations of the two.
+@item Runs seamlessly on CPU and GPU.
+@end itemize\n")
+    (license license:expat)))
diff --git a/gn/packages/mouse-longevity.scm b/gn/packages/mouse-longevity.scm
new file mode 100644
index 0000000..f11a7b9
--- /dev/null
+++ b/gn/packages/mouse-longevity.scm
@@ -0,0 +1,87 @@
+;;; guix-bioinformatics --- Bioinformatics packages for GNU Guix
+;;; Copyright © 2024 jgart <jgart@dismail.de>
+;;;
+;;; This file is part of guix-bioinformatics.
+;;;
+;;; genenetwork-machines is free software: you can redistribute it
+;;; and/or modify it under the terms of the GNU General Public License
+;;; as published by the Free Software Foundation, either version 3 of
+;;; the License, or (at your option) any later version.
+;;;
+;;; genenetwork-machines is distributed in the hope that it will be
+;;; useful, but WITHOUT ANY WARRANTY; without even the implied
+;;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+;;; See the GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with genenetwork-machines.  If not, see
+;;; <https://www.gnu.org/licenses/>.
+
+(define-module (gn packages mouse-longevity)
+  #:use-module (guix)
+  #:use-module (gnu)
+  #:use-module (gnu services shepherd)
+  #:use-module (gn services rshiny)
+  #:use-module (guix git-download)
+  #:use-module (guix modules)
+  #:use-module (guix records)
+  #:use-module (srfi srfi-1)
+  #:use-module (ice-9 match)
+  #:use-module (gnu packages cran)
+  #:use-module (gnu packages statistics)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix build-system trivial)
+  #:use-module ((gnu packages admin) #:select (shepherd))
+  #:use-module ((gnu packages web) #:select (nginx)))
+
+(define-public mouse-longevity-app
+  (let ((commit "8a7fdd353e1babcdc3c0453bdfba2aa0dead7c3f")
+        (revision "2"))
+    (package
+      (name "mouse-longevity-app")
+      (version (git-version "0.0.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://git.genenetwork.org/mouse-longevity-app/")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32 "1bmiq9xmsq8wgxv3nqg3r2j1kwy2m6pw8agapj31agbyw81agyna"))))
+      (build-system trivial-build-system)
+      (arguments
+       (list #:modules '((guix build utils))
+             #:builder
+             #~(begin
+                 (use-modules (guix build utils))
+                 (let* ((source    (assoc-ref %build-inputs "source"))
+                        (targetdir (string-append #$output "/share/" #$name))
+                        (app       (string-append #$output "/bin/" #$name))
+                        (Rbin      (search-input-file %build-inputs "/bin/Rscript")))
+                   (copy-recursively source targetdir)
+                   (mkdir-p (string-append #$output "/bin"))
+                   (call-with-output-file app
+                     (lambda (port)
+                       (format port
+                               "#!~a
+library(shiny)
+setwd(\"~a\")
+runApp(launch.browser=0, port=3979)~%\n"
+                               Rbin targetdir)))
+                   (chmod app #o555)))))
+      (propagated-inputs
+       (list r
+             r-ggplot2
+             r-dplyr
+             r-plotly
+             r-shinydashboard
+             ;; TODO: https://ci.genenetwork.org/jobs/genenetwork3/581
+             ;; r-shinydashboardplus
+             r-shinyjs
+             r-shiny))
+      (home-page "https://github.com/Dashbrook/Mouse_Longevity_app/")
+      (synopsis "R shiny app to visualize mouse lifespan data")
+      (description
+       "This package provides an R shiny app to visualize mouse strain
+longevity data.")
+      (license license:gpl3+))))
diff --git a/gn/packages/node.scm b/gn/packages/node.scm
index 4d338cc..4e12781 100644
--- a/gn/packages/node.scm
+++ b/gn/packages/node.scm
@@ -1584,3 +1584,26 @@ from C are supported as well as some other extensions from Ruby.")
     (synopsis "the mighty option parser used by yargs")
     (description "the mighty option parser used by yargs.")
     (license license:isc)))
+
+
+(define-public node-resumablejs
+  (let ((commit "b7580789f4d19bb180c08389538e0733f0f811d8"))
+    (package
+      (name "node-resumablejs")
+      (version (string-append "1.1.0-" (string-take commit 7)))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/23/resumable.js.git")
+               (commit commit)))
+         (file-name (git-file-name name version ))
+         (sha256
+          (base32
+           "0d0883jmsr2ydchx10y9a2vcijix7g65k1243s5ryl3i3jacm1bm"))))
+      (build-system node-build-system)
+      (arguments '(#:tests? #f))
+      (home-page "https://github.com/23/resumable.js/")
+      (synopsis "JavaScript library providing multiple simultaneous, stable and resumable uploads via the HTML5 File API")
+      (description "A JavaScript library providing multiple simultaneous, stable and resumable uploads via the HTML5 File API.")
+      (license license:expat))))
diff --git a/gn/packages/ocaml.scm b/gn/packages/ocaml.scm
index 7c6020a..cb97868 100644
--- a/gn/packages/ocaml.scm
+++ b/gn/packages/ocaml.scm
@@ -40,9 +40,9 @@
                  "0nzp43hp8pbjqkrxnwp5lgjrabxayf61h18fjaydi0s5faq6f3xh"))))
      (build-system ocaml-build-system)
      (inputs
-      `(("gsl" ,gsl-static)))
+      (list (list gsl "static")))
      (native-inputs
-      `(("ocamlbuild" ,ocamlbuild)))
+      (list ocamlbuild))
      (arguments '())
      (propagated-inputs '()))))
 
diff --git a/gn/packages/pangenome.scm b/gn/packages/pangenome.scm
index c66b594..5c5ef00 100644
--- a/gn/packages/pangenome.scm
+++ b/gn/packages/pangenome.scm
@@ -5,7 +5,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system cargo)
-  #:use-module (gnu packages crates-io)
+  #:use-module (past-crates packages crates-io)
   #:use-module (gn packages crates-io))
 
 
diff --git a/gn/packages/patches/python-unittest2-python3-compat.patch b/gn/packages/patches/python-unittest2-python3-compat.patch
new file mode 100644
index 0000000..68fbcca
--- /dev/null
+++ b/gn/packages/patches/python-unittest2-python3-compat.patch
@@ -0,0 +1,46 @@
+Skip tests that fail with newer versions of Python.
+
+Patch copied from Gentoo:
+
+https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-python/unittest2/files/unittest2-1.1.0-python3.5-test.patch
+
+diff --git a/unittest2/test/test_loader.py b/unittest2/test/test_loader.py
+index 683f662..347eea5 100644
+--- a/unittest2/test/test_loader.py
++++ b/unittest2/test/test_loader.py
+@@ -509,6 +509,7 @@ class Test_TestLoader(unittest2.TestCase):
+     #
+     # What happens when an impossible name is given, relative to the provided
+     # `module`?
++    @unittest.skipIf(sys.version_info[:2] >= (3, 5), "python 3.5 has problems here")
+     def test_loadTestsFromName__relative_malformed_name(self):
+         loader = unittest.TestLoader()
+ 
+@@ -811,6 +812,7 @@ class Test_TestLoader(unittest2.TestCase):
+     # TestCase or TestSuite instance."
+     #
+     # What happens when presented with an impossible module name?
++    @unittest.skipIf(sys.version_info[:2] >= (3, 5), "python 3.5 has problems here")
+     def test_loadTestsFromNames__malformed_name(self):
+         loader = unittest2.TestLoader()
+ 
+@@ -918,6 +920,7 @@ class Test_TestLoader(unittest2.TestCase):
+     # "The method optionally resolves name relative to the given module"
+     #
+     # What happens when presented with an impossible attribute name?
++    @unittest.skipIf(sys.version_info[:2] >= (3, 5), "python 3.5 has problems here")
+     def test_loadTestsFromNames__relative_malformed_name(self):
+         loader = unittest.TestLoader()
+ 
+diff --git a/unittest2/compatibility.py b/unittest2/compatibility.py
+index 9e5f1a5..2d20c19 100644
+--- a/unittest2/compatibility.py
++++ b/unittest2/compatibility.py
+@@ -140,6 +140,6 @@ except ImportError:
+ ###  ChainMap (helper for configparser and string.Template)
+ ########################################################################
+ 
+-class ChainMap(collections.MutableMapping):
++class ChainMap(collections.abc.MutableMapping):
+     ''' A ChainMap groups multiple dicts (or other mappings) together
+     to create a single, updateable view.
diff --git a/gn/packages/patches/python-unittest2-remove-argparse.patch b/gn/packages/patches/python-unittest2-remove-argparse.patch
new file mode 100644
index 0000000..c967387
--- /dev/null
+++ b/gn/packages/patches/python-unittest2-remove-argparse.patch
@@ -0,0 +1,11 @@
+--- a/setup.py	2017-09-12 01:22:06.273997788 +0200
++++ b/setup.py	2017-09-12 01:22:14.297918757 +0200
+@@ -57,7 +57,7 @@
+ # Both install and setup requires - because we read VERSION from within the
+ # package, and the package also exports all the APIs.
+ # six for compat helpers
+-REQUIRES = ['argparse', 'six>=1.4', 'traceback2'],
++REQUIRES = ['six>=1.4', 'traceback2'],
+ 
+ params = dict(
+     name=NAME,
diff --git a/gn/packages/python-web.scm b/gn/packages/python-web.scm
deleted file mode 100644
index 88478a5..0000000
--- a/gn/packages/python-web.scm
+++ /dev/null
@@ -1,40 +0,0 @@
-(define-module (gn packages python-web)
-  ;; core guix packages
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix build-system python)
-  #:use-module ((guix licenses) #:prefix license:)
-  ;; packages modules
-  #:use-module (gnu packages django)
-  #:use-module (gnu packages databases)
-  #:use-module (gnu packages python-web)
-  #:use-module (gnu packages python-crypto))
-
-(define-public python-authlib
-  (package
-   (name "python-authlib")
-   (version "1.2.0")
-   (source (origin
-            (method url-fetch)
-            (uri (pypi-uri "Authlib" version))
-            (sha256
-             (base32
-              "178ycfypdv1hy4zjm09rmysxakmwch2n6a5wypwmx4d5hc4fi8sg"))))
-   (build-system python-build-system)
-   (native-inputs (list python-httpx
-			python-flask
-			python-django
-			python-werkzeug
-			python-starlette
-			python-sqlalchemy
-			python-pycryptodomex))
-   (propagated-inputs (list python-cryptography))
-   (arguments `(#:tests? #f)) ;; temporarily deactivate tests
-   (home-page "https://authlib.org/")
-   (synopsis
-    "The ultimate Python library in building OAuth and OpenID Connect servers and clients.")
-   (description
-    "The ultimate Python library in building OAuth and OpenID Connect servers and
-clients. It is designed from low level specifications implementations to high
-level frameworks integrations, to meet the needs of everyone.")
-   (license license:bsd-3)))
diff --git a/gn/packages/python.scm b/gn/packages/python.scm
index e7cfdd7..54d45a4 100644
--- a/gn/packages/python.scm
+++ b/gn/packages/python.scm
@@ -3,11 +3,13 @@
   #:use-module (gnu packages)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages cran)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages ghostscript)
   #:use-module (gnu packages icu4c)
   #:use-module (gnu packages image)
+  #:use-module (gnu packages jupyter)
   #:use-module (gnu packages libffi)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages maths)
@@ -22,7 +24,9 @@
   #:use-module (gnu packages python-crypto)
   #:use-module (gnu packages python-science)
   #:use-module (gnu packages python-web)
-  #:use-module ((gnu packages python-xyz) #:hide (python2-six))
+  #:use-module (gnu packages jupyter)
+  #:use-module (gnu packages cran)
+  #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages rdf)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages serialization)
@@ -38,7 +42,8 @@
   #:use-module (guix utils)
   #:use-module (guix build-system pyproject)
   #:use-module (guix build-system python)
-  #:use-module (srfi srfi-1))
+  #:use-module (srfi srfi-1)
+  #:use-module (gn packages check))
 
 (define-public python-rpy2-2.9
   (package
@@ -1703,19 +1708,26 @@ window to get to RStudio for example.")
 (define-public python-flask-debugtoolbar
   (package
     (name "python-flask-debugtoolbar")
-    (version "0.11.0")
+    (version "0.16.0")
     (source
      (origin
        (method url-fetch)
-       (uri (pypi-uri "Flask-DebugToolbar" version))
+       (uri (string-append
+	     "https://github.com/pallets-eco/flask-debugtoolbar/archive/refs/tags/"
+	     version
+	     ".tar.gz"))
        (sha256
         (base32
-         "1d5asdnk8bmh6m46pzg3i7677cjgdm9mlm3wcpk19q7dak9pjkiw"))))
-    (build-system python-build-system)
+         "1qk8kga6gjlwc0c0hr1i500rhm1qfa4gqq3djy40j95fiz1idkgy"))))
+    (build-system pyproject-build-system)
+    (native-inputs
+     `(("python-pytest" ,python-pytest)))
     (propagated-inputs
      `(("python-blinker" ,python-blinker)
        ("python-flask" ,python-flask)
+       ("python-flit-core" ,python-flit-core)
        ("python-itsdangerous" ,python-itsdangerous)
+       ("python-flask-sqlalchemy" ,python-flask-sqlalchemy)
        ("python-werkzeug" ,python-werkzeug)))
     (home-page
      "https://flask-debugtoolbar.readthedocs.io/")
@@ -1955,3 +1967,60 @@ and messages in larger desktop or server-based applications.")
 implementation of the built-in float which supports formatted output with
 SI (decimal) and IEC (binary) prefixes.")
     (license license:mpl2.0)))
+
+
+(define-public python-pillow-9
+  (package
+    (name "python-pillow-9")
+    (version "9.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "Pillow" version))
+       (sha256
+        (base32 "011wgm1mssjchpva9wsi2a07im9czyjvik137xlp5f0g7vykdrkm"))
+       (modules '((guix build utils)))
+       (snippet '(begin
+                   (delete-file-recursively "src/thirdparty")))
+       (patches (search-patches "python-pillow-CVE-2022-45199.patch"
+                                ;; Included in 10.1.0.
+                                "python-pillow-use-zlib-1.3.patch"))))
+    (build-system python-build-system)
+    (native-inputs (list python-pytest))
+    (inputs (list freetype
+                  lcms
+                  libjpeg-turbo
+                  libtiff
+                  libwebp
+                  openjpeg
+                  zlib))
+    (propagated-inputs (list python-olefile))
+    (arguments
+     `(#:tests? #f
+       #:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'patch-ldconfig
+                    (lambda _
+                      (substitute* "setup.py"
+                        (("\\['/sbin/ldconfig', '-p'\\]")
+                         "['true']"))))
+                  (replace 'check
+                    (lambda* (#:key outputs inputs tests? #:allow-other-keys)
+                      (when tests?
+                        (setenv "HOME"
+                                (getcwd))
+                        (add-installed-pythonpath inputs outputs)
+                        (invoke "python" "selftest.py" "--installed")
+                        (invoke "python" "-m" "pytest" "-vv")))))))
+    (home-page "https://python-pillow.org")
+    (synopsis "Fork of the Python Imaging Library")
+    (description
+     "The Python Imaging Library adds image processing capabilities to your
+Python interpreter.  This library provides extensive file format support, an
+efficient internal representation, and fairly powerful image processing
+capabilities.  The core image library is designed for fast access to data
+stored in a few basic pixel formats.  It should provide a solid foundation for
+a general image processing tool.")
+    (properties `((cpe-name . "pillow")))
+    (license (license:x11-style
+              "http://www.pythonware.com/products/pil/license.htm"
+              "The PIL Software License"))))
diff --git a/gn/packages/r-shiny.scm b/gn/packages/r-shiny.scm
index 898ee72..c2e61a6 100644
--- a/gn/packages/r-shiny.scm
+++ b/gn/packages/r-shiny.scm
@@ -1,6 +1,10 @@
 (define-module (gn packages r-shiny)
   #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix download)
+  #:use-module (guix build-system r)
   #:use-module (guix packages)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (gnu packages bioconductor)
   #:use-module (gnu packages cran)
   #:use-module (gnu packages javascript))
 
@@ -12,3 +16,46 @@
 
 (define-public js-es5-shim-2
   (deprecated-package "js-es5-shim" js-es5-shim))
+
+
+(define-public r-runit
+  (package
+    (name "r-runit")
+    (version "0.4.33")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "RUnit" version))
+       (sha256
+        (base32 "0pybwvd57vf71vvlxdrynw5n6s5gnbqnwvq0qpd395ggqypwb95j"))))
+    (properties `((upstream-name . "RUnit")))
+    (build-system r-build-system)
+    (home-page "https://cran.r-project.org/package=RUnit")
+    (synopsis "R Unit Test Framework")
+    (description
+     "R functions implementing a standard Unit Testing framework, with additional code
+inspection and report generation tools.")
+    (license license:gpl2)))
+
+(define-public r-org-rn-eg-db ; used by jumpshiny service
+  (package
+    (name "r-org-rn-eg-db")
+    (version "3.20.0")
+    (source (origin
+              (method url-fetch)
+              (uri (bioconductor-uri "org.Rn.eg.db" version 'annotation))
+              (sha256
+               (base32
+                "009c22ry5nnklzdc5dywnf8lq41cj3141yr5vw1kgifys6lanj01"))))
+    (properties
+     `((upstream-name . "org.Rn.eg.db")))
+    (build-system r-build-system)
+    (propagated-inputs
+     (list r-annotationdbi))
+    (native-inputs (list r-runit))
+    (home-page "https://www.bioconductor.org/packages/org.Rn.eg.db/")
+    (synopsis "Genome wide annotation for Rat")
+    (description
+     "This package provides mappings from Entrez gene identifiers to various
+annotations for the genome of the rat.")
+    (license license:artistic2.0)))
diff --git a/gn/packages/ruby.scm b/gn/packages/ruby.scm
index befb550..4b5d903 100644
--- a/gn/packages/ruby.scm
+++ b/gn/packages/ruby.scm
@@ -29,7 +29,11 @@
   #:use-module (gnu packages python)
   #:use-module (gnu packages ragel)
   #:use-module (gnu packages rails)
+  #:use-module (gnu packages rdf)
   #:use-module (gnu packages ruby)
+  #:use-module (gnu packages ruby-check)
+  #:use-module (gnu packages ruby-xyz)
+  #:use-module (gnu packages ruby-check)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages version-control)
   #:use-module (guix packages)
@@ -5972,16 +5976,16 @@ Simple gem that adds various color methods to String class, and can be used as f
     "http://github.com/pjotrp/regressiontest")
   (license license:expat)))
 
-(define-public ruby-lmdb
+(define-public ruby-lmdb ; note you may need to explicitly use ruby@3.3.8 to run the extension - the guix default
   (package
    (name "ruby-lmdb")
-   (version "0.6.1")
+   (version "0.6.5")
    (source (origin
             (method url-fetch)
             (uri (rubygems-uri "lmdb" version))
             (sha256
              (base32
-              "0yzlf56ynj545ln5dxl422rpi8r6h11cr6rag5hk2qpbkzs6l9c2"))))
+              "094vwmp97av17k9sf8f42i308240a8aikbp3hf1f8wabcy7c7ar2"))))
    (build-system ruby-build-system)
    (inputs
     (list lmdb))
@@ -5996,4 +6000,270 @@ Simple gem that adds various color methods to String class, and can be used as f
    (synopsis "lmdb is a Ruby binding to OpenLDAP Lightning MDB.")
    (description "lmdb is a Ruby binding to OpenLDAP Lightning MDB.")
    (home-page "https://github.com/doriantaylor/rb-lmdb")
-   (license license:expat)))
+   (license license:expat))) ;; note that all these license statements need to be checked!
+
+
+(define-public ruby-unicode-types
+  (package
+    (name "ruby-unicode-types")
+    (version "1.10.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "unicode-types" version))
+       (sha256
+        (base32 "1mif6v3wlfpb69scikpv7i4zq9rhj19px23iym6j8m3wnnh7d2wi"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))
+    (synopsis
+     "[Unicode 16.0.0] Determines the very basic type of codepoints (one of: Graphic, Format, Control, Private-use, Surrogate, Noncharacter, Reserved)")
+    (description
+     "[Unicode 16.0.0] Determines the very basic type of codepoints (one of: Graphic,
+Format, Control, Private-use, Surrogate, Noncharacter, Reserved).")
+    (home-page "https://github.com/janlelis/unicode-types")
+    (license license:expat)))
+
+(define-public ruby-sxp
+  (package
+    (name "ruby-sxp")
+    (version "2.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "sxp" version))
+       (sha256
+        (base32 "08a7ha191gdc1n1pwaqgsx133wy1p1g4fchkhr5gx0jannx1p5vr"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))
+    (propagated-inputs (list ruby-matrix ruby-rdf))
+    (synopsis
+     "Universal S-expression parser with specific support for Common Lisp, Scheme, and RDF/SPARQL")
+    (description
+     "Universal S-expression parser with specific support for Common Lisp, Scheme, and
+RDF/SPARQL.")
+    (home-page "https://github.com/dryruby/sxp")
+    (license license:expat)))
+
+(define-public ruby-scanf
+  (package
+    (name "ruby-scanf")
+    (version "1.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "scanf" version))
+       (sha256
+        (base32 "000vxsci3zq8m1wl7mmppj7sarznrqlm6v2x2hdfmbxcwpvvfgak"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))
+    (synopsis "scanf is an implementation of the C function scanf(3).")
+    (description "scanf is an implementation of the C function scanf(3).")
+    (home-page "https://github.com/ruby/scanf")
+    (license license:expat)))
+
+(define-public ruby-ebnf
+  (package
+    (name "ruby-ebnf")
+    (version "2.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "ebnf" version))
+       (sha256
+        (base32 "0gpnphpp7qcdjh9vrj8bfrb3k54lq7pk7p23w92wr1d8r8ba6ip7"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))
+    (propagated-inputs (list ruby-base64
+                             ruby-htmlentities
+                             ruby-rdf
+                             ruby-scanf
+                             ruby-sxp
+                             ruby-unicode-types))
+    (synopsis
+     "EBNF is a Ruby parser for W3C EBNF and a parser generator for PEG and LL(1). Also includes parsing modes for ISO EBNF and ABNF.")
+    (description
+     "EBNF is a Ruby parser for W3C EBNF and a parser generator for PEG and LL(1).
+Also includes parsing modes for ISO EBNF and ABNF.")
+    (home-page "https://github.com/dryruby/ebnf")
+    (license license:expat)))
+
+(define-public ruby-bigdecimal
+  (package
+    (name "ruby-bigdecimal")
+    (version "3.2.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "bigdecimal" version))
+       (sha256
+        (base32 "1p2szbr4jdvmwaaj2kxlbv1rp0m6ycbgfyp0kjkkkswmniv5y21r"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))
+    (synopsis
+     "This library provides arbitrary-precision decimal floating-point number class.")
+    (description
+     "This library provides arbitrary-precision decimal floating-point number class.")
+    (home-page "https://github.com/ruby/bigdecimal")
+    (license license:expat)))
+
+(define-public ruby-rdf-turtle
+  (package
+    (name "ruby-rdf-turtle")
+    (version "3.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "rdf-turtle" version))
+       (sha256
+        (base32 "0irnlxnrkdqsk5wkjj51rwyj59lcj4j8y24s9yxplbksjy4vxwxs"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))
+    (propagated-inputs (list ruby-base64 ruby-bigdecimal ruby-ebnf ruby-rdf))
+    (synopsis
+     "RDF::Turtle is an Turtle reader/writer for the RDF.rb library suite.")
+    (description
+     "RDF::Turtle is an Turtle reader/writer for the RDF.rb library suite.")
+    (home-page "https://github.com/ruby-rdf/rdf-turtle")
+    (license license:unlicense)))
+
+(define-public ruby-readline
+  (package
+    (name "ruby-readline")
+    (version "0.0.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "readline" version))
+       (sha256
+        (base32 "0shxkj3kbwl43rpg490k826ibdcwpxiymhvjnsc85fg2ggqywf31"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))
+    (propagated-inputs (list ruby-reline))
+    (synopsis
+     "This is just a loader for \"readline\". If Ruby has the \"readline-ext\" gem
+that is a native extension, this gem will load it. If Ruby does not have
+the \"readline-ext\" gem this gem will load \"reline\", a library that is
+compatible with the \"readline-ext\" gem and implemented in pure Ruby.
+")
+    (description
+     "This is just a loader for \"readline\".  If Ruby has the \"readline-ext\" gem that
+is a native extension, this gem will load it.  If Ruby does not have the
+\"readline-ext\" gem this gem will load \"reline\", a library that is compatible
+with the \"readline-ext\" gem and implemented in pure Ruby.")
+    (home-page "https://github.com/ruby/readline")
+    (license license:expat)))
+
+(define-public ruby-ostruct
+  (package
+    (name "ruby-ostruct")
+    (version "0.6.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "ostruct" version))
+       (sha256
+        (base32 "04nrir9wdpc4izqwqbysxyly8y7hsfr4fsv69rw91lfi9d5fv8lm"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))
+    (synopsis "Class to build custom data structures, similar to a Hash.")
+    (description "Class to build custom data structures, similar to a Hash.")
+    (home-page "https://github.com/ruby/ostruct")
+    (license license:expat)))
+
+(define-public ruby-logger
+  (package
+    (name "ruby-logger")
+    (version "1.7.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "logger" version))
+       (sha256
+        (base32 "00q2zznygpbls8asz5knjvvj2brr3ghmqxgr83xnrdj4rk3xwvhr"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))
+    (synopsis "Provides a simple logging utility for outputting messages.")
+    (description
+     "This package provides a simple logging utility for outputting messages.")
+    (home-page "https://github.com/ruby/logger")
+    (license license:expat)))
+
+(define-public ruby-bcp47-spec
+  (package
+    (name "ruby-bcp47-spec")
+    (version "0.2.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "bcp47_spec" version))
+       (sha256
+        (base32 "043qld01c163yc7fxlar3046dac2833rlcg44jbbs9n1jvgjxmiz"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))
+    (synopsis "A subset of the BCP 47 spec.")
+    (description "This package provides a subset of the BCP 47 spec.")
+    (home-page "https://github.com/dadah89/bcp47_spec")
+    (license license:expat)))
+
+(define-public ruby-rdf
+  (package
+    (name "ruby-rdf")
+    (version "3.3.4")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "rdf" version))
+       (sha256
+        (base32 "1har1346p7jwrs89d5w1gv98jk2nh3cwkdyvkzm2nkjv3s1a0zx7"))))
+    (build-system ruby-build-system)
+    (propagated-inputs (list ruby-bcp47-spec
+                             ruby-bigdecimal
+                             ruby-link-header
+                             ruby-logger
+                             ruby-ostruct
+                             ruby-readline))
+    (arguments
+     `(#:tests? #f))
+    (synopsis
+     "RDF.rb is a pure-Ruby library for working with Resource Description Framework (RDF) data.")
+    (description
+     "RDF.rb is a pure-Ruby library for working with Resource Description Framework
+(RDF) data.")
+    (home-page "https://github.com/ruby-rdf/rdf")
+    (license license:unlicense)))
+
+(define-public ruby-rdf-raptor
+  (let ((commit "6392cea"))
+  (package
+    (name "ruby-rdf-raptor")
+    (version "3.3.0")
+    (source (origin
+             (method git-fetch)
+             (uri (git-reference
+                   (url "https://github.com/ruby-rdf/rdf-raptor")
+                   (commit commit)))
+             (file-name (string-append name "-" version "-checkout"))
+             (sha256
+              (base32
+            "1mqdddn8s3j0j7gqw0v34jw5cxg2mkka1x9fx46vy38v15m8bbn1"))))
+    (build-system ruby-build-system)
+    (propagated-inputs (list ruby-ffi ruby-rdf raptor2))
+    (arguments
+     `(#:tests? #f))
+    (synopsis
+     "RDF.rb plugin for parsing/serializing NTriples, RDF/XML, Turtle and RDFa data using the Raptor RDF Parser library.")
+    (description
+     "RDF.rb plugin for parsing/serializing NTriples, RDF/XML, Turtle and RDFa data
+using the Raptor RDF Parser library.")
+    (home-page "https://github.com/ruby-rdf/rdf-raptor")
+    (license license:unlicense))))
diff --git a/gn/packages/sambamba.scm b/gn/packages/sambamba.scm
index dd8fbfa..e5623d4 100644
--- a/gn/packages/sambamba.scm
+++ b/gn/packages/sambamba.scm
@@ -89,7 +89,7 @@ data.  It also provides the @command{bgzip}, @command{htsfile}, and
        ))
       (native-inputs
        `(("ldc" ,ldc)
-         ("shunit2-old" ,shunit2-old)
+         ;; ("shunit2-old" ,shunit2-old) disable for a bit
          ("coreutils" ,coreutils) ; for env
          ("perl" ,perl) ; Needed for building htslib
          ("ruby" ,ruby) ; Needed for building htslib
diff --git a/gn/packages/static.scm b/gn/packages/static.scm
index 8b43cdb..67b4873 100644
--- a/gn/packages/static.scm
+++ b/gn/packages/static.scm
@@ -64,7 +64,7 @@
                    (string-append all " atomic pthread")))))))))
     (inputs
      (list atomic-queue
-           gsl-static
+           (list gsl "static")
            htslib-minimal
            jemalloc
            (list zlib "static")
diff --git a/gn/packages/statistics.scm b/gn/packages/statistics.scm
index e0edd52..8e8483a 100644
--- a/gn/packages/statistics.scm
+++ b/gn/packages/statistics.scm
@@ -14,7 +14,18 @@
   #:use-module (gnu packages python-science)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages statistics)
-  #:use-module (past packages python27))
+  #:use-module (gnu packages cran)
+  #:use-module (past packages python27)
+
+  ;; for python-rpy2 and dependencies
+  #:use-module (gnu packages python-build)
+  #:use-module (guix build-system pyproject); python-rpy2-rinterface
+  #:use-module (gnu packages libffi); python-rpy2-rinterface
+  #:use-module (gnu packages check); python-rpy2-rinterface
+  #:use-module (gnu packages compression); python-rpy2-rinterface
+  #:use-module (gnu packages icu4c); python-rpy2-rinterface
+  #:use-module (gnu packages time); python-rpy2-robjects
+  #:use-module (guix gexp))
 
 (define-public r-hmisc-3
   (package
@@ -149,3 +160,123 @@ traits (CTL).  The additional correlation information obtained can be
 combined with QTL information to perform de novo reconstruction of
 interaction networks.")
     (license license:gpl3)))
+
+
+(define-public python-rpy2-rinterface
+  (package
+    (name "python-rpy2-rinterface")
+    (version "3.6.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "rpy2_rinterface" version))
+       (sha256
+        (base32 "1hjnc4143dvcrp9m4vnxm4fs2ahiagp5lklsqp1nki341kh0samn"))))
+    (build-system pyproject-build-system)
+    (propagated-inputs (list python-cffi
+                             python-packaging
+                             ;;python-backports-zoneinfo ; needed for python_version<3.9
+                             r-minimal))
+    (native-inputs (list zlib
+                         icu4c
+                         libdeflate
+                         python-cffi
+                         python-coverage
+                         python-packaging
+                         python-pytest
+                         python-pytest-cov
+                         python-setuptools
+                         python-wheel
+                         r-survival))
+    (home-page "https://rpy2.github.io/")
+    (synopsis "Low-level interface from Python to the R")
+    (description "Low-level interface for rpy2. rpy2 is an interface to R
+ running embedded in a Python process.")
+    (license license:gpl2)))
+
+
+(define-public python-rpy2-robjects
+  (package
+    (name "python-rpy2-robjects")
+    (version "3.6.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "rpy2_robjects" version))
+       (sha256
+        (base32 "0yn4nq26na9hzlm08vsxr050ls5nmngpyma49fpfwc9mhxc7njlk"))))
+    (build-system pyproject-build-system)
+    (propagated-inputs (list python-jinja2
+                             python-packaging
+                             python-rpy2-rinterface
+                             ;;python-backports-zoneinfo; needed for python_version<3.9
+                             python-tzlocal))
+    (native-inputs (list python-coverage
+                         python-ipython
+                         python-numpy
+                         python-packaging
+                         python-pandas
+                         python-pytest
+                         python-pytest-cov
+                         python-setuptools
+                         python-wheel))
+    (home-page #f)
+    (synopsis "Python interface to the R language (embedded R)")
+    (description "Python interface to the R language (embedded R).")
+    (license #f)))
+
+
+(define-public python-rpy2-patched
+  ;; TODO: Delete this after python-rpy2 is fixed upstream.
+  (package
+    (inherit python-rpy2)
+    (name "python-rpy2")
+    (version "3.6.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "rpy2" version))
+       (sha256
+        (base32 "1l3paflfc2wczjms9ghaklg4bxg0c2cqh4anvlskpl4id9vsakhp"))))
+    (propagated-inputs
+     (modify-inputs (package-propagated-inputs python-rpy2)
+       (prepend r-minimal)
+       (prepend python-rpy2-rinterface)
+       (prepend python-rpy2-robjects)))
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'build 'fix-license-metadata
+            (lambda* _
+              ;; Remove one field
+              (substitute* "./pyproject.toml"
+                (("license = \"GPL-2.0-or-later\"\n")
+                 "")
+                ;; update remaining field to acceptable PEP 621 format
+                (("^license-files = .*$")
+                 "license = {file = \"LICENSE\"}\n"))))
+          (delete 'check))))))
+
+
+(define-public r-thor
+  (package
+    (name "r-thor")
+    (version "1.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "thor" version))
+       (sha256
+        (base32 "1g9204n6khm1k9ifwlmhbycfp996k5c2zpcmk2aqd95iqafpaw4g"))))
+    (build-system r-build-system)
+    (propagated-inputs `(("r-r6" ,r-r6)
+                         ("r-storr" ,r-storr)))
+    (native-inputs (list r-testthat r-knitr))
+    (home-page "https://github.com/richfitz/thor")
+    (synopsis "R binding for the ‘Lightning’ database (LMDB) ")
+    (description
+     "This package is an  R interface to LMDB.
+ LMDB is an embedded transactional key-value store and this package provides R mappings to it.
+ It wraps the entire LMDB interface, except for support for duplicated keys.")
+    (license license:openldap2.8)))
diff --git a/gn/packages/virtualization.scm b/gn/packages/virtualization.scm
index e0eb016..22753f8 100644
--- a/gn/packages/virtualization.scm
+++ b/gn/packages/virtualization.scm
@@ -16,7 +16,8 @@
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages protobuf)
   #:use-module (gnu packages python)
-  #:use-module (gnu packages python-xyz))
+  #:use-module (gnu packages python-xyz)
+  #:use-module (past packages python27))
 
 (define-public gem5
   (package
diff --git a/gn/packages/web.scm b/gn/packages/web.scm
index 9290a64..734cbe1 100644
--- a/gn/packages/web.scm
+++ b/gn/packages/web.scm
@@ -76,6 +76,26 @@ entire app with our Sass variables and mixins, responsive grid system,
 extensive prebuilt components, and powerful plugins built on jQuery.")
     (license license:expat)))
 
+(define-public web-bootstrap-5.3.3
+  (package
+    (inherit web-bootstrap)
+    (name "web-bootstrap-5.3.3")
+    (version "5.3.3")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/twbs/bootstrap.git")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "1zzfmvfps13329wyqlf453rvzfxq9zl4jva83jw695bacfdmax9c"))))
+    (native-inputs (list source))))
+
+(define-public web-bootstrap-5.3 web-bootstrap-5.3.3)
+
+(define-public web-bootstrap-5 web-bootstrap-5.3)
+
 (define-public web-bootstrap-3
   (package
     (inherit web-bootstrap)
diff --git a/gn/packages/yaj.scm b/gn/packages/yaj.scm
index c36a6cc..bdd417d 100644
--- a/gn/packages/yaj.scm
+++ b/gn/packages/yaj.scm
@@ -12,7 +12,8 @@
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages web)
-  #:use-module (gn packages web))
+  #:use-module (gn packages web)
+  #:use-module (gn packages check))
 
 (define-public python-elasticsearch
   (package
diff --git a/gn/past/genenetwork1.scm b/gn/past/genenetwork1.scm
index 717aff6..ff5c7a4 100644
--- a/gn/past/genenetwork1.scm
+++ b/gn/past/genenetwork1.scm
@@ -21,7 +21,7 @@
   #:use-module (gnu packages bootstrap)
   #:use-module (gnu packages check)
   #:use-module (gnu packages cran)
-  #:use-module (gnu packages crates-io)
+  #:use-module (past-crates packages crates-io)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages ghostscript)
diff --git a/gn/services/bnw-container.scm b/gn/services/bnw-container.scm
index 4309f75..723e063 100644
--- a/gn/services/bnw-container.scm
+++ b/gn/services/bnw-container.scm
@@ -84,7 +84,7 @@
   ;; We don't need any packages inside the container.
   (packages (list coreutils))
 
-  (services (list (service dhcp-client-service-type)
+  (services (list (service dhcp-service-type)
                   (service bnw-service-type
                            ;; The following is for testing:
                            ;(bnw-configuration
diff --git a/gn/services/databases.scm b/gn/services/databases.scm
index 937aa9e..fbdf39e 100644
--- a/gn/services/databases.scm
+++ b/gn/services/databases.scm
@@ -34,7 +34,7 @@
   (server-port virtuoso-configuration-server-port
                (default 1111))
   (dirs-allowed virtuoso-dirs-allowed
-                (default "/var/genenetwork/virtuoso-data"))
+                (default (list "/var/genenetwork/virtuoso-data")))
   (number-of-buffers virtuoso-configuration-number-of-buffers
                      (default #f))
   (maximum-dirty-buffers virtuoso-configuration-maximum-dirty-buffers
@@ -42,7 +42,22 @@
   (http-server-ip virtuoso-configuration-http-server-ip
                   (default "localhost"))
   (http-server-port virtuoso-configuration-http-server-port
-                    (default 8890)))
+                    (default 8890))
+  (checkpoint-interval virtuoso-configuration-checkpoint-interval
+                       (default "60"))
+  (scheduler-interval virtuoso-configuration-scheduler-interval
+                      (default "10"))
+  ;; Database settings
+  (database-file virtuoso-configuration-database-file
+                 (default "/var/lib/virtuoso/virtuoso.db"))
+  (lock-file virtuoso-configuration-lock-file
+                 (default "/var/lib/virtuoso/virtuoso.lck"))
+  (transaction-file virtuoso-configuration-transaction-file
+                    (default "/var/lib/virtuoso/virtuoso.trx"))
+  (error-log-file virtuoso-configuration-error-log-file
+                  (default "/var/lib/virtuoso/virtuoso-errors.log"))
+  (syslog virtuoso-configuration-syslog
+          (default "0")))
 
 (define (virtuoso-activation config)
   (with-imported-modules '((guix build utils))
@@ -67,6 +82,7 @@
          (home-directory "/var/lib/virtuoso")
          (shell (file-append shadow "/sbin/nologin")))))
 
+
 (define (virtuoso-shepherd-service config)
   (shepherd-service
    (documentation "Run Virtuoso.")
@@ -86,9 +102,9 @@
                               (format port "ServerPort = ~a:~a~%"
                                       #$(virtuoso-configuration-server-ip config)
                                       #$(virtuoso-configuration-server-port config)))
-                            (when #$(virtuoso-dirs-allowed config)
+                            (when #$(>= (length (virtuoso-dirs-allowed config)) 1)
                                   (format port "DirsAllowed = ~a~%"
-                                          #$(virtuoso-dirs-allowed config)))
+                                          #$(string-join (virtuoso-dirs-allowed config) ",")))
                             (when #$(virtuoso-configuration-number-of-buffers config)
                                   (format port "NumberOfBuffers = ~a~%"
                                           #$(virtuoso-configuration-number-of-buffers config)))
@@ -100,7 +116,14 @@
                               (format port "[HTTPServer]~%")
                               (format port "ServerPort = ~a:~a~%"
                                       #$(virtuoso-configuration-http-server-ip config)
-                                      #$(virtuoso-configuration-http-server-port config)))))))
+                                      #$(virtuoso-configuration-http-server-port config)))
+                            (format port
+                                    "[Database]~%DatabaseFile = ~a~%LockFile = ~a~%TransactionFile = ~a~%ErrorLogFile = ~a~%Syslog = ~a~%"
+                                    #$(virtuoso-configuration-database-file config)
+                                    #$(virtuoso-configuration-lock-file config)
+                                    #$(virtuoso-configuration-transaction-file config)
+                                    #$(virtuoso-configuration-error-log-file config)
+                                    #$(virtuoso-configuration-syslog config))))))
              #:directory #$(virtuoso-configuration-state-directory config)
              #:user "virtuoso"
              #:group "virtuoso"
diff --git a/gn/services/discourse.scm b/gn/services/discourse.scm
index 0074c7b..feebb98 100644
--- a/gn/services/discourse.scm
+++ b/gn/services/discourse.scm
@@ -4,7 +4,8 @@
              (gn packages ruby)
              (guix modules)
              (guix records)
-             (ice-9 match))
+             (ice-9 match)
+             (gnu packages ruby-check))
 (use-service-modules networking shepherd web)
 (use-package-modules node ruby)
 
@@ -120,7 +121,7 @@
               (list node)
               %base-packages))
 
-  (services (list (service dhcp-client-service-type)
+  (services (list (service dhcp-service-type)
                   (service discourse-service-type
                            ;; The following is for testing:
                            ;(discourse-configuration
diff --git a/gn/services/genecup-container.scm b/gn/services/genecup-container.scm
index 42ad097..d61ed80 100644
--- a/gn/services/genecup-container.scm
+++ b/gn/services/genecup-container.scm
@@ -6,7 +6,8 @@
              (guix modules)
              (guix packages)
              (guix records)
-             (ice-9 match))
+             (ice-9 match)
+             ((gnu packages nss) #:select (nss-certs)))
 (use-service-modules shepherd)
 (use-package-modules certs compression)
 
diff --git a/gn/services/gitea-container.scm b/gn/services/gitea-container.scm
index 5e707ec..397e6fb 100644
--- a/gn/services/gitea-container.scm
+++ b/gn/services/gitea-container.scm
@@ -90,5 +90,5 @@
                   (id 998))
                 %base-groups))
 
-  (services (list (service dhcp-client-service-type)
+  (services (list (service dhcp-service-type)
                   (service gitea-service-type))))
diff --git a/gn/services/pluto.scm b/gn/services/pluto.scm
index 420e2cf..c6dc40f 100644
--- a/gn/services/pluto.scm
+++ b/gn/services/pluto.scm
@@ -4,7 +4,8 @@
              (gn packages julia)
              (guix modules)
              (guix records)
-             (ice-9 match))
+             (ice-9 match)
+             ((gnu packages nss) #:select (nss-certs)))
 (use-service-modules shepherd)
 (use-package-modules
   admin