about summary refs log tree commit diff
diff options
context:
space:
mode:
authorShepherd on Tux022024-06-20 07:26:21 -0500
committerShepherd on Tux022024-06-20 07:26:21 -0500
commitf0f8dc84eca7088177797f84db05314537615c77 (patch)
tree5a7408a19c92b0c4d536916269425d883c4f06ca
parent951e77b10c84889f29c1f2322087c796cedb375a (diff)
parent48af9393cf186230e08b0fa6f7f443bc818408d2 (diff)
downloadguix-bioinformatics-f0f8dc84eca7088177797f84db05314537615c77.tar.gz
Merge branch 'master' of https://gitlab.com/genenetwork/guix-bioinformatics
-rw-r--r--.guix-channel16
-rw-r--r--README.org9
-rw-r--r--gn/packages/bioinformatics.scm444
-rw-r--r--gn/packages/crates-io.scm454
-rw-r--r--gn/packages/gemini.scm82
-rw-r--r--gn/packages/gemma.scm5
-rw-r--r--gn/packages/genenetwork.scm52
-rw-r--r--gn/packages/julia.scm814
-rw-r--r--gn/packages/lisp.scm10
-rw-r--r--gn/packages/machine-learning.scm12
-rw-r--r--gn/packages/notebooks.scm3
-rw-r--r--gn/packages/pangenome.scm15
-rw-r--r--gn/packages/python-web.scm40
-rw-r--r--gn/packages/python.scm532
-rw-r--r--gn/packages/python24.scm72
-rw-r--r--gn/packages/quality-control.scm3
-rw-r--r--gn/packages/ratspub.scm16
-rw-r--r--gn/packages/ruby.scm82
-rw-r--r--gn/past/genenetwork1.scm18
-rw-r--r--gn/services/bh20-seq-resource-container.scm12
-rw-r--r--gn/services/databases.scm5
-rw-r--r--gn/services/genome-browser.scm2
-rw-r--r--gn/services/pluto.scm14
-rw-r--r--tux02-guix-substitutions-public-key.txt7
24 files changed, 2116 insertions, 603 deletions
diff --git a/.guix-channel b/.guix-channel
index ff9ab9e..e42b9ad 100644
--- a/.guix-channel
+++ b/.guix-channel
@@ -5,17 +5,19 @@
    (name guix-past)
    (url "https://gitlab.inria.fr/guix-hpc/guix-past")
    (introduction
-    (make-channel-introduction
-     "0c119db2ea86a389769f4d2b9c6f5c41c027e336"
-     (openpgp-fingerprint
+    (channel-introduction
+     (version 0)
+     (commit "0c119db2ea86a389769f4d2b9c6f5c41c027e336")
+     (signer
       "3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5"))))
   (channel
    (name guix)
    (url "https://git.savannah.gnu.org/git/guix.git")
    (branch "master")
-   (commit "5b35626374783c019ba0911b612e1385f238dfbe")
+   (commit "d4e9ad2d42dddf06a8f1b01c9f49fee16c592d75")
    (introduction
-    (make-channel-introduction
-     "9edb3f66fd807b096b48283debdcddccfea34bad"
-     (openpgp-fingerprint
+    (channel-introduction
+     (version 0)
+     (commit "9edb3f66fd807b096b48283debdcddccfea34bad")
+     (signer
       "BBB0 2DDF 2CEA F6A8 0D1D  E643 A2A0 6DF2 A33A 54FA"))))))
diff --git a/README.org b/README.org
index 2731ee9..c5936fa 100644
--- a/README.org
+++ b/README.org
@@ -1,5 +1,7 @@
 * guix-bioinformatics
 
+IMPORTANT: this repository has moved to https://git.genenetwork.org/guix-bioinformatics/!
+
 Bioinformatics packages for GNU Guix that are used in
 https://genenetwork.org/ and some other places.  See [[https://gitlab.com/pjotrp/guix-notes/blob/master/HACKING.org][Guix notes]] for
 installing and hacking GNU Guix. Other channels of bioinformatics
@@ -143,6 +145,13 @@ and then run:
 
 : guix package --install-from-file=that-file.scm
 
+* Substitute server
+
+We run our own substitution server. Add the key to your machine as
+root with
+
+: guix archive --authorize < tux02-guix-substitutions-public-key.txt
+: guix build -L ~/guix-bioinformatics/ -L ~/guix-past/modules/ genenetwork2 --substitute-urls="https://ci.guix.gnu.org https://bordeaux.guix.gnu.org https://guix.genenetwork.org" --dry-run
 
 * LICENSE
 
diff --git a/gn/packages/bioinformatics.scm b/gn/packages/bioinformatics.scm
index 2d1b55f..db420b7 100644
--- a/gn/packages/bioinformatics.scm
+++ b/gn/packages/bioinformatics.scm
@@ -23,7 +23,6 @@
   #:use-module (gn packages java)
   #:use-module (gn packages ocaml)
   #:use-module (gn packages python)
-  #:use-module (gn packages twint)
   #:use-module (gnu packages algebra)
   #:use-module (gnu packages assembly)
   #:use-module (gnu packages autotools)
@@ -33,6 +32,7 @@
   #:use-module (gnu packages bioinformatics)
   #:use-module (gnu packages boost)
   #:use-module (gnu packages bootstrap)
+  #:use-module (gnu packages c)
   #:use-module (gnu packages check)
   #:use-module (gnu packages cmake)
   #:use-module (gnu packages compression)
@@ -54,6 +54,7 @@
   #:use-module (gnu packages java)
   #:use-module (gnu packages jemalloc)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages llvm)
   #:use-module (gnu packages machine-learning)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages mpi)
@@ -460,7 +461,7 @@ reads.")
     (description "Variant detection in massively parallel sequencing data.")
     ;; Free for non-commercial use by academic, government, and
     ;; non-profit/not-for-profit institutions
-    (license license:non-copyleft)))
+    (license (license:non-copyleft "file:///LICENSE"))))
 
 (define-public edirect-gn
   (deprecated-package "edirect-gn" edirect))
@@ -487,7 +488,7 @@ reads.")
     (arguments
      `(#:install-source? #f
        #:cargo-inputs
-       (("rust-clap" ,rust-clap-3.1)
+       (("rust-clap" ,rust-clap-3)
         ("rust-rustc-hash" ,rust-rustc-hash-1)
         ("rust-regex" ,rust-regex-1)
         ("rust-handlegraph" ,rust-handlegraph-0.7)
@@ -510,6 +511,305 @@ reads.")
 collapses them into a non-redundant graph structure.")
     (license license:expat)))
 
+(define-public gafpack
+  (let ((commit "ad31875b6914d964c6fd72d1bf334f0843538fb6")     ; November 10, 2022
+        (revision "1"))
+    (package
+      (name "gafpack")
+      (version (git-version "0.0.0" revision commit))
+      (source
+        (origin
+          (method git-fetch)
+          (uri (git-reference
+                 (url "https://github.com/ekg/gafpack")
+                 (commit commit)))
+          (file-name (git-file-name name version))
+          (sha256
+           (base32 "0di2psh0ls7jlbnqs7k71p55f73pn23a09k1h3ril7gwjcrzr3rk"))))
+      (build-system cargo-build-system)
+      (arguments
+       `(#:install-source? #f
+         #:cargo-inputs
+         (("rust-clap" ,rust-clap-4)
+          ("rust-gfa" ,rust-gfa-0.10))))
+      (home-page "https://github.com/ekg/gafpack")
+      (synopsis "Convert variation graph alignments to coverage maps over nodes")
+      (description
+       "Gafpack converts alignments to pangenome variation graphs to coverage
+maps useful in haplotype-based genotyping.")
+      (license license:expat))))
+
+(define-public agc-for-pgr-tk
+  (let ((commit "453c0afdc54b4aa00fa8e97a63f196931fdb81c4") ; April 26, 2022
+        (revision "1"))
+    (package
+      (name "agc")
+      (version (git-version "2.0" revision commit))
+      (source
+        (origin
+          (method git-fetch)
+          (uri (git-reference
+                 (url "https://github.com/cschin/agc")
+                 (commit commit)))
+          (file-name (git-file-name name version))
+          (sha256
+           (base32 "1v5s79rl38dcyy5h1lykbp6clcbqq9winn533j54y49q1jp8chix"))
+          (snippet
+           #~(begin
+               (use-modules (guix build utils))
+               ;; Copy the two radul files we can't find a replacement for:
+               ;; https://github.com/refresh-bio/RADULS
+               (mkdir "keep-libs")
+               (rename-file "libs/raduls.h" "keep-libs/raduls.h")
+               (rename-file "libs/libraduls.a" "keep-libs/libraduls.a")
+               (delete-file-recursively "libs")
+               (rename-file "keep-libs" "libs")
+
+               (delete-file-recursively "py_agc_api/pybind11-2.8.1")
+               (substitute* '("makefile" "makefile.release")
+                 (("-mavx") "")
+                 (("-m64") "")
+                 (("\\$\\(AGC_LIBS_DIR)\\/mimalloc/\\$\\(LIB_ALLOC\\)")
+                  "$(pkg-config --cflags --libs mimalloc) /usr/lib/libmimalloc.so")
+                 (("\\$\\(AGC_LIBS_DIR)\\/\\$\\(LIB_ZLIB\\)")
+                  "$(pkg-config --cflags --libs zlib) /usr/lib/libz.so")
+                 (("\\$\\(AGC_LIBS_DIR)\\/\\$\\(LIB_ZSTD\\)")
+                  "$(pkg-config --cflags --libs libzstd) /usr/lib/libzstd.so")
+                 (("^PYBIND11_LIB = .*") "PYBIND11_LIB = /usr/include/pybind11")
+                 (("\\$\\(PYBIND11_LIB\\)/include") "$(PYBIND11_LIB)"))
+               (substitute* (find-files "src" "\\.(h|cpp)$")
+                 (("../../libs/ketopt.h") "ketopt.h")
+                 (("../../libs/zlib.h") "zlib.h")
+                 (("../../libs/zstd.h") "zstd.h"))))))
+      (build-system gnu-build-system)
+      (arguments
+       `(#:tests? #f                    ; No tests.
+         #:phases
+         (modify-phases %standard-phases
+           (delete 'configure)          ; No configure script.
+           (add-after 'unpack 'adjust-sources
+             (lambda* (#:key inputs #:allow-other-keys)
+               (let ((mimalloc (assoc-ref inputs "mimalloc")))
+                 (substitute* '("makefile" "makefile.release")
+                   (("/usr/include/pybind11")
+                    (search-input-directory inputs "/include/pybind11"))
+                   (("/usr/lib/libmimalloc.so")
+                    (search-input-file inputs "/lib/libmimalloc.so"))
+                   (("/usr/lib/libz.so")
+                    (search-input-file inputs "/lib/libz.so"))
+                   (("/usr/lib/libzstd.so")
+                    (search-input-file inputs "/lib/libzstd.so"))
+                   (("pkg-config") ,(pkg-config-for-target))))))
+           (replace 'install
+             (lambda* (#:key outputs #:allow-other-keys)
+               (let* ((out (assoc-ref outputs "out"))
+                      (include (string-append out "/include/")))
+                 (install-file "agc" (string-append out "/bin"))
+                 (install-file "libagc.so" (string-append out "/lib"))
+                 (mkdir-p (string-append include "app"))
+                 (mkdir-p (string-append include "core"))
+                 (mkdir-p (string-append include "lib-cxx"))
+                 (with-directory-excursion "src"
+                   (for-each
+                     (lambda (file)
+                       (copy-file file (string-append include file)))
+                     (find-files "." "\\.h$")))))))))
+      (native-inputs
+       (list minimap2                   ; for ketopt.h
+             pkg-config))
+      (inputs
+       (list mimalloc
+             python
+             pybind11
+             zlib
+             (list zstd "lib")))
+      (home-page "https://github.com/cschin/agc")
+      (synopsis "Assembled Genomes Compressor")
+      (description
+       "@acronym{Assembled Genomes Compressor, AGC} is a tool designed to
+compress collections of de-novo assembled genomes.  It can be used for various
+types of datasets: short genomes (viruses) as well as long (humans).")
+      (license license:expat))))
+
+(define-public pgr-tk
+  (package
+    (name "pgr-tk")
+    (version "0.3.6")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/Sema4-Research/pgr-tk")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "0vm1k63v91zd0pfbg2zmwskajylz8xg83m63qxwaiwny5f4y6f1j"))
+        (snippet
+         #~(begin
+             (use-modules (guix build utils))
+             (substitute* (find-files "." "Cargo.toml")
+               ;; Only use the major+minor version to decrease the number of
+               ;; special version crates.
+               (("(.*= \")([[:digit:]]+\\.[[:digit:]]+)\\.[[:digit:]]+(\".*)"
+                 _ name version tail)
+                (string-append name version tail))
+               ;; Then fix the version string for the actual package.
+               (("^version = \".*")
+                (string-append "version = \"" #$version "\"\n")))))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:install-source? #f
+       #:cargo-test-flags
+       (list "--release" "--"
+             "--skip=get_aln_segements"
+             "--skip=get_shmmr_dots"
+             "--skip=AGCFile"
+             "--skip=SeqIndexDB")
+       #:cargo-inputs
+       (("rust-bindgen" ,rust-bindgen-0.58)
+        ("rust-bgzip" ,rust-bgzip-0.2)
+        ("rust-byteorder" ,rust-byteorder-1)
+        ("rust-clap" ,rust-clap-3)
+        ("rust-cuckoofilter" ,rust-cuckoofilter-0.5)
+        ("rust-flate2" ,rust-flate2-1)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-log" ,rust-log-0.4)
+        ("rust-petgraph" ,rust-petgraph-0.6)
+        ("rust-pyo3" ,rust-pyo3-0.14)
+        ("rust-rayon" ,rust-rayon-1)
+        ("rust-regex" ,rust-regex-1)
+        ("rust-rustc-hash" ,rust-rustc-hash-1)
+        ("rust-serde" ,rust-serde-1)
+        ("rust-serde-json" ,rust-serde-json-1)
+        ("rust-simple-logger" ,rust-simple-logger-1))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'insert-wfa-source
+           (lambda* (#:key inputs #:allow-other-keys)
+             (copy-recursively (assoc-ref inputs "wfa-src")
+                               "rs-wfa/WFA")))
+         (add-after 'unpack 'adjust-source
+           (lambda* (#:key inputs #:allow-other-keys)
+             (substitute* '("pgr-bin/build.rs"
+                            "pgr-db/build.rs"
+                            "pgr-tk/build.rs")
+               (("git") "ls")
+               (("bioconda") "Guix"))
+             ;; Build with zlib, not zlib-ng
+             (substitute* '("pgr-bin/Cargo.toml"
+                            "pgr-db/Cargo.toml")
+               (("zlib-ng-compat") "zlib"))
+             ;; Don't look for agc to be bundled.
+             (substitute* "pgr-db/wrapper.h"
+               (("../agc/src/lib-cxx/agc-api.h") "lib-cxx/agc-api.h"))
+             (substitute* "pgr-db/build.rs"
+               ((".*panic!\\(\"Error.*") ""))
+             (mkdir-p "target/release")
+             (symlink (search-input-file inputs "/bin/agc")
+                      "target/release/agc")
+             (symlink (search-input-file inputs "/lib/libagc.so")
+                      "target/release/libagc")))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (with-directory-excursion "target/release"
+                 (install-file "libpgrtk.so" (string-append out "/lib"))
+                 (for-each
+                   (lambda (file)
+                     (install-file file (string-append out "/bin")))
+                   (list "pgr-filter"
+                         "pgr-mdb"
+                         "pgr-multifilter"
+                         "pgr-probe-match"
+                         "pgr-shmmr-pair-count")))))))))
+    (inputs
+     (list agc-for-pgr-tk
+           clang
+           python
+           zlib
+           (list zstd "lib")))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+       ("wfa-src"
+        ,(origin
+           (method git-fetch)
+           (uri (git-reference
+                  ;; forPYO3 branch, 14-03-2021
+                  (url "https://github.com/cschin/WFA")
+                  (commit "1f8c8d2905ed482cd2d306a1676d60c2a45cb098")))
+           (file-name "wfa-for-pgr-tk")
+           (sha256
+            (base32 "19h1cjp2bdlcfq5c6rsbk8bc0f8zn64b471dhj4xlfxd1prv2dpk"))))))
+    (home-page "https://github.com/Sema4-Research/pgr-tk")
+    (synopsis "Pangenome Research Tool Kit")
+    (description
+     "PGR-TK provides pangenome assembly management, query and
+@acronym{Minimizer Anchored Pangenome, MAP} Graph Generation.  It is a project
+to provide Python and Rust libraries to facilitate pangenomics analysis.
+Several algorithms and data structures used for the Peregrine Genome Assembler
+are useful for Pangenomics analysis as well.  This repo takes those algorithms
+and data structure, combining other handy 3rd party tools to expose them as a
+library in Python (with Rust code for those computing parts that need
+performance.)")
+    (license (license:non-copyleft
+               "file:///LICENSE"
+               "CC-BY-NC-SA 4.0"))))
+
+(define-public graph-genotyper
+  (let ((commit "e7cc6b43a5b1f389d76bf9aac7f2ee02f92caeaf") ; October 17, 2022
+        (revision "13"))
+    (package
+      (name "graph-genotyper")
+      (version (git-version "0.0.0" revision commit))
+      (source (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/davidebolo1993/graph_genotyper")
+               (commit commit)))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "1l8yjpkqamiqr1q5i7vr5z04aba7skpbcwyc9dx5fiklvljjfhcx"))))
+      (build-system copy-build-system)
+      (arguments
+       `(#:install-plan
+         '(("genotype.py" "bin/")
+           ("genotype.sh" "bin/"))
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'install 'wrap-genotype
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((out (assoc-ref outputs "out")))
+                 (wrap-script (string-append out "/bin/genotype.sh")
+                  `("GUIX_PYTHONPATH" ":" prefix (,(getenv "GUIX_PYTHONPATH")))
+                  `("PATH" ":" prefix
+                    ,(map (lambda (file-name)
+                            (string-append (assoc-ref inputs file-name) "/bin"))
+                          (list "gafpack"
+                                "odgi"
+                                "python"
+                                "samtools"
+                                "vg"))))))))))
+      (inputs
+       (list gafpack
+             guile-3.0
+             odgi
+             python
+             python-numpy
+             python-pandas
+             python-scipy
+             samtools
+             vg))
+      (home-page "https://bitbucket.org/jana_ebler")
+      (synopsis "Genotyping based on k-mers and pangenome graphs")
+      (description
+       "This package provides a genotyper for various types of genetic variants
+(such as SNPs, indels and structural variants).  Genotypes are computed based on
+read k-mer counts and a panel of known haplotypes.  A description of the method
+can be found @url{https://www.biorxiv.org/content/10.1101/2020.11.11.378133v1,
+here}.")
+      (license (license:non-copyleft
+                 "No license listed")))))
+
 (define-public pangenie
   (let ((commit "e779076827022d1416ab9fabf99a03d8f4725956") ; September 2, 2021 from phasing-tests branch
         (revision "2"))
@@ -1490,20 +1790,9 @@ reads, also called read-based phasing or haplotype assembly.  It is especially
 suitable for long reads, but works also well with short reads.")
     (license license:expat)))
 
-(define-public python-pytest-runner-2
-  (package
-    (inherit python-pytest-runner)
-    (version "2.12.2")
-    (source (origin
-              (method url-fetch)
-              (uri (pypi-uri "pytest-runner" version))
-              (sha256
-               (base32
-                "11ivjj9hfphkv4yfb2g74av4yy86y8gcbf7gbif0p1hcdfnxg3w6"))))))
-
 (define-public bh20-seq-resource
-  (let ((commit "ae4cb3c2cf7103bbc84f52618bb755d7ce25775b")
-        (revision "3"))
+  (let ((commit "2ae71911cd87ce4f2eabdff21e538267b3270d45")
+        (revision "4"))
     (package
       (name "bh20-seq-resource")
       (version (git-version "1.0" revision commit))
@@ -1514,36 +1803,45 @@ suitable for long reads, but works also well with short reads.")
                        (commit commit)))
                 (file-name (git-file-name name version))
                 (sha256
-                 (base32 "1k0gsz4yc8l5znanzd094g2jp40ksbpa9667zr31ayrjx6labz02"))
+                 (base32 "1k6cc88hrcm77jwpdk2084q0zirv2vlbz3c07nmpbhk1lhqk5x0n"))
                 (modules '((guix build utils)))
                 (snippet
                  '(begin
-                    (substitute* "setup.py"
-                      (("py-dateutil") "python-dateutil"))
-                    #t))))
+                    (delete-file "gittaggers.py")))))
       (build-system python-build-system)
+      (arguments
+       (list
+         #:tests? #f    ; Tests can't find pytest
+         #:phases
+         #~(modify-phases %standard-phases
+             (add-after 'unpack 'patch-program-calls
+               (lambda* (#:key inputs #:allow-other-keys)
+                 (substitute* "bh20sequploader/qc_fasta.py"
+                   (("\"minimap2\"")
+                    (string-append "\"" (search-input-file
+                                          inputs "/bin/minimap2")
+                                   "\""))))))))
       (propagated-inputs
-       `(("python-arvados-python-client" ,python-arvados-python-client)
-         ("python-dateutil" ,python-dateutil)
-         ("python-flask" ,python-flask)
-         ("python-magic" ,python-magic)
-         ("python-pyyaml" ,python-pyyaml)
-         ("python-pycurl" ,python-pycurl)
-         ("python-pyshex" ,python-pyshex)
-         ("python-redis" ,python-redis)
-         ("python-ruaml.yaml" ,python38-ruaml.yaml-0.15.76)
-         ("clustalw" ,clustalw)
-         ("python-schema-salad" ,python-schema-salad)
-         ("python-twint" ,python-twint)
-         ;; and for the service
-         ("python" ,python)
-         ("gunicorn" ,gunicorn)))
+       (list python-arvados-python-client
+             python-schema-salad
+             python-magic
+             python-pyshex
+             python-pyshexc-0.7
+             python-py-dateutil
+
+             ;; for the web
+             python-flask
+             python-pyyaml
+             python-redis
+
+             ;; and for the service
+             python
+             gunicorn))
+      (inputs
+       (list minimap2))
       (native-inputs
-       `(("git" ,(@ (gnu packages version-control) git))
-         ("python-oauth2client" ,python-oauth2client)
-         ("python-pytest" ,python-pytest-4)
-         ("python-pytest-runner" ,python-pytest-runner-2)
-         ("python-uritemplate" ,python-uritemplate)))
+       (list python-pytest-4                ; < 6
+             python-pytest-runner-4))       ; < 5
       (home-page "https://github.com/pubseq/bh20-seq-resource")
       (synopsis
        "Tool to upload SARS-CoV-19 sequences and service to kick off analysis")
@@ -1553,6 +1851,18 @@ it to upload the genomes of SARS-CoV-2 samples to make them publicly and freely
 available to other researchers.")
       (license license:asl2.0))))
 
+;; This version has no profile collisions.
+(define-public bh20-seq-resource-for-service
+  (package
+    ;(inherit (fix-profile-collisions-for-bh20 bh20-seq-resource))
+    (inherit
+      ((package-input-rewriting/spec
+        `(("python-google-api-core" . ,(const python-google-api-core-1))
+          ("python-google-auth" . ,(const python-google-auth-1))
+          ("python-pyparsing" . ,(const python-pyparsing-2.4.7))))
+       bh20-seq-resource))
+    (properties `((hidden? . #t)))))
+
 (define-public python-scanpy-git
   (let ((commit "590d42309f9ed6550d7b887039990edfc1ac7648") ; April 22, 2020
         (revision "1"))
@@ -1593,6 +1903,56 @@ available to other researchers.")
                  (delete-file "scanpy/tests/test_pca.py")
                  #t)))))))))
 
+;; TODO: Unbundle everything
+(define-public odgi
+  (package
+    (name "odgi")
+    (version "0.8.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://github.com/pangenome/odgi/releases"
+                                  "/download/v" version
+                                  "/odgi-v" version ".tar.gz"))
+              (sha256
+               (base32 "175083pb9hp0vn9a00hbxlayyk5a5j8p52yq5qfmbnfvndisbmbv"))
+              (snippet
+               #~(begin
+                   (use-modules (guix build utils))
+                   (substitute* "CMakeLists.txt"
+                     (("-march=native") "")
+                     (("-msse4\\.2") ""))
+                   (delete-file-recursively "deps/pybind11")
+                   (delete-file-recursively "deps/sdsl-lite")))))
+    (build-system cmake-build-system)
+    (native-inputs
+     (list pkg-config))
+    (inputs
+     (list jemalloc
+           libdivsufsort
+           pybind11
+           python
+           sdsl-lite))
+    (home-page "https://github.com/vgteam/odgi")
+    (synopsis "Optimized Dynamic Genome/Graph Implementation")
+    (description "@acronym{Optimized Dynamic Genome/Graph Implementation, odgi}
+provides an efficient and succinct dynamic DNA sequence graph model, as well as
+a host of algorithms that allow the use of such graphs in bioinformatic
+analyses.
+
+Careful encoding of graph entities allows odgi to efficiently compute and
+transform pangenomes with minimal overheads.  @command{odgi} implements a
+dynamic data structure that leveraged multi-core CPUs and can be updated on the
+fly.
+
+The edges and path steps are recorded as deltas between the current node id and
+the target node id, where the node id corresponds to the rank in the global
+array of nodes.  Graphs built from biological data sets tend to have local
+partial order and, when sorted, the deltas be small.  This allows them to be
+compressed with a variable length integer representation, resulting in a small
+in-memory footprint at the cost of packing and unpacking.")
+    (properties '((tunable? . #t)))
+    (license license:expat)))
+
 (define-public vg
   (package
     (name "vg")
@@ -1826,7 +2186,7 @@ available to other researchers.")
     (inputs
      `(("boost" ,boost)
        ("cairo" ,cairo)
-       ("curl" ,curl-minimal)
+       ("curl" ,curl)
        ("elfutils" ,elfutils)
        ("fastahack" ,fastahack)
        ("htslib" ,htslib)
@@ -2055,7 +2415,7 @@ The Genome Browser itself does not draw conclusions; rather, it collates all
 relevant information in one location, leaving the exploration and interpretation
 to the user.")
     (license (list
-               license:bsd-0    ; kent/src/{utils,lib,inc,tabStorm,parasol,hg/ausoSql,hg/autoXml}
+               ;; license:bsd-0    ; kent/src/{utils,lib,inc,tabStorm,parasol,hg/ausoSql,hg/autoXml}
                license:bsd-3    ; these two for bundled htslib-1.3
                license:expat
                (license:non-copyleft
diff --git a/gn/packages/crates-io.scm b/gn/packages/crates-io.scm
index 1dc4f65..e500d86 100644
--- a/gn/packages/crates-io.scm
+++ b/gn/packages/crates-io.scm
@@ -7,11 +7,145 @@
   #:use-module (guix build-system cargo)
   #:use-module (gnu packages crates-graphics)
   #:use-module (gnu packages crates-io)
-  #:use-module (gnu packages maths))
+  #:use-module (gnu packages maths)
+  #:use-module (gnu packages python))
+
+(define-public rust-bgzip-0.2
+  (package
+    (name "rust-bgzip")
+    (version "0.2.1")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "bgzip" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1kssq4hp8csg27rhggabpfiyn9xp5rh5b8al63dghk11vqs7hk5j"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-flate2" ,rust-flate2-1)
+        ("rust-thiserror" ,rust-thiserror-1))
+       #:cargo-development-inputs
+       (("rust-clap" ,rust-clap-2)
+        ("rust-csv" ,rust-csv-1)
+        ("rust-tempfile" ,rust-tempfile-3))))
+    (home-page "https://github.com/informationsea/bgzip-rs")
+    (synopsis "Rust implementation of bgzip")
+    (description "Rust implementation of bgzip")
+    (license license:expat)))
+
+(define-public rust-boomphf-0.5
+  (package
+    (name "rust-boomphf")
+    (version "0.5.9")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (crate-uri "boomphf" version))
+        (file-name
+         (string-append name "-" version ".tar.gz"))
+        (sha256
+         (base32 "0braniw72g9yq5006sfgc1g8d4317bb524c694jw6nggizrvg3sf"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-crossbeam-utils" ,rust-crossbeam-utils-0.8)
+        ("rust-log" ,rust-log-0.4)
+        ("rust-rayon" ,rust-rayon-1)
+        ("rust-serde" ,rust-serde-1)
+        ("rust-wyhash" ,rust-wyhash-0.5))
+       #:cargo-development-inputs
+       (("rust-bencher" ,rust-bencher-0.1)
+        ("rust-quickcheck" ,rust-quickcheck-1))))
+    (home-page "https://github.com/10XGenomics/rust-boomphf")
+    (synopsis "Scalable and Efficient Minimal Perfect Hash Functions")
+    (description "This package provides a Rust implementation of
+@url{https://arxiv.org/abs/1702.03154, fast and scalable minimal perfect hashing
+for massive key sets}.  It generates an @acronym{MPHF, minimal perfect hash
+functions} for a collection of hashable objects.")
+    (license license:expat)))
+
+(define-public rust-clap-lex-0.3
+  (package
+    (name "rust-clap-lex")
+    (version "0.3.0")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "clap-lex" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1a4dzbnlxiamfsn0pnkhn7n9bdfjh66j9fxm6mmr7d227vvrhh8d"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs (("rust-os-str-bytes" ,rust-os-str-bytes-6))))
+    (home-page "https://github.com/clap-rs/clap/tree/master/clap_lex")
+    (synopsis "Minimal, flexible command line parser")
+    (description "Minimal, flexible command line parser")
+    (license (list license:expat license:asl2.0))))
+
+(define-public rust-cuckoofilter-0.5
+  (package
+    (name "rust-cuckoofilter")
+    (version "0.5.0")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "cuckoofilter" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "067fkr9dc118rqddr72xdldq05d31yyipvvyrmj9yrrik52ah45q"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:skip-build? #t     ; Not packaging dependencies
+       #:cargo-inputs
+       (("rust-byteorder" ,rust-byteorder-1)
+        ;("rust-clippy" ,rust-clippy-0.0.302)
+        ;("rust-farmhash" ,rust-farmhash-1)
+        ("rust-fnv" ,rust-fnv-1)
+        ("rust-rand" ,rust-rand-0.7)
+        ("rust-serde" ,rust-serde-1)
+        ("rust-serde-bytes" ,rust-serde-bytes-0.11)
+        ("rust-serde-derive" ,rust-serde-derive-1))
+       #:cargo-development-inputs
+       (("rust-serde-json" ,rust-serde-json-1))))
+    (home-page "http://axiom.co")
+    (synopsis "Cuckoo Filter: Practically Better Than Bloom")
+    (description "Cuckoo Filter: Practically Better Than Bloom")
+    (license license:expat)))
+
+(define-public rust-gfa-0.6
+  (package
+    (name "rust-gfa")
+    (version "0.6.2")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "gfa" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0ghmy4r0324s6vvmj9nmh326346nkwm7nybnpcpswnjvf02b85gw"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-bstr" ,rust-bstr-0.2)
+        ("rust-bytemuck" ,rust-bytemuck-1)
+        ("rust-lazy-static" ,rust-lazy-static-1)
+        ("rust-nom" ,rust-nom-5)
+        ("rust-regex" ,rust-regex-1)
+        ("rust-serde" ,rust-serde-1))
+        #:cargo-development-inputs
+        (("rust-criterion" ,rust-criterion-0.3))))
+    (home-page "https://github.com/chfi/rs-gfa")
+    (synopsis
+     "Library for working with graphs in the GFA (Graphical Fragment Assembly) format")
+    (description
+     "Library for working with graphs in the GFA (Graphical Fragment Assembly) format")
+    (license license:expat)))
 
 (define-public rust-handlegraph-0.7
   (package
-    (inherit rust-handlegraph-0.3)
     (name "rust-handlegraph")
     (version "0.7.0-alpha.9")
     (source
@@ -23,6 +157,7 @@
         (sha256
          (base32
           "1frlcdwhycjvizb0gfb0v36vxjdi0jxagl2l2v6dzdjxpaawv9rs"))))
+    (build-system cargo-build-system)
     (arguments
      `(#:cargo-inputs
        (("rust-anyhow" ,rust-anyhow-1)
@@ -36,7 +171,206 @@
         ("rust-succinct" ,rust-succinct-0.5))
        #:cargo-development-inputs
        (("rust-quickcheck" ,rust-quickcheck-0.9)
-        ("rust-rand" ,rust-rand-0.7))))))
+        ("rust-rand" ,rust-rand-0.7))))
+    (home-page "https://github.com/chfi/rs-handlegraph")
+    (synopsis "Library for use in variation graphs")
+    (description
+     "This package provides a Rust implementation of VG handle graph.")
+    (license license:expat)))
+
+(define-public rust-handlegraph-0.3
+  (package
+    (inherit rust-handlegraph-0.7)
+    (name "rust-handlegraph")
+    (version "0.3.0")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "handlegraph" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1sj100w4lpj7798pws85qrfrzsily5hhzh6j118rwf56sgic1yml"))))
+    (arguments
+     `(#:cargo-inputs
+       (("rust-bstr" ,rust-bstr-0.2)
+        ("rust-gfa" ,rust-gfa-0.6))))))
+
+(define-public rust-kstring-1
+  (package
+    (name "rust-kstring")
+    (version "1.1.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (crate-uri "kstring" version))
+        (file-name (string-append name "-" version ".tar.gz"))
+        (sha256
+         (base32 "1r4n9fa5scikqvl736nxghcfa6s3b07xz61w43hyzs2qb3wmd3nk"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(;#:skip-build? #t     ; Uses unstable features.
+       #:cargo-inputs
+       (("rust-document-features" ,rust-document-features-0.2)
+        ("rust-serde" ,rust-serde-1)
+        ("rust-static-assertions" ,rust-static-assertions-1))
+       #:cargo-development-inputs
+       (("rust-criterion" ,rust-criterion-0.3)
+        ("rust-proptest" ,rust-proptest-1))))
+    (home-page "https://github.com/cobalt-org/kstring")
+    (synopsis "String optimized for map keys")
+    (description "Key String provides a Rust package optimized for map keys.")
+    (license (list license:expat license:asl2.0))))
+
+(define-public rust-pyo3-0.14
+  (package
+    (name "rust-pyo3")
+    (version "0.14.5")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "pyo3" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1j70b9bkncgpgnfxjxyvp4mk40rp55lk6qmacxm5c2k78y9hy41m"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-cfg-if" ,rust-cfg-if-1)
+        ("rust-hashbrown" ,rust-hashbrown-0.11)
+        ("rust-indexmap" ,rust-indexmap-1)
+        ("rust-indoc" ,rust-indoc-0.3)
+        ("rust-inventory" ,rust-inventory-0.1)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-num-bigint" ,rust-num-bigint-0.4)
+        ("rust-num-complex" ,rust-num-complex-0.4)
+        ("rust-parking-lot" ,rust-parking-lot-0.11)
+        ("rust-paste" ,rust-paste-0.1)
+        ("rust-pyo3-build-config" ,rust-pyo3-build-config-0.14)
+        ("rust-pyo3-macros" ,rust-pyo3-macros-0.14)
+        ("rust-serde" ,rust-serde-1)
+        ("rust-unindent" ,rust-unindent-0.1))
+       #:cargo-development-inputs
+       (("rust-assert-approx-eq" ,rust-assert-approx-eq-1)
+        ("rust-criterion" ,rust-criterion-0.3)
+        ("rust-proptest" ,rust-proptest-0.10)
+        ("rust-rustversion" ,rust-rustversion-1)
+        ("rust-serde-json" ,rust-serde-json-1)
+        ("rust-trybuild" ,rust-trybuild-1))))
+    (inputs (list python))
+    (home-page "https://github.com/pyo3/pyo3")
+    (synopsis "Rust bindings for the Python interpreter")
+    (description
+     "This package provides Rust bindings for Python, including tools for
+creating native Python extension modules.  Running and interacting with
+Python code from a Rust binary is also supported.")
+    (license license:asl2.0)))
+
+(define-public rust-pyo3-build-config-0.14
+  (package
+    (name "rust-pyo3-build-config")
+    (version "0.14.5")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "pyo3-build-config" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "13vkcl49b2x81azb613ss256k8pazrfc4fy4ny8pzgdciirn2afi"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs (("rust-once-cell" ,rust-once-cell-1))))
+    (home-page "https://github.com/pyo3/pyo3")
+    (synopsis "Build configuration for the PyO3 ecosystem")
+    (description "Build configuration for the PyO3 ecosystem")
+    (license license:asl2.0)))
+
+(define-public rust-pyo3-macros-0.14
+  (package
+    (name "rust-pyo3-macros")
+    (version "0.14.5")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "pyo3-macros" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1a4fh24c5q85f31n2rwbqrai2bjprf9kzh6xvpgj8j3hblhwa2zw"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-pyo3-macros-backend" ,rust-pyo3-macros-backend-0.14)
+        ("rust-quote" ,rust-quote-1)
+        ("rust-syn" ,rust-syn-1))))
+    (home-page "https://github.com/pyo3/pyo3")
+    (synopsis "Proc macros for PyO3 package")
+    (description "Proc macros for PyO3 package")
+    (license license:asl2.0)))
+
+(define-public rust-pyo3-macros-backend-0.14
+  (package
+    (name "rust-pyo3-macros-backend")
+    (version "0.14.5")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "pyo3-macros-backend" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1ps068jqyq1275zxxbzn6hyz9lkfz35az8waj6mzlji2jg2kyqki"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-proc-macro2" ,rust-proc-macro2-1)
+        ("rust-pyo3-build-config" ,rust-pyo3-build-config-0.14)
+        ("rust-quote" ,rust-quote-1)
+        ("rust-syn" ,rust-syn-1))))
+    (home-page "https://github.com/pyo3/pyo3")
+    (synopsis "Code generation for PyO3 package")
+    (description "Code generation for PyO3 package")
+    (license license:asl2.0)))
+
+(define-public rust-quick-csv-0.1
+  (package
+    (name "rust-quick-csv")
+    (version "0.1.6")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "quick-csv" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "131k8zzlplk2h62wz813jbvm0sk7v3mixwhhq34y9lmp3mqbgx7d"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs (("rust-rustc-serialize" ,rust-rustc-serialize-0.3))))
+    (home-page "https://github.com/tafia/quick-csv")
+    (synopsis "quick csv reader and decoder")
+    (description "quick csv reader and decoder")
+    (license license:expat)))
+
+(define-public rust-succinct-0.5
+  (package
+    (name "rust-succinct")
+    (version "0.5.2")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (crate-uri "succinct" version))
+        (file-name
+         (string-append name "-" version ".tar.gz"))
+        (sha256
+         (base32 "0654c9gq50x7djyf25zbzz3d2pc4x3z21wmjj3qbr6d9h4hbd63p"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-byteorder" ,rust-byteorder-1)
+        ("rust-num-traits" ,rust-num-traits-0.2))
+       #:cargo-development-inputs
+       (("rust-quickcheck" ,rust-quickcheck-0.9))))
+    (home-page "https://github.com/tov/succinct-rs")
+    (synopsis "Succinct data structures for Rust")
+    (description "This package provides succinct data structures for Rust.")
+    (license (list license:expat license:asl2.0))))
 
 (define-public rust-clap-for-jrep
   (package
@@ -141,42 +475,42 @@ or any combination.")
       (description "Rust CLI tools for manipulation of Jupyter Notebooks.")
       (license #f)))) ; There is no license.
 
-;; replace fields with those from upstream
-(define-public rust-clap-3.1
+(define-public rust-clap-4
   (package
     (name "rust-clap")
-    (version "3.1.6")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (crate-uri "clap" version))
-        (file-name (string-append name "-" version ".tar.gz"))
-        (sha256
-         (base32 "08q1hkksfixybnrwrpm44xq028wbn9yr2hnzrax9hihyq8v39jfq"))))
+    (version "4.0.9")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "clap" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "1w0dxqzrh449s9l2k8g66pdsff02599bwi5mh0gny3227kcpsq1h"))))
     (build-system cargo-build-system)
     (arguments
-     `(#:cargo-inputs
+     `(#:skip-build? #t     ; Not all inputs packaged.
+       #:cargo-inputs
        (("rust-atty" ,rust-atty-0.2)
         ("rust-backtrace" ,rust-backtrace-0.3)
         ("rust-bitflags" ,rust-bitflags-1)
-        ("rust-clap-derive" ,rust-clap-derive-3.1)
-        ("rust-indexmap" ,rust-indexmap-1)
-        ("rust-lazy-static" ,rust-lazy-static-1)
-        ("rust-os-str-bytes" ,rust-os-str-bytes-6)
-        ("rust-regex" ,rust-regex-1)
+        ("rust-clap-derive" ,rust-clap-derive-4)
+        ("rust-clap-lex" ,rust-clap-lex-0.3)
+        ("rust-once-cell" ,rust-once-cell-1)
         ("rust-strsim" ,rust-strsim-0.10)
         ("rust-termcolor" ,rust-termcolor-1)
         ("rust-terminal-size" ,rust-terminal-size-0.1)
-        ("rust-textwrap" ,rust-textwrap-0.15)
         ("rust-unicase" ,rust-unicase-2)
-        ("rust-yaml-rust" ,rust-yaml-rust-0.4))
-       #:cargo-development-inputs
-       (("rust-criterion" ,rust-criterion-0.3)
-        ("rust-lazy-static" ,rust-lazy-static-1)
-        ("rust-regex" ,rust-regex-1)
-        ("rust-rustversion" ,rust-rustversion-1)
-        ("rust-trybuild" ,rust-trybuild-1)
-        ("rust-trycmd" ,rust-trycmd-0.12))))
+        ("rust-unicode-width" ,rust-unicode-width-0.1))
+       ;#:cargo-development-inputs
+       ;(("rust-humantime" ,rust-humantime-2)
+       ; ("rust-rustversion" ,rust-rustversion-1)
+       ; ("rust-shlex" ,rust-shlex-1)
+       ; ("rust-snapbox" ,rust-snapbox-0.4)
+       ; ("rust-static-assertions" ,rust-static-assertions-1)
+       ; ("rust-trybuild" ,rust-trybuild-1)
+       ; ("rust-trycmd" ,rust-trycmd-0.13)
+       ; ("rust-unic-emoji-char" ,rust-unic-emoji-char-0.9))
+       ))
     (home-page "https://github.com/clap-rs/clap")
     (synopsis
       "A simple to use, efficient, and full-featured Command Line Argument Parser")
@@ -185,19 +519,17 @@ or any combination.")
       Argument Parser")
     (license (list license:expat license:asl2.0))))
 
-;; ready to upstream, WITH rust-clap-derive
-;; replace fields with those from upstream.
-(define-public rust-clap-derive-3.1
+(define-public rust-clap-derive-4
   (package
     (name "rust-clap-derive")
-    (version "3.1.4")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (crate-uri "clap-derive" version))
-        (file-name (string-append name "-" version ".tar.gz"))
-        (sha256
-         (base32 "05mz2y6k73wc1gvv9r4mllfqslzvlwkvx77lk7769ag1xlwd15fs"))))
+    (version "4.0.9")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "clap-derive" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "02zhbbmyz3dpy9ml6xfp7i8p3ffj1djvkdnkg6gr6d0s5r4hg8x4"))))
     (build-system cargo-build-system)
     (arguments
      `(#:cargo-inputs
@@ -213,40 +545,6 @@ or any combination.")
       "Parse command line argument by defining a struct, derive crate.")
     (license (list license:expat license:asl2.0))))
 
-(define-public rust-textwrap-0.15
-  (package
-    (name "rust-textwrap")
-    (version "0.15.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (crate-uri "textwrap" version))
-        (file-name (string-append name "-" version ".tar.gz"))
-        (sha256
-         (base32 "1yw513k61lfiwgqrfvsjw1a5wpvm0azhpjr2kr0jhnq9c56is55i"))))
-    (build-system cargo-build-system)
-    (arguments
-     `(#:skip-build? #t     ; Not all inputs packaged
-       ;#:tests? #f          ; Skip tests for now
-       #:cargo-inputs
-       (("rust-hyphenation" ,rust-hyphenation-0.8)
-        ("rust-smawk" ,rust-smawk-0.3)
-        ("rust-terminal-size" ,rust-terminal-size-0.1)
-        ("rust-unicode-linebreak" ,rust-unicode-linebreak-0.1)
-        ("rust-unicode-width" ,rust-unicode-width-0.1))
-       #:cargo-development-inputs
-       (("rust-criterion" ,rust-criterion-0.3)
-        ("rust-lipsum" ,rust-lipsum-0.8)
-        ("rust-termion" ,rust-termion-1)
-        ;("rust-unic-emoji-char" ,rust-unic-emoji-char-0.9)
-        ("rust-version-sync" ,rust-version-sync-0.9))))
-    (home-page "https://github.com/mgeisler/textwrap")
-    (synopsis
-      "Powerful library for word wrapping, indenting, and dedenting strings")
-    (description
-      "Powerful library for word wrapping, indenting, and dedenting strings")
-    (license license:expat)))
-
 (define-public rust-trycmd-0.12
   (package
     (name "rust-trycmd")
@@ -260,9 +558,7 @@ or any combination.")
          (base32 "1rwa5nzq8c5zg7lqmpkf7hyib415yxshd9amp911y8w1zss4s38p"))))
     (build-system cargo-build-system)
     (arguments
-     `(;#:skip-build? #t     ; Not all inputs at correct versions?
-       ;#:tests? #f          ; Skip tests for now
-       #:cargo-inputs
+     `(#:cargo-inputs
        (("rust-backtrace" ,rust-backtrace-0.3)
         ("rust-concolor" ,rust-concolor-0.0.8)
         ("rust-content-inspector" ,rust-content-inspector-0.2)
@@ -302,7 +598,7 @@ or any combination.")
          (base32 "0wx4wd849bmkqj0gdi041gmpfpvlyhy2ha4zpin69yw9d9npl8cl"))))
     (build-system cargo-build-system)
     (arguments
-     `(;#:skip-build? #t     ; Not all inputs packaged
+     `(#:skip-build? #t     ; Not all inputs packaged
        ;#:tests? #f          ; Skip tests for now
        #:cargo-inputs
        (("rust-combine" ,rust-combine-4)
@@ -371,7 +667,7 @@ or any combination.")
     (license license:gpl3+)))
 
 (define-public gn-rust-correlation
-  (let ((commit "fd85c0f75e03f170b97fcedba26317e0832d087e")
+  (let ((commit "a22381e9830bac9a6848449279d258397217e251")
         (revision "0"))
     (package
       (name "gn-rust-correlation")
@@ -385,7 +681,7 @@ or any combination.")
           (file-name (git-file-name name version))
           (sha256
            (base32
-            "164z2abp8vassxi8bpf68wgiqjmafd6hzrkz4hj3wdhf4djiplrr"))))
+            "1cb197p8zmgxymzs9b7bygs0kg67809z6gc2svza909sxr9ac5ps"))))
       (build-system cargo-build-system)
       (native-inputs
        (list gsl))
diff --git a/gn/packages/gemini.scm b/gn/packages/gemini.scm
deleted file mode 100644
index 9cefbeb..0000000
--- a/gn/packages/gemini.scm
+++ /dev/null
@@ -1,82 +0,0 @@
-(define-module (gn packages gemini)
-  #:use-module (gnu packages autotools)
-  #:use-module (gnu packages gettext)
-  #:use-module (gnu packages guile)
-  #:use-module (gnu packages guile-xyz)
-  #:use-module ((gnu packages skribilo) #:prefix guix:)
-  #:use-module (guix build-system gnu)
-  #:use-module (guix gexp)
-  #:use-module (guix packages)
-  #:use-module (guix git-download)
-  #:use-module ((guix licenses) #:prefix license:))
-
-(define-public skribilo-latest
-  (let ((commit "621eb1945aec8f26f5aee4bdf896f2434e145182")
-        (revision "1"))
-    (package
-      (inherit guix:skribilo)
-      (name "skribilo")
-      (version (git-version "0.9.5" revision commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "https://git.systemreboot.net/skribilo")
-                      (commit commit)))
-                (file-name (git-file-name name version))
-                (sha256
-                 (base32
-                  "16rdcvszl9x183y32hjdwns0lkrvkmwd2fsshymspb12k4cxj6i4"))))
-      (native-inputs
-       `(("autoconf" ,autoconf)
-         ("automake" ,automake)
-         ("gettext" ,gnu-gettext)
-         ,@(package-native-inputs guix:skribilo))))))
-
-(define-public tissue
-  (let ((commit "6d6285d071132960835f848a1703faaea2356937")
-        (revision "3"))
-    (package
-      (name "tissue")
-      (version (git-version "0.1.0" revision commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "https://git.systemreboot.net/tissue")
-                      (commit commit)))
-                (file-name (git-file-name name version))
-                (sha256
-                 (base32
-                  "1dlcy7m4gz1vmklyny4mxky9822q5hjc4qdmn42yf2qvh8xy62g5"))))
-      (build-system gnu-build-system)
-      (arguments
-       (list #:make-flags #~(list (string-append "prefix=" #$output))
-             #:modules `(((guix build guile-build-system)
-                          #:select (target-guile-effective-version))
-                         ,@%gnu-build-system-modules)
-             #:phases
-             (with-imported-modules '((guix build guile-build-system))
-               #~(modify-phases %standard-phases
-                   (replace 'patch-source-shebangs
-                     (lambda* (#:key inputs #:allow-other-keys)
-                       (substitute* "bin/tissue"
-                         (("^exec guile")
-                          (string-append "exec " (search-input-file inputs "/bin/guile"))))))
-                   (delete 'configure)
-                   (add-after 'install 'wrap
-                     (lambda* (#:key inputs outputs #:allow-other-keys)
-                       (let ((out (assoc-ref outputs "out"))
-                             (effective-version (target-guile-effective-version)))
-                         (wrap-program (string-append out "/bin/tissue")
-                           `("GUILE_LOAD_PATH" prefix
-                             (,(string-append out "/share/guile/site/" effective-version)
-                              ,(getenv "GUILE_LOAD_PATH")))
-                           `("GUILE_LOAD_COMPILED_PATH" prefix
-                             (,(string-append out "/lib/guile/" effective-version "/site-ccache")
-                              ,(getenv "GUILE_LOAD_COMPILED_PATH")))))))))))
-      (inputs (list guile-3.0 guile-filesystem guile-git guile-xapian))
-      (propagated-inputs
-       (list skribilo-latest))
-      (home-page "https://tissue.systemreboot.net")
-      (synopsis "Text based issue tracker")
-      (description "tissue is a text based issue tracker.")
-      (license license:gpl3+))))
diff --git a/gn/packages/gemma.scm b/gn/packages/gemma.scm
index e73a40d..e8c5194 100644
--- a/gn/packages/gemma.scm
+++ b/gn/packages/gemma.scm
@@ -27,7 +27,7 @@
 (define-public gemma-gn2 ; guix candidate - currently uses generic
                          ; openblas version and genenetwork github repo
 
-  (let ((commit "71553f5e5626e1d791b5be24c84ea6b17ae81cc7"))
+  (let ((commit "8cd4cdb23ecae8387c942ae5c203c5d61e137376"))
   (package
     (name "gemma-gn2")
     (version (string-append "0.98.5-" (string-take commit 7)))
@@ -39,8 +39,9 @@
              (file-name (string-append name "-" version "-checkout"))
              (sha256
               (base32
-               "11farc7smvkrrkvkbvh26i3sycdzwxrbgj536s3478v8j6iiwijp"))))
+            "06csrh8rgcjcl52ljyynizb15gy84gcd6glzl0gfkawmxy6am9n4"))))
     (inputs `(
+              ("catch" ,catch2)
               ("gsl" ,gsl)
               ("shunit2-old" ,shunit2-old)
               ("openblas" ,openblas)
diff --git a/gn/packages/genenetwork.scm b/gn/packages/genenetwork.scm
index 18b77e4..36d3ae6 100644
--- a/gn/packages/genenetwork.scm
+++ b/gn/packages/genenetwork.scm
@@ -27,8 +27,10 @@
   #:use-module (gnu packages golang)
   #:use-module (gnu packages graph)
   #:use-module (gnu packages graphviz)
+  #:use-module (gnu packages machine-learning)
   #:use-module (gnu packages parallel)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-check)
   #:use-module (gnu packages python-crypto)
   #:use-module (gnu packages python-science)
@@ -41,9 +43,7 @@
   #:use-module (gnu packages statistics)
   #:use-module (gnu packages textutils)
   #:use-module (gnu packages version-control)
-  ; #:use-module (gnu packages vim)
   #:use-module (gnu packages web)
-  ; #:use-module (gnu packages wget)
   #:use-module (gnu packages xml)
   #:use-module (gn packages bioinformatics)
   #:use-module (gn packages crates-io)
@@ -51,8 +51,8 @@
   #:use-module (gn packages javascript)
   #:use-module (gn packages python)
   #:use-module (gn packages statistics)
-  #:use-module (gn packages twint)
   #:use-module (gn packages web)
+  #:use-module (gn packages python-web)
   #:use-module (srfi srfi-1))
 
 
@@ -100,11 +100,20 @@
       (description "Reimplementation of genenetwork/QTLReaper in Rust")
       (license #f))))
 
+; Tests on the upstream python-pengouin package are broken. So, we
+; create this temporary workaround.
+(define python-pingouin-without-tests
+ (package
+   (inherit python-pingouin)
+   (arguments
+    (substitute-keyword-arguments (package-arguments python-pingouin)
+      ((#:tests? _ #f) #f)))))
+
 (define-public genenetwork3
-  (let ((commit "fe1b8be86b65346724f8f78ab9e5d897e0c480b0"))
+  (let ((commit "f52247c15f3694f3dd5fd0fd79c3e15376137e07"))
     (package
       (name "genenetwork3")
-      (version (git-version "0.1.0" "2" commit))
+      (version (git-version "0.1.0" "3" commit))
       (source
        (origin
          (method git-fetch)
@@ -114,7 +123,9 @@
          (file-name (git-file-name name version))
          (sha256
           (base32
-           "1i7g2c3irp5rr2b8vb7xm9v1hjb5vssc92s2lq910qszd53pdzgn"))))
+           "0ac0dr8dny65x4xvm8gw6ap3g8g0j933ipy9116idcws31rk2adk"))))
+      (inputs
+       (list python-click))
       (native-inputs
        (list python-hypothesis
              python-mypy
@@ -127,7 +138,8 @@
              python-wrapper
              csvdiff
              gn-rust-correlation
-             python-bcrypt
+             python-bcrypt ;; Replace use of bcrypt with argon below
+	     python-argon2-cffi
              python-flask
              python-flask-cors
              ;; Not working in Python > 3.8
@@ -136,12 +148,18 @@
              python-mysqlclient
              python-numpy
              python-pandas
-             python-pingouin
+             ;; python-pingouin << build failing
+             python-pingouin-without-tests
              python-plotly
+             python-scikit-learn
+             python-pymonad
              python-redis
              python-requests
              python-scipy
+	     python-authlib
              python-sparqlwrapper
+	     python-email-validator
+             python-xapian-bindings
              r-optparse
              r-qtl
              r-rjson
@@ -149,15 +167,23 @@
              r-wgcna
              r-ctl
              rust-qtlreaper
-	     diffutils))
+	     diffutils
+	     yoyo-migrations))
       (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")))))))
       (home-page "https://github.com/genenetwork/genenetwork3")
       (synopsis "GeneNetwork3 API for data science and machine learning.")
       (description "GeneNetwork3 API for data science and machine learning.")
       (license license:agpl3+))))
 
 (define-public genenetwork2
-  (let ((commit "13289325fb22c4bc10b52414fb9755e7911795f3"))
+  (let ((commit "bfe557dc1e537dc78a82a30817ecf2ca3004d978"))
     (package
       (name "genenetwork2")
       (version (git-version "3.11" "2" commit))
@@ -169,7 +195,7 @@
                 (file-name (string-append name "-" version))
                 (sha256
                  (base32
-                  "1ny0ix9h7r52lb2qhf2hpfqijckhkw4jr1wp53qfzrd84lf4pii4"))))
+                  "1bn0j0fpk4hcicgfird62x5wq2n6lj4rs1ggw69dcxyf4qdxbk5d"))))
       (native-inputs
        (list graphviz))
       (propagated-inputs
@@ -221,13 +247,13 @@
          ("python-simplejson" ,python-simplejson)
          ("python-markdown" ,python-markdown)
          ("python-rdflib" ,python-rdflib)
-         ("python-twint" ,python-twint)
+	 ("python-authlib" ,python-authlib)
+	 ("python-flask-session" ,python-flask-session)
          ;; TODO: Get rid of Python R bindings
          ("python-rpy2" ,python-rpy2)
          ("python-beautifulsoup4" ,python-beautifulsoup4)
          ;; Disable for now. Build fails on Penguin2
          ;; ("python-flask-socketio" ,python-flask-socketio)
-         ("python-xapian-bindings" ,python-xapian-bindings)
          ("python-xlsxwriter" ,python-xlsxwriter)
          ;; All the external js dependencies
          ("javascript-twitter-post-fetcher" ,javascript-twitter-post-fetcher)
diff --git a/gn/packages/julia.scm b/gn/packages/julia.scm
index 6dddd4b..31cc29c 100644
--- a/gn/packages/julia.scm
+++ b/gn/packages/julia.scm
@@ -23,19 +23,19 @@
 (define S specification->package)
 
 (define-public julia-visuals
-  (let ((commit "e7d670eb045a9f8e3a839476dc166318da7fe9dc")
-        (revision "1"))
+  (let ((commit "e8e2b601f40a76c8f20f0ddfe80c56257dd9a294")
+        (revision "2"))
     (package
       (name "julia-visuals")
       (version (git-version "0.0.0" revision commit))
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
-                       (url "https://github.com/sens/visuals")
-                       (commit commit)))
+                      (url "https://github.com/sens/visuals")
+                      (commit commit)))
                 (file-name (git-file-name name version))
                 (sha256
-                 (base32 "15hshm5qrig5qbj02xy4ji79kfc72n93nna5nvxkhvb8gw3vvx07"))))
+                 (base32 "0lm9yhk0mq5cvvkcbsgcjc1y7fzhr8qz2nxn38cy1zdxd8vfknsx"))))
       (build-system julia-build-system)
       (arguments
        `(#:tests? #f    ; no test suite
@@ -53,38 +53,66 @@
                (let ((out (assoc-ref outputs "out")))
                  ;; Copied from the Dockerfile.
                  (for-each
-                   (lambda (file)
-                     (copy-recursively file (string-append out "/" file)))
-                   (list "plutoserver"
-                         "environment.yml"
-                         "setup.py"
-                         "runpluto.sh"
-                         "notebooks"
-                         "Project.toml"
-                         "Manifest.toml")))))
+                  (lambda (file)
+                    (copy-recursively file (string-append out "/" file)))
+                  (list "plutoserver"
+                        "environment.yml"
+                        "setup.py"
+                        "runpluto.sh"
+                        "notebooks"
+                        "Project.toml")))))
            (add-after 'install 'wrap-program
              (lambda* (#:key inputs outputs #:allow-other-keys)
                (let ((out (assoc-ref outputs "out")))
                  ;; Do we need to wrap this with PYTHONPATH too?
                  (wrap-script (string-append out "/runpluto.sh")
-                   `("PATH" ":" prefix (,(string-append (assoc-ref inputs "julia") "/bin")
+                  `("PATH" ":" prefix (,(string-append (assoc-ref inputs "julia") "/bin")
                                         ,(string-append (assoc-ref inputs "coreutils") "/bin")))
-                   `("JULIA_LOAD_PATH" ":" prefix (,(getenv "JULIA_LOAD_PATH")))))))
+                  `("JULIA_LOAD_PATH" ":" prefix (,(getenv "JULIA_LOAD_PATH")))))))
+           (add-after 'install 'create-run-program
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (let ((out (assoc-ref outputs "out")))
+                 (with-output-to-file (string-append out "/runpluto")
+                   (lambda ()
+                     (format #t "#!~a --no-auto-compile
+!#
+(setenv \"JULIA_LOAD_PATH\" \"~a\")
+(setenv \"PATH\" \"~a\")
+(zero? (system*
+         \"~a\"
+         \"--project=/home/jovyan\"
+         \"--optimize=0\"
+         \"-e\" \"import Pluto;
+         Pluto.run(
+            host=\\\"0.0.0.0\\\",
+            port=4343,
+            launch_browser=false,
+            require_secret_for_open_links=false;
+            require_secret_for_access=false)\"))\n"
+                             (search-input-file inputs "/bin/guile")
+                             (getenv "JULIA_LOAD_PATH")
+                             (dirname (search-input-file inputs "/bin/yes"))
+                             (search-input-file inputs "/bin/julia"))))
+                   (chmod (string-append out "/runpluto") #o555))))
            (replace 'precompile
              (lambda _
                (invoke "julia" "-e" "\"import Pkg; Pkg.instantiate(); Pkg.status(); Pkg.precompile()\""))))))
+
       (propagated-inputs
        `(;; from setup.py
          ("python-jupyter-server-proxy"
           ,(@ (gn packages python) python-jupyter-server-proxy-1))))
+
       (inputs
-       `(("julia-distributions" ,julia-distributions)
-         ("julia-latexstrings" ,julia-latexstrings)
-         ("julia-optim" ,julia-optim)
-         ("julia-plots" ,julia-plots)
-         ("julia-pluto" ,julia-pluto)
-         ("julia-plutoui" ,julia-plutoui)
-         ("guile" ,(@ (gnu packages guile) guile-3.0))))    ; for wrap-script
+       (list julia-distributions
+             ;julia-interactiveutils    ; stdlib
+             julia-latexstrings
+             ;julia-markdown            ; stdlib
+             julia-optim
+             julia-plots
+             julia-pluto
+             julia-plutoui
+             (@ (gnu packages guile) guile-3.0)))   ; for wrap-script
       (home-page "https://github.com/sens/visuals")
       (synopsis "Visualizations using Pluto.jl notebooks")
       (description "Visualizations using Pluto.jl notebooks.")
@@ -262,7 +290,7 @@ distributed computing.")
 (define-public julia-distributions
   (package
     (name "julia-distributions")
-    (version "0.25.11")
+    (version "0.25.80")
     (source
       (origin
         (method git-fetch)
@@ -271,12 +299,14 @@ distributed computing.")
                (commit (string-append "v" version))))
         (file-name (git-file-name name version))
         (sha256
-         (base32 "0n5xgdpzrpb4s0g23rjggk7c7x8677hbhq0sam7xbw9mn2w79m7n"))))
+         (base32 "0nqlnkh8grxfm8d1mivi7dnrvb31bznj9s540a10d2v396ikfggn"))))
     (build-system julia-build-system)
     (arguments
      `(#:tests? #f))        ; Some failed tests
     (propagated-inputs
-     `(("julia-fillarrays" ,julia-fillarrays)
+     `(("julia-chainrulescore" ,julia-chainrulescore)
+       ("julia-densityinterface" ,julia-densityinterface)
+       ("julia-fillarrays" ,julia-fillarrays)
        ("julia-pdmats" ,julia-pdmats)
        ("julia-quadgk" ,julia-quadgk)
        ("julia-specialfunctions" ,julia-specialfunctions)
@@ -284,9 +314,11 @@ distributed computing.")
        ("julia-statsfuns" ,julia-statsfuns)))
     (native-inputs
      `(("julia-calculus" ,julia-calculus)
+       ("julia-chainrulestestutils" ,julia-chainrulestestutils)
        ("julia-finitedifferences" ,julia-finitedifferences)
        ("julia-forwarddiff" ,julia-forwarddiff)
        ("julia-json" ,julia-json)
+       ("julia-offsetarrays" ,julia-offsetarrays)
        ("julia-stablerngs" ,julia-stablerngs)
        ("julia-staticarrays" ,julia-staticarrays)))
     (home-page "https://github.com/JuliaStats/Distributions.jl")
@@ -303,6 +335,31 @@ properties
 @end enumerate")
     (license license:expat)))
 
+;; ready to upstream
+(define-public julia-densityinterface
+  (package
+    (name "julia-densityinterface")
+    (version "0.4.0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaMath/DensityInterface.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "10yr69lndh4jdyhjnpm421zvbw8v48bimxjawz05lqkd7k4w4lw6"))))
+    (build-system julia-build-system)
+    (propagated-inputs
+     (list julia-inversefunctions))
+    (native-inputs
+     (list julia-documenter))
+    (home-page "https://github.com/JuliaMath/DensityInterface.jl")
+    (synopsis "Interface for mathematical/statistical densities")
+    (description "This package defines an interface for mathematical/statistical
+densities and objects associated with a density in Julia.")
+    (license license:expat)))
+
 (define-public julia-plots
   (package
     (name "julia-plots")
@@ -369,40 +426,40 @@ properties
 (define-public julia-pluto
   (package
     (name "julia-pluto")
-    (version "0.15.1")
+    (version "0.19.9")
     (source
       (origin
         (method git-fetch)
         (uri (git-reference
                (url "https://github.com/fonsp/Pluto.jl")
-               (commit (string-append "v" version))))
+               (commit (string-append "v" version "-src"))))
         (file-name (git-file-name name version))
         (sha256
-         (base32 "1jsvqi33rsj8izm9pb0r4gjzb5xd01dxri8xp95h84kd0rdliirr"))))
+         (base32 "0h9sz4mpf3a4k0f5fblbb6j07wdhrnarxajrn0wz6zsq6w30x6yj"))))
     (build-system julia-build-system)
     (arguments
-     `(#:tests? #f      ; Test suite fails to load HTTP.jl.
+     `(#:tests? #f      ; Test suite tries to download the package registry.
        #:phases
        (modify-phases %standard-phases
          (add-after 'link-depot 'dont-check-for-upgrades
            (lambda _
-             (substitute* "frontend/components/Welcome.js"
-               (("local_index !== -1") "false"))))
-         (add-after 'link-depot 'skip-network-tests
-           (lambda _
-             (substitute* "test/runtests.jl"
-               ;; Attempts to update the package registry.
-               ((".*Basic.jl.*") "")))))))
+             (substitute* "frontend/components/welcome/Welcome.js"
+               ((".*new_update_message.*") "")))))))
     (propagated-inputs
-     `(("julia-configurations" ,julia-configurations)
-       ("julia-fuzzycompletions" ,julia-fuzzycompletions)
-       ("julia-http" ,julia-http)
-       ("julia-msgpack" ,julia-msgpack)
-       ("julia-tableiointerface" ,julia-tableiointerface)
-       ("julia-tables" ,julia-tables)))
+     (list julia-configurations
+           julia-fuzzycompletions
+           julia-http
+           julia-hypertextliteral
+           julia-mimes
+           julia-msgpack
+           julia-precompilesignatures
+           julia-relocatablefolders
+           julia-tables
+           julia-uris))
     (native-inputs
-     `(("julia-dataframes" ,julia-dataframes)
-       ("julia-offsetarrays" ,julia-offsetarrays)))
+     (list julia-dataframes
+           julia-offsetarrays
+           julia-timeroutputs))
     (home-page "https://github.com/fonsp/Pluto.jl")
     (synopsis "Simple reactive notebooks for Julia")
     (description "A Pluto notebook is made up of small blocks of Julia code
@@ -412,11 +469,10 @@ placed in arbitrary order - intelligent syntax analysis figures out the
 dependencies between them and takes care of execution.")
     (license license:expat)))
 
-;; ready to upstream, wait on Pluto.jl?
 (define-public julia-plutoui
   (package
     (name "julia-plutoui")
-    (version "0.7.9")
+    (version "0.7.51")
     (source
       (origin
         (method git-fetch)
@@ -425,24 +481,601 @@ dependencies between them and takes care of execution.")
                (commit (string-append "v" version))))
         (file-name (git-file-name name version))
         (sha256
-         (base32
-          "0p159b4m0nxbz36ll5kf082vb806n2f26ma145pbhp749aldzplp"))))
+         (base32 "0hqaa8wx7mia3krdwhj2yf8aa4a8h4r09j16dxn7nyc0zcz8hgb2"))))
     (build-system julia-build-system)
     (propagated-inputs
-     `(("julia-json" ,julia-json)
-       ("julia-reexport" ,julia-reexport)
-       ("julia-suppressor" ,julia-suppressor)))
+     (list julia-abstractplutodingetjes
+           julia-colortypes
+           julia-fixedpointnumbers
+           julia-hyperscript
+           julia-hypertextliteral
+           julia-iocapture
+           julia-json
+           julia-mimes
+           julia-reexport
+           julia-uris))
     (home-page "https://github.com/fonsp/PlutoUI.jl")
     (synopsis "Helper package for Julia Pluto")
     (description "This package helps to make @code{html\"<input>\"} a bit more
 native to Julia.  Use it with the @code{@@bind} macro in Pluto.")
+    (license license:unlicense)))
+
+(define-public julia-http-1.5
+  (package
+    (inherit julia-http)
+    (name "julia-http")
+    (version "1.5.5")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/JuliaWeb/HTTP.jl")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0qcfixsq65g8hdimygam7cd8nvcz6w7nzkkjk98mvf65dcby4593"))))
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'install 'disable-network-tests
+            (lambda _
+              #;(substitute* "test/runtests.jl"
+                (("\"async.jl") "# \"async.jl")
+                (("\"client.jl") "# \"client.jl"))
+              #;(substitute* "test/aws4.jl"
+                (("@testset.*HTTP.request with AWS authentication.*" all)
+                 (string-append all "return\n")))
+              #;(substitute* "test/insert_layers.jl"
+                (("@testset.*Inserted final layer runs handler.*" all)
+                 (string-append all "return\n")))
+              #;(substitute* "test/multipart.jl"
+                (("@testset \"Setting of Content-Type.*" all)
+                 (string-append all "return\n"))
+                (("@testset \"Deprecation of .*" all)
+                 (string-append all "return\n")))
+              #;(substitute* "test/websockets.jl"
+                (("@testset.*External Host.*" all)
+                 (string-append all "return\n")))
+              #;(substitute* "test/messages.jl"
+                (("@testset.*Read methods.*" all)
+                 (string-append all "return\n"))
+                (("@testset.*Body - .*" all)
+                 (string-append all "return\n"))
+                (("@testset.*Write to file.*" all)
+                 (string-append all "return\n")))
+              #;(substitute* "test/cookies.jl"
+                (("@testset.*Set-Cookie casing.*" all)
+                 (string-append all "return\n")))
+#t)))))
+    (propagated-inputs
+     (list julia-codeczlib
+           julia-inifile
+           julia-loggingextras
+           julia-mbedtls
+           julia-openssl
+           julia-simplebufferstream
+           julia-uris))
+    ;; required for tests
+    (native-inputs
+     (list julia-bufferedstreams
+           julia-json))))
+
+(define-public julia-simplebufferstream
+  (package
+    (name "julia-simplebufferstream")
+    (version "1.1.0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaPackaging/SimpleBufferStream.jl")
+               ;; First commit after 1.1.0 with a license
+               (commit "80c9854d5d9ea921da6f619624989fa30e83b8be")))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "05c4d73ki4cp38g66ljxwbl2d0dni3w05r8xsd6g1v63x2rqqbgn"))))
+    (build-system julia-build-system)
+    (arguments
+     (list
+       #:phases
+       #~(modify-phases %standard-phases
+           (add-after 'link-depot 'adjust-tests
+             (lambda _
+               (substitute* "test/runtests.jl"
+                 ;; Tests fail when build machine is too *fast*.
+                 (("0\\.01") "0.001")
+                 ;; Don't create circular dependencies with http
+                 (("using HTTP.*") "")
+                 (("@testset.*HTTP.jl.*" all)
+                  (string-append all "return\n"))))))))
+    (home-page "https://github.com/JuliaPackaging/SimpleBufferStream.jl")
+    (synopsis "What Base.BufferStream should be")
+    (description "This is what I wish Base.BufferStream was.")
+    (license license:expat)))
+
+(define-public julia-openssl
+  (package
+    (name "julia-openssl")
+    (version "1.4.1")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaWeb/OpenSSL.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "1s2h4qh9y3alhkf18p4pjqp77mvsb47qagmk68pq0wsx8r3hzhzx"))))
+    (build-system julia-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'install 'disable-network-tests
+            (lambda _
+              (substitute* "test/runtests.jl"
+                ;; No /etc/ssl/certs/ca-certificates.crt in the build environment.
+                (("@testset.*(ReadPEMCert|X509Certificate|X509Store).*" all)
+                 (string-append all "return\n"))
+                ;; No network connection
+                (("@testset.*(HttpsConnect|ClosedStream|NoCloseStream).*" all)
+                 (string-append all "return\n"))
+                ;; undefined symbol.
+                ;; XXX: THIS BREAKS THE PACKAGE!
+                (("@testset.*ErrorTaskTLS.*" all)
+                 (string-append all "return\n"))))))))
+    (propagated-inputs
+     (list julia-bitflags
+           julia-openssl-jll))
+    (home-page "https://github.com/JuliaWeb/OpenSSL.jl")
+    (synopsis "Openssl Julia bindings")
+    (description "This package provides Openssl Julia bindings.")
+    (license license:expat)))
+
+#;(define-public julia-openssl-jll
+  (package
+    (name "julia-openssl-jll")
+    (version "3.0.8+0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaBinaryWrappers/OpenSSL_jll.jl")
+               (commit (string-append "OpenSSL-v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "1d9kcx7a3yv3rgkggq7h436sfjafr66pq8d0lmlcjxdpl46hx3j7"))))
+    (build-system julia-build-system)
+    (arguments
+     '(#:tests? #f ; no runtests
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'link-depot 'override-binary-path
+           (lambda* (#:key inputs #:allow-other-keys)
+             (map
+               (lambda (wrapper)
+                 (substitute* wrapper
+                   (("lib64") "lib")
+                   (("generate_wrapper_header.*")
+                   (string-append
+                    "generate_wrapper_header(\"OpenSSL\", \""
+                    (assoc-ref inputs "openssl") "\")\n"))))
+               ;; There's a Julia file for each platform, override them all
+               (find-files "src/wrappers/" "\\.jl$")))))))
+    (inputs
+     (list (@ (gnu packages tls) openssl)))
+    (propagated-inputs
+     (list julia-jllwrappers))
+    (home-page "https://github.com/JuliaBinaryWrappers/OpenSSL_jll.jl")
+    (synopsis "Openssl library wrappers")
+    (description "This package provides a wrapper for openssl.")
+    (license license:expat)))
+
+#;(define-public julia-openssl-jll-1.1
+  (package
+    (name "julia-openssl-jll")
+    (version "1.1.21+0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaBinaryWrappers/OpenSSL_jll.jl")
+               (commit (string-append "OpenSSL-v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "05wgsvy0iviffkcq4w1dg8gaafyxknnk26c1gpcgma5yhfia8yfs"))))
+    (build-system julia-build-system)
+    (arguments
+     '(#:tests? #f ; no runtests
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'link-depot 'override-binary-path
+           (lambda* (#:key inputs #:allow-other-keys)
+             (map
+               (lambda (wrapper)
+                 (substitute* wrapper
+                   (("generate_wrapper_header.*")
+                   (string-append
+                    "generate_wrapper_header(\"OpenSSL\", \""
+                    (assoc-ref inputs "openssl") "\")\n"))))
+               ;; There's a Julia file for each platform, override them all
+               (find-files "src/wrappers/" "\\.jl$")))))))
+    (inputs
+     (list (@ (gnu packages tls) openssl-1.1)))
+    (propagated-inputs
+     (list julia-jllwrappers))
+    (home-page "https://github.com/JuliaBinaryWrappers/OpenSSL_jll.jl")
+    (synopsis "Openssl library wrappers")
+    (description "This package provides a wrapper for openssl.")
+    (license license:expat)))
+
+(define-public julia-bitflags
+  (package
+    (name "julia-bitflags")
+    (version "0.1.7")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/jmert/BitFlags.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "1wphfpwqm7bsff68d6h9yhhxrh1lq2shyl0afbzp0h5czf6qi2xr"))))
+    (build-system julia-build-system)
+    (home-page "https://github.com/jmert/BitFlags.jl")
+    (synopsis "Enum-like type for bit flag option values")
+    (description "@code{BitFlag.jl} provides an @code{Enum}-like type for bit
+flag option values.")
+    (license license:expat)))
+
+(define-public julia-relocatablefolders
+  (package
+    (name "julia-relocatablefolders")
+    (version "0.3.0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaPackaging/RelocatableFolders.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "116f98y2w5cqkv2fvddmv54422cpby6d7q1dndgqh2rdlkpb44iw"))))
+    (build-system julia-build-system)
+    (propagated-inputs
+     (list julia-scratch))
+    (home-page "https://github.com/JuliaPackaging/RelocatableFolders.jl")
+    (synopsis "Reference packages in their project directory")
+    (description "An alternative to the @code{@@__DIR__} macro.  Packages that
+wish to reference paths in their project directory run into issues with
+relocatability when used in conjunction with @code{PackageCompiler}.")
+    (license license:expat)))
+
+(define-public julia-scratch
+  (package
+    (name "julia-scratch")
+    (version "1.1.1")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaPackaging/Scratch.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "0s7dmqsskq5vy7sk6pxng5vrznrn6msg7xf8a9kj3a03b617pgap"))))
+    (build-system julia-build-system)
+    (arguments
+     (list #:tests? #f))        ; Tries to download the Julia registry.
+    (home-page "https://github.com/JuliaPackaging/Scratch.jl")
+    (synopsis "Scratch spaces for all your persistent mutable data needs")
+    (description "This repository implements the scratch spaces API for
+package-specific mutable containers of data.  These spaces can contain
+datasets, text, binaries, or any other kind of data that would be convenient to
+store in a location specific to your package.  As compared to Artifacts, these
+containers of data are mutable.  Because the scratch space location on disk is
+not very user-friendly, scratch spaces should, in general, not be used for a
+storing files that the user must interact with through a file browser.  In that
+event, packages should simply write out to disk at a location given by the
+user.  Scratch spaces are designed for data caches that are completely managed
+by a package and should be removed when the package itself is uninstalled.")
+    (license license:expat)))
+
+(define-public julia-hypertextliteral
+  (package
+    (name "julia-hypertextliteral")
+    (version "0.9.4")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaPluto/HypertextLiteral.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "06nzgxrl1aac9bqb37l2lak2aicp9h7fd1ijcva9pq80z0d74a8a"))))
+    (build-system julia-build-system)
+    (arguments (list #:tests? #f))      ; Disable tests until all inputs are pacakged.
+    (propagated-inputs
+     (list julia-tricks))
+    (native-inputs
+     (list julia-documenter
+           ;julia-faker
+           julia-hyperscript
+           ;julia-narrativetest
+           ))
+    (home-page "https://juliapluto.github.io/HypertextLiteral.jl/stable/")
+    (synopsis "Julia library for the string interpolation of HTML and SVG")
+    (description "HypertextLiteral is a Julia package for generating HTML, SVG,
+and other SGML tagged content.  It works similar to Julia string interpolation,
+only that it tracks hypertext escaping needs and provides handy conversions
+dependent upon context.")
+    (license license:expat)))
+
+;; This can be removed with julia-1.10
+(define-public julia-tricks
+  (package
+    (name "julia-tricks")
+    (version "0.1.7")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/oxinabox/Tricks.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "0870hiqpl14wpr2v16wl6fw89r469yjrchv6gn4pfw2irw3nkjip"))))
+    (build-system julia-build-system)
+    (home-page "https://github.com/oxinabox/Tricks.jl")
+    (synopsis "Cunning tricks though the julia compiler internals")
+    (description "Tricks.jl is an particularly cunning package that does tricks
+with the Julia edge system.")
+    (license license:expat)))
+
+(define-public julia-registryinstances
+  (package
+    (name "julia-registryinstances")
+    (version "0.1.0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/GunnarFarneback/RegistryInstances.jl")
+               (commit "2796d959014475bc19e2dfa174179cdf02642d28")))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "09926dy2s4wcml6s2hrbq1j1r1456d61fvk5fma4sbr9qsvpyyd0"))))
+    (build-system julia-build-system)
+    (arguments
+     (list #:tests? #f))        ; TODO:   Got exception outside of a @test
+    (propagated-inputs
+     (list julia-lazilyinitializedfields))
+    (home-page "https://github.com/GunnarFarneback/RegistryInstances.jl")
+    (synopsis "Access the information in installed Julia registries")
+    (description "Julia's package manager stores package metadata in registries,
+which consist of TOML files in a directory structure.")
+    (license license:expat)))
+
+(define-public julia-lazilyinitializedfields
+  (package
+    (name "julia-lazilyinitializedfields")
+    (version "1.2.1")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/KristofferC/LazilyInitializedFields.jl")
+               (commit "53ed8cbe78b2048105a0e0b355294e7f024e3d14")))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "1jwpka27d873cyn0vxrg7h7ns7fmlqlyx5h38cw6zvfbdhkrmi09"))))
+    (build-system julia-build-system)
+    (native-inputs
+     (list julia-documenter))
+    (home-page "https://github.com/KristofferC/LazilyInitializedFields.jl")
+    (synopsis "Handle lazily initialized fields")
+    (description "A package for handling lazily initialized fields.")
+    (license license:expat)))
+
+(define-public julia-mimes
+  (package
+    (name "julia-mimes")
+    (version "0.1.4")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaWeb/MIMEs.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "0vgc2q2mgbrm16px7cbqsrga9l99djlb1ayg5k1djb0mbnprjajk"))))
+    (build-system julia-build-system)
+    (home-page "https://github.com/JuliaWeb/MIMEs.jl")
+    (synopsis "MIME information: filetype, encoding, gzip")
+    (description "A small package to transform between file extensions and MIME
+types, with bonus features.")
+    (license license:expat)))
+
+(define-public julia-loggingextras
+  (package
+    (name "julia-loggingextras")
+    (version "1.0.0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaLogging/LoggingExtras.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "0mc0bbr2wsa809q74hg4npdw2xcni4xl40zz50i6djwnxq88yl07"))))
+    (build-system julia-build-system)
+    (home-page "https://github.com/JuliaLogging/LoggingExtras.jl")
+    (synopsis "Composable Loggers for the Julia Logging StdLib")
+    (description "LoggingExtras is designs around allowing you to build
+arbitrarily complicated systems for \"log plumbing\".  That is to say basically
+routing logged information to different places.  It is built around the idea of
+simple parts which are composed together, to allow for powerful and flexible
+definition of your logging system.")
+    (license license:expat)))
+
+(define-public julia-precompilesignatures
+  (package
+    (name "julia-precompilesignatures")
+    (version "3.0.3")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/rikhuijzer/PrecompileSignatures.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "11rjdx8n3q10iis7ryzbvlvgdpi6kd2h53qp7lac02yx6rsgsfx1"))))
+    (build-system julia-build-system)
+    (arguments
+     (list #:tests? #f))    ; cycle with Pluto.jl.
+    ;(native-inputs
+    ; (list julia-pluto))
+    (home-page "https://github.com/rikhuijzer/PrecompileSignatures.jl")
+    (synopsis "Generate precompile directives by reading method signatures")
+    (description "This package reads all method signatures in a package and
+generates precompile directives for any concrete signature that it can find.")
+    (license license:expat)))
+
+(define-public julia-precompiletools
+  (package
+    (name "julia-precompiletools")
+    (version "1.1.2")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaLang/PrecompileTools.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "124qzflwnn34d8x8vz3cmj2m4a55mg5qf8i8jdcwyyrnag3si7zr"))))
+    (build-system julia-build-system)
+    (arguments
+     (list #:tests? #f))        ; Tries to download the Julia registry.
+    (propagated-inputs
+     (list julia-preferences))
+    (home-page "https://github.com/JuliaLang/PrecompileTools.jl")
+    (synopsis "Reduce time-to-first-execution of Julia code")
+    (description "PrecompileTools allows you to reduce the latency of the first
+execution of Julia code.  It is applicable for package developers and for
+\"ordinary users\" in their personal workflows.")
+    (license license:expat)))
+
+(define-public julia-timeroutputs
+  (package
+    (name "julia-timeroutputs")
+    (version "0.5.23")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/KristofferC/TimerOutputs.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "031m7d837cw4c7iz4arrm1a1ppqihhj5jsldvm7z1bc72jxgfrcv"))))
+    (build-system julia-build-system)
+    (propagated-inputs
+     (list julia-exprtools))
+    (home-page "https://github.com/KristofferC/TimerOutputs.jl")
+    (synopsis "Formatted output of timed sections in Julia")
+    (description "TimerOutputs is a small Julia package that is used to generate
+formatted output from timings made in different sections of a program.  It's
+main functionality is the @code{@@timeit} macro, similar to the @code{@@time}
+macro in Base except one also assigns a label to the code section being timed.
+Multiple calls to code sections with the same label (and in the same \"scope\")
+will accumulate the data for that label.  After the program has executed, it is
+possible to print a nicely formatted table presenting how much time,
+allocations and number of calls were made in each section.  The output can be
+customized as to only show the things you are interested in.")
+    (license license:expat)))
+
+(define-public julia-memoize
+  (package
+    (name "julia-memoize")
+    (version "0.4.4")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaCollections/Memoize.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "0mfavihgdmh6zzjx5lzbigmgsa50pa9ik9gk2gq9wam26prkmkba"))))
+    (build-system julia-build-system)
+    (propagated-inputs
+     (list julia-macrotools))
+    (home-page "https://github.com/JuliaCollections/Memoize.jl")
+    (synopsis "Memoize macro for Julia")
+    (description "Easy memoization for Julia.")
+    (license license:bsd-0)))
+
+(define-public julia-abstractplutodingetjes
+  (package
+    (name "julia-abstractplutodingetjes")
+    (version "1.1.4")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaPluto/AbstractPlutoDingetjes.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "03grnv26n3qdadb2awv3d0rs655l5hhmh7h43v949za9aaaz89j3"))))
+    (build-system julia-build-system)
+    (arguments
+     (list #:tests? #f))        ; No tests for this package.
+    (home-page "https://docs.juliahub.com/AbstractPlutoDingetjes/UHbnu/")
+    (synopsis "Abstract package for creating widgets in Pluto.jl")
+    (description "An abstract package to be implemented by packages/people who
+create widgets (or other dingetjes) for Pluto.")
+    (license license:unlicense)))
+
+(define-public julia-hyperscript
+  (package
+    (name "julia-hyperscript")
+    (version "0.0.4")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaWeb/Hyperscript.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "0flap3a9p6fr768kjfk1lkyfgjqcyhzvzl7in7gjszfy04pqj55w"))))
+    (build-system julia-build-system)
+    (home-page "https://github.com/JuliaWeb/Hyperscript.jl")
+    (synopsis "Lightweight DOM representation for Julia")
+    (description "Hyperscript is a package for working with HTML, SVG, and CSS
+in Julia.  When using this library you automatically get:
+@enumerate
+@item A concise DSL for writing HTML, SVG, and CSS.
+@item Flexible ways to combine DOM pieces together into larger components.
+@item Safe and automatic HTML-escaping.
+@item Lightweight and optional support for scoped CSS.
+@item Lightweight and optional support for CSS unit arithmetic.
+@end enumerate")
     (license license:expat)))
 
 ;; ready to upstream
 (define-public julia-statsfuns
   (package
     (name "julia-statsfuns")
-    (version "0.9.8")
+    (version "0.9.18")
     (source
       (origin
         (method git-fetch)
@@ -451,21 +1084,19 @@ native to Julia.  Use it with the @code{@@bind} macro in Pluto.")
                (commit (string-append "v" version))))
         (file-name (git-file-name name version))
         (sha256
-         (base32 "1zl46p9gbx9xkjnnpd45csshqvq2i94mxw10karpr8xkx8msyk3k"))))
+         (base32 "1y71gz4skp6hxw8k5vjbjayplxmdfh3m3yjfw4ggi0azav6c9hrk"))))
     (build-system julia-build-system)
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-after 'link-depot 'adjust-test-suite
-           (lambda _
-             (substitute* "test/misc.jl"
-               (("test logmvbeta\\(1") "test_nowarn logmvbeta(1")))))))
     (propagated-inputs
-     (list julia-logexpfunctions
+     (list julia-chainrulescore
+           julia-inversefunctions
+           julia-irrationalconstants
+           julia-logexpfunctions
+           julia-reexport
            julia-rmath
            julia-specialfunctions))
     (native-inputs
-     (list julia-forwarddiff))
+     (list julia-chainrulestestutils
+           julia-forwarddiff))
     (home-page "https://github.com/JuliaStats/StatsFuns.jl")
     (synopsis "Mathematical functions related to statistics")
     (description "This package provides a collection of mathematical constants
@@ -473,6 +1104,29 @@ and numerical functions for statistical computing.")
     (license license:expat)))
 
 ;; ready to upstream
+(define-public julia-inversefunctions
+  (package
+    (name "julia-inversefunctions")
+    (version "0.1.8")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/JuliaMath/InverseFunctions.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "05g9f6i735x7syfr56l4yf4fy71kgdisjc6cfxi4jkf46iq86a69"))))
+    (build-system julia-build-system)
+    (native-inputs
+     (list julia-documenter))
+    (home-page "https://github.com/JuliaMath/InverseFunctions.jl")
+    (synopsis "Interface for function inversion in Julia")
+    (description
+     "This package provides an interface to invert functions in Julia.")
+    (license license:expat)))
+
+;; ready to upstream
 (define-public rmath-for-julia-rmath-jll
   ;; More recent commits fix various build issues
   (let ((commit "5c5dfd6baca358103fbb47cc03dc0ecee04fb1ff")
@@ -691,6 +1345,40 @@ polynomials.")
                      AbstractInterval, along with its subtypes Interval and AnchoredInterval, and also Bound.")
     (license license:expat)))
 
+(define-public julia-infinity
+  (package
+    (name "julia-infinity")
+    (version "0.2.4")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/cjdoris/Infinity.jl")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32 "1941lwvrdjnrynigzixxin3chpg1ba6xplvcwc89x0f6z658hwmm"))))
+    (build-system julia-build-system)
+    (arguments
+     (list
+      #:tests? #f           ; TODO: Fix tests!
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'link-depot 'remove-timezones.jl
+            (lambda _
+              (substitute* "test/runtests.jl"
+                (("using TimeZones.*") "")
+                ((".*infextendedtime.*") "")))))))
+    (propagated-inputs
+     (list julia-requires))
+    (native-inputs
+     (list julia-compat))
+    (home-page "https://docs.juliahub.com/Infinity/")
+    (synopsis "Representation of infinity in Julia")
+    (description "This package provides representations for infinity and
+negative infinity in Julia.")
+    (license license:expat)))
+
 ;; TODO: There is talk upstream about separating out the timezone data into a
 ;; separate package which can allow this to actually be packaged in a sane way.
 ;; As of 1.7.1 there are 257 items in Artifact.toml
diff --git a/gn/packages/lisp.scm b/gn/packages/lisp.scm
index 50ef3b5..111ee52 100644
--- a/gn/packages/lisp.scm
+++ b/gn/packages/lisp.scm
@@ -55,8 +55,6 @@
            (base32 "0n6m3aqvdfnsrhlhqjcy72d1i55lbkjg13ij5c7vw003p1n78wxi"))
           (file-name (git-file-name name commit))))
       (build-system asdf-build-system/sbcl)
-      (arguments
-       `(#:asd-files '("defstar.asd")))
       (home-page "https://github.com/lisp-maintainers/defstar")
       (synopsis "Type declarations for defun et all")
       (description
@@ -89,8 +87,6 @@ with a star added at the end.")
            (base32 "0zgx4ymyzvfg44z36yr4l87cd9mprajd7sycr2zc67ab6330rynf"))
           (file-name (git-file-name name commit))))
       (build-system asdf-build-system/sbcl)
-      (arguments
-       `(#:asd-files '("2am.asd")))
       (home-page "https://gitlab.common-lisp.net/dkochmanski/2am")
       (synopsis "Small testing framework based on 1am")
       (description
@@ -175,8 +171,6 @@ fringilla labore. Tellus penatibus arcu ligula nisi.")
            (base32 "1blmrb4c9gsxj87scz74z1s8w9d1w2r48fyxj0y1sw3vr6bsbb8f"))
           (file-name (git-file-name name commit))))
       (build-system asdf-build-system/sbcl)
-      (arguments
-       `(#:asd-files '("fare-memoization.asd")))
       (native-inputs
         (list sbcl-hu.dwim.stefil))
       (inputs
@@ -212,8 +206,6 @@ with the same arguments again, rather than re-doing the computation.")
            (base32 "08s53zj3mcx82kszp1bg2vsb4kydvkc70kj4hpq9h1l5a1wh44cy"))
           (file-name (git-file-name name commit))))
       (build-system asdf-build-system/sbcl)
-      (arguments
-       `(#:asd-files '("meta.asd")))
       (inputs
         (list sbcl-named-readtables))
       (home-page "https://gitlab.common-lisp.net/frideau/meta")
@@ -245,8 +237,6 @@ generators.")
            (base32 "056qi6vw9bk19s42mapyg55mimhhvhlwgny080v9mhv4fhnqi196"))
           (file-name (git-file-name name commit))))
       (build-system asdf-build-system/sbcl)
-      (arguments
-       `(#:asd-files '("scribble.asd")))
       (native-inputs
         (list sbcl-babel))
       (inputs
diff --git a/gn/packages/machine-learning.scm b/gn/packages/machine-learning.scm
index fbaffb2..8f9f1f0 100644
--- a/gn/packages/machine-learning.scm
+++ b/gn/packages/machine-learning.scm
@@ -11,18 +11,6 @@
     (arguments
      (substitute-keyword-arguments (package-arguments tensorflow)
        ((#:substitutable? _ #f) #f)
-       ;((#:phases phases)
-       ; `(modify-phases ,phases
-       ;    (add-after 'unpack 'hardcode-multicore-usage
-       ;      (lambda _
-       ;        (substitute* "tensorflow/core/protobuf/config.proto"
-       ;          ;(("num_threads = 1") "num_threads = 28") ; 56/2 for penguin2
-       ;          ;(("intra_op_parallelism_threads = 2")
-       ;          ; "intra_op_parallelism_threads = 0")
-       ;          ;(("inter_op_parallelism_threads = 5")
-       ;          ; "inter_op_parallelism_threads = 0")
-       ;          )
-       ;        #t))))
        ((#:configure-flags flags)
         `(cons
            "-Dtensorflow_OPTIMIZE_FOR_NATIVE_ARCH=ON"
diff --git a/gn/packages/notebooks.scm b/gn/packages/notebooks.scm
index 9a22b73..89f1360 100644
--- a/gn/packages/notebooks.scm
+++ b/gn/packages/notebooks.scm
@@ -59,8 +59,7 @@ instance.")
           (file-name (git-file-name name commit))))
       (build-system asdf-build-system/sbcl)
       (arguments
-        `(#:tests? #f ; There are no tests.
-          #:asd-files '("nb.asd")))
+        `(#:tests? #f)) ; There are no tests.
       (inputs
         (list sbcl-ningle
               sbcl-clack
diff --git a/gn/packages/pangenome.scm b/gn/packages/pangenome.scm
index 69e3d81..c66b594 100644
--- a/gn/packages/pangenome.scm
+++ b/gn/packages/pangenome.scm
@@ -1,23 +1,12 @@
-;; Bioinformatics module
+;; Pangenome module
 
 (define-module (gn packages pangenome)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
-  #:use-module (guix utils)
   #:use-module (guix download)
-  #:use-module (guix git-download)
   #:use-module (guix build-system cargo)
-  #:use-module (guix build-system gnu)
-  #:use-module (guix graph)
-  #:use-module (guix scripts graph)
-  #:use-module (guix store)
-  #:use-module (guix gexp)
-  #:use-module (gnu packages)
-  #:use-module (gnu packages base)
   #:use-module (gnu packages crates-io)
-  #:use-module (gnu packages rust)
-  #:use-module (gnu packages version-control)
-  #:use-module (srfi srfi-1))
+  #:use-module (gn packages crates-io))
 
 
 (define-public gfautil
diff --git a/gn/packages/python-web.scm b/gn/packages/python-web.scm
new file mode 100644
index 0000000..88478a5
--- /dev/null
+++ b/gn/packages/python-web.scm
@@ -0,0 +1,40 @@
+(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 d9c4511..510546d 100644
--- a/gn/packages/python.scm
+++ b/gn/packages/python.scm
@@ -9,8 +9,11 @@
   #:use-module (gnu packages image)
   #:use-module (gnu packages libffi)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages maths)
   #:use-module (gnu packages monitoring)
   #:use-module (gnu packages pcre)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages protobuf)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-check)
@@ -29,6 +32,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #:use-module (guix gexp)
   #:use-module (guix utils)
   #:use-module (guix build-system python)
   #:use-module (srfi srfi-1))
@@ -251,12 +255,6 @@ Python 3 support.")
   (package-with-python2 python-avro))
 
 
-; env IPFS_PATH=/export/ipfs/ ipfs add -r htmlgen/
-; added QmUD9LMJTE8q5wYkUyAwLdz2QCGXWt457iFnyYQAGfsN3j htmlgen/htmlgen-2.2.2-gn.tar.gz
-; added QmZLWsPHLFTU3hWAfdTwj3RXFrS8Ma7KEixne1suWuYqeG htmlgen
-; penguin2:~/tmp$ env IPFS_PATH=/export/ipfs/ ipfs pin add -r QmZLWsPHLFTU3hWAfdTwj3RXFrS8Ma7KEixne1suWuYqeG
-; pinned QmZLWsPHLFTU3hWAfdTwj3RXFrS8Ma7KEixne1suWuYqeG recursively
-
 (define-public python2-htmlgen-gn ; guix obsolete
   (package
     (name "python2-htmlgen-gn")
@@ -265,7 +263,7 @@ Python 3 support.")
               (method url-fetch)
               ;; http://files.genenetwork.org/software/contrib/htmlgen-2.2.2-gn.tar.gz
               (uri (string-append
-                     "http://ipfs.genenetwork.org/ipfs/QmZLWsPHLFTU3hWAfdTwj3RXFrS8Ma7KEixne1suWuYqeG/htmlgen-" version "-gn.tar.gz"))
+                     "https://files.genenetwork.org/software/htmlgen-2.2.2-gn.tar.gz"))
               (sha256
                (base32
                 "1lwsk56rymhrma46cbyh3g64ksmq1vsih3qkrc2vh0lpba825y7r"))
@@ -360,13 +358,6 @@ Python 3 support.")
     (description #f)
     (license #f)))
 
-; penguin2:~/tmp$ env IPFS_PATH=/export/ipfs/ ipfs add -r Imaging/
-; added QmV8Rew1re8gBTLsaqMU4bd7euFUPEpjiD572mtoz6KhPn Imaging/Imaging-1.1.6-gn.tar.gz
-; added QmdkzQpVMLZVtywpYesynt9c7H8w7hHZRYKq8woN7stfpD Imaging
-; env IPFS_PATH=/export/ipfs/ ipfs pin add -r QmdkzQpVMLZVtywpYesynt9c7H8w7hHZRYKq8woN7stfpD
-; pinned QmdkzQpVMLZVtywpYesynt9c7H8w7hHZRYKq8woN7stfpD recursively
-
-
 (define-public python2-pil1-gn ; guix obsolete
   (package
     (name "python2-pil1") ; works with GN2
@@ -427,11 +418,6 @@ capabilities to the Python interpreter.")
                "file://README"
                "See 'README' in the distribution."))))
 
-;  agrigento:~/izip/git/opensource/genenetwork$ scp ./contrib/piddle-1.0.15-gn.tgz penguin2.genenetwork.org
-; penguin2:~$ env IPFS_PATH=/export/ipfs/ ipfs add piddle-1.0.15-gn.tgz
-; added QmSMptV2VALL2s7igqRqKJ8ALNvhqFRUYVG54kEF7ac6ve piddle-1.0.15-gn.tgz
-; penguin2:~$ env IPFS_PATH=/export/ipfs/ ipfs pin add -r QmSMptV2VALL2s7igqRqKJ8ALNvhqFRUYVG54kEF7ac6ve
-; pinned QmSMptV2VALL2s7igqRqKJ8ALNvhqFRUYVG54kEF7ac6ve recursively
 
 (define-public python2-piddle-gn ; guix obsolete
   (package
@@ -440,7 +426,7 @@ capabilities to the Python interpreter.")
     (source (origin
      (method url-fetch)
      (uri (string-append
-           "http://ipfs.genenetwork.org/ipfs/QmeKcMb8AdwZNUcAaTASVpZ39ipwJn8eBoqqDfoCzQYmNk/piddle-" version ".tgz"))
+           "https://files.genenetwork.org/software/piddle-1.0.15-gn.tgz"))
      (sha256
       (base32
        "05gjnn31v7p0kh58qixrpcizcxqf3b7zv4a5kk8nsmqwgxh0c6gq"))))
@@ -707,8 +693,7 @@ clusters (computers connected via network).")
 (define GN1-thirdparty-sources
   (origin
     (method url-fetch/tarbomb)
-    ;; ipfs get QmTPwYT2pehdxdG1TiHEzVzLgbeuhJ4utXShuz3twA84AB
-    (uri "file:///gnu/store/p33a2sh3x2nhiiphdw9nly80njg6p8fi-thirdparty.tgz")
+    (uri "https://files.genenetwork.org/software/thirdparty.tgz")
     (file-name "GN1-thirdparty")
     (sha256
      (base32
@@ -851,37 +836,68 @@ spreadsheets without the need for COM objects.")
          (base32
           "1lg1klrczvzfan89y3bl9ykrknl3nb01vvai37fkww24apzyibjf"))))))
 
+(define-public python-py-dateutil
+  (package
+    (name "python-py-dateutil")
+    (version "2.2")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "py-dateutil" version))
+              (sha256
+               (base32
+                "0j5hyhn2yqwyapbhvdvw14a0ydhdl6ddw95nii091iarf6hjryky"))))
+    (build-system python-build-system)
+    (arguments
+     (list
+       #:tests? #f          ; Package is unmaintained since ~2014
+       #:phases
+       #~(modify-phases %standard-phases
+           (replace 'check
+             (lambda* (#:key tests? #:allow-other-keys)
+               (when tests?
+                 (invoke "python" "test.py")))))))
+    (propagated-inputs (list python-six))
+    (home-page "https://bitbucket.org/cld/dateutil")
+    (synopsis "Extensions to the standard Python datetime module")
+    (description "Extensions to the standard Python datetime module")
+    (license license:bsd-3)))
+
 (define-public python-arvados-python-client
   (package
     (name "python-arvados-python-client")
-    (version "2.0.2")
+    (version "2.5.0")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "arvados-python-client" version))
         (sha256
-         (base32
-          "19l4w6m5426x5k2kick630dh2jx26j16ycs2nhbfgr4cd43d29y4"))))
+         (base32 "1j08aykj0v2z2bqwr5nfnbjgc1yzdnfdafcnxbf2jbwqh8kx7zc9"))
+        (modules '((guix build utils)))
+        (snippet
+         '(begin
+            (substitute* "setup.py"
+              ;; Don't set a maximum version of pycurl.
+              (("(pycurl >=([[:digit:]]+\\.?)+),.*" _ pycurl)
+               (string-append pycurl "',\n")))))))
     (build-system python-build-system)
     (arguments
      `(#:tests? #f))    ; tests not included?
     (propagated-inputs
-     `(("python-ciso8601" ,python-ciso8601)
-       ("python-future" ,python-future)
-       ;("python-google-api-python-client" ,python-google-api-python-client)
-       ("python-google-api-client" ,python-google-api-client)
-       ("python-httplib2" ,python-httplib2)
-       ("python-pycurl" ,python-pycurl)
-       ("python-ruaml.yaml" ,python38-ruaml.yaml-0.15.76)
-       ("python-setuptools" ,python-setuptools)
-       ("python-oauth2client" ,python-oauth2client)
-       ("python-uritemplate" ,python-uritemplate)
-       ("python-ws4py" ,python-ws4py)))
+     (list python-ciso8601
+           python-future
+           python-google-api-client
+           python-google-api-core-1
+           python-google-auth-1
+           python-httplib2
+           python-protobuf
+           python-pycurl
+           python-pyparsing-2.4.7       ; < 3
+           python-ruamel.yaml
+           python-ws4py))
     (native-inputs
-     `(("python-mock" ,python-mock)
-       ("python-pbr" ,python-pbr-1.6.0)
-       ("python-pyyaml" ,python-pyyaml)
-       ))
+     (list python-mock
+           python-pbr-1.6.0
+           python-pyyaml))
     (home-page "https://arvados.org")
     (synopsis "Arvados client library")
     (description "This package provides the arvados module, an API client for
@@ -899,46 +915,35 @@ server.")
         (method url-fetch)
         (uri (pypi-uri "PyShEx" version))
         (sha256
-         (base32
-          "1fy664bh6hpmr4cf49fwwxng36kv7s6b2986hbv0cqcypc4ri2cs"))))
+         (base32 "1fy664bh6hpmr4cf49fwwxng36kv7s6b2986hbv0cqcypc4ri2cs"))))
     (arguments
-     '(#:phases
+     '(#:tests? #f          ; Tests try to use the internet.
+       #:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
+         (add-after 'unpack 'drop-rdflib-namespace-rdfnamespace
            (lambda _
-             (substitute* "requirements.txt"
-               ((">=.*") "\n"))
-             #t))
+             ;; _RDFNamespace is in rdflib-5
+             ;; https://github.com/hsolbrig/PyShEx/commit/d138a5b4f2249212f2141b7b9bbaff6696ee9415
+             (substitute* "pyshex/prefixlib.py"
+               (("XMLNS, _RDFNamespace") "XMLNS"))))
          (replace 'check
            (lambda* (#:key inputs outputs tests? #:allow-other-keys)
-             (if tests?
-               (begin
-                 (delete-file "tests/test_cli/test_evaluate.py")
-                 (delete-file "tests/test_cli/test_sparql_options.py")
-                 (delete-file "tests/test_issues/test_fhir.py")
-                 (delete-file "tests/test_issues/test_issue_30.py")
-                 (delete-file "tests/test_pyshex_utils/test_schema_loader.py")
-                 (delete-file "tests/test_shex_manifest/test_basics.py")
-                 (delete-file "tests/test_shextest_validation/test_manifest_shex_json.py")
-                 (delete-file "tests/test_shextest_validation/test_manifest_shex_shexc.py")
-                 (delete-file "tests/test_support_libraries/test_prefixlib.py")
-                 (delete-file "tests/test_utils/test_manifest.py")
-                 (delete-file "tests/test_utils/test_sparql_query.py")
-                 (delete-file "tests/test_utils/test_n3_mapper.py")
-                 (invoke "python" "-m" "unittest"))
-               #t))))))
+             (when tests?
+               (add-installed-pythonpath inputs outputs)
+               (setenv "SKIP_EXTERNAL_URLS" "true")
+               (invoke "python" "-m" "unittest")))))))
     (build-system python-build-system)
     (propagated-inputs
-     `(("python-cfgraph" ,python-cfgraph)
-       ("python-pyshexc" ,python-pyshexc)
-       ("python-rdflib" ,python-rdflib)
-       ("python-pbr" ,python-pbr)
-       ("python-rdflib-jsonld" ,python-rdflib-jsonld)
-       ("python-requests" ,python-requests)
-       ("python-shexjsg" ,python-shexjsg)
-       ("python-sparql-slurper" ,python-sparql-slurper)
-       ("python-sparqlwrapper" ,python-sparqlwrapper)
-       ("python-urllib3" ,python-urllib3)))
+     (list python-cfgraph
+           python-pyshexc-0.7
+           python-rdflib
+           python-requests
+           python-shexjsg
+           python-sparql-slurper
+           python-sparqlwrapper
+           python-urllib3))
+    (native-inputs
+     (list python-pbr python-unittest2))
     (home-page "https://github.com/hsolbrig/PyShEx")
     (synopsis "Python ShEx Implementation")
     (description "This package provides a python ShEx Implementation.")
@@ -947,44 +952,97 @@ server.")
 (define-public python-pyshexc
   (package
     (name "python-pyshexc")
-    (version "0.5.4")
+    (version "0.9.1")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "PyShExC" version))
         (sha256
-         (base32
-          "0hyhmc971gh25ja34j9hbkr7dg9n3jfin8668cqzjmcpjvb1jnil"))))
+         (base32 "1lq4lf0nal1v1d3vbyrr1hfkhmhphy06dyqhyw7b5zls9dfrga9m"))))
     (build-system python-build-system)
     (arguments
-     '(#:tests? #f  ; Tests aren't included in release tarball.
+     '(#:tests? #f  ; It isn't clear how the tests expect to succeed.
        #:phases
        (modify-phases %standard-phases
          (replace 'check
            (lambda* (#:key inputs outputs tests? #:allow-other-keys)
-             (if tests?
-               (begin (add-installed-pythonpath inputs outputs)
-                      (substitute* "tests/test_basic_parser.py"
-                        (("BasicParserTestCase.repo_url.*")
-                         (string-append "BasicParserTestCase.repo_url = \""
-                                        (assoc-ref inputs "test-suite")
-                                        "/schemas\"\n")))
-                      (with-directory-excursion "tests"
-                        (invoke "python" "build_test_harness.py")
-                        (invoke "python" "test_basic_parser.py")
-                        (invoke "python" "test_issue_2.py")
-                        (invoke "python" "test_shexr.py")))
-               #t))))))
+             (when tests?
+               (add-installed-pythonpath inputs outputs)
+               (invoke "python" "-m" "unittest" "discover" "-s" "tests")))))))
     (propagated-inputs
-     `(("python-antlr4-python3-runtime" ,python-antlr4-python3-runtime)
-       ("python-jsonasobj" ,python-jsonasobj)
-       ("python-pyjsg" ,python-pyjsg)
-       ("python-rdflib" ,python-rdflib)
-       ("python-rdflib-jsonld" ,python-rdflib-jsonld)
-       ("python-requests" ,python-requests)))
+     (list python-antlr4-python3-runtime
+           python-chardet
+           python-jsonasobj
+           python-pyjsg
+           python-rdflib-shim
+           python-shexjsg))
+    (native-inputs
+     (list python-pbr
+           python-requests
+           python-yadict-compare))
+    (home-page "https://github.com/shexSpec/grammar-python-antlr")
+    (synopsis "Python ShExC Parser")
+    (description "This package converts the @dfn{Shape Expression Compact}
+(ShExC) into @dfn{Python JSON Schema Binding} (pyjsg) objects.")
+    (license license:asl2.0)))
+
+(define-public python-pyshexc-0.7
+  (package
+    (inherit python-pyshexc)
+    (name "python-pyshexc")
+    (version "0.7.0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/shexSpec/grammar")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name "shexspec-grammar" version))
+        (sha256
+         (base32 "08wsknjq8zyi3hk01w6yl6z8jld63l6l64n43gjhj0jphbm4s9iz"))
+        (modules '((guix build utils)))
+        (snippet
+         '(begin
+            (substitute* "parsers/python/setup.cfg"
+              (("python-requires = 3") "python_requires = >=3.6"))))))
+    (arguments
+     `(#:tests? #f  ; Tests try to access the internet.
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'chdir
+           (lambda _
+             (chdir "parsers/python")
+             (setenv "PBR_VERSION" ,version)))
+         (replace 'check
+           (lambda* (#:key inputs outputs tests? #:allow-other-keys)
+             (when tests?
+               (add-installed-pythonpath inputs outputs)
+               (substitute* "tests/__init__.py"
+                 (("schemas_base =.*")
+                  (string-append "schemas_base = \""
+                                 (assoc-ref inputs "test-suite")
+                                 "/schemas\"\n")))
+               (substitute* "tests/test_shexr.py"
+                 (("https://raw.githubusercontent.com/shexSpec/shexTest/master/validation/manifest")
+                  (string-append (assoc-ref inputs "test-suite")
+                                 "/validation/manifest")))
+               (substitute* "tests/test_issue_9.py"
+                 (("https://raw.githubusercontent.com/shexSpec/shexTest/master/schemas/1dotNS2.shex")
+                  (search-input-file inputs "/schemas/1dotNS2.shex")))
+               (symlink (assoc-ref inputs "test-suite")
+                        "../../../shexTest")
+               (invoke "python" "-m" "unittest" "discover" "-s" "tests")))))))
+    (propagated-inputs
+     (list python-antlr4-python3-runtime
+           python-certifi
+           python-jsonasobj
+           python-rdflib-shim
+           python-requests
+           python-shexjsg))
     (native-inputs
-     `(("python-yadict-compare" ,python-yadict-compare)
-       ("python-shexjsg" ,python-shexjsg-min)
+     `(("python-pbr" ,python-pbr)
+       ("python-unittest2" ,python-unittest2)
+       ("python-yadict-compare" ,python-yadict-compare)
        ("test-suite"
         ,(origin
            (method git-fetch)
@@ -995,23 +1053,18 @@ server.")
            (sha256
             (base32
              "1x788nyrwycfr55wbg0ay6mc8mi6wwsg81h614rx9pw6rvrsppps"))))))
-    (home-page "https://github.com/shexSpec/grammar/tree/master/parsers/python")
-    (synopsis "Python ShExC Parser")
-    (description "This package converts the @dfn{Shape Expression Compact}
-(ShExC) into @dfn{Python JSON Schema Binding} (pyjsg) objects.")
-    (license license:asl2.0)))
+    (home-page "https://github.com/shexSpec/grammar/tree/master/parsers/python")))
 
 (define-public python-antlr4-python3-runtime
   (package
     (name "python-antlr4-python3-runtime")
-    (version "4.7.1")
+    (version "4.9.3")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "antlr4-python3-runtime" version))
         (sha256
-         (base32
-          "1lrzmagawmavyw1n1z0qarvs2jmbnbv0p89dah8g7klj8hnbf9hv"))))
+         (base32 "06w8fz73rk8vzjz9rydfk56g4mbqpyl81yhypc14jab886dlc97j"))))
     (build-system python-build-system)
     (home-page "https://www.antlr.org/")
     (synopsis "ANTLR runtime for Python")
@@ -1051,84 +1104,39 @@ treats name/value pairs as first class attributes whenever possible.")
 (define-public python-shexjsg
   (package
     (name "python-shexjsg")
-    (version "0.6.5")
+    (version "0.8.2")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "ShExJSG" version))
         (sha256
-         (base32
-          "1nn69sl5j949qy21nl5gr56cxfhmml1vng08hayxqfj6vn3ay3gg"))))
+         (base32 "1dnhpk6n6vzadkv13y7r6y2mi1pzv4y19vmxh91k9ykpqngn4ypi"))))
     (build-system python-build-system)
     (arguments
      '(#:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("requirements.txt"
-                            "requirements-dev.txt")
-              (("pyshexc.*") "") ; no loops
-               (("==.*") "\n"))
-             #t))
          (replace 'check
            (lambda* (#:key inputs outputs tests? #:allow-other-keys)
              (if tests?
                (begin (add-installed-pythonpath inputs outputs)
-                      (substitute* '("tests/test_shexc.py"
-                                     "tests/test_shexj.py")
-                        (("shexTestRepository =.*")
-                         (string-append "shexTestRepository = \""
-                                        (assoc-ref inputs "test-suite")
-                                        "/schemas\"\n")))
-                      (invoke "python" "-m" "unittest"))
-               #t))))))
+                      ;; Tries to download files from the internet.
+                      (substitute* "tests/test_shexj.py"
+                        (("skipIf\\(False") "skipIf(True"))
+                      (invoke "python" "-m" "unittest"))))))))
     (propagated-inputs
-     `(("python-antlr4-python3-runtime" ,python-antlr4-python3-runtime)
-       ("python-certifi" ,python-certifi)
-       ("python-chardet" ,python-chardet)
-       ("python-idna" ,python-idna)
-       ("python-isodate" ,python-isodate)
-       ("python-pyjsg" ,python-pyjsg)
-       ("python-requests" ,python-requests)
-       ("python-urllib3" ,python-urllib3)))
+     (list python-pyjsg))
     (native-inputs
-     `(("python-jsonasobj" ,python-jsonasobj)
-       ("python-pbr" ,python-pbr)
-       ("python-pyparsing" ,python-pyparsing)
-       ("python-pyshexc" ,python-pyshexc)
-       ("python-rdflib" ,python-rdflib)
-       ("python-rdflib-jsonld" ,python-rdflib-jsonld)
-       ("python-six" ,python-six)
-       ("python-yadict-compare" ,python-yadict-compare)
-       ("test-suite"
-        ,(origin
-           (method git-fetch)
-           (uri (git-reference
-                  (url "https://github.com/shexSpec/shexTest")
-                  (commit "v2.0.2")))
-           (file-name (git-file-name name version))
-           (sha256
-            (base32
-             "1x788nyrwycfr55wbg0ay6mc8mi6wwsg81h614rx9pw6rvrsppps"))))))
+     (list python-jsonasobj
+           python-pbr
+           python-rdflib-shim
+           python-requests
+           python-yadict-compare))
     (home-page "https://github.com/hsolbrig/ShExJSG")
     (synopsis "Astract Syntax Tree for the ShEx 2.0 language")
     (description "This package provides an astract syntax tree for the
 ShEx 2.0 language.")
     (license license:cc0)))
 
-;; Lets use this one for tests.
-(define python-shexjsg-min
-  (package
-    (inherit python-shexjsg)
-    (name "python-shexjsg")
-    (arguments
-     (substitute-keyword-arguments (package-arguments python-shexjsg)
-       ((#:tests? _ #t) #f)))
-    (native-inputs
-     `(,@(alist-delete "python-pyshexc"
-                       (package-native-inputs python-shexjsg))))
-    (properties `((hidden? . #t)))))
-
 (define-public python-yadict-compare
   (package
     (name "python-yadict-compare")
@@ -1160,31 +1168,17 @@ handles recursion and lists.")
 (define-public python-pyjsg
   (package
     (name "python-pyjsg")
-    (version "0.9.2")
+    (version "0.11.10")
     (source
       (origin
-        (method git-fetch)
-        (uri (git-reference
-               ;; Releases aren't tagged in the repository.
-               (url "https://github.com/hsolbrig/pyjsg")
-               (commit "9b2b8fa8e3b8448abe70b09f804a79f0f31b32b7")))
-        (file-name (git-file-name name version))
+        (method url-fetch)
+        (uri (pypi-uri "PyJSG" version))
         (sha256
-         (base32
-          "0fhpvb6i6xhyd6hnwknw0y2k33cb7iwj07g009lw96r580vprxs4"))))
+         (base32 "1ylbx2pc06qsvb8cqnr8nysvmw55f8nkm05ybcwjpyik53zy7mjb"))))
     (build-system python-build-system)
     (arguments
      '(#:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda* (#:key inputs #:allow-other-keys)
-             (for-each (lambda (file)
-                         (make-file-writable file))
-                       (find-files "." "."))
-             (substitute* "tests_standalone_2/test_xsfacet.py"
-               (("\\.\\.', '\\.\\.', '\\.\\.', 'shexSpec', 'shexTest")
-                (assoc-ref inputs "test-suite")))
-             #t))
          ;; From tox.ini
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
@@ -1193,30 +1187,20 @@ handles recursion and lists.")
                  (lambda (dir)
                    (invoke "python" "-m" "unittest" "discover" "-s" dir))
                  '("tests/test_issues"
-                   "tests/test_basics"
+                   ;"tests/test_basics"
                    "tests/test_jsglib"
                    "tests/test_parser_impl"
                    "tests/test_python_generator"
                    "tests_standalone"
-                   "tests_standalone_2"))
-               #t))))))
+                   "tests_standalone_2"))))))))
     (propagated-inputs
-     `(("python-antlr4-python3-runtime" ,python-antlr4-python3-runtime)
-       ("python-jsonasobj" ,python-jsonasobj)
-       ("python-requests" ,python-requests)))
+     (list python-antlr4-python3-runtime
+           python-jsonasobj))
     (native-inputs
-     `(("python-unittest2" ,python-unittest2)
-       ("python-yadict-compare" ,python-yadict-compare)
-       ("test-suite"
-        ,(origin
-           (method git-fetch)
-           (uri (git-reference
-                  (url "https://github.com/shexSpec/shexTest")
-                  (commit "v2.0.2")))
-           (file-name (git-file-name name version))
-           (sha256
-            (base32
-             "1x788nyrwycfr55wbg0ay6mc8mi6wwsg81h614rx9pw6rvrsppps"))))))
+     (list python-pbr
+           python-requests
+           python-unittest2
+           python-yadict-compare))
     (home-page "https://github.com/hsolbrig/pyjsg")
     (synopsis "Python JSON Schema Grammar bindings")
     (description
@@ -1245,30 +1229,37 @@ handles recursion and lists.")
     (description "This package provides a SPARQL Slurper for rdflib.")
     (license license:asl2.0)))
 
-(define-public python38-ruaml.yaml-0.15.76 ;; no longer in use 
+(define-public python-sparqlslurper
   (package
-    (inherit python-ruamel.yaml)
-    (name "python-ruamel.yaml")
-    (version "0.15.76")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (pypi-uri "ruamel.yaml" "0.15.78"))
-        (sha256
-         (base32
-          "0pwxgrma6k47kvsphqz5yrhwnfrhwsrhn6sjp8p21s91wdgkqyc5"))))
+    (name "python-sparqlslurper")
+    (version "0.5.1")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "sparqlslurper" version))
+              (sha256
+               (base32 "0ipma74dr5jvsxwaa9al147mn9vv3v5r9lb9hajm4qgwcjqfp0lj"))))
+    (build-system python-build-system)
     (arguments
-     `(#:tests? #f  ; suprise test failures
+     '(#:tests? #f  ; Tests try to use the internet.
        #:phases
        (modify-phases %standard-phases
-         ;; For some unknown reason we need: ruamel.yaml<=0.15.77,>=0.15.54
-         ;; But 0.15.78 is the first which builds with python-3.8.
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* "__init__.py"
-               (("0\\.15\\.78") "0.15.76")
-               (("15, 78") "15, 76"))
-             #t)))))))
+         (replace 'check
+           (lambda* (#:key inputs outputs tests? #:allow-other-keys)
+             (when tests?
+               (add-installed-pythonpath inputs outputs)
+               (invoke "python" "-m" "unittest")))))))
+    (propagated-inputs
+     (list python-rdflib-shim
+           python-sparqlwrapper))
+    (native-inputs
+     (list python-pbr python-unittest2))
+    (home-page "http://github.com/hsolbrig/sparqlslurper")
+    (synopsis "SPARQL Slurper for rdflib")
+    (description "This package provides an implementation of a
+@code{rdflibGraph} that acts as a cache for a SPARQL endpoint.  SPARQL Slurper
+translates the @code{Graph.triples()} function into the corresponding SPARQL
+query and resolves it against an endpoint.")
+    (license license:cc0)))
 
 (define-public python2-ruamel.ordereddict
   (package
@@ -1299,6 +1290,22 @@ handles recursion and lists.")
 sorted order.")
     (license license:expat)))
 
+(define-public python-pytest-5
+  (package
+    (inherit python-pytest)
+    (name "python-pytest")
+    (version "5.4.3")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "pytest" version))
+              (sha256
+               (base32
+                "1n67lk8iwlsmfdm8663k8l7isllg1xd3n9p1yla7885szhdk6ybr"))))
+    (build-system python-build-system)
+    (native-inputs
+     (modify-inputs (package-native-inputs python-pytest)
+                    (prepend python-argcomplete python-requests)))))
+
 (define-public python-pytest-4
   (package
     (inherit python-pytest)
@@ -1315,9 +1322,33 @@ sorted order.")
        ((#:tests? _ #f) #f)))
     (native-inputs
      `(("python-argcomplete" ,python-argcomplete)
+       ("python-atomicwrites" ,python-atomicwrites)
        ("python-requests" ,python-requests)
        ,@(package-native-inputs python-pytest)))))
 
+(define-public python-pytest-runner-4
+  (package
+    (inherit python-pytest-runner)
+    (name "python-pytest-runner")
+    (version "4.5.1")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "pytest-runner" version))
+              (sha256
+               (base32
+                "1vzilbayx5mznsdm1r258m3616374p6kvhsbj4j6238j9djkvjyi"))))))
+
+(define-public python-pytest-runner-2
+  (package
+    (inherit python-pytest-runner)
+    (version "2.12.2")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "pytest-runner" version))
+              (sha256
+               (base32
+                "11ivjj9hfphkv4yfb2g74av4yy86y8gcbf7gbif0p1hcdfnxg3w6"))))))
+
 (define-public python-pandas-plink
   (package
     (name "python-pandas-plink")
@@ -1784,3 +1815,66 @@ file format spec.")
       (license:fsf-free (string-append "https://web.archive.org/web/20190211105114/"
                                        "http://www.repoze.org/LICENSE.txt")))))
 
+(define-public python-rdflib-shim
+  (package
+    (name "python-rdflib-shim")
+    (version "1.0.3")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "rdflib_shim" version))
+              (sha256
+               (base32
+                "03gwsjcinbyyqrhs2jfhs6mr7j69dfn5djihd0mv9al654gd2mfr"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  (substitute* "requirements.txt"
+                    (("rdflib-jsonld==0.6.1") "rdflib-jsonld"))))))
+    (build-system python-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key inputs outputs tests? #:allow-other-keys)
+             (when tests?
+               (add-installed-pythonpath inputs outputs)
+               (invoke "python" "-m" "unittest" "discover" "-s" "tests")))))))
+    (propagated-inputs
+     (list python-rdflib python-rdflib-jsonld))
+    (native-inputs
+     (list python-pbr))
+    (home-page "http://hsolbrig.github.io/rdflib-shim")
+    (synopsis "Shim for rdflib 5 and 6 incompatibilities")
+    (description "Shim for rdflib 5 and 6 incompatibilities")
+    (license license:cc0)))
+
+(define-public python-h5py-2
+  (package
+    (name "python-h5py")
+    (version "2.10.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "h5py" version))
+              (sha256
+               (base32
+                "0baipzv8n93m0dq0riyi8rfhzrjrfrfh8zqhszzp1j2xjac2fhc4"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:tests? #f ;no test target
+       #:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'fix-hdf5-paths
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      (setenv "HDF5_DIR"
+                              (assoc-ref inputs "hdf5")))))))
+    (propagated-inputs (list python-six python-numpy))
+    (inputs (list hdf5-1.10))
+    (native-inputs (list python-cython python-pkgconfig pkg-config))
+    (home-page "https://www.h5py.org/")
+    (synopsis "Read and write HDF5 files from Python")
+    (description
+     "The h5py package provides both a high- and low-level interface to the
+HDF5 library from Python.  The low-level interface is intended to be a
+complete wrapping of the HDF5 API, while the high-level component supports
+access to HDF5 files, datasets and groups using established Python and NumPy
+concepts.")
+    (license license:bsd-3)))
diff --git a/gn/packages/python24.scm b/gn/packages/python24.scm
index 35cd91e..381b1ef 100644
--- a/gn/packages/python24.scm
+++ b/gn/packages/python24.scm
@@ -140,7 +140,15 @@ pre-defined variants."
     (name "python24-pil")
     (arguments
      (substitute-keyword-arguments (package-arguments python2-pil1)
-       ((#:python _) python-2.4)))))
+       ((#:python _) python-2.4)
+       ((#:phases phases '%standard-phases)
+        `(modify-phases ,phases
+           (replace 'add-install-to-pythonpath
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (setenv "PYTHONPATH"
+                       (string-append (site-packages inputs outputs) ":"
+                                      (getenv "PYTHONPATH")))))
+           (delete 'sanity-check))))))) ; Not applicable to python-2.4
 
 (define-public python24-piddle
   (package
@@ -148,7 +156,15 @@ pre-defined variants."
     (name "python24-piddle")
     (arguments
      (substitute-keyword-arguments (package-arguments python2-piddle-gn)
-       ((#:python _) python-2.4)))
+       ((#:python _) python-2.4)
+       ((#:phases phases '%standard-phases)
+        `(modify-phases ,phases
+           (replace 'add-install-to-pythonpath
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (setenv "PYTHONPATH"
+                       (string-append (site-packages inputs outputs) ":"
+                                      (getenv "PYTHONPATH")))))
+           (delete 'sanity-check)))))   ; Not applicable to python-2.4
     (native-inputs `(("python24-setuptools" ,python24-setuptools)))
     (propagated-inputs
      `(("python24-pil" ,python24-pil)))))
@@ -182,7 +198,7 @@ pre-defined variants."
 (define GN1-thirdparty-sources
   (origin
     (method url-fetch/tarbomb)
-    (uri "http://ipfs.genenetwork.org/ipfs/QmTPwYT2pehdxdG1TiHEzVzLgbeuhJ4utXShuz3twA84AB/thirdparty.tgz")
+    (uri "https://files.genenetwork.org/software/thirdparty.tgz")
     (file-name "GN1-thirdparty")
     (sha256
      (base32
@@ -200,13 +216,18 @@ pre-defined variants."
        (modify-phases %standard-phases
          (delete 'build)
          (delete 'check)
+         (replace 'add-install-to-pythonpath
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (setenv "PYTHONPATH"
+                     (string-append (site-packages inputs outputs) ":"
+                                    (getenv "PYTHONPATH")))))
+         (delete 'sanity-check)     ; Not applicable to python-2.4
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out     (assoc-ref outputs "out"))
                     (sitedir (string-append out "/lib/python2.4/site-packages/json/")))
                (mkdir-p sitedir)
-               (copy-recursively "thirdparty/json" sitedir)
-               #t))))))
+               (copy-recursively "thirdparty/json" sitedir)))))))
     (home-page "")
     (synopsis "")
     (description "")
@@ -224,13 +245,18 @@ pre-defined variants."
        (modify-phases %standard-phases
          (delete 'build)
          (delete 'check)
+         (replace 'add-install-to-pythonpath
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (setenv "PYTHONPATH"
+                     (string-append (site-packages inputs outputs) ":"
+                                    (getenv "PYTHONPATH")))))
+         (delete 'sanity-check)     ; Not applicable to python-2.4
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out     (assoc-ref outputs "out"))
                     (sitedir (string-append out "/lib/python2.4/site-packages/svg/")))
                (mkdir-p sitedir)
-               (copy-recursively "thirdparty/svg" sitedir)
-               #t))))))
+               (copy-recursively "thirdparty/svg" sitedir)))))))
     (home-page "")
     (synopsis "")
     (description "")
@@ -248,6 +274,12 @@ pre-defined variants."
        (modify-phases %standard-phases
          (delete 'build)
          (delete 'check)
+         (replace 'add-install-to-pythonpath
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (setenv "PYTHONPATH"
+                     (string-append (site-packages inputs outputs) ":"
+                                    (getenv "PYTHONPATH")))))
+         (delete 'sanity-check)     ; Not applicable to python-2.4
          (replace 'install
            (lambda* (#:key outputs #:allow-other-keys)
              (let* ((out     (assoc-ref outputs "out"))
@@ -322,7 +354,13 @@ pre-defined variants."
        (modify-phases %standard-phases
          (add-after 'unpack 'change-directory
            (lambda _
-             (chdir "thirdparty/pp-1.5.7") #t)))))
+             (chdir "thirdparty/pp-1.5.7")))
+         (replace 'add-install-to-pythonpath
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (setenv "PYTHONPATH"
+                     (string-append (site-packages inputs outputs) ":"
+                                    (getenv "PYTHONPATH")))))
+         (delete 'sanity-check))))  ; Not applicable to python-2.4
     (home-page "")
     (synopsis "")
     (description "")
@@ -346,9 +384,15 @@ pre-defined variants."
      `(#:python ,python-2.4
        #:phases
        (modify-phases %standard-phases
+         (replace 'add-install-to-pythonpath
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (setenv "PYTHONPATH"
+                     (string-append (site-packages inputs outputs) ":"
+                                    (getenv "PYTHONPATH")))))
+         (delete 'sanity-check)     ; Not applicable to python-2.4
          (add-before 'check 'pre-check
            (lambda* (#:key inputs tests? #:allow-other-keys)
-             (if tests?
+             (when tests?
                (begin
                  (mkdir-p "/tmp/mysqld")
                  (call-with-output-file "/tmp/my.cnf"
@@ -368,8 +412,7 @@ pre-defined variants."
                  (sleep 5)
                  (invoke "mysqladmin" "-S" "/tmp/mysqld/mysql.sock" "variables")
                  (invoke "mysql" "-S" "/tmp/mysqld/mysql.sock"
-                         "-e" "'create database mysqldb_test charset utf8;'"))
-               #t))))
+                         "-e" "'create database mysqldb_test charset utf8;'"))))))
        #:tests? #f))    ; TODO: Run the test suite
     (native-inputs
      `(("mysql" ,mysql-5.0) ; Best supported version according to the README.
@@ -461,18 +504,13 @@ algorithm can be found in Gablonsky's
 thesis}.")
     (license license:expat)))
 
-; env IPFS_PATH=/export/ipfs/ ipfs add direct.so
-; added QmYUZiuAP6DJeubu69JqvRWSsn53qCZCS3FkRWgTowtWkA direct.so
-; penguin2:~/tmp$ env IPFS_PATH=/export/ipfs/ ipfs pin add QmYUZiuAP6DJeubu69JqvRWSsn53qCZCS3FkRWgTowtWkA
-; pinned QmYUZiuAP6DJeubu69JqvRWSsn53qCZCS3FkRWgTowtWkA recursively
-
 (define-public python24-direct-gn
   (package
     (name "python24-direct-gn")
     (version "GN")
     (source (origin
               (method url-fetch)
-              (uri "http://ipfs.genenetwork.org/ipfs/QmYUZiuAP6DJeubu69JqvRWSsn53qCZCS3FkRWgTowtWkA")
+              (uri "https://files.genenetwork.org/software/direct.so")
               (file-name "direct.so")
               (sha256
                (base32
diff --git a/gn/packages/quality-control.scm b/gn/packages/quality-control.scm
index 7bc60ef..f0a9c2f 100644
--- a/gn/packages/quality-control.scm
+++ b/gn/packages/quality-control.scm
@@ -59,8 +59,7 @@
           (file-name (git-file-name name commit))))
       (build-system asdf-build-system/sbcl)
       (arguments
-        `(#:tests? #f ; Need to fix tests.
-          #:asd-files '("qc.asd")))
+        `(#:tests? #f)) ; Need to fix tests.
       (native-inputs
         (list sbcl-1am))
       (inputs
diff --git a/gn/packages/ratspub.scm b/gn/packages/ratspub.scm
index 5f6f7b5..726bc0b 100644
--- a/gn/packages/ratspub.scm
+++ b/gn/packages/ratspub.scm
@@ -17,6 +17,7 @@
   #:use-module (gnu packages python-xyz)
   #:use-module (gn packages javascript)
   #:use-module (gn packages machine-learning)
+  #:use-module (gn packages python)
   #:use-module (gn packages web))
 
 (define-public ratspub
@@ -148,6 +149,13 @@ Association Studies}} catalog are also included in the search.  These
 gene-keyword relationships are presented as an interactive graph and a table.")
     (license license:expat)))
 
+(define use-corrected-inputs
+  (package-input-rewriting/spec
+    ;; Tensorflow-native provides much improved speeds. python-h5py@2 provides
+    ;; compatibility with our version of tensorflow.
+    `(("tensorflow" . ,(const tensorflow-native))
+      ("python-h5py" . ,(const python-h5py-2)))))
+
 (define-public ratspub-with-tensorflow-native
   (package
     (inherit
@@ -262,7 +270,7 @@ if __name__ == '__main__':
 (define-public genecup
   (package
     (name "genecup")
-    (version "1.6")
+    (version "1.8")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -270,7 +278,7 @@ if __name__ == '__main__':
                      (commit (string-append "v" version))))
               (file-name (git-file-name name version))
               (sha256
-               (base32 "050yg4hvjs9rghw41q35xdd2c2rzh9sl4sfwkk3am150mgf2p0nh"))))
+               (base32 "0clnlnj6cl816yj3nalh1h6hsvnh3sjq2g84x1kmj1zkqkw184ri"))))
     (build-system python-build-system)
     (arguments
      `(#:tests? #f  ; no test suite
@@ -399,11 +407,11 @@ concepts and a list of keywords for each concept.")
 (define-public genecup-with-tensorflow-native
   (package
     (inherit
-      (tensowflow-native-instead-of-tensorflow genecup))
+      (use-corrected-inputs genecup))
     (name "genecup-with-tensorflow-native")))
 
 (define-public genecup-latest-with-tensorflow-native
   (package
     (inherit
-      (tensowflow-native-instead-of-tensorflow genecup-master))
+      (use-corrected-inputs genecup-master))
     (name "genecup-latest-with-tensorflow-native")))
diff --git a/gn/packages/ruby.scm b/gn/packages/ruby.scm
index ca0339f..e2c4164 100644
--- a/gn/packages/ruby.scm
+++ b/gn/packages/ruby.scm
@@ -127,7 +127,7 @@ and comma separated table files - useful for Excel sheets and SQL/RDF
 output")
    (home-page
     "http://github.com/pjotrp/bioruby-table")
-   (license expat)))
+   (license license:expat)))
 
 (define-public ruby-ntlm-http
   (package
@@ -148,7 +148,8 @@ output")
     (description
      "Ruby/NTLM HTTP provides NTLM authentication over http.")
     (home-page "http://www.mindflowsolutions.net")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-webrobots
   (package
@@ -171,7 +172,8 @@ output")
      "This library helps write robots.txt compliant web robots in Ruby.
 ")
     (home-page "https://github.com/knu/webrobots")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-mechanize ; guix maybe ready
   (package
@@ -213,7 +215,7 @@ submitted.  Mechanize also keeps track of the sites that you have visited as
 a history.")
   (home-page
    "http://docs.seattlerb.org/mechanize/")
-  (license expat)))
+  (license license:expat)))
 
 (define-public ruby-elasticsearch-transport
 (package
@@ -240,7 +242,7 @@ a history.")
 ")
   (home-page
     "https://github.com/elasticsearch/elasticsearch-ruby/tree/master/elasticsearch-transport")
-  (license #f)))
+  (license (license:non-copyleft "will fill in later"))))
 
 (define-public ruby-elasticsearch-api
 (package
@@ -266,7 +268,7 @@ a history.")
 ")
   (home-page
     "https://github.com/elasticsearch/elasticsearch-ruby/tree/master/elasticsearch-api")
-  (license #f)))
+  (license (license:non-copyleft "will fill in later"))))
 
 (define-public ruby-elasticsearch
   (package
@@ -295,7 +297,7 @@ a history.")
 ")
    (home-page
     "http://github.com/elasticsearch/elasticsearch-ruby")
-   (license #f)))
+   (license (license:non-copyleft "will fill in later"))))
 
 
 
@@ -1720,7 +1722,8 @@ and HTML without having to deal with character set issues.")
     acts as a drop-in replacement for Rails `auto_link`
 ")
     (home-page "https://github.com/vmg/rinku")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-sidekiq
   (package
@@ -1745,7 +1748,8 @@ and HTML without having to deal with character set issues.")
     (description
       "Simple, efficient background processing for Ruby.")
     (home-page "https://sidekiq.org")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-mini-scheduler
   (package
@@ -2007,7 +2011,8 @@ and HTML without having to deal with character set issues.")
     (synopsis "")
     (description "")
     (home-page "")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public generate-ninja   ; or 'gn'
   (let ((commit "dfcbc6fed0a8352696f92d67ccad54048ad182b3")
@@ -2476,7 +2481,8 @@ Use rake-compiler-dock to enter an interactive shell session or add a task to yo
     (description
       "The CSV library provides a complete interface to CSV files and data.  It offers tools to enable you to read and write to and from Strings or IO objects, as needed.")
     (home-page "https://github.com/ruby/csv")
-    (license (list #f #f))))
+    (license (list (license:non-copyleft "will fill in later")
+                   (license:non-copyleft "will fill in later")))))
 
 (define-public ruby-maxminddb
   (package
@@ -2690,7 +2696,8 @@ Use rake-compiler-dock to enter an interactive shell session or add a task to yo
     (description
       "HTTP Accept, Accept-Charset, Accept-Encoding, and Accept-Language for Ruby/Rack")
     (home-page "http://mjijackson.github.com/rack-accept")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-mustermann
  (package
@@ -2948,7 +2955,8 @@ Use rake-compiler-dock to enter an interactive shell session or add a task to yo
     (description
       "Run test/unit tests by line number.  Metal!")
     (home-page "https://github.com/qrush/m")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-allocation-stats
   (package
@@ -3027,7 +3035,8 @@ Use rake-compiler-dock to enter an interactive shell session or add a task to yo
     (description
       "FakeWeb is a helper for faking web requests in Ruby.  It works at a global level, without modifying code or writing extensive stubs.")
     (home-page "http://github.com/chrisk/fakeweb")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-simple-oauth
   (package
@@ -3364,7 +3373,8 @@ Psych also knows how to serialize and de-serialize most Ruby objects to and from
       "   Kwalify is a parser, schema validator, and data binding tool for YAML and JSON.
 ")
     (home-page "http://www.kuwata-lab.com/kwalify/")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-reek
   (package
@@ -4375,7 +4385,8 @@ non-blocking I/O methods for Ruby without raising exceptions on
 EAGAIN and EINPROGRESS.
 ")
     (home-page "https://yhbt.net/kgio/")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-unicorn
   (package
@@ -4405,7 +4416,8 @@ advantage of features in Unix/Unix-like kernels.  Slow clients should
 only be served by placing a reverse proxy capable of fully buffering
 both the the request and response in between unicorn and slow clients.")
     (home-page "https://yhbt.net/unicorn/")
-    (license (list #f #f))))
+    (license (list (license:non-copyleft "will fill in later")
+                   (license:non-copyleft "will fill in later")))))
 
 (define-public ruby-pry-rails
   (package
@@ -4463,7 +4475,8 @@ both the the request and response in between unicorn and slow clients.")
     (description
       "CSS flipper for right-to-left processing.  A Ruby port of https://github.com/ded/r2")
     (home-page "https://github.com/mzsanford/R2rb")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-openssl
   (package
@@ -5146,7 +5159,8 @@ public-key signature system described in RFC 8032.")
     (description
       "Annotates Rails/ActiveRecord Models, routes, fixtures, and others based on the database schema.")
     (home-page "https://github.com/ctran/annotate_models")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-flamegraph
   (package
@@ -5303,7 +5317,7 @@ specify.")
     (description
       "This package provides a small gem that attempts to guess and then force encoding of HTML documents for Ruby 1.9")
     (home-page "https://github.com/cantino/guess_html_encoding")
-   (license expat)))
+   (license license:expat)))
 
 (define-public ruby-ruby-readability
   (package
@@ -5332,7 +5346,8 @@ specify.")
     (description
       "Port of arc90's readability project to ruby")
     (home-page "https://github.com/cantino/ruby-readability")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 ;; TODO: 0.3.3 never finishes the install phase with ruby-2.6
 ;; TODO: Unbundle cppjieba
@@ -5614,7 +5629,8 @@ with processing Chinese text.")
 \"test/unit/rr\".
 ")
     (home-page "https://github.com/test-unit/test-unit-rr")
-    (license #f)))
+    (license (license:non-copyleft
+               "will fill in later"))))
 
 (define-public ruby-aws-sdk-kinesis
   (package
@@ -5955,3 +5971,25 @@ Simple gem that adds various color methods to String class, and can be used as f
   (home-page
     "http://github.com/pjotrp/regressiontest")
   (license license:expat)))
+
+(define-public ruby-lmdb
+  (package
+   (name "ruby-lmdb")
+   (version "0.6.1")
+   (source (origin
+            (method url-fetch)
+            (uri (rubygems-uri "lmdb" version))
+            (sha256
+             (base32
+              "0yzlf56ynj545ln5dxl422rpi8r6h11cr6rag5hk2qpbkzs6l9c2"))))
+   (build-system ruby-build-system)
+   (native-inputs
+    `(("ruby-rake" ,ruby-rake)
+       ("ruby-rake-compiler" ,ruby-rake-compiler)
+       ("ruby-rspec" ,ruby-rspec)      ("ruby-rspec" ,ruby-rspec)))
+   (arguments
+    `(#:tests? #f ; There are no tests.
+   ))   (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)))
diff --git a/gn/past/genenetwork1.scm b/gn/past/genenetwork1.scm
index c557ee7..717aff6 100644
--- a/gn/past/genenetwork1.scm
+++ b/gn/past/genenetwork1.scm
@@ -44,7 +44,6 @@
   #:use-module (past packages python)
   #:use-module (past packages web)
   #:use-module (gn packages bioinformatics)
-  #:use-module (gn packages twint)
   #:use-module (gn packages databases)
   #:use-module (gn packages elixir)
   #:use-module (gn packages gemma)
@@ -110,15 +109,22 @@ location of a putative QTL.")
        `(#:python ,python-2.4
          #:phases
          (modify-phases %standard-phases
+           (replace 'add-install-to-pythonpath
+             (lambda* (#:key inputs outputs #:allow-other-keys)
+               (setenv "PYTHONPATH"
+                       (string-append (site-packages inputs outputs) ":"
+                                      (getenv "PYTHONPATH")))))
+           (delete 'sanity-check)       ; Not applicable to python-2.4
            (add-after 'unpack 'make-max-markername-size-larger
              (lambda _
                (substitute* "Src/dataset.c"
-                 (("512") "2048"))
-               #t))
+                 (("512") "2048"))))
            (replace 'check
-             (lambda* (#:key inputs outputs #:allow-other-keys)
-               (add-installed-pythonpath inputs outputs)
-               (invoke "python" "test/runtest.py"))))))
+             (lambda* (#:key tests? inputs outputs #:allow-other-keys)
+               (when tests?
+                 (setenv "PYTHONPATH" (string-append (site-packages inputs outputs) ":"
+                                                     (getenv "PYTHONPATH")))
+                 (invoke "python" "test/runtest.py")))))))
       (native-inputs
        `(("python24-setuptools" ,python24-setuptools)))
       (home-page "http://qtlreaper.sourceforge.net/")
diff --git a/gn/services/bh20-seq-resource-container.scm b/gn/services/bh20-seq-resource-container.scm
index cb77cdb..e0eccf7 100644
--- a/gn/services/bh20-seq-resource-container.scm
+++ b/gn/services/bh20-seq-resource-container.scm
@@ -5,6 +5,7 @@
              (guix modules)
              ((guix packages) #:select (package-source))
              (guix records)
+             (guix build-system python) ; for python-version from guix/build/python-build-system.scm
              (ice-9 match))
 (use-service-modules shepherd)
 (use-package-modules compression python python-web)
@@ -14,7 +15,7 @@
   make-covid19-pubseq-configuration
   covid19-pubseq-configuration?
   (package          covid19-pubseq-configuration-package    ; package
-                    (default bh20-seq-resource))
+                    (default bh20-seq-resource-for-service))
   (deploy-directory covid19-pubseq-deploy-directory         ; string
                     (default "/srv/http"))
   (port             covid19-pubseq-configuration-port       ; string
@@ -58,9 +59,10 @@
                           #:directory #$deploy-directory
                           #:log-file "/var/log/covid19-pubseq.log"
                           #:environment-variables
+                          ;(let (pyversion (python-version (@ (gnu packages python) python)))
                           '("TMPDIR=/export/tmp"
-                            ;; TODO: Don't hardcode python version!
-                            "PYTHONPATH=/run/current-system/profile/lib/python3.8/site-packages")
+                            "PYTHONPATH=/run/current-system/profile/lib/python3.9/site-packages")
+                          ;  (string-append "PYTHONPATH=/run/current-system/profile/lib/python" pyversion "/site-packages")))
                           ;#:mappings
                           ;(list (file-system-mapping
                           ;        (source "/export/tmp")
@@ -68,7 +70,7 @@
                           ;        (writable? #t))
                           ;      (file-system-mapping
                           ;        ;; TODO: Don't hardcode python version!
-                          ;        (source "/run/current-system/profile/lib/python3.8/site-packages")
+                          ;        (source "/run/current-system/profile/lib/python3.9/site-packages")
                           ;        (target source)))
                           ))
                (stop  #~(make-kill-destructor))))))))
@@ -104,3 +106,5 @@
   (packages '())
 
   (services (list (service covid19-pubseq-service-type))))
+
+;; guix system container /home/shepherd/guix-bioinformatics/gn/services/bh20-seq-resource-container.scm --share=/export/tmp=/export/tmp --network
diff --git a/gn/services/databases.scm b/gn/services/databases.scm
index 2b2b225..937aa9e 100644
--- a/gn/services/databases.scm
+++ b/gn/services/databases.scm
@@ -33,6 +33,8 @@
              (default "localhost"))
   (server-port virtuoso-configuration-server-port
                (default 1111))
+  (dirs-allowed virtuoso-dirs-allowed
+                (default "/var/genenetwork/virtuoso-data"))
   (number-of-buffers virtuoso-configuration-number-of-buffers
                      (default #f))
   (maximum-dirty-buffers virtuoso-configuration-maximum-dirty-buffers
@@ -84,6 +86,9 @@
                               (format port "ServerPort = ~a:~a~%"
                                       #$(virtuoso-configuration-server-ip config)
                                       #$(virtuoso-configuration-server-port config)))
+                            (when #$(virtuoso-dirs-allowed config)
+                                  (format port "DirsAllowed = ~a~%"
+                                          #$(virtuoso-dirs-allowed config)))
                             (when #$(virtuoso-configuration-number-of-buffers config)
                                   (format port "NumberOfBuffers = ~a~%"
                                           #$(virtuoso-configuration-number-of-buffers config)))
diff --git a/gn/services/genome-browser.scm b/gn/services/genome-browser.scm
index 2d14a42..e350674 100644
--- a/gn/services/genome-browser.scm
+++ b/gn/services/genome-browser.scm
@@ -130,7 +130,7 @@
                            (program (file-append ucsc-genome-browser "/bin/gfServer"))
                            (arguments
                              '("gfServer" "dynserver" "/gbdb")))))))
-          (syslog-service)  ; needed by inetd
+          (service syslog-service-type)  ; needed by inetd
           (service httpd-service-type
                    (httpd-configuration
                      (config
diff --git a/gn/services/pluto.scm b/gn/services/pluto.scm
index d137314..720b769 100644
--- a/gn/services/pluto.scm
+++ b/gn/services/pluto.scm
@@ -44,16 +44,20 @@
                (modules '((gnu build shepherd)
                           (gnu system file-systems)))
                (start #~(make-forkexec-constructor/container
-                          (list #$(file-append package "/runpluto.sh") #$port)
+                          ;(list #$(file-append package "/runpluto.sh") #$port)
+                          (list #$(file-append package "/runpluto"))
                           #:log-file "/var/log/pluto.log"
                           #:user "julia"
                           #:group "julia"
-                          ;; This needs to exist. Unclear why.
+                          ;; This prevents the service from using /root as $HOME.
                           #:environment-variables '()
                           #:mappings (list (file-system-mapping
                                              (source "/home/jovyan")
                                              (target source)
-                                             (writable? #t)))))
+                                             (writable? #t))
+                                           (file-system-mapping
+                                             (source "/etc/ssl")
+                                             (target source)))))
                (stop  #~(make-kill-destructor))))))))
 
 (define pluto-service-type
@@ -86,6 +90,10 @@
   ;; No firmware for VMs.
   (firmware '())
   (packages (list nss-certs))
+  ;; For testing
+  ;(packages (cons* nss-certs %base-packages))
+
+  (setuid-programs '())
 
   (services (list (service pluto-service-type
                            (pluto-configuration
diff --git a/tux02-guix-substitutions-public-key.txt b/tux02-guix-substitutions-public-key.txt
new file mode 100644
index 0000000..ee65299
--- /dev/null
+++ b/tux02-guix-substitutions-public-key.txt
@@ -0,0 +1,7 @@
+(public-key 
+ (ecc 
+  (curve Ed25519)
+  (q #9F56EAB5CE37AA15693C31F451140588240F259676C137E31C0CA70EC4D1B534#)
+  )
+ )
+